Cloud Egress Costs: The Hidden Tax Breaking Cloud Budgets (and How to Cut It 20–80%)
Egress is rarely one line item — it's internet-out, NAT, cross-AZ, cross-region, CDN cache-fill, and realtime fanout. We break down list pricing across AWS, GCP, Azure, Supabase, Neon and Cloudflare, model four workloads, and show why your biggest network cost is architectural, not the rate card.

Cloud egress is no longer a niche billing annoyance. It is one of the most misread lines on a cloud bill, because it rarely appears as one line item. The obvious part is public internet transfer. The expensive part is everything around it: NAT processing, cross-Availability-Zone traffic, cross-region replication, private-endpoint data processing, CDN cache-fill, and — increasingly — websocket and webhook fanout from realtime stacks.
The strongest framing for any team trying to control it is this: your biggest network costs are usually architectural, not list-price driven. Catalog price differences between clouds are small. The cost curve is set by where your bytes move and how many times.
All prices below are public list prices and all workload numbers are modeled for budgeting, not invoice reconciliation. They exclude enterprise discounts, taxes, and second-order savings (less compute, fewer DB reads), which usually strengthen the case for optimization rather than weaken it.
The pricing snapshot
Common North America and Europe internet egress clusters around $0.085–$0.09/GB on AWS and Azure, while Google Cloud Premium Tier often starts higher at $0.12/GiB for the first tier before falling. The cheaper, less-discussed paths — and the ones that quietly compound — are internal.
| Path | Representative list price | Why it bites |
|---|---|---|
| Public internet egress (AWS, first 10 TB) | $0.09/GB | The visible number everyone benchmarks |
| Cross-AZ transfer | ~$0.01/GB each direction | Nearly universal; ~half of AWS transfer cost in Datadog's sample |
| Cross-region transfer | ~$0.02/GB (wider on GCP: $0.02–$0.14/GiB) | Multi-region replication and cross-region reads |
| NAT gateway | ~$0.045/GB plus ~$0.045/hour | Private-subnet workloads pay this on top of egress |
| CDN cache-fill | $0.01–$0.04/GiB + lookups | A CDN lowers origin egress but is not free |
Two structural alternatives change the table entirely. Oracle Cloud includes the first 10 TB/month of egress free, and Cloudflare R2 charges no internet egress at all — useful to know as architectural options even if they are not drop-in compute-origin equivalents.
What 10 TB actually costs
The same baseline 10 TB/month of internet-bound traffic, before any NAT or architectural side effects:
| Provider | 10 TB/month baseline |
|---|---|
| AWS | ~$891 |
| GCP Premium | ~$1,110 |
| GCP Standard | ~$833 |
| Azure | ~$792 |
| Oracle | $0 (within free tier) |
| Cloudflare R2 (egress-only) | $0 |
Now add one NAT gateway to that same private-subnet workload and the picture shifts: AWS becomes ~$1,373, GCP ~$1,595, Azure ~$1,274. In plain terms, NAT adds 44–61% on top of the baseline — an invisible markup that has nothing to do with the per-GB rate you compared between clouds.
Four workloads, four very different egress profiles
| Archetype | Modeled monthly egress | Egress share of a typical bill |
|---|---|---|
| Midsize web app | ~$1,080 | ~12% |
| Media streaming | ~$9,490 | ~38% |
| Analytics / ETL | ~$6,740 | ~22% |
| Backup / DR (drill month) | ~$2,360 | ~20% |
The analytics row mirrors AWS's own published example: a 210 TB/month cross-region S3 path through an interface endpoint cost $6,300/month, versus $0 for the same-region gateway-endpoint path. Few line items are easier to eliminate than a cross-region path that exists only because the workflow was assembled around convenience instead of locality.
The optimization playbook
The best way to cut egress is to attack each path where bytes move: viewer delivery, origin fetch, cross-region replication, cross-AZ chatter, service-to-service access, exports, and restores.
| Strategy | What it attacks | Modeled savings | Trade-off |
|---|---|---|---|
| Architecture locality | Cross-AZ / cross-region bytes | 20–80% of internal transfer | HA design needs care |
| CDN + origin shielding | Repeated origin delivery | 20–95% of origin egress | Cache invalidation discipline |
| Compression (Brotli, WebP/AVIF) | Raw payload size | 15–40% of text/JSON | CPU / QA overhead |
| Gateway / private endpoints | NAT, public detours | 20–100% on the path | Network complexity |
| Replace polling with webhooks/events | "No change" chatter | 50–99% for low-change data | Retry / ordering logic |
| Lifecycle & restore discipline | Restore / export bytes | 30–80% of DR egress | RTO trade-offs |
Two rules carry most of the weight. Move compute to the data for ETL, lakehouse, and replication-heavy estates. And monitor bytes by path, not "network" as one blended bucket — on AWS, filter Cost Explorer on Data Transfer - Internet (Out), Region to Region, and Inter AZ; alert when cross-AZ exceeds ~40% of transfer spend for an app that isn't intentionally zonal.
The modern-stack trap: Supabase, Neon, and Trigger
This is the part that catches fast-moving teams. The cost inflection is usually not the scaffold tool — it's the subscription topology and event-delivery pattern the fast build makes easy to ship.
Supabase's own docs are blunt about it: Broadcast is recommended for scalability, Postgres Changes does not scale as well (every change event is authorization-checked per subscriber — 100 subscribers + one insert can trigger 100 reads, on a single ordered thread), and payload size dominates. In Supabase's benchmarks, the same broadcast pattern moved 10.4 GB at 1 KB payloads versus 348 GB at 50 KB.
Turn that into money. Assume one row update per second, a 2 KB payload, and 500 subscribed clients:
- That's 500 messages/second ≈ 1.3 billion messages/month.
- On Supabase Pro/Team realtime pricing, message overage alone is roughly $3,200+/month.
- The delivered bytes are ~2.6 TB/month — another ~$210/month of egress over the included quota.
One feature. No traffic spike you'd notice. And it scales almost linearly if components open duplicate subscriptions or broadcast whole rows when a 100-byte delta would do.
| Anti-pattern | Better pattern |
|---|---|
Broad Postgres Changes subscriptions |
Broadcast with narrow channels and filters |
| Full-row payloads | Compact custom payloads / deltas |
| Every component opens its own subscription | One subscription hub per page or tenant |
| Polling Edge Functions for changes | Webhooks, Broadcast, or outbox + worker |
pg_net trigger-to-HTTP on every row |
Batch in an outbox table; debounce; scheduled flush |
The guidance for teams shipping fast: ship the feature with direct subscriptions, but plan the graduation path early — channel scoping, payload minimization, event batching, outbox tables, and webhook/Edge-Function aggregation. That's where realtime UX stays delightful without quietly becoming an egress problem.
The bottom line
Most companies don't have an egress pricing problem first. They have an egress architecture problem first. The rate card is nearly the same everywhere; the bill is set by NAT paths that shouldn't exist, cross-AZ chatter that ignores locality, and realtime fanout that delivers the same logical change a thousand times. Those are fixable — usually in the 20–80% range on the transfer line item, and occasionally 100% on a path that should never have existed.
If you want a second set of eyes on where your bytes are actually going, that's exactly what the free egress audit does: share your stack and get a ranked list of your top avoidable transfer paths, with a rough savings range and fixes by complexity and payback.
FAQ
Common questions
What counts as cloud egress cost?
Not just public internet transfer. Egress is a family of line items: internet-out, cross-AZ traffic (~$0.01/GB each direction), cross-region transfer (~$0.02/GB), NAT gateway processing (~$0.045/GB plus hourly), private-endpoint data processing, CDN cache-fill and lookups, and realtime/serverless fanout. Most of the cost is architectural, not the per-GB rate.
How much of a cloud bill is egress?
Secondary references to Gartner put egress at roughly 10–15% of the cloud bill for many customers; IDC has estimated about 6% of cloud storage cost. Cloudflare's own research found that reducing or eliminating egress fees saved customers 7.5–27% of their total monthly bill. Treat these as directional planning ranges, not universal benchmarks.
Does a CDN make egress free?
No. Transfer from cloud origins to the same provider's CDN is often free, but CDNs still charge cache-fill and lookup fees, and non-cacheable traffic still pays standard internet egress. A CDN is best evaluated on total delivery cost — it can lower origin egress and backend load, not eliminate billing entirely.
Why does Supabase or Trigger.dev get expensive at scale?
Realtime fanout multiplies one row change into many subscriber deliveries. A feature with 500 subscribers and 2KB payloads emitting one event per second is ~1.3 billion messages/month — roughly $3,200+/month in realtime message overage plus egress on Supabase Pro/Team pricing. The fixes are channel scoping, payload minimization, batching, and outbox patterns.
Related
Keep going
Free Cloud Egress Audit
Share your stack and get your top avoidable transfer paths, free.
OpenCloud Egress Report 2026
The full data-first report: pricing, the hidden tax, and the optimization playbook.
OpenReduce Supabase Egress Costs
The realtime-fanout playbook for Supabase, Neon, and Trigger stacks.
Open