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

Heroku to Google Cloud in an hour.
Fully automated.

One command. An agent reads your repository and deploys it into the Google Cloud project 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 account key provisions the network and a GKE cluster in your own project - 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 Google Cloud console
One service account, about twenty minutes.
network
your VPC, three fixed egress IPs
cluster
GKE, 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 Google Cloud, reachable on a public URL - while the Heroku stack keeps serving traffic untouched.

What it costs

You pay Google Cloud. Usually a lot less.

Heroku charges you for dyno hours. Google Cloud charges you for what you use - and as its customer you get committed use discounts, sustained use discounts and Spot VMs, none of which exist on a dyno-hour bill.

60%

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

Specific to Google Cloud

What Google Cloud gives you that a dyno tier cannot.

Heroku sells you a fixed dyno size at list price. Google Cloud prices the machine you actually asked for, and discounts it whether or not you negotiate.

Sustained use discounts you do not have to ask for

Google Cloud applies sustained use discounts automatically to instances that run for a large part of the month, and committed use discounts on top if you commit for one or three years. The first of those needs no contract and no forecast - it simply happens because the workload is long-running, which is precisely what a web service is.

Custom machine types

Google Cloud lets you define the exact vCPU and memory a service needs instead of rounding up to the next fixed shape. This is the direct opposite of dyno tiers, where a service that wants slightly more memory has to buy a whole size class more of everything. A memory-heavy worker and a CPU-heavy API stop subsidising each other.

BigQuery and Vertex AI over internal networking

If your data or model serving already lives in Google Cloud, running the applications in the same project means reaching them over internal networking with Workload Identity rather than public endpoints and long-lived service account keys. From Heroku, every one of those calls leaves the platform and is authenticated with a static credential in a config var.
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 Google Cloud project you already hold - Google Cloud invoices you directly.

  • We do not take a cut of your Google Cloud 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 Google Cloud 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 Google Cloud project
invoiced by Google Cloud, directly to you
VPC · your network policy
GKE clusterwebworkercronpreview-pr-482Cloud SQLMemorystoreCloud 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 Google Cloud,
live within the hour.

Any Google Cloud 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 Google Cloud

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

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

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 Google Cloud project on Cloud SQL 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.

Do our Google Cloud committed use discounts apply?

Yes. Workloads run on GKE inside your own project, so committed use discounts, sustained use discounts and any negotiated pricing apply exactly as they do to the rest of your estate. On Heroku you pay for dyno hours and no volume commitment is available to you at all.

Can our applications reach BigQuery and Vertex AI directly?

Yes. Because the cluster runs inside your own project, workloads reach BigQuery, Vertex AI, Pub/Sub and Cloud Storage over Google internal networking, authenticated with Workload Identity rather than long-lived keys.

We already run a GKE cluster. Can Qovery use it?

Yes. Qovery can install onto an existing GKE cluster instead of creating one, which is the usual path when a platform team has already standardised on a network design or a node pool layout.

How does every Heroku primitive map to Google Cloud?

On Heroku
On Google Cloud
What changes
Web dyno
GKE pod on Compute Engine
Autoscales on real utilisation, and because Google Cloud supports custom machine types the node shape matches what the service actually needs instead of the next tier up.
Worker dyno
GKE 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
Cloud SQL for PostgreSQL
Container mode for development, Cloud SQL for production - high availability, automated backups and point-in-time recovery, reachable over private IP rather than a public endpoint.
Heroku Key-Value Store
Memorystore for Redis
Memorystore, sized independently of the application and attached to your VPC over private service access.
Add-on message brokers
Pub/Sub or a Helm chart
Deployed by Qovery as a service inside your environment.
Bucket add-ons and file storage
Cloud 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
Cloud Load Balancing with managed TLS
Cloud Load Balancing with Google-managed certificates, issued and renewed automatically, on the global anycast frontend.
Private Spaces
Your own VPC
You already own the VPC. Firewall rules, Private Service Connect, VPC peering and Cloud NAT egress are yours, and Workload Identity replaces long-lived service account keys.
Buildpacks
Dockerfile or Buildpacks
Both supported. The agent writes a Dockerfile if your repository does not have one.