Skip to main content

Three Vendors Pitched You a Heroku Exit in 2026. Here's What All Three Guides Left Out.

12 min readDora NodaDora Noda
Share
On this page

On February 6, 2026, Heroku's chief product officer confirmed what the industry had whispered for years: the platform that invented git-push deploy was moving to a sustaining-engineering model — stability and security work, but no new features and no new Enterprise contracts. Within weeks, every vendor with a PaaS to sell had published a "next move" for the refugees.

Microsoft's Apps on Azure blog ran Heroku Entered Maintenance Mode — Here's Your Next Move, routing readers to Azure Container Apps. DigitalOcean shipped a Heroku comparison and a migration landing page promising a move "in as little as 2 days" with "up to 6x cheaper managed databases." Cloud66 published a vs-Heroku comparison claiming "up to 93% lower costs" on your own cloud servers.

Each guide is directionally honest about its own strengths. Each is also systematically silent about the same three things: the meters on the new platform, the add-on-to-service mapping that re-creates the same bill shape under a different logo, and the migration labor it books as your problem. This post is the reader's guide to all three omissions — plus the one exit no vendor guide will pitch. So here is the number first, then the evidence behind it.

The bill, totaled​

The reference app is a typical small-production Heroku setup: two Standard-1X web dynos and one Standard-1X worker ($25 each), Postgres Standard-0 ($50), Key-Value Store Premium-0 ($15), and a log drain (~$7). That is $147/mo on Heroku's published list prices, with egress unmetered. Base case below: 100 GB of monthly egress and 10 GB of monthly log volume.

Line itemHeroku (today)DigitalOceanAzure Container AppsCloud66 (on DO VMs)Owned box
App compute, 3 × ~1 vCPU/1 GB$75 (3 × Standard-1X)$30 (3 × $10 fixed)~$58 (metered vCPU/GiB-s + requests)$48 (2 × $24 VMs)included
Postgres$50 (Standard-0, HA)$15 single-node / $30 HA~$19 (B1ms burstable)self-hosted on your VMsself-hosted
Redis / Valkey$15 (Premium-0)$15~$20 (Basic)self-hostedself-hosted
Log ingestion, 10 GB~$7 (drain)$0 (forwarding incl.)~$28 (per-GB)$0$0
Registry$0$0$5 (ACR Basic)$0$0
Platform fee$0$0$0$29 (subscription)$0
Machines + backups———~$8 (backup storage)~$110 (dedicated, setup amortized)
Egress, 100 GB$0$0 (inside included transfer)$0 (inside 100 GB free)$0$0
Total$147$60 / $75 HA~$130~$85~$110
Delta vs Heroku—−$87 / −$72−$17−$62−$37

Three things jump out. First, DigitalOcean's headline holds up best — but only at the single-node database tier, which is not what Heroku Standard-0 buyers are getting (more on that below). Second, Azure barely beats Heroku at low traffic despite the guide's enthusiasm, because the guide prices compute while the bill prices everything else. Third, nobody's guide shows you a table shaped like this one, with every row totaled and every total differenced.

The rest of this post is why.

The sensitivity your bill actually depends on: egress​

Heroku never metered egress as a line item — third-party comparisons track it as an unpublished soft limit around 2 TB per app per month — so teams leaving it have no muscle memory for what bandwidth costs elsewhere. Every destination above reintroduces the meter in a different place. The table below prices egress alone at three volumes; the 100 GB column matches the base case above.

Monthly egressHerokuDigitalOceanAzureCloud66Owned box
100 GB$0$0$0$0$0
1 TB$0~$14 (over included transfer, $0.02/GB)~$78 (over 100 GB free, $0.087/GB)depends on your cloud (below)$0
5 TBsoft-cap territory (~2 TB/app, unpublished)~$94~$426depends on your cloud (below)$0 (inside 20 TB)

DigitalOcean's $10 fixed containers each include 100 GB of transfer (pricing docs), so the reference app starts with 300 GB pooled and pays $0.02/GB past that. Azure gives 100 GB free account-wide, then charges $0.087/GB in Zone 1. At 1 TB, Azure's all-in bill from the previous section jumps from ~$130 to ~$208 — suddenly the most expensive landing, 40% above the Heroku bill you were fleeing. At 5 TB it is ~$556 against the owned box's flat ~$110.

Cloud66's row is the subtlest because Cloud66 has no egress meter of its own — it inherits whichever cloud you bolt it to. On DigitalOcean droplets with terabytes of pooled transfer, the 5 TB cell is $0. On AWS, where egress past the free 100 GB runs $0.09/GB, the same cell is ~$450.

"No vendor lock-in" is true of the control plane and false of the invoice: pick AWS as the substrate and you have re-created the hyperscaler meter under a DevOps-platform logo. Ask any Cloud66-shaped pitch which cloud the percentage assumed.

Omission 1: the meters​

DigitalOcean: "up to 6x cheaper managed databases." The $15/mo entry managed database is real (DO pricing), and against Heroku Postgres Standard-0's $50 it looks like more than 3x. But the $15 tier is a single node with 10 GB of disk, while Standard-0 is a 64 GB highly available setup with automated failover. The like-for-like DO configuration adds a standby node and doubles to $30/mo — still cheaper, roughly 1.7x, not 6x — and the overage that matters at scale, bandwidth past included transfer, sits one docs page away from the guide's pricing.

Azure: the guide prices compute; the bill prices everything else. Microsoft's post is genuinely useful on the migration mechanics — the author migrated a real Heroku app to pressure-test the experience — but follow its costing and you will miss four line items. Container Apps bills metered vCPU-seconds and GiB-seconds past a monthly grant of 180,000 vCPU-s, 360,000 GiB-s, and 2M requests; a 3-replica always-on service lands around $58/mo, not near zero.

The burstable B1ms Postgres the guide implies lists at $12.41/mo plus storage, roughly $19 with the 32 GB minimum — single-zone, where Heroku Standard-0 includes HA. Log ingestion into Log Analytics bills per GB (~$2.76/GB pay-as-you-go), so the 10 GB of logs Heroku drained for $7 cost ~$28. And the container registry (ACR Basic, ~$5/mo) plus egress complete a bill where compute is less than half the total.

Cloud66: "up to 93% lower costs." Against what baseline, on which cloud, and counting whose labor? The 93% number compares Heroku list prices against cheap cloud VMs without always surfacing the two lines Cloud66 adds back: the platform subscription (paid plans from $29/mo) and the cloud bill itself, which you still pay in full. The deeper meter is operational: Cloud66's "managed databases" run on your own servers, which means patching, backups, and failover are tooling-assisted but ultimately yours. That is a legitimate trade — many teams prefer it — but it is not the same product as Heroku Postgres, and pricing it as a pure saving books your on-call hours at zero.

Omission 2: the mapping​

Nobody runs bare dynos. The typical Heroku app arrives with an entourage — Postgres, Key-Value Store, Scheduler, a logging add-on, review apps and pipelines — and each member needs a new home with its own bill and its own parity gaps:

Heroku add-onDigitalOceanAzureCloud66
Postgres (+ followers, extensions)Managed PG; followers via read-only nodes; verify extension listFlexible Server; HA is zone-redundant at ~2x burstableSelf-hosted on your VM; replication you configure
Key-Value StoreManaged Valkey from $15Cache/Managed Redis from ~$16–20Self-hosted Valkey/Redis
SchedulerApp Platform jobsContainer Apps JobsCron on your box
Papertrail / log drainsLog forwarding with retention limitsLog Analytics, per-GB ingested + retainedSelf-hosted Loki/ELK, your disk
Review apps + pipelinesPR preview deploys (closest match)Preview environments need pipeline workBranch deploys, no Heroku-style promote flow

Credit where each guide earns it: DigitalOcean genuinely runs the same Cloud Native Buildpacks as Heroku, so the app itself often redeploys with minimal changes, and its PR preview deploys are the closest thing any guide offers to review apps. Microsoft's guide is the most honest about application mechanics. Cloud66 is the most honest about control — SSH access, no 30-second request timeout, persistent storage — because there is no shared platform left to say no.

The systematic gap is the follower database and the extension list. Heroku Postgres followers, forks, and pg:copy have no one-click equivalent on any destination; each becomes a read replica you provision and a cutover you rehearse. Extensions beyond the basics (PostGIS, pgvector, Timescale, pg_cron) need a per-target availability check before migration week, not during it. None of the three guides puts that check in its happy path.

Omission 3: the labor​

DigitalOcean's "as little as 2 days" is doing a lot of work with "as little as." Two days is achievable for a stateless web app with a toy database and no background jobs. For the reference app in this post — worker dyno, 10+ GB database, scheduler jobs, log drains — a realistic budget looks like this:

TaskRealistic cost
App re-platforming (buildpacks / Dockerfile / manifests + env + secrets)2 hours – 2 days, depending on destination
Data migration (dump/restore + verify) plus cutover window4–8 hours elapsed, plus a rehearsal
Extension + follower parity (per-target checks, replica setup)2–8 hours
Add-on re-creation (jobs, drains, Redis rotation, error tracking)~1 day
DNS/TLS cutover + rollback rehearsal~half a day
Staging parity + load/smoke testing1–2 days
Total~4–8 working days

The guides book every row of that table as the reader's problem while headlining the calendar time of the easiest row. The honest version of "2 days" is "2 days of platform work plus a week of your team's verification," and the team doing the verification is the same team that is already behind on roadmap because their platform announced sustaining mode. Price the migration in engineer-days, not landing-page days, and the cheapest destination is the one you migrate to exactly once.

The exit no vendor pitches​

Here is the option absent from all three guides: the same twelve-factor app, unchanged in every way that matters, on flat-rate hardware you own. A single Hetzner-class dedicated box (8 cores, 64 GB RAM, NVMe) lists around $110/mo all-in with setup amortized, runs the web tier, the worker, Postgres, and Valkey on one machine with room to spare, and absorbs the reference app's egress inside 20 TB of included transfer — the 5 TB column that costs $426 on Azure costs $0 here.

The migration labor is identical to any other move: containerize once, dump and restore once, cut DNS once. What differs is the resulting bill, which has no per-unit meter left in it.

The second dyno is free. The follower database is free. The next terabyte is free.

That is also the honest boundary of the pitch. The $110 buys machines, not outcomes: failover, backup-restore testing, Postgres upgrades, and on-call are yours unless you automate them like a platform team.

The managed premium on every other row of the totaled table is, at its best, the cheapest on-call engineer a small team will ever hire. But when the guides omit the meters, the mapping, and the labor, they are not selling you that engineer — they are selling you a second lock-in with better marketing. Read them with the spreadsheet open.

Bex.co is the open-source, AI-native Render alternative — push a git repo, get a running HTTPS service on machines you own. Star the repo on GitHub or deploy your first app today.

Six questions for any exit guide​

  1. Where is the totaled bill? Compute-only pricing is a down payment, not a quote. Demand every row: database HA parity, cache, logs, registry, plan fees.
  2. What does egress cost at my volume? Run your actual trailing-twelve-months transfer through the new meter, not the guide's implicit zero.
  3. Is the database comparison HA-to-HA? Single-node-to-HA price ratios are the oldest trick in the comparison book.
  4. Where is my add-on map? Every follower, fork, extension, scheduled job, and drain needs a named destination before migration week.
  5. Who pays the labor, in engineer-days? "2 days" of platform work plus a week of verification is a 4–8 day migration. Budget it.
  6. What meters survive the move? The winning exit is the one that leaves the fewest per-unit meters on your invoice — count them before you sign.

Related articles

Check your move before you migrate

Free browser tools: check a render.yaml or your Render scripts against bex, or turn a Heroku app or docker-compose.yml into a draft render.yaml. Nothing you paste leaves your browser.

Open the migration tools