AI Native WorkshopGo from AI experimentation to AI-native execution across your organization.
Heroku → AWS migration

Heroku to AWS in an hour.
Fully automated.

One command. An agent reads your repository and deploys it into the AWS account you already own - after you approve the plan.

Amazon Web ServicesTeams migrating with Qovery may be eligible for AWS migration credits through our ISV Accelerate partnership.
No step is destructiveBoth stacks run in parallelHeroku stays up until you move DNS
your-app — qovery agent
$ deploy this project with Qovery
Scanning repository...
web Node.js 20 Dockerfile generated
worker Node.js 20 detected from Procfile
scheduler cron 2 jobs
database PostgreSQL 15 Heroku Postgres, connected remotely
Plan: 3 services, 1 external database, 12 environment variables
Nothing has been created yet. Approve to continue.
200+ companies run on their own cloud with Qovery4.8 on G2 · 80+ reviews
  • Talkspace
  • Alan
  • Powens
  • Prezi
  • Prosperity
  • Getsafe
We migrated our whole staging environment with a single prompt. Production was a one-click clone of staging. Once the tests gave us confidence we moved DNS off Heroku - we have been running production on our own cloud with Qovery ever since.
Miguel VictoriaSoftware Engineer, Sofive
We liked the Heroku experience, and we knew AWS meant skills and effort we did not have spare - that is why we kept putting the migration off. We do not regret doing it with Qovery. Deployments that took me over two hours now take 30 minutes.
Kyle FlavinDirector of DevOps, RxVantageCase study →
How the migration runs

Three steps, then the agent does it.

Your side takes about five minutes. Everything after that is automated.

  1. 01

    A CloudFormation stack provisions the network and an EKS cluster in your own account - about twenty minutes, and nothing leaves your boundary. Qovery gets a role you can read, scope down or revoke. Talk to a migration engineer before you connect anything.

  2. 02

  3. 03

  4. 04

    Optional
In the AWS console
One CloudFormation stack, about twenty minutes.
network
your VPC, three fixed egress IPs
cluster
EKS, in your region
access
a role scoped to Qovery
10–60 min

From there it is automatic. Your apps come up running and live on AWS, reachable on a public URL - while the Heroku stack keeps serving traffic untouched.

What it costs

You pay AWS. Usually a lot less.

Heroku charges you for dyno hours. AWS charges you for what you use - and as its customer you get Savings Plans, Reserved Instances, Graviton and Spot, none of which exist on a dyno-hour bill.

60%

Moving a workload off Heroku onto AWS usually cuts infrastructure cost - up to 60% for the same workload that was running on Heroku.

* Depends on your dyno counts and sizes, add-ons, data volume and region. A migration engineer will model your estate against the equivalent AWS shape before you commit to anything.

Specific to AWS

What you can do on AWS that a dyno bill cannot.

A dyno is billed at list price, per hour, in fixed sizes. The moment the workload runs in your own AWS account, three levers open up that have no equivalent on Heroku.

Savings Plans and Reserved Instances

Commit to a level of compute for one or three years and the same capacity costs materially less than on-demand. Heroku has no commitment tier to buy - you pay list for every dyno hour, forever. Qovery sizes the node groups; the commitment is made in your account, on your terms, and it applies to everything running there rather than to one app.

Graviton, for the same code

AWS's ARM instances generally give better price-performance than the x86 equivalent on ordinary web and worker loads. The agent builds your image for arm64 and Qovery schedules the node group onto Graviton, so this is a build-target change rather than a rewrite. On Heroku the underlying CPU is not something you get to choose.

Spot capacity for interruptible work

Batch jobs, queue workers and preview environments tolerate interruption; a checkout endpoint does not. Qovery keeps web services on on-demand nodes and places the interruptible pools on Spot, which is exactly the split a dyno-hour bill cannot express because every dyno costs the same regardless of how much it matters.
Qovery is not a PaaS

Our control plane. Your account, your bill.

Qovery sits above the infrastructure and never owns it. Every cluster, database and bucket is provisioned inside the AWS account you already hold - AWS invoices you directly.

  • We do not take a cut of your AWS spend. A flat subscription, whether your bill is $2k or $200k.
  • We push it the other way: idle nodes, oversized requests and preview environments left running get flagged so you stop paying for them.
  • Heroku and the PaaS successors run all of this in their account. Qovery runs it in yours.

Not sure which AWS services fit your workload? A solution engineer will map it with you.

QoveryCONTROL PLANE
deploymentsenvironmentspreview envsRBAC + auditcost signals
provisions standard Terraform and Kubernetes manifests
Your AWS account
invoiced by AWS, directly to you
VPC · your network policy
EKS clusterwebworkercronpreview-pr-482RDSElastiCacheS3secrets
IAM: yours · data residency: yours · audit trail: yours

Stop paying Qovery and the stack keeps running - the manifests and qovery/qovery Terraform are already in your account.

Leave Heroku

Your first app on AWS,
live within the hour.

Any commercial AWS region, with multi-region and multi-cluster from one control plane. Nothing you do here touches your existing Heroku stack until you decide to move the domain.

AWS Marketplace

Qovery is an AWS ISV Accelerate partner, available on AWS Marketplace. Spend transacts through your existing AWS agreement and counts toward an Enterprise Discount Program commitment.

View on AWS Marketplace →
Frequently asked

Heroku to AWS

Something not covered here? Talk to a migration engineer - they have done this on estates larger than yours.

How long does a Heroku to AWS migration take?

First app live in under an hour. Full estates finish in days: one team moved 37 applications off Heroku in under two hours, and Sofive migrated its entire full-stack application and database from a single Cursor prompt. The pace is set by your data and your change windows, not by the tooling.

Will migrating disrupt our running Heroku apps?

No. Nothing in the process modifies or removes anything on Heroku. Both stacks run in parallel until you move DNS, and you can move it back.

Can Qovery migrate our Heroku Postgres database to AWS?

Yes. Under 100 GB migrates live with minimal interruption. Larger datasets use a replication-based cutover rather than a dump and restore. The database lands in your own AWS account on Amazon RDS for PostgreSQL.

Is Qovery a PaaS?

No. Qovery installs into the cloud account you already own. You hold the cloud bill, the VPC, the cluster and the audit trail - the control plane is ours, the infrastructure is yours.

Can Qovery run the migration for us?

Yes. A Qovery solution engineer will run it with you end to end, database included - discovery of your existing Heroku services, the deployment plan, the data migration and the DNS cutover. Teams usually take this route when production data needs a replication-based cutover, or when compliance requires the whole path documented.

What happens if we stop using Qovery?

Everything keeps running. Qovery generates standard Terraform and native Kubernetes manifests in your account, so the estate outlives the subscription.

Can we buy Qovery through AWS Marketplace?

Yes. Qovery is an AWS ISV Accelerate partner. Spend transacts through your existing agreement and counts toward an EDP commitment, and AWS sales teams co-sell the migration with us.

Will Qovery deploy into our existing VPC?

Yes, but network configuration is fixed at cluster creation. If you need specific CIDR ranges, an existing VPC, or peering to other clusters, supply those requirements before the cluster is created - changing the VPC afterwards means creating a new cluster.

How does every Heroku primitive map to AWS?

On Heroku
On AWS
What changes
Web dyno
EKS pod on EC2
Autoscales on real CPU and memory utilisation, and the node group underneath can sit on Graviton, Spot or a Savings Plan. A dyno has one price and one shape.
Worker dyno
EKS pod in the same cluster
Long-running work without the 30-second router timeout.
Heroku Scheduler
Kubernetes CronJob
Real cron expressions instead of fixed ten-minute, hourly and daily buckets.
Heroku Postgres
Amazon RDS for PostgreSQL
Container mode for development, Amazon RDS for production - Multi-AZ failover, automated backups and point-in-time recovery, in your own account under your own KMS keys.
Heroku Key-Value Store
Amazon ElastiCache
ElastiCache, sized independently of the application rather than bought as an add-on plan, and reachable only from inside your VPC.
Add-on message brokers
Amazon MQ or a Helm chart
Deployed by Qovery as a service inside your environment.
Bucket add-ons and file storage
Amazon S3
Same account and same IAM boundary as the workloads that read it.
Config vars
Qovery variables and secrets
Scoped per project, environment and service, with aliases and overrides instead of one flat list.
Review apps
Preview environments
One per pull request, created on open and shut down when idle.
Pipelines
Environments and deployment stages
Ordered stages with approval gates, promoting the same artifact.
Heroku router and SSL
an AWS Network Load Balancer with managed TLS
A Network Load Balancer with certificates issued and renewed through AWS Certificate Manager. No per-domain SSL add-on.
Private Spaces
Your own VPC
You already own the VPC. Security groups, PrivateLink endpoints, peering and NAT egress are yours to define, and the three fixed egress IPs are stable for allowlisting.
Buildpacks
Dockerfile or Buildpacks
Both supported. The agent writes a Dockerfile if your repository does not have one.