Skip to main content

Fly.io Started Charging for Cross-Region Postgres Traffic in February 2026 — Here's What It Costs vs. Flat Networking on Owned Hardware

11 min readDora NodaDora Noda
Share
On this page

In December 2025, Fly.io told its users that Managed Postgres traffic crossing region boundaries would stop being free. From February 2026, every gigabyte your app servers pull from an MPG cluster in another region lands on your invoice — at the same private-network rates Fly already charged for app-to-app traffic, sharing the same free quota. The first charges showed up on March invoices, and teams running multi-region topologies have now had half a year to feel the new line item.

This post prices that line item. Not the announcement recap — the actual dollars, at realistic volumes, on both of Fly's pricing tiers, against the same traffic on flat-rate infrastructure you own. If your app and database live in the same region, you can stop after the first table: you owe nothing. Everyone else, read on.

The bill, up front

Monthly cost of cross-region database traffic (NA/EU rates), network charges only — base compute and storage excluded on both sides:

Monthly x-region DB trafficFly.io (granular org)Fly.io (legacy org)Hetzner Cloud (20 TB pooled)Owned box (1 Gbit flat)
100 GB~$0.60~$2.00$0$0
500 GB~$3.00~$10.00$0$0
5 TB~$30.70~$102.40$0$0
25 TB~$153.60~$512.00~€5 (over 20 TB cap)$0

Fly granular = $0.006/GB cross-region private transfer; Fly legacy (pre–July 2024 orgs that never opted into granular pricing) = $0.02/GB internet-egress rate applied to all transfer. Hetzner Cloud includes 20 TB/month pooled per project with ~€1/TB overage; dedicated root servers on a 1 Gbit uplink carry unmetered traffic. Inbound is free on both platforms — only outbound is metered.

The verdict in one sentence: below a few hundred gigabytes a month the new charge is coffee money on either tier, past a few terabytes it becomes a line item worth architecting around, and past 20 TB the flat-rate side wins by two orders of magnitude because its meter barely exists.

What actually changed in February 2026

The change is narrower — and older in spirit — than "Fly started charging for private networking." The pieces, in order:

  • July 2024: Fly split private transfer onto its own cheaper rate card for new organizations. Cross-region private traffic got granular per-region-group rates, same-region private traffic became free, and orgs created before July 18, 2024 stayed on the old model (everything at internet-egress rates) with a manual opt-in.
  • December 3, 2025: Fly announced that Managed Postgres inter-region private traffic — previously unbilled — would be metered from February 2026 at the existing private-network rates, sharing the existing free quota. Zero-price preview line items appeared on December invoices so teams could see their exposure before paying.
  • February–March 2026: metering went live; the first real charges appeared on invoices issued at the start of March 2026.

Three things this change is not: it is not a new rate (MPG reuses the July 2024 private-network card), it does not touch same-region traffic (explicitly free — "usage in the same region as your MPG cluster won't incur costs"), and it does not change app-to-app billing at all. If your whole stack sits in iad next to your MPG cluster in iad, February 2026 changed nothing for you.

Why charge at all? Fly's own answer is admirably blunt: "Inter-region private network traffic cost us money, so we need to charge for it to make them sustainable." Fair enough — backbone transit between continents is a real cost. But it means the meter now follows your topology, not just your traffic: the same queries cost $0 or $100/month depending on which regions the two ends live in.

The rate card, decoded

Here is the full data-transfer card, from Fly's pricing docs:

Region groupEgress to public internetPrivate network, cross-region
North America, Europe$0.02/GB$0.006/GB
Asia-Pacific, Oceania, South America$0.04/GB$0.015/GB
Africa, India$0.12/GB$0.050/GB

Plus the rules that decide which column you pay:

  • Granular orgs (created after July 18, 2024, or manually opted in) pay the private column for cross-region private traffic, and same-region private traffic is free.
  • Legacy orgs pay the internet-egress column for all transfer — a pre-2024 org that never opted in pays $0.02/GB in NA/EU even for traffic a newer org moves at $0.006/GB. The opt-in is one click on the Organizations page, and it is one-way.
  • Inbound is always free. Only outbound is metered, on both tiers.
  • External WireGuard peers count as internet. Traffic leaving Fly to an external peer (say, a database in another cloud reached over your Fly private network) is billed at internet-egress rates, confirmed by Fly staff when the granular card launched.

A note on shorthand, because you will see a wrong version of these numbers floating around: there is no "$0.01/GB in, $0.02/GB out" private-network rate. Inbound is $0 — Fly meters outbound only — and the $0.02/GB figure is the legacy-org and internet-egress rate, while granular orgs pay $0.006/GB for cross-region private traffic in NA/EU. MPG billing reuses exactly these rates; nothing about the February 2026 change invented a new price.

The region groups deserve a second look because they are the sensitivity knob. That 500 GB/month of app-to-DB chatter costs $3.00 in iadfra, but $7.50 in sinsyd and $25.00 in bomjnb — same bytes, 8x spread. If your users forced you into Africa or India regions, the new MPG meter bites hardest precisely where you had the least choice about placement.

Three topologies, priced

Enough rate card. Here are three topologies you will recognize, each priced monthly for its network leg on both Fly tiers (NA/EU).

Topology A: single region, app + MPG side by side. Your Machines and your MPG cluster all live in fra. Cross-region traffic: zero. Network bill: $0 on both tiers — the MPG announcement exempts same-region traffic explicitly. This is the topology Fly's own guidance recommends ("have majority of your app machines in the same region as your MPG cluster"), and it remains the cheapest correct answer for most apps. Roughly 500 GB of queries that would cost $3–10/month across regions costs nothing here.

Topology B: multi-region app, single-region database. App servers in iad, fra, and sin all talking to one MPG cluster in iad. Two-thirds of DB traffic now crosses a region boundary. At a realistic 500 GB/month of cross-region chatter (query results dominate; requests are small): ~$3.00/month granular, ~$10.00/month legacy. Noticeable on an invoice, not architecturally decisive — until the app grows. At 5 TB the same shape costs ~$30.70 vs ~$102.40, at which point the legacy org is paying more for the network leg than for the $38/month MPG Basic plan underneath it.

Topology C: cross-region read replica. Primary MPG in iad, replica in fra absorbing reads plus the replication stream — call it 2 TB/month cross-region. That is ~$12.30/month granular, ~$41.00/month legacy, every month, before a single user byte leaves for the internet. This is the topology where the February change stings most: read replicas exist for latency and resilience, and now each replica carries a standing bandwidth tax proportional to how much it is actually used. The busier your replica, the more you pay for the privilege of having it.

Two patterns fall out. First, the granular/legacy gap is a flat 3.3x in NA/EU — a legacy org pays triple for identical bytes, so the one-click opt-in is the highest-ROI action in this post. Second, every topology's bill scales with utilization of the cross-region leg, which is exactly backwards from how teams think about resilience: the replica you added for safety gets more expensive the more it earns its keep.

The owned-hardware side of the ledger

Now the same traffic on infrastructure with a flat network model. Two shapes, both from Hetzner's own docs:

  • Hetzner Cloud: each server includes 20 TB/month of outbound traffic (EU; US/Singapore allowances are smaller), pooled across every server in the project — a quiet server's unused allowance covers a loud one's overage before anything is billed. Overage is ~€1/TB, billed in 100 MB blocks. Inbound and internal traffic (same network zone, private Networks, or to Hetzner dedicated servers) is free.
  • Hetzner dedicated root servers: a 1 Gbit uplink carries unlimited traffic; only 10 Gbit uplinks drop to a 20 TB included cap.

Run topologies A–C through this model and the network column is a wall of zeroes: 500 GB, 2 TB, 5 TB — all inside the 20 TB included allowance, so $0 incremental on Cloud and $0 on dedicated. The meter only wakes up past 20 TB pooled: our 25 TB row costs ~€5 (about $5–6) on Cloud against $153.60/$512.00 on Fly. Crossover math, in other words, barely exists — there is no volume at which Fly's per-GB meter undercuts flat hardware on network alone, because the flat side charges roughly $0.001/GB past a 20 TB free tier while Fly charges $0.006–0.02/GB from the first byte past its much smaller quota.

Two honest caveats, because this comparison is network-only by design. First, base compute is excluded: Fly's $38/month MPG Basic buys you a managed Postgres you never patch, while the Hetzner side prices the wire but leaves you operating the database (or paying someone to). Second, Hetzner Cloud's generous 20 TB is an EU story — US allowances run 1–8 TB depending on plan, so an Americas-heavy fleet should re-run the numbers with the smaller cap. Neither caveat changes the shape: per-GB metering punishes cross-region chatter; flat allowances absorb it.

The deeper point is architectural. On flat networking, your topology is a latency and resilience decision. On per-GB private networking, it is a cost decision too — every region boundary you draw for reliability gets a monthly price tag attached. That is a legitimate way to run a network business, but it quietly penalizes the exact thing multi-region Postgres is for.

What to do about it

Four steps, in ROI order:

  1. Check your org's pricing tier. Pre–July 2024 orgs on legacy rates pay 3.3x for identical cross-region bytes in NA/EU. The Organizations page offers a one-way switch to granular pricing — for almost any private-network-heavy app, take it.
  2. Co-locate app and MPG. Same-region traffic is free on both tiers and explicitly exempt from the February change. Unless you have a latency case for splitting them, one region for the database leg is the cheapest correct architecture.
  3. Read your preview line items. Fly has shown MPG inter-region usage on invoices since December 2025. Before re-architecting anything, look at what you actually move — sub-terabyte volumes are single dollars even on the legacy tier.
  4. Price the replica honestly. A cross-region read replica now carries a standing bandwidth tax that grows with use. That does not make replicas wrong — latency and failover are real requirements — but the decision should include the $/month from Topology C, not just the instance price.

And if your traffic keeps growing past the point where per-GB math makes sense, that is the market telling you something: there is a volume at which owning the wire beats renting it by the byte. Flat-rate machines with unmetered private networking move the region boundary back to being an engineering decision instead of a billing event.

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.

Sources

Related articles

Run this on infrastructure you own

bex is the open-source, AI-native Render alternative — push a git repo and get a running HTTPS service on your own machines.

Get started with bex