Cloudflare R2 vs Amazon S3 vs Backblaze B2: what the pricing calculators don't show you
Free egress sounds transformative. Here is when it actually changes the bill, and when it does not.
The S3 bill that catches teams by surprise
Most teams evaluating Cloudflare R2 or Backblaze B2 as S3 alternatives are chasing one number: egress. S3 charges $0.09 per GB for data transferred to the internet. R2 charges nothing. B2, via the Cloudflare Bandwidth Alliance, charges nothing either. Those are real differences. Whether they translate to a meaningfully lower bill depends on the other numbers most comparisons skip.
Teams typically arrive at this comparison the same way. S3 is the default choice: it lives in the same AWS account as everything else, the SDK exists in every language, and nobody gets fired for using it. Then, 12 to 18 months in, the bill doubles. Not because storage doubled, but because something changed the download volume: a feature shipped, a reporting pipeline started running, or customers started uploading larger files. The first time it happens, it looks like a one-off. The second time, it becomes a line item someone has to justify.
That is the moment most teams start taking this comparison seriously. Here is what the math actually looks like.
What the S3 bill is actually made of
S3 Standard billing has three components. Most teams only think carefully about one.
- Storage: $0.023 per GB per month. This is the number people see first and find easy to model.
- Egress: $0.09 per GB transferred to the internet, after the first 100 GB free per month. This is the number that surprises people.
- Requests: $0.005 per 1,000 PUT, POST, or LIST operations; $0.0004 per 1,000 GET operations. This is the number people forget to include in comparisons, especially for write-heavy services.
For a service that stores 1 TB and downloads 2 TB per month, say user-generated files, build artifacts, and video exports, the monthly bill looks roughly like this: $23 for storage, $171 for egress (1,900 GB at $0.09 after the free 100 GB), and about $2 for requests. Total: around $196, of which 87% is egress.
That is the scenario where the alternatives look compelling. The calculation changes if your workload is write-heavy, your users are in APAC, or you need compliance-grade storage features. Most public comparisons model the read-heavy scenario and leave it there.
Cloudflare R2: when zero egress changes the math
R2 charges $0.015 per GB for Standard storage, about 35% cheaper than S3. Egress to the internet is genuinely zero. Operations split into two classes: Class A (writes, lists, multipart operations) at $4.50 per million, and Class B (reads, HEAD requests) at $0.36 per million.
Using the same 1 TB storage, 2 TB download scenario: $15 for storage, $0 for egress, roughly $1.80 for reads at 5 million Class B operations. Total: about $17. The saving against S3 is $179 per month, and it is real.
The case weakens on write-heavy workloads. A service ingesting logs, processing uploads, or running frequent multipart writes at 100 million Class A operations per month will spend $450 on R2 operations alone. S3 PUT costs at the same volume are around $500, a gap that narrows to near-irrelevance once migration engineering time is factored in. The mistake teams make is calculating egress savings on their current bill without also exporting their PUT count from CloudWatch. Egress appears as a line item; operation counts require a separate query.
Backblaze B2: lowest storage price, with geographic constraints
B2 charges $0.006 per GB per month: about 60% cheaper than R2 and 74% cheaper than S3 Standard. Standard download bandwidth costs $0.01 per GB, but traffic flowing through Cloudflare's network is free under the Backblaze-Cloudflare Bandwidth Alliance. There are no caps or ratio limits on this arrangement.
For the same 1 TB storage, 2 TB download scenario with Cloudflare handling delivery: $6 for storage, $0 for egress, under $0.01 for transactions. Total: about $6 per month. That is cheaper than R2 on the same workload by roughly 60%, and cheaper than S3 by 97%.
The Cloudflare dependency is real. If you already use Cloudflare for CDN, DDoS protection, or Workers, the alliance makes B2 the cheapest realistic option across the three services. If you use CloudFront, Akamai, or no CDN at all, you pay B2's standard egress rate, still far less than S3 but not zero.
The harder constraint is geography. Backblaze operates three data centres: Reston VA (US East), Amsterdam (EU), and Toronto (Canada East). There is no APAC region. For applications where latency is part of the product experience (interactive document previews, media playback, real-time image rendering), B2 will produce noticeably higher latency for users in India, Singapore, Japan, or Australia. For archival storage, backups, or assets accessed occasionally, the latency difference rarely affects the user experience. For frequent interactive reads from Asia-Pacific, it does.
B2 also has no archival storage tiers. S3 offers Glacier, Glacier Instant Retrieval, and Deep Archive for objects that start hot and cool over months or years. If your data has a long tail (audit logs kept for seven years, customer backups retained for compliance), S3's archival pricing will eventually cost less than B2's flat per-GB rate, even including egress. For objects accessed fewer than once per month, S3 Glacier Instant Retrieval at $0.004/GB starts competing directly with B2's $0.006/GB.
Four access patterns and which service wins each
| Access pattern | S3 Standard | Cloudflare R2 | B2 + Cloudflare | Decision driver |
|---|---|---|---|---|
| Read-heavy, US/EU users, Cloudflare CDN in use | ~$196 | ~$17 | ~$6 | B2 wins on storage price; both offer zero egress via Cloudflare |
| Read-heavy, significant APAC user base, latency matters | ~$196 | ~$17 | ~$6 + latency cost | R2's edge network covers APAC; B2's three DCs do not |
| Write-heavy: 100M PUT operations per month | ~$523 | ~$467 | ~$50 (if Cloudflare) | B2 wins if you use Cloudflare; S3 and R2 converge on ops cost |
| Compliance archive requiring Object Lock or multi-region | Supported | Not supported | Not supported | S3 is the only option; R2 and B2 do not implement Object Lock |
What teams find out after migrating
Three issues tend to surface after the migration, not before.
ETags on multipart objects break silently. R2 calculates ETags differently from S3 for uploads that used the multipart API, a documented behaviour that is easy to overlook during planning. Applications that store S3 ETags in a database for deduplication or integrity verification will produce false positives or failures after migration. The fix is a one-time recalculation pass over stored ETag values, but the scope is wider than teams expect: any service that ever used S3's multipart API is affected.
Write operation costs are harder to model than egress costs. Egress is visible as a line item on your AWS bill. PUT counts live in CloudWatch metrics, but most teams have never queried them. R2's Class A operation cost of $4.50 per million catches write-heavy services unexpectedly. Export three months of S3 operation counts before committing to a migration. The egress calculation is often straightforward; the operation calculation requires more work.
Running both stores in parallel adds cost. A safe migration approach (validate the new store, backfill historical objects, verify integrity, then cut over) means paying for storage in two places for several weeks. For a 100 TB migration, that parallel window typically costs 20 to 30% of a full month's storage bill in addition to the engineering time. It is the correct approach. Most cost-saving analyses assume an instant cutover.
Three questions before deciding
Answer these before starting migration planning.
Is your dominant cost egress or operations? Pull three months of S3 cost breakdown. If egress is 70% or more of the total, the move to R2 or B2 is likely worth the engineering effort. The saving is large enough to justify six to eight weeks of migration work within a year. If operations or storage dominate, the saving is smaller and the migration ROI is weaker.
Where are your active users? If a meaningful share of users are in APAC, Southeast Asia, or South America, B2's three-DC footprint will produce higher latency for interactive reads. R2's edge network handles non-US and non-EU geography better than B2. S3 remains the most consistent globally for latency-sensitive access patterns.
Do you need compliance storage features? Object Lock, multi-region replication, and Glacier archival tiers are S3-specific. If your data retention policy, regulatory requirements, or customer contracts require immutable object storage or multi-region redundancy, neither R2 nor B2 replaces S3 for those object classes today. You can use them alongside S3, with different buckets for different data classes, but not as a complete replacement.
If egress dominates your bill, your users are in the US or EU, and you do not need compliance storage features, the switch from S3 to R2 or B2 is worth the work. The cost reduction is real. The migration is technically straightforward for most applications. The work is in finding the compatibility gaps before production traffic does.
Frequently asked questions
Related reading
Redis writes at scale: what benchmarks don't capture
Redis benchmarks claim millions of operations per second. They are measured under ideal conditions. Here are the three write-path failure modes that only appear in production — and how to diagnose each one.
Redis, Valkey, or Dragonfly in 2026: how to actually decide
The Redis licence change created a three-way choice. Most teams are making it based on benchmarks. The real decision factors are licencing risk, ecosystem backing, and cloud-provider alignment.
gRPC vs REST for internal services: the decision you're probably making too early
The gRPC vs REST debate isn't about performance. It's about when the cost of schema enforcement is worth paying — and most teams reach for gRPC before they've hit the problems it actually solves.