Network bandwidth pricing decoded: per-GB, per-Mbps, per-flow
Per-GB egress, included monthly quotas, port speed caps, inter-AZ charges. Six provider models compared on the same workload pattern.
Bandwidth pricing models split into three philosophical buckets:
- Pay per GB transferred — AWS, GCP, Azure. Simple, expensive.
- Included quota + cheap overage — DigitalOcean, Vultr, Linode, Hetzner. Cheap baseline, modest overage.
- Port speed cap, unmetered — Some dedicated server providers. Pay for bandwidth shape, not consumption.
Most public cloud comparisons focus on the per-GB rate and miss the structural difference. A workload doing 500 GB/month looks different under each model.
The actual rates, sorted
| Provider | Included per VM | Overage |
|---|---|---|
| AWS | 100 GB free (account-wide) | $0.09/GB tiered |
| GCP | 200 GB free per project | $0.12/GB tiered down to $0.05 |
| Azure | 100 GB free (account-wide) | $0.087/GB tiered |
| Hetzner | 20 TB per VM | EUR 1/TB |
| DigitalOcean | 1-10 TB per droplet (size-dependent) | $0.01/GB |
| Vultr | 1-10 TB per VM (size-dependent) | $0.01/GB |
| Linode | 1-20 TB per VM (size-dependent) | $0.005/GB |
Three workload shapes, six providers
Take a small 2 vCPU / 4 GB equivalent VM on each provider, and three monthly bandwidth profiles.
Profile A: 100 GB/month egress (low — internal API, light public traffic)
- AWS: 0 GB billed (100 GB free tier). $0.
- GCP: 0 GB billed (200 GB free). $0.
- Azure: 0 GB billed. $0.
- Hetzner: 0 GB billed (way under 20 TB). $0.
- DigitalOcean: 0 GB billed (under 1 TB included). $0.
- Vultr: 0 GB billed. $0.
- Linode: 0 GB billed. $0.
At low volume nobody charges for bandwidth. This is why a static blog can run on any provider for essentially the VM cost.
Profile B: 2 TB/month (modest public-facing app)
- AWS: 1900 GB × $0.09 = $171
- GCP: 1800 GB × $0.12 = $216
- Azure: 1900 GB × $0.087 = $165
- Hetzner: $0 (well under 20 TB)
- DigitalOcean: $0-50 depending on droplet size
- Vultr: $0-50
- Linode: $0-30
At this volume the hyperscalers cost more in egress than the VM itself. The cheap providers are essentially free.
Profile C: 30 TB/month (image-heavy public app or download mirror)
- AWS: ~$2,500
- GCP: ~$2,800
- Azure: ~$2,500
- Hetzner: 10 TB × EUR 1 = EUR 10 (~$11)
- DigitalOcean: $250-300
- Vultr: $250-300
- Linode: $100-150
At this volume hyperscaler bandwidth is 100-200x more expensive than Hetzner. There is no architecture justification for this gap — it's pure pricing strategy.
The "private network" line
Most providers offer a free private network between VMs in the same region:
- AWS: free within an AZ, $0.01/GB across AZs (each direction!)
- GCP: free within a zone, $0.01/GB across zones in the same region
- Azure: free within an AZ, $0.01/GB across availability zones in the same region
- Hetzner: free, no inter-AZ charges (no AZ concept inside a region)
- DigitalOcean/Vultr/Linode: free private networking within a region
AWS' inter-AZ pricing is the one that bites. A chatty K8s mesh across 3 AZs can easily push 5-10 TB/month of inter-AZ traffic. That's $100-200/month in nominally "private" networking. Topology-aware routing or single-AZ deployment for non-critical components mitigates it.
Inter-region pricing
Inter-region traffic on the hyperscalers is the silent killer for active-active multi-region architectures.
- AWS US East to US West: $0.02/GB. Multi-region replication of a Postgres at modest write rate (10 MB/s sustained) = ~25 TB/month each way = $500 each way.
- GCP US Central to EU: $0.08/GB. Painful.
- Azure region pairs vary, generally $0.02-0.05/GB.
Cross-cloud (AWS to GCP, etc.) goes via the public internet, billed as full egress on the source side: $0.09/GB. This is why bridging clouds is expensive.
Port speed vs metered
Hetzner dedicated servers offer 1 Gbit/s "unmetered" ports — pay for the line speed, traffic is included. For huge-volume use cases (CDN origins, video distribution), this can be the cheapest option overall: about EUR 50-100/month for 1 Gbit/s unmetered, which translates to ~324 TB/month if saturated.
The CDN escape valve
Cloudflare bandwidth is effectively free at any reasonable scale (their billing model is based on Pro/Business plan features, not GB). For static asset serving, sticking Cloudflare in front of an S3 or R2 bucket cuts your egress bill to zero, regardless of which cloud the origin lives on.
R2 specifically: $0 egress, $0.015/GB-month storage. Beats S3 on combined cost the moment your egress exceeds about 1.3x storage.
Modelling your real cost
Pull your last 3 months of egress numbers, plug them into the cloudprice TCO calculator for each candidate provider, and see where the crossover is. For most workloads with >1 TB/month of public egress, the crossover into "Hetzner is dramatically cheaper" happens immediately.
External: AWS Data Transfer pricing, Hetzner Cloud bandwidth.