The Object Storage Egress War Everyone Covers Is R2 vs S3. The One That Saves Money Is R2 vs B2.
Cloudflare made egress free and won the headline. Backblaze made operations free too, and nobody put that in the spreadsheet.
The story everyone's telling: object storage egress is free now
For most of the last two decades, the economics of cloud object storage followed one brutal pattern: storage was cheap, and getting your own data back out was not. Amazon S3 set that pattern in 2006 and never fundamentally changed it. Cloudflare R2 launched in 2022 with one deliberate provocation aimed straight at it: zero egress fees, permanently. By 2026 that pitch has mostly won the public argument. R2 is the answer most engineers reach for when someone asks how to stop paying to serve their own files, and object storage egress being free is treated as settled.
It isn't wrong. It's incomplete. It treats egress as the only line item worth comparing, and that stopped being true the moment R2 introduced per-operation pricing on top of free bandwidth. It was never fully true for Backblaze B2 either, which built a different kind of free-egress deal years before R2 existed and rarely gets invited into the comparison.
What R2 actually bills you for, and it isn't just bandwidth
R2's 2026 pricing sheet has four parts: storage at $0.015 per GB per month, Class A operations (writes, lists, and other metadata changes) at $4.50 per million, Class B operations (reads) at $0.36 per million, and a free tier covering 10GB of storage plus 1 million Class A and 10 million Class B calls. Egress is $0.00 per GB, with no allowance to track because there's no meter running.
The free-egress framing is accurate and R2 delivers on it without asterisks. But operations are billed per call, not per byte, which means a workload's read and write pattern moves the bill far more than its egress volume does. A bucket serving a modest number of large files barely notices the operations line. A bucket ingesting or serving tens of millions of small objects a month notices it immediately.
What Backblaze B2 bills you for: almost nothing, until you leave the ratio
B2's pricing looks unremarkable at first glance: storage starts at $6.95 per TB per month, which works out to roughly $0.00695 per GB, less than half of R2's rate and less than a third of S3 Standard's. The part that changes the comparison is what B2 doesn't charge for. Class A, B, and C operations — uploads, downloads, and most other API calls — are free on the pay-as-you-go plan, with no per-call meter at all. A narrow Class D category, covering less common calls, costs $0.004 per 10,000 requests, with the first 2,500 each day free.
Egress is free up to roughly three times your average monthly stored data, calculated on B2's own network, with no CDN required to unlock it. Past that ratio, egress is billed at $0.01 per GB, a ninth of S3's standard rate, or it stays free indefinitely if the download is routed through a Bandwidth Alliance partner such as Cloudflare, Fastly, or bunny.net sitting in front of the bucket.
The three price sheets, side by side
Laid out plainly, the shape of each provider's bill looks like this for a standard, non-archive storage tier:
| Provider | Storage ($/GB-mo) | Write/list ops | Read ops | Egress |
|---|---|---|---|---|
| Cloudflare R2 | $0.015 | $4.50/million | $0.36/million | $0.00/GB, always |
| AWS S3 Standard (US East) | $0.023 | ≈$5.00/million | ≈$0.40/million | First 100GB/mo free, then ≈$0.09/GB |
| Backblaze B2 | $0.00695 | Free | Free | Free up to ≈3x stored data, then $0.01/GB |
S3's request and egress figures vary slightly by region and shift at higher tiers; the numbers above are the standard US East rates and are close enough for the comparison that follows.
Running the same workload through all three
Take a mid-size media application: 10TB of stored images, 20 million new objects written per month, 300 million read requests per month, and 30TB of monthly egress served with no CDN layered in front of the bucket. That egress-to-storage ratio, 3-to-1, sits right at the edge of B2's free allowance, which makes it a useful stress test rather than a cherry-picked win.
| Line item | Cloudflare R2 | AWS S3 Standard | Backblaze B2 |
|---|---|---|---|
| Storage | $150 | $230 | $69.50 |
| Write/list ops | $90 | $100 | $0 |
| Read ops | $108 | $120 | $0 |
| Egress | $0 | ≈$2,691 | ≈$0 (at the free ceiling) |
| Total | ≈$348 | ≈$3,141 | ≈$70 |
The S3 egress figure uses the flat first-tier rate as an upper-bound estimate; AWS's actual tiered pricing gets cheaper per GB at higher volumes and varies by region, so treat ≈$2,691 as a ceiling, not a quote. Even with real tiering pulling that number down, S3 isn't closing a gap this size. The result that matters is B2 landing under R2 by roughly 5x on a workload R2's marketing is aimed squarely at, because operations pricing and the free-egress ratio did more work than bandwidth did.
Where this flips, and where R2 still wins outright
The workload above sits near the edge of B2's ratio on purpose. Move the ratio and the winner changes. Take a video streaming service with a modest library, 2TB stored, but heavy playback: 200TB of monthly egress against light write volume, say 2 million uploads and 50 million reads a month. That's 100x the stored data in egress, nowhere near B2's roughly 3x ceiling.
On R2: storage $30, writes $9, reads $18, egress $0 — about $57 a month. On B2: storage $13.90, operations free, but egress beyond the 6TB free allowance (3x the 2TB stored) comes to roughly 194,000GB at $0.01/GB, or about $1,940 a month. R2 wins by more than 30x on this shape, because a flat zero beats a ratio-capped allowance once egress dwarfs storage.
The pattern is consistent: R2's flat zero-egress deal is strongest when egress volume runs far ahead of stored data — streaming, CDN origins, large read fan-out from a small dataset. B2's combination of free operations and ratio-based free egress is strongest when egress stays within a few multiples of storage and write or list volume is meaningful. Neither provider is the correct default. The ratio is.
The caveats that don't show up in either provider's pricing page
B2's 3x allowance is measured against trailing average storage, not the current month's total, so a bucket that's still growing won't get the full benefit of an allowance sized for its eventual footprint. A quiet month followed by a traffic spike can also push a workload over the ratio faster than expected, since the allowance moves with a rolling average rather than a hard, easily-forecast number.
Routing through a Bandwidth Alliance partner to remove B2's egress cap entirely is operationally simple, but it's still another layer in the request path and another vendor relationship if a CDN wasn't already part of the stack. And all three providers now speak the S3 API well enough for most SDKs and tooling to work unmodified, which weakens the traditional lock-in argument for staying on S3 specifically. Where S3 still earns its premium is depth: fine-grained IAM policies, S3 Object Lambda, and replication tooling that neither competitor fully replicates.
If a CDN already sits in front of the bucket, the ratio stops mattering
Many teams already run Cloudflare, Fastly, or a similar CDN in front of their storage for caching, TLS termination, or DDoS protection, independent of which object store sits behind it. For those teams, B2's Bandwidth Alliance turns egress into a rounding error regardless of the egress-to-storage ratio: a download that passes through a partner CDN on its way out is exempt from B2's cap entirely, not merely discounted.
That changes the streaming example from the previous section completely. With a CDN already in the path, the same 200TB of monthly egress costs $0 on both R2 and B2, and the earlier 30x gap in R2's favor disappears. The comparison collapses to storage cost and operations volume, where B2's $0.00695/GB and free operations beat R2's $0.015/GB on both counts. The CDN, not the storage provider, ends up doing the job the egress-fee comparison assumed the storage bill was doing.
What switching actually costs, in engineering time rather than dollars
The comparisons above assume switching providers is close to free, and for a plain key-value workload it mostly is. R2 and B2 both implement enough of the core S3 API — PutObject, GetObject, ListObjectsV2, multipart upload, delete — that most existing S3 SDKs work against either one with an endpoint and credential change, not a rewrite.
The parts that cost real time are outside the core object operations. Bucket policies written against IAM's full syntax have no direct equivalent on R2 or B2, so access rules generally get reimplemented at the application layer instead of the bucket layer. Multipart part-size minimums, server-side encryption defaults, and presigned URL expiry behaviour differ enough between providers that a migration needs a genuine integration test pass, not just a config swap. And any pipeline built on S3 Event Notifications to SQS, SNS, or Lambda needs a replacement: R2 has its own event system through Cloudflare Queues, while B2 has no built-in equivalent and leans on whatever sits in front of it. None of that shows up in a per-GB price comparison, and all of it shows up in a migration timeline.
A decision rule, not a leaderboard
The workload's egress-to-storage ratio is a number every team already has sitting in a billing dashboard. Divide monthly egress by average stored data, and the choice mostly makes itself. Well above roughly 3x — streaming, large read fan-out, CDN origin work — R2's flat zero-egress pricing is hard to beat, and its per-operation fees rarely dominate unless write volume runs into the tens of millions a month. Comfortably below that ratio, with meaningful write or list traffic, run B2's numbers before assuming R2 is cheaper; free operations pricing alone can outweigh R2's egress advantage. If the workload needs S3-specific tooling and cost isn't the binding constraint, the egress bill is the price of staying in that ecosystem, not evidence something was set up wrong.
The egress war, as a marketing argument, is mostly over. What's left is a smaller and more useful question: which provider's free tier actually matches the shape of the traffic in front of it. That shape is specific to each workload, and it was sitting in a billing dashboard the whole time.
Frequently asked questions
Related reading
AI Crawler Verification Barely Exists. That's Why 24 Million Fake Requests Got Through in Two Months.
Cloudflare will charge AI crawlers by the fetch. DataDome found 24 million requests faking a known crawler's identity in two months. Here's the verification gap between the two.
AWS had four separate outages in 2026. Multi-region would have caught exactly one.
Four AWS outages hit in eleven weeks in 2026: a data center overheating, a third-party network failure, a software limit, and a hardware routing fault. The standard fix, multi-region, would have caught exactly one.
Coinbase's rollback hit a circular dependency: the tooling needed the gateway that had just failed
When Coinbase's ingress gateway failed on 14 July 2026, the path engineers needed to reach their own rollback tooling ran through that same gateway. AWS hit an identical loop nine months earlier.