Published 2026-08-17 Β· reference numbers, verify before budgeting
R2's storage rate is $0.015 per GB-month. S3 Standard is $0.023. That's a 35% gap and, on its own, not a reason to switch anything. The number that actually matters is the one nobody puts next to the storage price on the pricing page: S3 charges $0.09 per GB to move data out to the internet. R2 charges $0, always, no tier, no cap. We priced one real workload at three traffic levels to see what that difference is actually worth.
A mid-size media store: 500 GB of objects (images, video, user uploads β the kind of bucket that backs a SaaS product or a content site), 50,000 writes a month and 5,000,000 reads a month. The only thing we vary is egress β how much of that 500 GB actually gets downloaded by end users each month β because that's the one line item priced completely differently between the two.
Before a single byte leaves either bucket, here's the fixed monthly floor:
| Line item | AWS S3 Standard | Cloudflare R2 |
|---|---|---|
| Storage (500 GB) | 500 Γ $0.023 = $11.50 | 500 Γ $0.015 = $7.50 |
| Writes (50,000) | $0.005/1,000 β $0.25 | Class A $4.50/M β $0.23 |
| Reads (5,000,000) | $0.0004/1,000 β $2.00 | Class B $0.36/M β $1.80 |
| Fixed monthly floor | $13.75 | $9.53 |
Prices are reference estimates, August 2026. R2 rates confirmed against Cloudflare's current pricing page; S3 rates from AWS's published US East tier. Report outdated price β
Even with zero downloads, R2 is already 31% cheaper before egress enters the picture β the storage rate alone does that. Ignore R2's free tier here on purpose (10 GB storage, 1M Class A ops, 10M Class B ops a month, which would erase almost this entire floor at this scale) so the comparison holds at any size, not just small buckets.
Now we let the same 500 GB bucket actually get downloaded β 100 GB, 1 TB, then 10 TB a month, which is a realistic range from "small app with some traffic" to "video or dataset distribution."
| Monthly egress | AWS S3 total | Cloudflare R2 total | R2 saves |
|---|---|---|---|
| 100 GB | $13.75 + (100 Γ $0.09) = $22.75 | $9.53 | $13.22 (58%) |
| 1 TB (1,024 GB) | $13.75 + $92.16 = $105.91 | $9.53 | $96.38 (91%) |
| 10 TB (10,240 GB) | $13.75 + $921.60 = $935.35 | $9.53 | $925.82 (99%) |
The R2 column doesn't move. That's the entire point of the pricing model β egress isn't metered, so the bill is flat whether the bucket is idle or serving a traffic spike. The S3 column is linear in bandwidth, which means the bucket costs the most in exactly the month your product does best. At 10 TB egress, storage β the number both pricing pages lead with β is under 1% of the S3 bill. Egress is the bill.
S3's egress fee predates the current wave of CDN-first storage products; it's priced as if every download were a direct, uncached transfer out of AWS's network, and AWS still owns most of the compute those transfers used to feed. R2 was built specifically to undercut that model β Cloudflare's whole pitch is that egress is free because they'd rather you route the request through their CDN than pay to leave it. Neither is a scam, they're just different bets on where the money gets made. AWS makes it on data movement; Cloudflare makes it on the storage and request volume, hoping the traffic already comes through their network as a customer of Workers or their CDN anyway.
The trade-off that doesn't show up in either price column: S3 has been in production for 19 years, ships to more regions, and has deeper tooling for cross-region replication, lifecycle policies and IAM-level access control than R2's current feature set. If the workload is nearly all writes with almost no reads β backups, cold archives, compliance retention that's rarely downloaded β the egress gap barely matters and S3's maturity is worth the 31% storage premium. The moment reads become the dominant traffic, that trade flips hard.
For a bucket that mostly sits there, price on storage β S3 and R2 are close enough that operational fit should decide it. For a bucket that gets downloaded β images, video, package registries, public datasets, anything user-facing β egress dominates the bill within a few hundred GB of monthly traffic, and R2's $0 rate turns a five-figure annual line item into a few hundred dollars. Run the data egress cost calculator against your own traffic before committing to either, and size the storage side separately with the object storage cost calculator. If the workload sits behind a CDN either way, check it against the CDN bandwidth calculator too β sometimes the cache hit rate matters more than which bucket sits behind it.
Try the numbers yourself: plug your own storage and traffic into the cloud egress cost calculator, or see the request-side cost with the S3 request cost calculator. If you're also running compute at the edge, the Cloudflare Workers cost calculator covers the other half of an R2-based stack. It's the same lesson as hidden API costs that double your bill: the sticker price on the homepage is rarely the number that moves.
Figures are reference estimates (August 2026). S3 rates are the published US East, first-tier rates (storage under 50TB, egress under 10TB/month) and rise or fall in higher tiers. R2 rates confirmed live against Cloudflare's pricing page at time of writing. Always confirm on each provider's official pricing page before budgeting.