The per-GB storage price comparison is a distraction. S3 Standard is $0.023/GB/month, R2 is $0.015/GB/month, and Backblaze B2 is $0.006/GB/month. On storage alone, B2 looks like the obvious winner. But storage cost is almost never the line item that actually hurts on an AWS bill. Egress is. And for read-heavy workloads, operations charges pile up fast too.
This article runs three real workloads through all three providers and shows what the bill actually looks like. The scenarios: a static asset CDN (high reads, low writes), a backup bucket (low reads, high writes), and a media storage app (mixed). For a detailed breakdown of B2's pricing structure on its own, see the Backblaze B2 vs AWS S3 comparison. For the full S3 pricing mechanics, the S3 pricing explainer covers request charges, retrieval tiers, and replication costs in detail.
The Pricing Baseline
Before running the scenarios, here are the raw rates for each provider as of May 2026.
Cloudflare R2: Storage at $0.015/GB/month. Zero egress fees, full stop. Class A operations (writes, lists) at $4.50/million requests. Class B operations (reads) at $0.36/million requests. Free tier includes 10 GB storage, 1 million Class A ops, and 10 million Class B ops per month.
Backblaze B2: Storage at $0.006/GB/month, which is 4x cheaper than S3 on storage alone. Egress is $0 when served through Cloudflare CDN via the Bandwidth Alliance partnership; $0.01/GB otherwise. Class A (upload) transactions are free. Class B (download) transactions at $0.004/10,000 requests. Free tier: 10 GB storage and 1 GB/day download.
AWS S3 Standard: Storage at $0.023/GB/month for the first 50 TB. Egress at $0.09/GB for the first 10 TB/month, dropping to $0.085/GB for the next 40 TB. Operations at $0.005/1,000 for PUT/COPY/POST/LIST and $0.0004/1,000 for GET requests. Egress to CloudFront origin pulls is free, but that only helps if you are already in the CloudFront ecosystem. The 5 GB storage, 20,000 GET requests, and 2,000 PUT requests are permanently free with no expiration. Egress allowances vary by account type: legacy accounts (created before July 15, 2025) get 15 GB/month free for 12 months; accounts created after July 15, 2025 get 100 GB/month free egress as part of the credit-based free tier.
Backblaze B2's zero-egress pricing only applies when traffic is routed through Cloudflare's network, which includes Cloudflare CDN, Cloudflare Workers, and R2 itself. If you pull data directly from B2's native endpoints without Cloudflare in the path, you pay $0.01/GB. For most production setups, putting Cloudflare in front costs nothing extra and makes the zero-egress rate easy to hit.
Scenario 1: Static Asset CDN
Static Asset CDN
| Provider | Storage | Egress | Operations | Total/mo |
|---|---|---|---|---|
| Cloudflare R2 | $1.50 | $0.00 | $3.60 | $5.10 |
| Backblaze B2 lowest | $0.60 | $0.00 via CF | $4.00 | $4.60 |
| AWS S3 | $2.30 | $45.00 | $4.00 | $51.30 |
The S3 number is not a typo. Five hundred gigabytes of egress at $0.09/GB is $45.00. Every month. That is more than 8x what R2 charges for the same workload. This is the scenario where egress-free pricing makes the clearest case for switching.
B2 edges out R2 on this workload purely on storage cost: $0.60 vs $1.50 for 100 GB. The operations costs are close. If your read volume is significantly higher than 10M requests/month, R2's $0.36/million Class B rate beats B2's $0.004/10,000 ($4.00/million) rate. At scale, R2 is actually cheaper on operations.
Scenario 2: Backup Bucket
Backup Bucket
| Provider | Storage | Egress | Operations | Total/mo |
|---|---|---|---|---|
| Cloudflare R2 | $7.50 | $0.00 | $0.04 | $7.54 |
| Backblaze B2 lowest | $3.00 | $0.00 via CF | $0.04 | $3.04 |
| AWS S3 | $11.50 | $0.45 | $0.04 | $11.99 |
Backup workloads are storage-dominant. You write a lot, you read almost nothing, and egress is minimal (you only restore when something breaks). In this scenario, B2's $0.006/GB/month rate is decisive. At 500 GB, B2 costs $3.00 in storage versus R2's $7.50 and S3's $11.50.
Operations and egress are negligible at 100K reads and 5 GB transfer. B2 wins this workload cleanly. If you are storing multi-terabyte backups, the gap widens further: 5 TB on B2 is $30/month; on S3 it is $115/month.
Scenario 3: Media Storage App
Media Storage App
| Provider | Storage | Egress | Operations | Total/mo |
|---|---|---|---|---|
| Cloudflare R2 | $3.00 | $0.00 | $1.80 | $4.80 |
| Backblaze B2 lowest | $1.20 | $0.00 via CF | $2.00 | $3.20 |
| AWS S3 | $4.60 | $18.00 | $2.00 | $24.60 |
The media app scenario shows both providers landing at roughly similar operations costs. B2's storage advantage ($1.20 vs $3.00) plus zero egress keeps it below R2 by about $1.60/month at this scale. S3 costs $24.60, with $18.00 of that being pure egress.
Across all three scenarios, B2 wins on raw cost every time. R2 comes in second but is operationally simpler for teams that already use Cloudflare products. S3 is last on price in all three workloads, and it is not close.
Where S3 Still Wins
Price is not the only variable. S3 has a significant advantage in ecosystem depth that neither R2 nor B2 can match.
Event notifications: S3 integrates natively with Lambda triggers, SQS, and SNS. Upload a file and immediately trigger a processing pipeline. R2 has no native event notification system as of 2025. You can work around this with Cloudflare Workers watching for changes, but it is not the same level of integration.
Analytics and query: S3 integrates directly with Athena, Glue, and Redshift Spectrum. If your bucket is a data lake, there is no equivalent in the R2 or B2 ecosystems. The hidden AWS S3 costs article covers the Athena query pricing and what it actually adds to a data pipeline budget.
Durability: S3 guarantees 99.999999999% (11 nines) object durability backed by SLA. B2 and R2 make competitive durability claims, but the contractual weight behind S3's SLA is unmatched.
As of 2025, R2 does not support object lifecycle policies for automatic deletion or transition to cheaper tiers. There is no server-side encryption with customer-managed keys (SSE-C). No native event notifications. No Athena integration. The S3-compatible API covers most SDK usage, but these missing features matter for certain workloads. Verify against the current Cloudflare R2 docs before starting a migration.
What About DigitalOcean Spaces?
If your workload runs on DigitalOcean Droplets, DigitalOcean Spaces is worth looking at. It is not zero-egress, but it includes 1 TB of outbound bandwidth per month in the base price, plus CDN is included. Spaces starts at $5/month, which includes 250 GB storage and 1 TB outbound bandwidth. Storage overage beyond 250 GB is $0.020/GB/month; egress overage beyond 1 TB is $0.01/GB.
For teams already on DO, Spaces has a practical advantage: everything talks to everything else natively. Spaces uses the S3-compatible API, so migration from S3 is straightforward. The CDN endpoint terminates on Cloudflare's network anyway, which gives you similar geographic distribution to R2 without managing a separate Cloudflare account. It is not the cheapest option in these scenarios, but it is the simplest if you are already in the DO ecosystem.
- Zero egress, always
- S3-compatible API
- Cheap read operations
- No lifecycle policies
- No event notifications
- No Athena integration
- Lowest storage price
- Zero egress via Cloudflare
- Free upload transactions
- Need Cloudflare for free egress
- Smaller ecosystem
- No Lambda triggers
- Lambda + SQS event triggers
- Athena, Glue, Redshift
- 11 nines durability SLA
- Highest egress cost
- Most expensive in all 3 scenarios
- Complex pricing tiers
The Bottom Line
For read-heavy workloads with significant egress, R2 and B2 are not incrementally cheaper than S3. They are dramatically cheaper. The $51.30 vs $5.10 gap in the CDN scenario is not a pricing technicality; it is real money that compounds every month.
The decision splits this way: use B2 when storage volume is large and you want the lowest possible storage rate. Use R2 when you are already in the Cloudflare ecosystem or want a zero-configuration zero-egress setup. Use S3 when you need Lambda event triggers, Athena queries, lifecycle policies, or the full depth of AWS service integrations. Paying 10x more for egress is only defensible if you actually use what you are paying for.
One migration note: all three support the S3-compatible API. Moving from S3 to R2 or B2 is usually a config change in your SDK client, not a code rewrite. Test with a non-production bucket first and use the calculator below to confirm the numbers before committing.
Run Your Own Storage Cost Comparison
Plug in your actual storage volume, egress, and request counts to get a side-by-side cost breakdown across providers including S3, R2, B2, Spaces, and more.
Open Storage Calculator