Fly.io vs Heroku
SEPT 2026 auditA comparison of Fly.io and Heroku built from values read directly from each provider's own documentation, with the source recorded against every figure.
Adoption share
HTTP Archive counts — how much more of the web runs Fly.io than Heroku, among the origins HTTP Archive actually detects. Measured . Source: HTTP Archive.
The short answer
Choose Fly.io if…
Workloads that ship as Docker images and need placement in particular regions. Billing is purely usage-based with no plan tiers, which suits spiky or region-pinned traffic better than a flat monthly fee.
Editorial · Palash Bagchi · approved
Choose Heroku if…
Teams that want to deploy by pushing to Git and let the platform handle the runtime, with Postgres, a scheduler and Docker deploys available on the same platform.
Editorial · Palash Bagchi · approved
Consider something else if…
- Fly.io: You want a predictable flat bill rather than charges that track the resources provisioned for each app.
- Heroku: The dyno filesystem is ephemeral, and a web process must respond within 30 seconds of receiving a request.
Neither quite fits? Every other option, ranked by iScore: Fly.io alternatives · Heroku alternatives
13 sourced criteria separate them — see where, with sources, below.
Pick the criteria you care about. The chart counts how many of them lean toward each provider — the same read as scanning the bars below, just totalled for the ones you chose.
Fly.io 0
Heroku 0
At a glance.
| Criterion | Fly.io | Heroku |
|---|---|---|
| Pricing | ||
| Pricing model | Usage-based, no compute plan tiers; billing is pro-rated for the time resources are provisioned. | Usage-based on wall-clock time, prorated to the second |
| When you exceed a cap | No plan cap to exceed — Fly bills per second for provisioned resources. The only documented enforcement is unspecified automated scaling limits, which surface as an error message (platform-wide, all plans) | Service sleeps: on the Eco plan ($5/month for a 1000 dyno-hour pool, the cheapest paid tier) exhausting the pool forces every Eco dyno on the account to sleep for the rest of the month, and extra hours cannot be bought |
| Limits | ||
| Memory (entry plan) | 256 MB on shared-cpu-1x, the cheapest Machine at $1.94/month in Ashburn (iad), the region the pricing table shows by default. | 0.5 GB RAM on the Eco dyno ($5 flat/month, the cheapest paid dyno) and 0.5 GB on Basic. |
| File, inode or volume limit | 8 GB rootfs (deployed image) limit per Machine, platform-wide on all plans; exceeding it fails the image push at deploy time | 1000 MB maximum compressed slug size, platform-wide on all plans; raisable via support ticket |
| Execution | ||
| Streaming response limit | No duration or size ceiling documented. Streaming works, but Fly Proxy buffers responses before compressing them, so progressive server-side rendering needs Content-Encoding: none set on those responses. | Platform-wide (router): 30 seconds to send the first byte, then a rolling 55-second idle window — if no data is sent for 55 seconds the connection is terminated |
| Managed connection pooling | Supported | Limited |
| Deployment | ||
| Git deployment | Limited | Supported |
| Docker deployment | Supported | Supported |
| Scheduled jobs | Limited | Supported |
| Infrastructure | ||
| Persistent processes | Supported — A stopped or suspended Machine still bills for its root filesystem at $0.15 per GB per month. | Supported |
| Persistent storage | Supported | Not supported |
| Managed databases | Supported | Supported |
| Scales to zero | Supported | Limited |
| Autoscaling | Limited — Two forms: autostop/autostart of existing Machines, and metrics-based autoscaling. | Limited |
| Regions | 17 regions | 2 regions on the Common Runtime, which is what a standard dyno runs in: eu (Europe) and us (United States). A further 10 — Dublin, Frankfurt, London, Montreal, Mumbai, Oregon, Singapore, Sydney, Tokyo and Virginia — exist only in Private Spaces, an Enterprise product. |
| Support | ||
| Support on entry paid plan | Community support is free. Paid support is a separate subscription on top of compute, not a plan tier: Standard $29/month, Premium $199/month. | Ticket-based support to technical or billing staff for all customers. Heroku Enterprise adds Salesforce Success Plans — Standard, Premier and Signature — which are what buy a named contact and a committed response. |
| Response time commitment | 36-hour first response on Standard, the cheapest paid support plan at $29/month. | Best effort for a business-stopping issue on the plans any customer can buy. Heroku Enterprise Success Plans commit to 2 days in business hours, 1 hour, or 15 and 30 minute updates. Business hours are Monday to Friday, 9am-9pm Eastern. |
Where they differ.
Pricing model
- Fly.io
- Usage-based, no compute plan tiers; billing is pro-rated for the time resources are provisioned.
- Heroku
- Usage-based on wall-clock time, prorated to the second
Sources (2) →Sources ↓
- Pricing — Fly.io Docs ↗
“Plans get complicated, so we just charge based on usage. Pick and choose which pieces you need for your application; that's all you'll see on your invoice.”
Read 2026-09-14 · official docs · Report a correction
- Usage & Billing | Heroku Dev Center ↗
“Heroku computes usage from wall-clock time, not CPU time. Any dynos scaled above 0 accrue usage, regardless of traffic or activity. Heroku prorates all costs to the second.”
Read 2026-09-05 · official docs · Report a correction
When you exceed a cap
- Fly.io
- No plan cap to exceed — Fly bills per second for provisioned resources. The only documented enforcement is unspecified automated scaling limits, which surface as an error message (platform-wide, all plans)
- Heroku
- Service sleeps: on the Eco plan ($5/month for a 1000 dyno-hour pool, the cheapest paid tier) exhausting the pool forces every Eco dyno on the account to sleep for the rest of the month, and extra hours cannot be bought
Sources (2) →Sources ↓
- Fly.io Resource Pricing · Fly Docs ↗
“Organizations may be subject to automated scaling limits to prevent abuse or to help with capacity planning. Email the address in the error message if you run into such a limit and it's getting in your way.”
Read 2026-09-05 · official pricing · Report a correction
- Eco Dyno Hours | Heroku Dev Center ↗
“When you use all your Eco dyno hours for a given month, all Eco dynos on your account are forced to sleep for the rest of the month. You can't purchase additional dyno hours.”
Read 2026-09-05 · official docs · Report a correction
Memory (entry plan)
256 MB on shared-cpu-1x, the cheapest Machine at $1.94/month in Ashburn (iad), the region the pricing table shows by default.
0.5 GB RAM on the Eco dyno ($5 flat/month, the cheapest paid dyno) and 0.5 GB on Basic.
Sources (2) →Sources ↓
- Fly.io Resource Pricing - Fly.io ↗
“CPU(s) RAM Price/second Price/hour Price/month shared-cpu-1x 1 shared 256MB $0.00000075 $0.0027 $1.94 512MB $0.00000123 $0.0044 $3.19”
Read 2026-09-27 · official docs · Report a correction
- Dyno Types — Heroku Dev Center ↗
“Runtime Plan Memory (RAM) CPU Share Compute $/Month Dyno Units Consumed Dedicated Sleeps Eco 0.5 GB 1x 1x-4x $5 flat* N/A No”
Read 2026-09-14 · official docs · Report a correction
File, inode or volume limit
- Fly.io
- 8 GB rootfs (deployed image) limit per Machine, platform-wide on all plans; exceeding it fails the image push at deploy time
- Heroku
- 1000 MB maximum compressed slug size, platform-wide on all plans; raisable via support ticket
Sources (2) →Sources ↓
- Troubleshoot your deployment · Fly Docs ↗
“Machines have an 8GB rootfs limit.”
Read 2026-09-05 · official docs · Report a correction
- Limits | Heroku Dev Center ↗
“The default maximum allowed slug size (after compression) is 1000 MB.”
Read 2026-09-05 · official docs · Report a correction
Streaming response limit
- Fly.io
- No duration or size ceiling documented. Streaming works, but Fly Proxy buffers responses before compressing them, so progressive server-side rendering needs Content-Encoding: none set on those responses.
- Heroku
- Platform-wide (router): 30 seconds to send the first byte, then a rolling 55-second idle window — if no data is sent for 55 seconds the connection is terminated
Sources (2) →Sources ↓
- Content Encoding — Fly Docs ↗
“The proxy buffers responses before compressing them. That can break HTML streaming—e.g., progressive server-side rendering. To avoid buffering, disable compression by setting Content-Encoding: none for those responses”
Read 2026-09-05 · official docs · Report a correction
- Request Timeout | Heroku Dev Center ↗
“Heroku supports HTTP features such as long-polling and streaming responses. An application has an initial 30 second window to respond with a single byte back to the client. However, each byte transmitted thereafter (either received from the client or sent by your application) resets a rolling 55 second window. If no data is sent during the 55 second window, the connection will be terminated.”
Read 2026-09-05 · official docs · Report a correction
Managed connection pooling
- Fly.io
- Supported
- Heroku
- Limited
Sources (2) →Sources ↓
- Cluster configuration options ↗
“All Managed Postgres clusters come with PGBouncer for connection pooling, which helps manage database connections efficiently. You can configure how PGBouncer assigns connections to clients by changing the pool mode.”
Read 2026-09-05 · official docs · Report a correction
- Server-Side Connection Pooling for Heroku Postgres | Heroku Dev Center ↗
“Server-side connection pooling is available for Standard, Premium, Private, and Shield-tier databases. [...] Server-side connection pooling isn't available for Essential-tier databases.”
Read 2026-09-05 · official docs · Report a correction
Git deployment
- Fly.io
- Limited
- Heroku
- Supported
Sources (2) →Sources ↓
- Continuous deployment with GitHub Actions — Fly Docs ↗
“push to the repository's master branch. If your repository uses a default branch other than master, such as main, then you should change that here. [...] jobs: deploy: name: Deploy app runs-on: ubuntu”
Read 2026-09-07 · official docs · Report a correction
- Deploying with Git | Heroku Dev Center ↗
“To deploy your app to Heroku, use the git push command to push the code from your local repository's main branch to your heroku remote.”
Read 2026-09-05 · official docs · Report a correction
Scheduled jobs
- Fly.io
- Limited
- Heroku
- Supported
Sources (2) →Sources ↓
- fly machine run · Fly Docs ↗
“Use the --schedule flag to set the Machine's config.schedule property, which starts the Machine on a fuzzy hourly, daily, weekly, or monthly cycle.”
Read 2026-09-05 · official docs · Report a correction
- Heroku Scheduler | Heroku Dev Center ↗
“Scheduler is a free add-on for running jobs on your app at scheduled time intervals, much like cron in a traditional server environment.”
Read 2026-09-05 · official docs · Report a correction
Persistent storage
- Fly.io
- Supported
- Heroku
- Not supported
Sources (2) →Sources ↓
- Fly Volumes overview · Fly Docs ↗
“Fly Volumes are local persistent storage for Fly Machines.”
Read 2026-09-05 · official docs · Report a correction
- Dynos (App Containers) | Heroku Dev Center ↗
“Each dyno gets its own ephemeral filesystem, with a fresh copy of the most recently deployed code. During the dyno's lifetime, its running processes can use the filesystem as a temporary scratchpad, but no files that are written are visible to processes in any other dyno.”
Read 2026-09-05 · official docs · Report a correction
Scales to zero
- Fly.io
- Supported
- Heroku
- Limited
Sources (2) →Sources ↓
- Automatically stop and start Machines · Fly Docs ↗
“Use autostop/autostart to automatically start and stop or suspend existing Machines based on incoming requests. [...] you don't pay for their CPU and RAM when they're in a stopped or suspended state.”
Read 2026-09-05 · official docs · Report a correction
- Eco Dyno Hours | Heroku Dev Center ↗
“If an app has an Eco web dyno, and that dyno receives no web traffic in a 30-minute period, it sleeps. In addition to the web dyno sleeping, if you have a worker Eco dyno, it also sleeps. Eco web dynos do not consume Eco dyno hours while sleeping.”
Read 2026-09-05 · official docs · Report a correction
Regions
17 regions
2 regions on the Common Runtime, which is what a standard dyno runs in: eu (Europe) and us (United States). A further 10 — Dublin, Frankfurt, London, Montreal, Mumbai, Oregon, Singapore, Sydney, Tokyo and Virginia — exist only in Private Spaces, an Enterprise product.
Sources (2) →Sources ↓
- Regions - Fly.io Documentation ↗
“You can host your apps in any of the following regions. Region ID Region Location Gateway MPG ams Amsterdam, Netherlands ✓ ✓ arn Stockholm, Sweden ✓ cdg Paris, France ✓ dfw Dallas, Texas (US) ✓ ✓ ewr Secaucus, NJ (US) ✓ fra Frankfurt, Germany ✓ ✓ gru Sao Paulo, Brazil ✓ iad Ashburn, Virginia (US) ✓ ✓ jnb Johannesburg, South Africa lax Los Angeles, California (US) ✓ ✓ lhr London, United Kingdom ✓ ✓ nrt Tokyo, Japan ✓ ✓ ord Chicago, Illinois (US) ✓ ✓ sin Singapore, Singapore ✓ ✓ sjc San Jose, California (US) ✓ ✓ syd Sydney, Australia ✓ ✓ yyz Toronto, Canada ✓ ✓”
Read 2026-09-27 · official docs · Report a correction
- Regions | Heroku Dev Center ↗
“eu Europe Common Runtime us United States Common Runtime dublin Dublin, Ireland Private Spaces frankfurt Frankfurt, Germany Private Spaces london London, United Kingdom Private Spaces montreal Montreal, Canada Private Spaces mumbai Mumbai, India Private Spaces oregon Oregon, United States Private Spaces singapore Singapore Private Spaces sydney Sydney, Australia Private Spaces tokyo Tokyo, Japan Private Spaces virginia Virginia, United States Private Spaces”
Read 2026-09-05 · official docs · Report a correction
Support on entry paid plan
- Fly.io
- Community support is free. Paid support is a separate subscription on top of compute, not a plan tier: Standard $29/month, Premium $199/month.
- Heroku
- Ticket-based support to technical or billing staff for all customers. Heroku Enterprise adds Salesforce Success Plans — Standard, Premier and Signature — which are what buy a named contact and a committed response.
Sources (2) →Sources ↓
- Fly.io Pricing ↗
“Support Community support is free and always has been. The paid plans add an easily nerd-sniped support team that feels like an extension of your own.”
Read 2026-09-14 · official pricing · Report a correction
- Heroku Support ↗
“Heroku Enterprise customers have access to a range of Salesforce Success Plans that offer additional guidance and support. All Customers Standard Success SELF-GUIDED RESOURCES Premier Success EXPERT GUIDANCE Signature Success PROACTIVE, PERSONALIZED PARTNERSHIP”
Read 2026-09-14 · official site · Report a correction
Response time commitment
- Fly.io
- 36-hour first response on Standard, the cheapest paid support plan at $29/month.
- Heroku
- Best effort for a business-stopping issue on the plans any customer can buy. Heroku Enterprise Success Plans commit to 2 days in business hours, 1 hour, or 15 and 30 minute updates. Business hours are Monday to Friday, 9am-9pm Eastern.
Sources (2) →Sources ↓
- Fly.io Pricing ↗
“Standard $29 / mo Basic support for single developers and small teams. Great for personal projects and startups. 36-hour first response time Technical architecture support”
Read 2026-09-14 · official pricing · Report a correction
- Heroku Support ↗
“Business Stopping Issue Response Times Best effort 2 days, during business hours* 1 hour 15 and 30 minute updates Other Issue Response Times Best effort 2 days, during business hours* 2 days, during business hours* 2 days, during business hours*”
Read 2026-09-14 · official site · Report a correction
When these numbers change, hear about it. Sources are re-checked monthly; a repricing goes out as a short note.
Documented by only one.
These criteria are published by one provider and not the other. An absence here means we have not found a source, not that the feature is missing — except where we say we read the other provider's own page on a given date and it does not state it. Those rows lean, and the provider can correct them with a link.
Questions this comparison answers.
When you exceed a cap: Fly.io or Heroku?
Fly.io: No plan cap to exceed — Fly bills per second for provisioned resources. The only documented enforcement is unspecified automated scaling limits, which surface as an error message (platform-wide, all plans)
Heroku: Service sleeps: on the Eco plan ($5/month for a 1000 dyno-hour pool, the cheapest paid tier) exhausting the pool forces every Eco dyno on the account to sleep for the rest of the month, and extra hours cannot be bought
Should I choose Fly.io or Heroku?
Pick Fly.io if Workloads that ship as Docker images and need placement in particular regions. Billing is purely usage-based with no plan tiers, which suits spiky or region-pinned traffic better than a flat monthly fee.
Pick Heroku if Teams that want to deploy by pushing to Git and let the platform handle the runtime, with Postgres, a scheduler and Docker deploys available on the same platform.

Comments are hosted by EchoThread, which sets cookies and offers social sign-in. Like the analytics on this site, it does not load until you accept — see the privacy page.