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

Heroku to Azure in an hour.
Fully automated.

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

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 the cloud 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 service principal provisions the network and an AKS cluster in your own subscription - 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 Azure console
One service principal, about twenty minutes.
network
your VPC, three fixed egress IPs
cluster
AKS, 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 Azure, reachable on a public URL - while the Heroku stack keeps serving traffic untouched.

What it costs

You pay Azure. And it counts toward your commitment.

Heroku charges you for dyno hours, and none of it counts toward anything. Azure charges you for what you use - and the spend draws down your Enterprise Agreement or MACC commitment like any other Azure workload.

60%

Moving a workload off Heroku onto Azure 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 Azure shape before you commit to anything.

Specific to Azure

Why Azure is different if you are already a Microsoft shop.

For most teams the Azure argument is not really about compute pricing. It is that the money and the identity are already there, and Heroku sits outside both.

Spend counts toward your EA or MACC

If your organisation has an Enterprise Agreement or a Microsoft Azure Consumption Commitment, you have already promised Microsoft a level of spend. Workloads running on Heroku contribute nothing toward it - you are paying Salesforce while separately owing Microsoft a commitment. Move them to your own subscription and the same compute draws down an obligation you are committed to regardless.

Entra ID decides who deploys where

Access is governed by the directory you already run. SAML SSO against Entra ID, your existing groups, and conditional access policies determine who can deploy to production - rather than a separate list of Heroku collaborators that no one reconciles against leavers.

Reservations and the Azure savings plan for compute

Reserved instances for the steady-state footprint, the savings plan for compute where the shape moves around, and Spot for interruptible pools. All three are priced against your subscription. On a dyno bill there is nothing to reserve and nothing to discount.
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 Azure subscription you already hold - Azure invoices you directly.

  • We do not take a cut of your Azure 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 Azure 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 Azure subscription
invoiced by Azure, directly to you
VPC · your network policy
AKS clusterwebworkercronpreview-pr-482Azure DatabaseAzure CacheBlob Storagesecrets
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 Azure,
live within the hour.

Any Azure 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.

Frequently asked

Heroku to Azure

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

How long does a Heroku to Azure 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 Azure?

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 Azure subscription on Azure Database 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 this burn our existing Azure commitment?

Yes. Compute runs on AKS in your own subscription, so the spend counts toward an Enterprise Agreement or a Microsoft Azure Consumption Commitment exactly like any other Azure workload. Money spent with Heroku counts toward neither.

Does Qovery work with Entra ID for single sign-on?

Yes. Qovery supports SAML single sign-on, so access is governed by the same Entra ID groups and conditional access policies as the rest of your Microsoft estate.

Does the workload stay inside our tenant?

Yes. The AKS cluster, the databases and the application data all live inside your own Azure subscription and your own virtual network. Qovery operates them through the Azure API and never hosts your workloads.

How does every Heroku primitive map to Azure?

On Heroku
On Azure
What changes
Web dyno
AKS pod on Azure Virtual Machines
Autoscales on real utilisation, and the underlying node pool can carry a reservation, the savings plan for compute, or Spot - all billed to your subscription.
Worker dyno
AKS 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
Azure Database for PostgreSQL
Container mode for development, Azure Database for PostgreSQL Flexible Server for production - zone-redundant high availability, automated backups, and private endpoint access only.
Heroku Key-Value Store
Azure Cache for Redis
Azure Cache for Redis, sized independently of the application and reachable over a private endpoint inside your virtual network.
Add-on message brokers
Azure Service Bus or a Helm chart
Deployed by Qovery as a service inside your environment.
Bucket add-ons and file storage
Azure Blob Storage
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 Azure Load Balancer with managed TLS
An Azure Load Balancer with managed TLS, certificates issued and renewed automatically, and no per-domain SSL add-on to buy.
Private Spaces
Your own VPC
You already own the virtual network. NSGs, private endpoints, peering and NAT gateway egress are yours, and Entra ID governs who can change any of it.
Buildpacks
Dockerfile or Buildpacks
Both supported. The agent writes a Dockerfile if your repository does not have one.