Introduction
“The server is cheap, but the bandwidth is killing me.”
If you’ve ever self-hosted anything beyond a simple blog, you’ve likely felt this pain. Most people focus on CPU and RAM pricing when choosing a VPS, but bandwidth costs are the silent budget-killer hiding in plain sight. A $5/month VPS can easily balloon into a $50+ bill if you exceed the included transfer allowance.
This guide breaks down how cloud bandwidth pricing works and shares 7 battle-tested strategies to cut your data transfer costs by up to 80%.
1. Why Is Cloud Bandwidth So Expensive?
1.1 The “Triple Charge” Model
Unlike dedicated servers, cloud providers charge for bandwidth in three ways:
| Billing Item | Typical Price | Description |
|---|---|---|
| Egress (outbound) | $0.05~$0.23/GB | Data leaving your server to the internet |
| Ingress (inbound) | Usually free | Data coming into your server |
| Fixed bandwidth fee | $3~$200/mo | Charged by bandwidth cap/port speed |
The core problem: Egress traffic is the expensive part. If you serve images, videos, or heavy API responses, your bill climbs fast.
1.2 Egress Price Comparison Across Providers
| Provider | Egress Price ($/GB) | Free Tier / Included |
|---|---|---|
| AWS (first 100GB) | $0.09 | 100GB (first year) |
| AWS (100GB-1TB) | $0.085 | — |
| Azure | $0.087 | 15GB free |
| Google Cloud | $0.085~$0.12 | 100GB/mo (f1-micro) |
| Alibaba Cloud (China) | ~$0.11/GB | None |
| Tencent Cloud (China) | ~$0.11/GB | None |
| DigitalOcean | $0.01/GB (overage) | 1TB~5TB included |
| Vultr | $0.01/GB (overage) | 1TB~4TB included |
| Hetzner | €0.007/GB | 10TB~20TB included |
| BuyVM | €0.005/GB | Unmetered at port speed |
💡 Key Insight: Hetzner’s overage at €0.007/GB is 1/12th of AWS pricing. This is why the self-hosting community overwhelmingly recommends Hetzner for bandwidth-heavy workloads.
2. 7 Proven Bandwidth Cost-Saving Strategies
Strategy 1: CDN Caching for Static Assets (Savings: ★★★★★)
A CDN is the single most effective bandwidth cost-cutting tool. Edge nodes cache your static assets so users fetch them from nearby locations instead of your origin server.
Best Free Option: Cloudflare Free Plan
- Completely free, 330+ edge nodes globally
- Auto-caches CSS, JS, images, fonts
- Reduces origin egress by 60%~90%
Configuration (Nginx):
# Set cache headers for static assets
location ~* \.(jpg|jpeg|png|gif|ico|css|js|woff2)$ {
expires 365d;
add_header Cache-Control "public, immutable";
add_header CDN-Cache-Status $upstream_cache_status;
}
Then enable Caching → Cache Level: Standard in Cloudflare Dashboard.
Strategy 2: Pick Bandwidth-Friendly Providers (Savings: ★★★★)
The same 10TB of egress costs wildly different amounts:
# AWS: $0.09 × 100GB + $0.085 × 900GB = $85.65
# Hetzner: 10TB included free, overage at €0.007/GB
# DigitalOcean: 2-4TB included in most plans
# BuyVM: €0.005/GB overage — cheapest in the market
Recommendation Priority:
- Hetzner — 10TB free egress, €0.007/GB overage
- BuyVM — €0.005/GB overage, unmetered options available
- DigitalOcean $12+/mo plans — 2-4TB included egress
Strategy 3: Move Object Storage to Cloudflare R2 (Savings: ★★★☆)
Cloudflare R2’s killer feature is zero egress fees:
| Feature | AWS S3 | Cloudflare R2 |
|---|---|---|
| Storage (1TB) | $23/mo | $15/mo |
| Egress (1TB) | $90 | $0 |
| Class A ops (100K) | $0.05 | $0.45 |
| Class B ops (1M) | $0.004 | $0.0036 |
# Migrate from S3 to R2 using rclone
rclone copy s3:my-bucket r2:my-bucket \
--progress \
--multi-thread-streams 8
Strategy 4: Enable Gzip & Brotli Compression (Savings: ★★★)
Compression reduces transferred data by ~70%. Most web servers support both:
# Nginx Brotli configuration
brotli on;
brotli_comp_level 6;
brotli_types text/plain text/css application/json application/javascript \
application/xml application/xml+rss text/javascript image/svg+xml;
# gzip as fallback
gzip on;
gzip_comp_level 5;
gzip_types text/plain text/css application/json application/javascript;
Strategy 5: Automatic Image Compression & WebP/AVIF Conversion (Savings: ★★★★)
Images are typically the #1 bandwidth consumer. Converting to modern formats saves massively:
# Batch convert PNG to WebP (60%+ size reduction)
npm install -g sharp-cli
sharp -i ./images/*.png -o ./webp/ --format webp --quality 80
Nginx dynamic image resizing with ngx_http_image_filter_module:
location /images/ {
image_filter resize 800 600;
image_filter_jpeg_quality 80;
}
Strategy 6: Reverse Proxy for Shared Bandwidth Pool (Savings: ★★★☆)
If you run multiple services on one VPS, a unified reverse proxy reduces TLS handshake overhead and simplifies CDN integration:
# Docker Compose: Nginx Proxy Manager
version: '3'
services:
nginx:
image: jc21/nginx-proxy-manager:latest
ports:
- "80:80"
- "443:443"
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
This single entry point makes it trivial to add caching rules, WAF, and CDN configurations globally.
Strategy 7: Keep Database and Application in the Same Region (Savings: ★★☆)
Cross-region data transfer fees are surprisingly high:
# Bad: App in Singapore, DB in US-West
# → Cross-region traffic charges apply ($0.02~$0.09/GB)
# Good: App in Singapore, DB in Singapore
# → Free intra-region traffic
AWS charges $0.02~$0.09/GB for cross-region data transfer, while intra-region/AZ traffic is just $0.01/GB.
3. Real-World Case Study
Photo Gallery App with 5,000 DAU
Before Optimization (AWS-only):
| Item | Cost |
|---|---|
| EC2 (t3.medium) | $30.14/mo |
| Egress (1.5TB) | $135/mo |
| S3 Storage (500GB) | $12.50/mo |
| S3 Egress | $45/mo |
| Total | $222.64/mo |
After Optimization (Hetzner + Cloudflare CDN + R2 + Image Compression):
| Item | Cost |
|---|---|
| Hetzner CX42 (4 vCPU/8GB) | €8.85/mo |
| Cloudflare CDN (Free) | $0/mo |
| Egress (CDN-filtered: ~200GB) | €1.40/mo |
| R2 Storage (500GB) | $7.50/mo |
| R2 Egress | $0/mo |
| Total | ~$18/mo |
Savings: 92%!
4. Summary & Action Checklist
| Priority | Action | Est. Savings |
|---|---|---|
| 🔴 High | Enable CDN (Cloudflare Free) | 60%~90% |
| 🔴 High | Image Compression + WebP | 40%~70% |
| 🟡 Medium | Migrate to Hetzner / BuyVM | 50%~80% |
| 🟡 Medium | Move object storage to R2 | 50%~100% |
| 🟢 Low | Enable Brotli/Gzip compression | 20%~40% |
| 🟢 Low | Same-region deployment | 30%~50% |
Golden Rule: Cache traffic before it reaches your origin. Compress data before it leaves your server.
If you haven’t tried Cloudflare’s free CDN or R2 yet, today’s the day. The former costs nothing and saves bandwidth; the latter eliminates egress fees entirely.
Coming Next: We’ll dive into Reserved Instances and Spot Instances across major cloud providers — how to save another 60-80% on compute costs.