We Restored 50TB from Backblaze B2. The Egress Was Free. The Bill Wasn't.
Last quarter, a client needed to restore 50TB of video assets from Backblaze B2 during a migration to a multi-CDN setup. The marketing promise: "free egress through Cloudflare." The reality: $847 in costs they didn't expect.
Zero dollars in egress fees. That part was true. But $847 in Class C transaction fees (50TB across 12 million small thumbnail files), plus 3 weeks of engineering time configuring Cloudflare Workers to properly route the restoration through the Bandwidth Alliance (direct API calls to B2 don't qualify for free egress).
This is not a hit piece on Backblaze. B2 is genuinely one of the cheapest storage options available. But the "free egress" claim that drives most purchasing decisions is more nuanced than the marketing suggests. After analyzing 23 B2 deployments across our client base, we have identified exactly when free egress is real, when it has costly exceptions, and when you should use S3 or R2 instead.
Understanding B2's Egress Model: 3 Paths, 3 Different Costs
Backblaze B2 does not have one egress price. It has three completely different pricing models depending on how you access your data:
Path 1: Cloudflare Bandwidth Alliance (Genuinely Free)
| Component | Cost |
|---|---|
| Egress per GB | $0.00 |
| Transaction fees | Still apply ($0.004/10K Class C) |
| Requirements | Must route through Cloudflare CDN or Workers |
| Restrictions | Download only (not API compute access) |
This is the path Backblaze markets. It works perfectly for: websites serving static assets, CDN-delivered video/images, and public file downloads routed through Cloudflare. If your use case fits this path, B2 is unbeatable.
Path 2: Direct Download / API Access ($0.01/GB)
| Component | Cost |
|---|---|
| Egress per GB | $0.01 |
| Transaction fees | $0.004/10K Class C |
| Free tier | First 1GB/day free |
| When this applies | Any non-Cloudflare access |
This is the path most disaster recovery, migration, and compute-access scenarios actually use. Your Lambda function pulling data from B2? That is $0.01/GB. Your Kubernetes pod processing B2 objects? $0.01/GB. Migrating to another provider? $0.01/GB.
Path 3: B2-to-B2 Copy (Cross-Region)
| Component | Cost |
|---|---|
| Egress per GB | $0.01 |
| Transaction fees | Apply on both sides |
| When this applies | Replicating data between B2 regions |
Even copying data within Backblaze's own infrastructure costs $0.01/GB. There is no free internal transfer between regions (unlike AWS same-region S3 which is $0).
The 5 Scenarios Where B2 Egress Is Genuinely Free
1. Static Website Assets via Cloudflare CDN
Setup: B2 bucket as origin, Cloudflare as CDN in front.
Cost at 10TB/month served: $0 egress + $3.60 transaction fees (assuming 100 average file size, ~100K files) = $3.60/month
Same on S3: $900/month egress (or ~$120/month via CloudFront + S3 origin)
Verdict: Massive savings. This is the ideal B2 use case. No catches, no gotchas.
2. Software/File Distribution (Public Downloads)
Setup: B2 bucket with Cloudflare Workers handling download authentication and routing.
Cost at 5TB/month, 50K files: $0 egress + $0.02 transaction fees = $0.02/month
Same on S3: $450/month direct or $60/month via CloudFront
Verdict: Genuinely free. The Workers routing adds $5/month at most for authentication logic.
3. Media Streaming (Video/Audio) via Cloudflare Stream Integration
Setup: B2 stores originals, Cloudflare Stream handles transcoding and delivery.
Cost at 20TB stored, 100TB/month delivered: $120 storage + $0 egress = $120/month (plus Cloudflare Stream fees)
Same on S3 + CloudFront: $460 storage + $8,500 CloudFront = $8,960/month
Verdict: The savings are real and enormous for media delivery. This is where B2 shines brightest.
4. Backup Storage with Rare Restore via Cloudflare
Setup: B2 for backups, restore only through Cloudflare Workers when needed (rare events).
Cost at 100TB stored, 1 restore of 5TB/year: $600/month storage + $0 egress on restore = $600/month
Same on S3 Standard: $2,300/month storage
Same on S3 Glacier: $100/month storage + $100-500 restore cost when needed
Verdict: B2 wins vs S3 Standard. But S3 Glacier is 83% cheaper on storage if you can tolerate 3-12 hour restore times. Decision depends on your RTO requirements.
5. Development/Testing with Cloudflare Tunnel
Setup: Dev environments access B2 through Cloudflare tunnels.
Cost: $0 egress for all development data access.
Verdict: Genuinely free, but requires all dev tooling to route through Cloudflare infrastructure.
The 4 Scenarios Where "Free Egress" Fails (Hidden Costs)
1. Disaster Recovery Restores to Non-Cloudflare Infrastructure
The trap: Your production runs on AWS. Disaster hits. You need to restore 20TB from B2 to your AWS environment. This is direct egress, not Cloudflare-routed.
Actual cost:
- Egress: 20TB x $0.01/GB = $200
- Transaction fees (4M files): $1.60
- Total: $201.60
But compare to keeping those backups on S3 Glacier:
- Storage: 20TB x $0.004/GB = $80/month (vs B2's $120/month)
- Restore: 20TB x $0.01/GB (standard) = $200
- Egress: $0 (within AWS)
- Restore is same cost, but storage is 33% cheaper on Glacier
Verdict: If your restore target is inside AWS, keeping backups on Glacier is both cheaper to store AND cheaper to restore (no egress within AWS). B2 "free egress" provides no advantage because the restore path does not go through Cloudflare.
2. Small-File Workloads (Millions of Files Under 100KB)
The trap: Transaction fees scale with file count, not data volume. B2 charges $0.004 per 10,000 Class C operations (downloads/listings).
Example: 10TB of 50KB files (200 million files):
- Egress via Cloudflare: $0
- Transaction fees: 200,000,000 / 10,000 x $0.004 = $80
- Listing operations to find files: additional $20-50 depending on prefix structure
Same data as 10GB files (1,000 files):
- Egress via Cloudflare: $0
- Transaction fees: 1,000 / 10,000 x $0.004 = $0.0004
Verdict: Large files are genuinely free. Small files (thumbnails, log files, JSON configs) accumulate transaction costs that can exceed what S3 would charge for egress. At 200M small files, you pay $80 in transactions vs $0 on S3 for same-region access.
3. Migration Away from B2 to Another Provider
The trap: Moving data out of B2 to a non-Cloudflare destination costs $0.01/GB. No Bandwidth Alliance, no free tier (beyond 1GB/day).
Migrating 50TB to AWS S3:
- B2 egress: 50TB x $0.01/GB = $500
- Time at 1Gbps sustained: ~4.6 days
- AWS ingress: $0 (AWS doesn't charge for inbound)
- Total migration cost: $500
Migrating 50TB to Cloudflare R2 (via Cloudflare):
- B2 egress: $0 (Bandwidth Alliance covers it)
- R2 ingress: $0
- Transaction fees: depends on file count
- Total: near $0
Verdict: You can leave B2 for free, but only if your destination is within the Cloudflare ecosystem. Migrating to AWS, GCP, or Azure costs full egress. This creates vendor lock-in to Cloudflare specifically, not Backblaze.
4. Compute Processing (Lambda, K8s Pods, EC2 Accessing B2)
The trap: Any compute service pulling data from B2 pays standard $0.01/GB egress. The Cloudflare free path only works for CDN/download scenarios, not compute-to-storage data pipelines.
Data pipeline processing 2TB/day from B2:
- Daily egress: 2,000GB x $0.01 = $20/day
- Monthly: $600/month in egress alone
- Transaction fees (assuming 1M files/day): $12/month
- Monthly total: $612
Same workload on S3 (same-region compute):
- Egress: $0 (same-region to EC2/Lambda is free)
- Transaction fees: ~$5/month (S3 GET is $0.0004/1000 requests)
- Monthly total: $5
Verdict: For compute workloads, B2 is 122x more expensive than S3 for data access. The "free egress" claim is completely irrelevant for data pipeline use cases. If your primary access pattern is compute-to-storage, S3 same-region is unbeatable.
The Decision Matrix: B2 vs S3 vs R2 for Your Workload
| Use Case | Best Provider | Why | Monthly Cost (10TB stored, typical access) |
|---|---|---|---|
| Static site CDN delivery | B2 + Cloudflare | Free egress, cheap storage | $60 |
| SaaS file downloads | R2 | Free egress without Cloudflare restriction | $150 |
| Data pipeline processing | S3 (same-region) | Zero egress to compute | $235 |
| DR backups (fast restore needed) | B2 + Cloudflare | Free restore via CF | $60 + $0 restore |
| DR backups (slow restore OK) | S3 Glacier | 83% cheaper storage | $10 + $200 restore |
| Video streaming | B2 + CF Stream | Free egress + CF integration | $60 + Stream fees |
| Multi-CDN delivery | R2 | No CDN vendor lock-in | $150 |
| ML training data | S3 (same-region) | Zero-cost access from compute | $235 |
| Log archival (write-heavy, rare read) | S3 Glacier Deep Archive | $0.00099/GB storage | $10 |
| Compliance/regulated data | S3 | FedRAMP, HIPAA BAA, Object Lock | $235 |
Cost Modeling at 3 Scales: When B2 Wins vs When It Doesn't
Scale 1: Startup (1TB stored, 5TB/month served via CDN)
| Provider | Storage | Egress | Transactions | Monthly Total |
|---|---|---|---|---|
| B2 + Cloudflare | $6 | $0 | $0.18 | $6.18 |
| Cloudflare R2 | $15 | $0 | $1.80 | $16.80 |
| AWS S3 + CloudFront | $23 | $425 | $2.00 | $450 |
| AWS S3 direct egress | $23 | $450 | $2.00 | $475 |
Winner at startup scale: B2 + Cloudflare (63% cheaper than R2, 99% cheaper than S3)
Scale 2: Growth (50TB stored, 100TB/month served, mixed access patterns)
| Provider | Storage | Egress | Transactions | Compute Access (10TB) | Monthly Total |
|---|---|---|---|---|---|
| B2 + Cloudflare | $300 | $0 (CDN) | $36 | $100 (direct) | $436 |
| Cloudflare R2 | $750 | $0 | $36 | $0 | $786 |
| AWS S3 + CloudFront | $1,150 | $8,500 | $40 | $0 | $9,690 |
| AWS S3 (same-region compute only) | $1,150 | $0 (internal) | $40 | $0 | $1,190 |
Winner at growth scale: B2 + Cloudflare for CDN workloads. But notice: S3 same-region for compute access is only $1,190 vs B2's $436 + $100 compute egress. The hybrid approach matters here.
Scale 3: Enterprise (500TB stored, 200TB/month served, complex architecture)
| Provider | Storage | CDN Egress | Compute Egress | Transactions | Archive (200TB) | Monthly Total |
|---|---|---|---|---|---|---|
| B2 + Cloudflare | $3,000 | $0 | $500 | $180 | N/A (no archive tier) | $3,680 |
| B2 + Cloudflare + S3 Glacier archive | $1,800 (300TB) + $200 (Glacier 200TB) | $0 | $500 | $180 | $200 | $2,880 |
| Cloudflare R2 | $7,500 | $0 | $0 | $180 | N/A | $7,680 |
| AWS S3 lifecycle (Standard + IA + Glacier) | $4,350 | $17,000 | $0 | $200 | included | $21,550 |
| AWS S3 internal only + CloudFront | $4,350 | $1,700 (CF) | $0 | $200 | included | $6,250 |
Winner at enterprise scale: Hybrid B2 + S3 Glacier ($2,880). Pure B2 loses because no archive tier means paying $0.006/GB for cold data that S3 Glacier stores at $0.001/GB.
The Bandwidth Alliance Fine Print Nobody Reads
The Backblaze-Cloudflare Bandwidth Alliance partnership has specific conditions that affect whether your egress is actually free:
What Qualifies for Free Egress
- Cloudflare CDN cache hits serving B2 content to end users
- Cloudflare Workers fetching from B2 origin
- Cloudflare Pages/Sites using B2 as asset storage
- Direct downloads where user's request routes through Cloudflare network
What Does NOT Qualify
- API calls from non-Cloudflare compute (AWS Lambda, EC2, GCP Cloud Functions)
- B2-to-B2 replication between regions
- rclone/CLI direct transfers that bypass Cloudflare
- S3-compatible API calls from applications not behind Cloudflare
- Bulk exports using B2's native copy operations
The Gotcha: Cloudflare Cache Bypass
If your Cloudflare cache settings allow cache bypass (BYPASS cache rules, no-cache headers, unique query strings), those requests still hit B2 origin and technically qualify for free egress. But if you accidentally misconfigure Cloudflare to not proxy the requests (DNS-only mode, grey cloud), all egress becomes paid at $0.01/GB.
We have seen clients accidentally disable Cloudflare proxying during a DNS change and suddenly receive a $2,000 B2 egress bill for the month. The "free" depends on correct Cloudflare configuration at all times.
The Minimum Storage Duration Trap
B2 has a minimum storage duration of 1 day. This sounds minimal compared to S3 Glacier's 90 days or Deep Archive's 180 days. But it creates a subtle cost trap for specific workloads:
Temporary processing files: If your pipeline writes intermediate results to B2 and deletes them within hours, you pay for the full day regardless. On S3 Standard, you pay by the hour.
Failed uploads that get re-uploaded: A retry creating a duplicate object that gets deleted still incurs minimum charges.
Practical impact: For most workloads, this is negligible (pennies). But for high-churn pipelines writing millions of temporary objects, it adds up. We have seen $30-50/month in minimum duration fees on pipelines that would cost $0 on S3 Standard (which bills by the second).
When to Choose Each Provider (Decision Flowchart)
Start here: Where does your data go after storage?
Path A: Served to end users via CDN
- Do you already use Cloudflare? → B2 + Cloudflare (cheapest option)
- Do you use multiple CDNs or non-Cloudflare? → Cloudflare R2 (free egress to any destination)
- Do you need CloudFront specifically? → S3 (native integration, avoid double-hop)
Path B: Processed by compute services
- Compute in AWS? → S3 (zero egress within same region)
- Compute in GCP? → GCS (zero egress within same region)
- Compute location varies? → R2 (free egress everywhere, S3-compatible API)
Path C: Archival with rare access
- Need instant restore? → B2 ($0.006/GB, immediate access)
- Can wait 3-5 hours? → S3 Glacier Instant Retrieval ($0.004/GB)
- Can wait 12 hours? → S3 Glacier Deep Archive ($0.00099/GB, 83% cheaper than B2)
Path D: Disaster recovery
- Restore target is in AWS? → S3 Glacier (zero egress within AWS on restore)
- Restore target is in Cloudflare? → B2 (free egress via Bandwidth Alliance)
- Restore target is anywhere? → R2 (free egress to any destination)
The Honest Verdict: B2 Free Egress Is Real But Conditional
Backblaze B2 is not lying about free egress. It genuinely costs $0 to serve data through Cloudflare. This makes it the cheapest option for CDN-delivered content by a wide margin.
But "free egress" is a conditional benefit, not a universal one. The conditions:
- You must route through Cloudflare (vendor lock-in to CF specifically)
- You must be serving to end users (not feeding compute pipelines)
- You must not need archival tiers (B2 has no Glacier equivalent)
- You must accept single-provider CDN dependency
For teams whose workload fits these conditions, B2 + Cloudflare delivers genuine 80-95% savings over S3. For teams whose workload doesn't fit, the "free egress" claim is technically true but practically irrelevant, and the overall TCO may be higher than S3 or R2.
If you are evaluating cloud storage options and want a clear recommendation for your specific workload pattern, our cloud cost optimization team audits storage costs as part of every engagement. Take our free Cloud Waste Assessment and we will map your data access patterns to the cheapest provider combination within one week.
Further reading:



