cloudflare · r2 · s3
Cloudflare R2 Pricing: When Free Egress Beats S3
By Aakash Verma ·
Cloudflare R2 charges $0.015 per GB-month for Standard storage, $4.50 per million Class A operations (writes and lists), $0.36 per million Class B operations (reads), and nothing for egress. The first 10 GB, 1 million Class A and 10 million Class B operations each month are free. Those are the numbers on Cloudflare’s R2 pricing page, last updated October 1, 2026, which we checked on October 24.
The egress line is the whole story. Amazon S3 charges $0.09 per GB for data leaving AWS after the first 100 GB a month. R2 charges zero, through its own r2.dev URLs or a custom domain. If people download a lot of what you store, that difference is most of your bill. If they don’t, R2 saves you a lot less than the internet says.
The full price list
| R2 Standard | R2 Infrequent Access | S3 Standard (US East) | |
|---|---|---|---|
| Storage, per GB-month | $0.015 | $0.01 | $0.023 |
| Writes and lists, per million | $4.50 | $9.00 | $5.00 |
| Reads, per million | $0.36 | $0.90 | $0.40 |
| Reading data back, per GB | none | $0.01 | none |
| Egress to the internet, per GB | free | free | $0.09 after 100 GB |
| Minimum storage time | none | 30 days | none |
S3 prices are from the Amazon S3 pricing page, the same ones our S3 pricing post walks through. The free tier on R2 covers Standard storage only; Infrequent Access gets no free allowance at all.
Class A is anything that creates or lists: PutObject, CopyObject, ListObjects, every part of a multipart upload. Class B is GetObject and HeadObject, basically every read. Deletes are free on R2, and so is aborting a multipart upload.
Where R2 wins, in numbers
Take an app that keeps 2 TB of user uploads, writes 5 million objects a month, serves 50 million reads, and sends 3 TB out to browsers.
On S3 Standard that’s $47.10 of storage, $25.00 of PUTs, $20.00 of GETs and $267.48 of data transfer: $359.58 a month. On R2 it’s $30.57 of storage (after the free 10 GB), $18.00 of Class A and $14.40 of Class B (after the free operations), and $0 of egress: $62.97 a month.
Almost $270 of the $297 difference is the transfer line. Storage and requests are cheaper on R2 too, but only by about a third.

The grid shows the pattern. Read it down the first column and the savings stay small, $8 a month for a terabyte nobody downloads. Read it across any row and they jump the moment real traffic starts. (Storage and egress only; requests would add a little to both sides. The R2 pricing calculator does the full version with your own numbers.)
Where R2 doesn’t win
Archives. If the data is backups or old logs that you write once and almost never read, R2 is the wrong comparison to make. S3 Glacier Deep Archive is $0.00099 per GB, so 10 TB costs about $10 a month there and $102 on R2 Infrequent Access. Deep Archive takes hours to restore and has a 180-day minimum, but for disaster-recovery copies that’s fine.
Data that’s already behind a CDN. If your S3 bucket already sits behind CloudFront and most requests are cache hits, S3’s egress line is mostly gone already: transfer from S3 to CloudFront is free and CloudFront’s first 1 TB out each month is free. Run the CloudFront calculator on your real traffic before assuming R2 will help.
List-heavy code. Class A on R2 is $4.50 per million, only 10% below S3’s $5. An app that lists a bucket on every page load pays for that on both. That’s a code fix, not a provider fix.
Infrequent Access used for the wrong files. R2’s IA class bills a 30-day minimum and $0.01 per GB every time you read it back. Cloudflare’s own example: 1 TB stored for 5 days and read 1,000 times costs $29.90 on IA versus $14.85 on Standard. Use it for things you really don’t read.
The move itself costs money (on the AWS side)
Cloudflare’s migration tools are free. Super Slurper copies a whole bucket in one go, Sippy copies objects lazily as they’re requested. You pay R2 only for the Class A operations they make (one per object under 100 MiB for Super Slurper).
AWS still charges you to send the data out. Copying 2 TB out of S3 is about $175 of data transfer at $0.09 per GB. There’s a way around it: AWS waives data transfer out when you move off AWS if you ask Support first, but it’s meant for moving all your data, or all of one service’s data, within 180 days. Moving one bucket and keeping the rest on S3 doesn’t obviously qualify. Ask before you start, not after the invoice.
One more gotcha: the free r2.dev URL is rate limited and Cloudflare says it’s for development, not production. Put a custom domain on the bucket instead. That also puts Cloudflare’s cache in front of it, so repeat downloads don’t even count as Class B reads.
So, should you switch?
If your S3 bill is mostly data transfer out, yes, and the saving is usually the size of that line. If it’s mostly storage, R2 saves about a third, which is real money at 50 TB and a rounding error at 500 GB. If it’s mostly requests, fix the code first.
Want to know which one yours is? Plug your numbers into the R2 pricing calculator, or send us the bill and we’ll tell you.
Want us to look at your bill?
No upfront fee: for six months you pay half of what we save you each month, then you keep all of it. Nothing saved, nothing owed.
Also here: Free cloud cost audit ($0) · Cloud cost optimization services: $0 up front · Reduce your startup's AWS bill · Pricing: paid only from verified savings · Move from AWS to a European cloud