Nobody's Fly.io invoice got smaller this year. On January 1, 2026, volume snapshots — previously a free, automatic part of running stateful Machines — became a metered line item at $0.08 per GB per month. Thirty-one days later, on February 1, inter-region private network traffic for Managed Postgres started billing at Fly.io's standard private-network data-transfer rates. Two things that used to read as "included" became meters within 60 days of each other, and neither one announced itself with a price cut anywhere else to soften the landing.
This post prices both meters with a worked monthly bill: a typical two-region app (two app Machines, a Managed Postgres primary plus one read replica, daily snapshots) priced line-by-line under the new Fly.io metering, against the same topology on owned Hetzner hardware where cross-region traffic and local backup copies are already-sunk flat capacity.
Then the sensitivity analysis — where the meters barely register, and where they multiply — and the general pattern worth naming about maturing pay-as-you-go platforms.
What exactly changed, and when
The timeline is short enough to quote in full. In late 2025, Fly.io announced that starting January 1, 2026, volume snapshots would bill at $0.08 per GB per month, with the first 10 GB free each month — first charges appearing on the early-February invoice. Then on December 3, 2025, a second announcement said that from February 2026, inter-region private network usage for Managed Postgres (MPG) would be billed at the same rate as existing private network usage, sharing the same free quota, with same-region traffic staying free. December invoices carried a zero-price preview line so teams could see their usage before the meter went live — a genuinely considerate move that also tells you the vendor knew the numbers would surprise people.
Scope matters, because the loose version of this story ("Fly.io now charges for all private networking") overstates it. The February meter covers Managed Postgres inter-region traffic: WAL streaming from a primary to a cross-region read replica, and app Machines in one region talking to a database cluster in another. Same-region private traffic is untouched. And the per-GB rates are Fly.io's existing data-transfer schedule, which is region-grouped:
| Traffic | Free quota | Metered rate |
|---|---|---|
| North America / Europe | 100 GB per month free | $0.02 per GB |
| Asia-Pacific / Oceania / South America | 30 GB per month free | $0.04 per GB |
| Africa / India | 30 GB per month free | $0.12 per GB |
Two details in that table do most of the work in the section below. First, the free quotas are small relative to what database replication actually moves — 100 GB sounds generous until a replica streams write-ahead logs across regions all month. Second, the Africa/India rate is six times the North America/Europe rate, so the region pair you pick is itself a cost decision now. East-west traffic used to be placement-neutral. It is not anymore.
The snapshot meter has its own quiet multiplier: Fly.io keeps automatic snapshots with multi-day retention, so the billed footprint is not your volume size — it is your volume size times the number of retained copies. A 10 GB database with seven retained daily snapshots is roughly 70 GB of snapshot storage, minus the 10 GB free allowance. Default retention policies doing their job is what makes the real cost run several multiples of the naive per-GB number.
The worked number: one two-region app, both invoices
Take a typical small-but-serious setup: two app Machines (one in iad, one in fra), a Managed Postgres primary in iad with one read replica in fra, a 10 GB data volume, automatic daily snapshots with seven copies retained, and roughly 150 GB a month of cross-region traffic (replica WAL streaming plus the fra app reading the iad primary). Nothing exotic — this is the reference HA topology Fly.io's own docs steer you toward.
App compute, base volume storage, and the database itself cost the same before and after these changes, so set them aside as constants. Here are only the lines that moved:
| New-meter line | Fly.io, 2026 metering | Same topology, owned Hetzner |
|---|---|---|
| Snapshots: ~70 GB stored (10 GB × 7 retained) | (70 − 10 free) × $0.08 = $4.80/mo | $0 marginal — rotating local copies on the box's own disk |
| Inter-region private traffic: 150 GB | (150 − 100 free) × $0.02 = $1.00/mo | $0 marginal — inside each box's 20 TB included traffic |
| New-meter subtotal | $5.80/mo | $0 marginal |
Five-eighty a month will not sink anyone, and intellectual honesty requires saying so up front. The Hetzner side of the same table is two CX22 cloud boxes (2 vCPU, 4 GB RAM, 40 GB disk, 20 TB of included traffic each) at about €3.79–4.59 a month apiece depending on whether you caught the June 2026 repricing — call it roughly $10 a month flat for the pair, inside which the 150 GB of cross-region traffic and the local backup copies vanish without a line item.
So the small-case verdict is genuinely mixed: Fly.io's new meters add a ~$6 surcharge to a bill that already includes compute, volumes, and the managed database, while the flat pair of boxes costs ~$10 all-in but leaves you operating Postgres replication and backup rotation yourself. There is no 5x gotcha here. The gotcha is in the next section, where every variable points the same direction.
Sensitivity: where the meters barely register, and where they multiply
A single number is an anecdote; four numbers are a cost model. Same app, one variable changed at a time:
- Bigger data, same retention. A 60 GB database with seven retained snapshots is ~420 GB of snapshot storage: (420 − 10) × $0.08 = $32.80 a month for backups alone — more than the compute it protects. Snapshot cost scales with data × retention, not with traffic, so it grows silently as the database grows. On the flat boxes, the same 60 GB needs a bigger disk or an attached volume, but there is still no per-GB-per-month meter ticking on every retained copy.
- Heavier replication. A write-heavy app pushing 1 TB a month across regions: (1000 − 100) × $0.02 = $18 a month of east-west transfer that was $0 last year. Replication traffic is the least compressible line on the invoice — you cannot cache WAL streaming or batch your way out of it.
- The other region groups. That same 1 TB in Africa/India regions: (1000 − 30) × $0.12 = $116.40 a month. The 6x regional multiplier turns a rounding error into the largest line on the bill, and it applies to exactly the deployments — serving users outside North America and Europe — whose operators shopped for global-anycast reach in the first place.
- The honest boundary: single-region. An app with everything in one region pays $0 of new networking charges — same-region traffic is explicitly free, and co-locating app Machines with the database cluster is Fly.io's own stated advice for reducing the bill. Only the snapshot meter still applies. If your users tolerate one region, the February change is not your problem. But note what that advice concedes: the platform is now financially rewarding you for not using the multi-region topology it spent years selling as the default.
Read the four together and the shape is clear. Each meter is small at the reference point and steep away from it — data growth, write throughput, region choice, and retention length all multiply independently. None of them is controllable the way compute is: you cannot autoscale your backup retention down at night or cache your replica stream. That uncontrollability is what makes new meters different from higher prices on old ones.
The pattern, not just the invoice
Zoom out one level and the two meters join a sequence: Fly.io removed its permanent free tier in 2024, started metering volume snapshots in January 2026, and started metering Managed Postgres inter-region traffic in February 2026. Three tightenings in roughly two years, each one aimed at something that was previously bundled into the base price closely enough that nobody modeled it. This is what maturing usage-based pricing looks like — not usually a headline rate hike, which customers can comparison-shop, but the quiet discovery of billable surface: traffic that flowed unmeasured gets measured, storage nobody purged gets priced, and each addition arrives with reasonable justification. (Inter-region traffic genuinely costs Fly.io money; their announcement says so plainly. The question was never whether it costs them — it is whether your architecture budget knew it would cost you.)
The budgeting consequence is the real product difference against flat hardware. An owned Hetzner box costs the same kind of number every month: the CX22's price moves only when Hetzner republishes the catalog, and 20 TB of included traffic absorbs everything from idle to incident without changing shape. A metered invoice, by contrast, changes shape between cycles — new lines appear, free quotas get consumed by growth you wanted, and the month you most need your replica (a regional incident, a traffic spike) is the month the east-west meter runs hottest. Flat pricing is not cheaper on every workload; it is legible on every workload, and legibility compounds for the team doing capacity planning in a spreadsheet.
The self-hosted side, stated honestly
None of the above erases what the flat number buys you out of. Two Hetzner boxes do not come with a managed Postgres control plane: failover, replica lag monitoring, point-in-time recovery, and backup-rotation scripts are yours to write and page on. Fly.io's snapshot meter, galling as a new line item, funds automatic daily snapshots with real retention that most self-hosted setups never actually implement — the modal self-hosted "backup strategy" is a cron job nobody tested restoring from. And multi-region on owned hardware means operating WireGuard meshes, cross-region monitoring, and your own incident response across data centers, where Fly.io's anycast and private networking work out of the box.
The honest decision rule: if you are single-region with a small database, stay where the managed control plane is — the new meters cost you a few dollars and the operations saving is worth far more. If you are multi-region with a growing database, heavy cross-region reads, or users in the $0.12 regions, price the two 2026 meters explicitly against a flat pair of boxes including the cost of your own on-call time for Postgres. The meters punish exactly the topologies — replicated, retained, global — that serious apps grow into, which is why "it is only $6" is true of the starting point and misleading about the trajectory.
The meter-expansion pattern is one reason to own the fleet the meters run on. Bex.co is the open-source, AI-native Render alternative — push a git repo, get a running HTTPS service on machines you own, with flat bandwidth instead of a per-GB meter. Star the repo on GitHub or deploy your first app today.
Sources
- We are going to start charging for volume snapshots from January 2026 — Fly.io community announcement (rate $0.08/GB/month, first 10 GB free, effective January 1, 2026)
- We are going to start charging for MPG inter-region private network usage from February 2026 — Fly.io community announcement, December 3, 2025 (same rate as existing private network usage, shared free quota, same-region free)
- Fly.io resource pricing — data-transfer schedule ($0.02/GB North America/Europe, $0.04 APAC/South America, $0.12 Africa/India; 100 GB / 30 GB free quotas) and volume storage ($0.15/GB/month provisioned)
- Cost management on Fly.io — volumes billing while detached, snapshot billing notice
- Vercel vs Hetzner in 2026 — CX22 specs (2 vCPU, 4 GB RAM, 40 GB NVMe, 20 TB traffic, ~€3.79/month)



