Cloudflare R2 vs AWS S3 for Indie Makers (Real Costs)
R2 charges nothing for egress and $0.015 per GB-month for Standard storage, with 10 GB, 1M writes and 10M reads free each month. S3 Standard in us-east-1 is $0.023 per GB-month, and internet data transfer costs $0.09 per GB after the first 100 GB a month across your AWS account. For a solo founder serving files to the public, that egress line decides most of the bill.

Key takeaways
- Cloudflare's R2 pricing docs say: "There are no charges for egress bandwidth for any storage class." S3 charges $0.09 per GB for the first 10 TB a month of internet transfer after a 100 GB free allowance shared across AWS.
- R2 Standard storage is $0.015 per GB-month, with Class A operations at $4.50 per million and Class B at $0.36 per million. S3 Standard in us-east-1 is $0.023 per GB-month, $0.005 per 1,000 PUTs and $0.0004 per 1,000 GETs.
- R2's free tier renews every month: 10 GB-month of Standard storage, 1 million Class A and 10 million Class B operations. New AWS accounts now get credits (up to $200) and a Free plan that ends after 6 months at most.
- In our worked example of 50 GB stored and 500 GB served a month, R2 costs $0.60 and S3 about $38.45. At 1 TB stored and 5 TB served, it is $14.85 vs about $470.50.
- Pick S3 if you already live inside AWS, need S3 features R2 does not implement (versioning, bucket policies, object tagging) or move data mostly between AWS services.
On this page 23
- TL;DR
- A note on Cloudflare's own comparison page
- R2 vs S3 at a glance
- Pricing in detail
- Cloudflare R2
- AWS S3
- The AWS Free Tier has changed
- Worked example 1: a small SaaS with user uploads
- Worked example 2: a download or media product
- What about S3 behind CloudFront?
- S3 API compatibility: what R2 does not do
- Presigned URLs and public buckets
- Pick R2 if, pick S3 if
- Migrating from S3 to R2
- Three alternatives in brief
- Frequently asked questions
- Is Cloudflare R2 cheaper than S3?
- Does R2 have a free tier?
- Is the AWS S3 free tier still 5 GB for 12 months?
- Is R2 fully compatible with the S3 API?
- Can I serve public files straight from an R2 bucket?
- Ship it, then launch it
- Sources
Verdict: For a solo founder storing user uploads, downloads or static assets that the public fetches, Cloudflare R2 is the cheaper default, because it charges nothing for egress and less for storage. AWS S3 still wins when your app already runs inside AWS, when files mostly move between AWS services rather than out to the internet, or when you need S3 features R2 does not implement.
Every price below comes from Cloudflare's and AWS's own pages, checked on 10 Nov 2026. The worked examples are our arithmetic, and the advice is ours and marked as such.
TL;DR#
- Egress is the big difference. Cloudflare's docs say: "There are no charges for egress bandwidth for any storage class" (R2 pricing). AWS charges $0.09 per GB for the first 10 TB a month of internet transfer from us-east-1, after a 100 GB monthly allowance shared across all AWS services (AWS price list, S3 pricing).
- Storage. R2 Standard is $0.015 per GB-month. S3 Standard in us-east-1 is $0.023 per GB-month for the first 50 TB (AWS S3 price data).
- Requests. R2: $4.50 per million writes (Class A), $0.36 per million reads (Class B). S3: $0.005 per 1,000 PUTs ($5 per million) and $0.0004 per 1,000 GETs ($0.40 per million).
- Free tiers. R2 renews 10 GB, 1M writes and 10M reads every month. AWS now gives new accounts credits and a Free plan of up to 6 months, not a fixed S3 allowance.
- Our worked examples: 50 GB stored and 500 GB served costs $0.60 on R2 and about $38.45 on S3. At 1 TB stored and 5 TB served: $14.85 vs about $470.50.
Disclosure: ZeroRaised publishes this comparison and is a launch site for bootstrapped products. ZeroRaised has no commercial relationship with Cloudflare or AWS and earns nothing if you sign up for either. Facts come from the linked sources as checked on 10 Nov 2026.
A note on Cloudflare's own comparison page#
If you searched "cloudflare r2 vs s3", the top result is probably Cloudflare's R2 vs S3 page. It is a vendor page, and its comparison footnote says: "Prices are limited to the public fees as of 10/10/2024". That is over two years old. The numbers in this post come from Cloudflare's R2 pricing docs (last updated 30 Oct 2026) and AWS's own price data, both fetched today.
R2 vs S3 at a glance#
| Cloudflare R2 | AWS S3 (us-east-1) | |
|---|---|---|
| Standard storage | $0.015 / GB-month | $0.023 / GB-month (first 50 TB) |
| Infrequent access storage | $0.01 / GB-month (30-day minimum) | Standard-IA: $0.0125 / GB-month |
| Retrieval fee (infrequent class) | $0.01 / GB | Standard-IA: $0.01 / GB |
| Writes | Class A: $4.50 / million | PUT, COPY, POST, LIST: $0.005 / 1,000 |
| Reads | Class B: $0.36 / million | GET and others: $0.0004 / 1,000 |
| Egress to internet | Free | 100 GB/month free across AWS, then $0.09 / GB (first 10 TB) |
| Monthly free tier | 10 GB-month, 1M Class A, 10M Class B | None fixed for S3; new-account credits instead |
| Deletes | Free | Not covered in this post |
| API | S3-compatible, with gaps | The S3 API itself |
| Public file serving | Custom domain, or rate-limited r2.dev for dev | Bucket URLs, or CloudFront in front |
Pricing in detail#
Cloudflare R2#
R2 bills on three things: storage, Class A operations (writes and lists, which "tend to mutate state") and Class B operations (reads). The pricing page lists Standard storage at $0.015 per GB-month, Class A at $4.50 per million and Class B at $0.36 per million. Infrequent Access is $0.01 per GB-month but adds a $0.01 per GB retrieval fee and a 30-day minimum storage duration.
The free tier renews each month: 10 GB-month of storage, 1 million Class A and 10 million Class B requests. It "only applies to Standard storage". Deletes (DeleteObject, DeleteBucket, AbortMultipartUpload) are free.
Two details worth knowing. First, Cloudflare rounds up: "If you have performed one million and one operations, you will be billed for two million operations." Second, the egress footnote says egress via the Workers API, the S3 API and r2.dev domains is free, but "If you connect other metered services to an R2 bucket, you may be charged by those services."
AWS S3#
AWS's own price data for US East (N. Virginia) lists S3 Standard storage at $0.023 per GB-month for the first 50 TB, $0.022 for the next 450 TB and $0.021 over 500 TB. PUT, COPY, POST or LIST requests are $0.000005 each ($0.005 per 1,000), and GET and all other requests are $0.0004 per 1,000 (AWS S3 price data).
Data transfer is where S3 gets expensive for public files. The S3 pricing page describes the free allowance as "Data transferred out to the internet for the first 100GB per month, aggregated across all AWS Services and Regions (except China and GovCloud)". Beyond that, AWS's price list shows "$0.090 per GB - first 10 TB / month data transfer out beyond the global free tier", then $0.085 per GB for the next 40 TB (AWS price list).
The AWS Free Tier has changed#
If you remember a fixed yearly S3 allowance from older guides, check before you rely on it. Today's AWS Free Tier FAQ says: "New customers receive up to $200 in AWS credits, $100 upon sign-up and up to $100 more as you explore foundational AWS services." It also says: "Your Free plan expires the earlier of (1) 6 months from the date you opened your AWS account, or (2) once you have exhausted your Free Tier credits." S3 appears on the AWS Free Tier page as available on both plans, without a specific free storage amount.
Our read: credits are fine for trying S3, but they run out. R2's free tier does not, which matters for a side project that may sit at 3 GB for a year.
Worked example 1: a small SaaS with user uploads#
Example (our arithmetic): 50 GB stored, 500 GB downloaded by users each month, 2 million GETs, 100,000 PUTs. We assume Standard storage, us-east-1 for S3, and that nothing else in your AWS account uses the 100 GB free transfer.
| Line | Cloudflare R2 | AWS S3 |
|---|---|---|
| Storage | (50 - 10 free) × $0.015 = $0.60 | 50 × $0.023 = $1.15 |
| Writes | 100,000 is under 1M free = $0.00 | 100 × $0.005 = $0.50 |
| Reads | 2M is under 10M free = $0.00 | 2,000 × $0.0004 = $0.80 |
| Egress | $0.00 | (500 - 100) × $0.09 = $36.00 |
| Total | $0.60 | $38.45 |
Storage and requests are close. Egress is 94% of the S3 bill.
Worked example 2: a download or media product#
Example (our arithmetic): 1 TB (we use 1,000 GB) stored, 5 TB (5,000 GB) served each month, 10 million GETs, 500,000 PUTs. Same assumptions as above.
| Line | Cloudflare R2 | AWS S3 |
|---|---|---|
| Storage | (1,000 - 10) × $0.015 = $14.85 | 1,000 × $0.023 = $23.00 |
| Writes | 500,000 is under 1M free = $0.00 | 500 × $0.005 = $2.50 |
| Reads | 10M is within 10M free = $0.00 | 10,000 × $0.0004 = $4.00 |
| Egress | $0.00 | (5,000 - 100) × $0.09 = $441.00 |
| Total | $14.85 | $470.50 |
Where R2 can still surprise you is reads. Cloudflare's own asset-hosting example, 10 million reads per day, comes to $104.40 a month in Class B operations alone. Our read: if you serve hot public files, put a custom domain in front of the bucket so Cloudflare's cache can absorb repeat requests, and check your Class B count in the dashboard after launch. Our guide on handling traffic spikes covers the rest of the launch-day plumbing.
What about S3 behind CloudFront?#
The fair counter-argument is that nobody should serve public S3 files without a CDN. AWS now sells flat-rate CloudFront plans with "no overage charges". The page lists a Free plan at $0/month with 1M requests, 100GB data transfer and 5GB of included S3 storage, and Pro at $15/month with 10M requests, 50TB data transfer and 50GB of S3 storage. Separately, CloudFront's pay-as-you-go page lists an always-free tier of "1 TB of data transfer out to the internet per month" and "10,000,000 HTTP or HTTPS Requests per month".
Our read: this narrows the gap a lot. If you are committed to AWS, put CloudFront in front of S3 and read the plan terms for what counts toward each allowance. If you are starting fresh, R2 behind a custom domain gets you there with one vendor and no egress meter at all.
S3 API compatibility: what R2 does not do#
R2 speaks the S3 API, so the AWS SDK works with an endpoint swap to https://<ACCOUNT_ID>.r2.cloudflarestorage.com and region: "auto" (presigned URLs docs). But Cloudflare's S3 compatibility table marks several operations as not implemented, including:
- Versioning:
PutBucketVersioningandGetBucketVersioning. - Bucket policies and ACLs:
PutBucketPolicy,PutBucketAclandGetBucketAcl. - Object tagging:
PutObjectTagging,GetObjectTaggingandDeleteObjectTagging. - Static website hosting and replication:
PutBucketWebsiteandPutBucketReplication.
If your code relies on any of these, you need a workaround (for example, access control in your app or a Worker) before you switch.
Presigned URLs and public buckets#
Both services support the usual pattern for user uploads: your server signs a short-lived URL and the browser uploads directly to storage. On R2, a presigned URL can allow GET, PUT, HEAD or DELETE, with an expiry "from 1 second to 7 days (604,800 seconds)", and generating one needs "no communication with R2". Cloudflare also notes the Workers binding "cannot generate presigned URLs", so inside a Worker you sign with aws4fetch or the AWS SDK (presigned URLs).
For public files, R2 gives you two routes (public buckets):
- r2.dev subdomain. Quick, but "Public access through
r2.devsubdomains is rate-limited and should only be used for development purposes." - Custom domain. Required for "WAF custom rules, caching, access controls, or Bot Management". This is the production route.
Our read: set up the custom domain on day one. Swapping URLs in a database full of user uploads later is a chore.
Pick R2 if, pick S3 if#
This is our editorial advice, based on the published prices and docs above.
Pick Cloudflare R2 if:
- Users or the public download your files (uploads, avatars, exports, installers, images, video).
- Your bill would otherwise be mostly egress.
- You want a free tier that never expires, for side projects that may stay small.
- Your frontend already runs on Cloudflare. Our Vercel vs Cloudflare Pages comparison covers that side.
Pick AWS S3 if:
- Your app runs on EC2, Lambda or ECS and files mostly move inside AWS.
- You need versioning, bucket policies, object tagging, replication or S3 event notifications.
- You have AWS credits to burn and a CDN plan (CloudFront) you are happy with.
- A customer contract or security review names AWS.
For the rest of the stack around storage, see our SaaS tech stack for solo founders.
Migrating from S3 to R2#
Cloudflare documents two tools (data migration):
- Super Slurper for "one-time, comprehensive transfers".
- Sippy for incremental migration, "populating your R2 bucket as objects are requested", which Cloudflare suggests "For gradual migration that avoids upfront egress fees."
Both are "free to use"; you pay only for the Class A operations they make in R2, and "your source bucket might incur additional charges" as objects are copied (R2 pricing). Our read: budget for S3 egress on the way out.
Our read on a safe order: point new uploads at R2 first, turn on Sippy for old objects, check for any of the unsupported features above, then switch your public URLs to the R2 custom domain.
Three alternatives in brief#
- Backblaze B2: "Starts at $6.95 / TB / mo", "First 10GB storage is always free", and free egress up to 3x your average monthly storage, then $0.01/GB (Backblaze pricing).
- Bunny Storage: Standard tier from $0.01/GB per region, Edge tier (SSD) $0.02/GB, with a $1 monthly minimum (Bunny Storage pricing).
- Hetzner Object Storage: €6.49 per month excluding VAT, which includes 1 TB of storage and 1 TB of egress (Hetzner Object Storage).
Frequently asked questions#
Is Cloudflare R2 cheaper than S3?#
For anything that serves files to the internet, almost always. R2 storage is $0.015 per GB-month against $0.023 for S3 Standard in us-east-1, and R2 charges no egress, while S3 charges $0.09 per GB for internet transfer after the first 100 GB a month. In our example of 50 GB stored and 500 GB served, R2 costs $0.60 and S3 about $38.45. S3 can be competitive when data rarely leaves AWS.
Does R2 have a free tier?#
Yes, and it renews every month. Cloudflare lists 10 GB-month of storage, 1 million Class A operations and 10 million Class B operations free each month, with free egress. The free tier applies only to Standard storage, not Infrequent Access.
Is the AWS S3 free tier still 5 GB for 12 months?#
Not for new accounts on today's AWS Free Tier page. AWS says new customers receive up to $200 in credits, $100 at sign-up and up to $100 more by exploring services, and the Free plan expires after 6 months or when credits run out, whichever comes first. The S3 listing on that page shows no specific free storage amount.
Is R2 fully compatible with the S3 API?#
Mostly for everyday work. Standard SDK calls such as PutObject, GetObject, multipart uploads and presigned URLs work against R2's S3 endpoint. Cloudflare's compatibility table marks bucket versioning, bucket policies, bucket ACLs, object tagging, static website configuration and replication as not implemented, so check that list before you migrate.
Can I serve public files straight from an R2 bucket?#
Yes, through a custom domain or the r2.dev subdomain. Cloudflare says r2.dev access is rate-limited and should only be used for development. For production, connect a custom domain, which also lets you use Cloudflare's cache, WAF rules and access controls.
Ship it, then launch it#
Once your uploads have somewhere cheap to live, run through our product launch checklist for bootstrapped makers and submit your product to ZeroRaised for free. For more infrastructure comparisons with real numbers, join the ZeroRaised newsletter.
Sources#
- Cloudflare R2 pricing, last checked 10 Nov 2026
- Cloudflare R2 S3 API compatibility, last checked 10 Nov 2026
- Cloudflare R2 presigned URLs, last checked 10 Nov 2026
- Cloudflare R2 public buckets, last checked 10 Nov 2026
- Cloudflare R2 data migration, last checked 10 Nov 2026
- Cloudflare R2 vs AWS S3 (vendor page), last checked 10 Nov 2026
- Amazon S3 pricing, last checked 10 Nov 2026
- AWS S3 price data (us-east-1), last checked 10 Nov 2026
- AWS Data Transfer price list (us-east-1), last checked 10 Nov 2026
- AWS Free Tier, last checked 10 Nov 2026
- AWS Free Tier FAQs, last checked 10 Nov 2026
- Amazon CloudFront pricing, last checked 10 Nov 2026
- Amazon CloudFront pay-as-you-go pricing, last checked 10 Nov 2026
- Backblaze B2 pricing, last checked 10 Nov 2026
- Bunny Storage pricing, last checked 10 Nov 2026
- Hetzner Object Storage, last checked 10 Nov 2026
Frequently asked questions
Is Cloudflare R2 cheaper than S3?
For anything that serves files to the internet, almost always. R2 storage is $0.015 per GB-month against $0.023 for S3 Standard in us-east-1, and R2 charges no egress, while S3 charges $0.09 per GB for internet transfer after the first 100 GB a month. In our example of 50 GB stored and 500 GB served, R2 costs $0.60 and S3 about $38.45. S3 can be competitive when data rarely leaves AWS.
Does R2 have a free tier?
Yes, and it renews every month. Cloudflare lists 10 GB-month of storage, 1 million Class A operations and 10 million Class B operations free each month, with free egress. The free tier applies only to Standard storage, not Infrequent Access.
Is the AWS S3 free tier still 5 GB for 12 months?
Not for new accounts on today's AWS Free Tier page. AWS says new customers receive up to $200 in credits, $100 at sign-up and up to $100 more by exploring services, and the Free plan expires after 6 months or when credits run out, whichever comes first. The S3 listing on that page shows no specific free storage amount.
Is R2 fully compatible with the S3 API?
Mostly for everyday work. Standard SDK calls such as PutObject, GetObject, multipart uploads and presigned URLs work against R2's S3 endpoint. Cloudflare's compatibility table marks bucket versioning, bucket policies, bucket ACLs, object tagging, static website configuration and replication as not implemented, so check that list before you migrate.
Can I serve public files straight from an R2 bucket?
Yes, through a custom domain or the r2.dev subdomain. Cloudflare says r2.dev access is rate-limited and should only be used for development. For production, connect a custom domain, which also lets you use Cloudflare's cache, WAF rules and access controls.