Your AWS egress price hasn't changed since you first architected the app. The bill did anyway.
A 2020 migration plan that priced a small SaaS at 300 GB of monthly egress — a few API responses, some image serving, a nightly backup pull — penciled in about $27/month at $0.09/GB. Rebuild that same product shape in 2026 with webhooks, pre-signed S3 URLs, streaming LLM responses, and per-tenant analytics exports, and the same 10,000 monthly active users now push 1–2 TB out without changing the pricing page once. At the identical $0.09/GB, that's $90–$180/month — and on GCP's Premium Tier ($0.12/GB first terabyte) or with cross-region replication layered on, closer to $250. The sticker is frozen. The multiplier underneath it — 3–7× in 2026 cost teardowns — is what moved the bill, and per-provider spreads as wide as 127× once zero-egress and bandwidth-included platforms enter the comparison. This post recomputes the same traffic across every meter so you can price the gap honestly.
The Meter That Didn't Move
Internet egress pricing at the three hyperscalers looks almost boring on a slide. That's the trap.
| Provider | Internet egress (first 10 TB/mo) | Next tier | Free allowance | Ingress |
|---|---|---|---|---|
| AWS | $0.09/GB | $0.085/GB (10–50 TB) | 100 GB/mo (all services) | Free |
| Azure | $0.087/GB | $0.083/GB (10–50 TB) | 100 GB/mo (first 100 GB free) | Free |
| GCP Premium Tier | $0.12/GB (first 1 TB), $0.11/GB (next 9 TB) | $0.085/GB above 10 TB | ~1 GB/mo | Free |
| GCP Standard Tier | $0.085/GB | $0.08/GB above 10 TB | ~1 GB/mo | Free |
The numbers are collected from vendor pricing pages verified June 2026. They have not moved meaningfully in years. AWS still publishes the same tiered schedule it did in 2020: 100 GB free, then $0.09/GB to 10 TB, then the gentle step-downs above it. Azure has held $0.087/GB. GCP shaved its Standard Tier to $0.085/GB for latency-tolerant traffic but kept Premium at a headline $0.12/GB in the first terabyte.
What changed is everything that creates egress for the same product:
- API-first distribution. A 2020 monolith that served HTML now fans the same data across REST, webhooks, and event streams — each a separate outbound trip.
- Pre-signed object URLs and image/CDN serving. Every asset hit that used to be a cache HIT is now an S3-origin egress byte if you missed the CDN.
- LLM streaming responses. A chat or agent surface that streams tokens to the browser bills wall-clock egress for every chunk. One popular AI-SaaS workload analysis found egress alone exceeding the GPU cost once checkpoints moved.
- Per-tenant exports and analytics taps. Multi-tenant apps that once exported CSVs monthly now stream Parquet to customer warehouses daily.
2026 repatriation writeups and platform bills that audited the same workload across its growth put the volume delta at 3–7× for the identical product shape at the same MAU band — not because the product got seven times more popular, but because each user session became more egress-dense. That is the multiplier the pricing page never mentions.
And internet egress is only one of the meters. Two others ride alongside it on the same bill:
- Cross-region egress — typically $0.02/GB on AWS and Azure, $0.01–$0.08/GB on GCP depending on tiers — hits any multi-region Postgres replica, Redis cluster, or S3 cross-region replication you added since the first deploy.
- Cross-AZ egress — $0.01/GB per direction on all three — adds up once you run even "highly available" Kubernetes across three AZs. Two million internal API calls that cross AZs daily quietly become their own line item.
A 2020 plan that modeled only internet egress underestimated the real egress surface by ignoring both.
Worked Recompute: The Same Traffic, Six Bills
Take a concrete workload: a 10,000-MAU B2B SaaS — Next.js frontend, Postgres, S3/R2 for assets, a background worker, webhooks to three customer systems per tenant per day. No video, no ML training. Just the kind of boring, mildly successful SaaS that platform pricing pages pretend to model.
We price its monthly egress at three points that correspond to how "API-expanded" the product has become since the original 300 GB plan.
| Monthly egress | AWS ($0.09/GB) | Azure ($0.087/GB) | GCP Premium* | Hetzner CX22/CPX (€7.99/mo, 20 TB included) | DigitalOcean (4 TB included, then $0.01/GB) | Cloudflare R2 + Workers ($0 egress) |
|---|---|---|---|---|---|---|
| 500 GB (conservative — 1.7× 2020 plan) | $36 (after 100 GB free) | $34.80 | $52 | €7.99 total — $0 egress marginal | ~$5–10 (within included) | $0 egress (storage $7.50) |
| 2 TB (typical — 6.7× 2020 plan) | $172.80 | $167.04 | $206 | €7.99 total — $0 egress marginal | ~$10 + overage only above 4 TB | $0 egress |
| 10 TB (API-heavy / export-heavy) | $891 | $862.65 | ~$1,080 (blended $0.12→$0.11) | €7.99 total — still inside 20 TB | $60 (6 TB × $0.01 above 4 TB incl.) | $0 egress |
* GCP Premium Tier calculation uses the north-America/Europe blended $0.12/$0.11 schedule for internet egress; Standard Tier would be ~$170 at 2 TB.
Three lines jump out:
-
At 500 GB, Hetzner's entire server costs less than the AWS egress alone. The CX22 (2 vCPU, 4 GB RAM, 40 GB NVMe) that hosts this workload end-to-end — compute, storage, and bandwidth — invoices at €7.99/month after Hetzner's April 2026 adjustment (up from €5.99, still fixed). AWS bills $36 just for the bytes leaving, on top of EC2, RDS, and NAT. The break-even point where AWS egress alone exceeds the whole Hetzner box is around 220 GB — well below the conservative row.
-
At 2 TB, the gap is ~22×. AWS $173 vs. Hetzner $0 marginal egress (the box is sunk). That is not "hosted is a little more expensive for convenience." That is an order of magnitude that swallows the managed-services discount you thought you were paying for.
-
At 10 TB, the spread between the cheapest and most expensive way to serve the same bytes reaches ~60× within this table — and 127× once you isolate raw storage egress. The 127× figure debated across 2026 comparison posts isn't hand-waving: it's $0.09/GB on S3 internet egress vs. $0/GB on R2 (mathematically infinite) and, expressed as a bounded ratio that includes storage fees, ~$0.09/GB vs. effectively $0.0007/GB blended when bandwidth is included in a flat-rate box — the denominator teams actually pay per egress byte when the box bundles 20 TB. Different authors cut the comparison at slightly different boundaries; the point is not the exact integer but that provider choice moved the bill from "rounding error" to "largest line item."
Two notes before anyone copies the table into a budget doc:
- Hetzner's 20 TB is outbound to the internet, EU/US regions, at full line rate with no throttling. Overage is €1/TB — flat. A 10 TB workload is half its included allowance; a 30 TB month costs exactly €10 more. Compare that to the hyperscaler tiers that still bill $900+ at the same volume.
- The DigitalOcean and R2 rows are not "Hetzner but cheaper." DO gives you ~4 TB included per droplet family and then $0.01/GB (the budget-friendly headline), and R2 gives you $0 egress on every object read but bills storage at $0.015/GB and Class A/B operations separately. They are included here to show the 127× is not a two-provider trick — it's a spectrum where every step off the hyperscaler internet meter is a step toward flat.
Why the Spread Is This Wide
If "egress" were one product, a 127× spread would be a cartel. It's not — it's a stack of different things all labeled "bandwidth" in marketing copy, bundled differently at each provider.
| Layer | AWS S3 | Cloudflare R2 | Backblaze B2 | Hetzner Cloud | Vultr / DO | Self-hosted MinIO / Garage on Hetzner |
|---|---|---|---|---|---|---|
| Storage $/GB/mo | $0.023 | $0.015 | $0.006 | Included on volume (volume $0.04/GB) | DO Spaces $0.02, Vultr Object $0.02 | Sunk (NVMe) |
| Internet egress $/GB | $0.09 | $0.00 | Free to 3× stored, then $0.01 | $0 (inside 20 TB), €0.001 beyond | $0.01 flat (Vultr), DO pooled free then $0.01 | $0 (inside box) |
| What's bundled | Durability + API + metered egress | Durability + API, egress eaten by Cloudflare network | Durability, egress subsidized to 3× | Compute + 20 TB, no per-byte meter | Compute + pooled egress | You run it |
Three things to read off the table:
- R2's zero is real, not a promo. Cloudflare eats the egress on its own global network. For a SaaS that serves images, exports, or AI artifacts from object storage, switching origin from S3 to R2 zeros the largest egress sub-bill without rearchitecting the app — same S3 SDK, different endpoint. The tradeoff is higher per-GB storage ($0.015 vs. $0.006 on B2) and operation charges that matter at millions of small reads.
- B2's "free to 3× stored" is generous but not zero. Store 2 TB and you get 6 TB of free egress — enough to zero the bill for many backup-shaped workloads, but a serving-heavy app that reads 10× its stored bytes per month hits $0.01/GB fast.
- Bandwidth-included VMs are not object storage. Hetzner's 20 TB rides with the compute instance, not the bucket. A 500 GB egress SaaS fits. A 50 TB video app still fits (20 TB included, next 30 TB at €30). An AI lab moving a 400 TB checkpoint monthly does not fit any single box — that lab should be pricing dedicated transit, not VM bandwidth.
The 127×, then, is not "pick the cheapest cell." It's the distance between a workload that left every byte on the hyperscaler internet meter and one that moved the hot path onto a flat-rate or zero-egress surface for the same bytes. Teams whose 2020 plan never considered that move are now the teams whose egress multiplied underneath a flat sticker.
What 20 TB Included Is Actually Worth
Put a price on the inclusion.
Hetzner's CX22/CPX/CAX families include 20 TB outbound per server per month in EU and US regions. Overage is €1.00/TB (≈$1.08/TB at recent rates), flat, no tiers. Inbound and internal (private-network) traffic is unlimited and unmetered.
Translate that to the table above:
- A 2 TB/month SaaS on AWS pays ~$173 in egress — more than 21× the CX22's entire invoice. On Hetzner that same 2 TB is 10% of the included allowance. The marginal cost of the next gigabyte is zero until you cross 20 TB.
- A 10 TB/month SaaS on AWS pays ~$891. On Hetzner the marginal egress cost is still $0 — the box is only half full. Even a 25 TB month (5 TB over) costs €7.99 + €5 = €12.99 total. AWS would bill > $2,200 at the blended tier rate for the same 25 TB outbound.
- The crossover where AWS egress alone exceeds the Hetzner box sits around 220 GB (320 GB billable after the 100 GB free tier × $0.09 ≈ €7.99). Every SaaS that serves more than a brochure worth of HTML crosses it.
This is why "even after Hetzner's three 2026 hikes" — April (+30–37%), late April (dedicated setup fees), and June (+113–175% on CCX/CPX dedicated vCPU) — Hacker News comment threads kept landing on the same punchline: even after +30–50%, Hetzner is the cheapest option for bandwidth-heavy workloads, because the thing that got expensive elsewhere wasn't compute but bytes leaving. Hetzner raised compute. Hyperscalers taxed egress. The two are not the same line item, so a single "price increased" headline flattens the wrong comparison.
None of this claims "Hetzner is always cheaper." For a bursty, 20 GB/month webhook SaaS, AWS egress is $0 (inside the 100 GB free tier) and Hetzner still bills €7.99 for an idle box. Metered-per-second platforms and free-tier hyperscaler egress genuinely win at the low end where the included bandwidth of a flat box is waste. The honest shape is a crossover, not a slogan:
- < 100 GB/mo: Hyperscaler free tier cheapest. Flat box overpays.
- ~200 GB–20 TB/mo: Bandwidth-included VM dominated. This is where most "successful small SaaS" live in 2026.
- > 20 TB/mo on one box: Still wins on flat, but you need to think about multi-server fan-out and whether object-storage zero-egress (R2) should own the hot bytes instead of VM bandwidth.
If your 2020 plan budgeted 300 GB and never revisited the traffic shape, you are almost certainly in the middle band now — and paying the hyperscaler middle-band tax for it.
The Comfort of an Unchanged Price Is the Trap
An unchanged price feels like stability. On a bill where the volume variable tripled underneath it, it's a multiplier in disguise.
Three places teams still under-count even after they notice internet egress:
-
Cross-region replication you added for "reliability." That S3 cross-region copy, that Postgres streaming replica, that Kafka MirrorMaker — each bills egress at $0.02/GB (AWS/Azure) or more on GCP Premium. A 2 TB regional replica is another ~$40/month of replicated egress before a single byte reaches the customer.
-
Cross-AZ chatter inside Kubernetes. Three AZs, a chatty service mesh, and a few million internal gRPC calls per day that cross AZ boundaries at $0.01/GB each direction. It rarely appears in a "data transfer out" estimate, but it appears on the invoice.
-
NAT Gateway egress that double-bills. Outbound internet traffic from a private subnet traverses the NAT Gateway (metered processing) and then the internet egress meter. Teams price one and forget the other; the bill charges both.
The EU's January 2024 Data Act — which requires the three hyperscalers to remove switching (exit) egress charges for customers moving off — starts biting on 12 January 2027, with switching windows already running since September 2025. Providers have started volunteering exits and credits ahead of the deadline, and the CMA's March 2026 commitments from AWS and Microsoft touched egress in the same sweep. That's useful if you are leaving. It does nothing for the monthly serving traffic of the app you keep running where you are.
The fix is not a slogan but a budget habit: re-audit the volume variable once a year against the price variable. The price page will still say $0.09. Your product's egress surface will not. Price the bytes you actually serve — internet, cross-region, cross-AZ, NAT — at the sticker that hasn't moved, add the storage egress surface (R2 zero vs. S3 nine cents), and compare it to what 20 TB included covers on owned hardware. That is the honest math underneath "self-hosted is cheaper" in 2026: not that Hetzner never raised prices, but that its bandwidth inclusion outran the egress multiplier that kept climbing while the sticker slept.
A version of the table above is one rerun away from your own workload: take last month's DataTransfer-Out-Bytes (plus cross-region and cross-AZ), multiply by your provider's tier, and put the total next to the fixed price of the smallest Hetzner family member that fits your compute. If the gap crosses 5×, you are paying a bandwidth tax the included-allotment model already zeroed.
Bex.co is the open-source, AI-native Render alternative — push a git repo, get a running HTTPS service on machines you own. Your bandwidth rides with the box, not on a per-GB meter. Star the repo on GitHub or deploy your first app today.