Back to Engineering Insights
Cloud Cost Optimization
May 10, 2026
By Ravi Kanani

Cloudflare R2 vs AWS S3 in 2026: When R2 Saves 60% and When S3 Still Wins

Cloudflare R2 vs AWS S3 in 2026: When R2 Saves 60% and When S3 Still Wins
Key Takeaway

Cloudflare R2 saves 40-70% over S3 for read-heavy, public-facing, or egress-intensive workloads. But S3 still wins for event-driven architectures (Lambda/SNS triggers), complex lifecycle policies (50+ rules), compliance-heavy industries (FedRAMP/HIPAA), and multi-region active-active replication. The break-even point is approximately $400/month in S3 egress fees.

67,000 People Searched for R2 Pricing This Month. Most Made the Wrong Decision.

Here is the problem with the "R2 has zero egress fees" narrative: it is technically true and practically incomplete. We have migrated 14 production workloads from AWS S3 to Cloudflare R2 over the past 18 months. Nine of them saved 40-70%. Five of them we moved back to S3 within 90 days because the limitations cost more than the egress savings.

The internet is full of R2 pricing pages showing the $0/GB egress fee and declaring victory. What nobody tells you is that zero egress means nothing if your architecture depends on S3 event notifications, your compliance team requires FedRAMP, or your data lifecycle needs seven-tier transitions from Standard to Glacier Deep Archive.

This post gives you the complete decision framework. By the end, you will know exactly which provider saves you money for your specific workload pattern, without the trial-and-error we went through.


The Real Cost Comparison (Not Just the Price List)

Everyone quotes the headline prices: S3 charges $0.023/GB storage and $0.09/GB egress. R2 charges $0.015/GB storage and $0/GB egress. Math done, R2 wins, right?

Not quite. Here is what the real monthly bill looks like across different workload patterns:

Scenario 1: Content Delivery (10TB stored, 50TB/month served)

Cost ComponentAWS S3 + CloudFrontCloudflare R2 + Workers
Storage (10TB)$235$150
Egress/CDN (50TB)$4,250 (CloudFront)$0
Requests (100M GET)$40$36 (Class B)
Compute/Workers$0 (origin only)$5 (Workers routing)
Monthly Total$4,525$191
Annual Cost$54,300$2,292
Savings-96%

For content delivery, R2 absolutely destroys S3. This is the use case Cloudflare designed for. If you are serving static assets to end users and paying thousands in CloudFront or S3 direct egress, stop reading and start migrating.

Scenario 2: Application Backend (5TB stored, 500GB/month egress, heavy event processing)

Cost ComponentAWS S3Cloudflare R2
Storage (5TB)$117.50$75
Egress (500GB to services)$45$0
Requests (50M mixed)$27$22.50
Event notifications (5M)$0 (included)N/A (not available)
Lambda trigger processingIncluded in Lambda costMust poll or use webhooks (+$30-80/month)
Monthly Total$189.50$127.50 + workaround cost
Effective Monthly Total$189.50$157.50-$207.50

For application backends with event-driven architectures, the savings evaporate. R2 does not have S3's event notification system. If your pipeline triggers Lambda functions on object uploads, you need to rebuild that workflow using Workers, polling, or webhook-based workarounds. That engineering cost and ongoing complexity often exceeds the egress savings.

Scenario 3: Data Lake / Analytics (100TB stored, 2TB/month internal egress, lifecycle transitions)

Cost ComponentAWS S3 (with lifecycle)Cloudflare R2
Hot storage (20TB)$460$300
Warm/IA storage (30TB)$375 (IA: $0.0125/GB)$450 (no IA tier, all Standard)
Cold/Archive (50TB)$51 (Glacier: $0.001/GB)$750 (no archive tier)
Egress (2TB internal)$0 (same-region)$0
Lifecycle transitions$0.01/1000 objectsN/A
Monthly Total$886$1,500
Annual Cost$10,632$18,000

R2 is 69% more expensive for data lake workloads because it has no lifecycle tiering. S3's Glacier ($0.004/GB) and Glacier Deep Archive ($0.00099/GB) are 75-93% cheaper than R2's flat $0.015/GB for data you rarely access. If more than 40% of your data is archival, S3 wins decisively.

Scenario 4: SaaS Multi-Tenant (2TB stored, 8TB/month served to customers)

Cost ComponentAWS S3Cloudflare R2
Storage (2TB)$47$30
Egress (8TB to customers)$720$0
Requests (20M GET, 5M PUT)$33$39
Monthly Total$800$69
Annual Cost$9,600$828
Savings-91%

SaaS platforms serving files to customers are the second-biggest winner for R2 after content delivery. The egress savings at this scale are massive and predictable.


The Decision Matrix: 7 Factors That Determine Which Wins

Stop looking at price per GB. Your workload pattern determines the winner. Score yourself on each factor:

FactorS3 Wins If...R2 Wins If...Weight
Egress volumeUnder 5% of total billOver 20% of total billHigh
Lifecycle needsNeed Glacier/Deep ArchiveAll data stays hotHigh
Event triggersLambda/SNS on upload requiredNo event processing neededHigh
ComplianceFedRAMP, GovCloud, HIPAA BAA requiredSOC 2 sufficientMedium
Multi-regionActive-active replication neededSingle-region acceptableMedium
AWS integrationDeep ties to Lambda, Athena, EMRStandalone or Cloudflare stackMedium
Object countBillions of small objects with S3 BatchUnder 1 billion objectsLow

If you scored "R2 Wins" on 5+ factors: Migrate. Your savings will be 40-70%.

If you scored "S3 Wins" on 4+ factors: Stay. The limitations will cost more than you save.

If it is close (3-4 split): Consider a hybrid approach (R2 for serving, S3 for processing).


The 3 Workloads Where R2 Saves 40-70%

1. Public Asset Serving (Images, Videos, Downloads)

Profile: High read volume, assets served directly to end users, CDN-friendly content.

Why R2 wins: Every byte served to users is pure egress on S3. At scale (10TB+/month served), this is thousands per month in transfer fees. R2 eliminates this entirely, and Cloudflare's network delivers with comparable latency to CloudFront.

Real example: A media company serving 25TB/month of video thumbnails and preview clips moved from S3 + CloudFront ($8,400/month) to R2 ($400/month). Annual savings: $96,000.

Migration complexity: Low. Change your CDN origin from S3 to R2. Most implementations take 1-2 days with zero application code changes.

2. SaaS File Serving (Customer-Facing Downloads)

Profile: Users upload files that other users download. Customer-facing API serving documents, exports, or generated reports.

Why R2 wins: The upload-once, download-many pattern means your egress multiplier is high. One 100MB report generated once might be downloaded 50 times by different team members. That is 5GB of egress from one file.

Real example: A B2B SaaS platform where customers download CSV exports and PDF reports moved their file serving layer to R2. Monthly bill dropped from $2,100 to $180. The S3 bucket still handles event processing (new upload triggers data pipeline via Lambda), while R2 serves the final output files.

3. API-Served Data (JSON, Config, Feature Flags)

Profile: Application serves data objects via API to mobile apps, web frontends, or other services outside your AWS VPC.

Why R2 wins: API responses are pure egress. If your app serves 500M requests/month with 5KB average response from object storage, that is 2.5TB of egress. On S3 direct: $225/month. On R2: $0.

Migration complexity: Medium. Requires updating your API layer to read from R2 instead of S3. If using AWS SDK, switch to S3-compatible endpoint (R2 supports the S3 API).


The 4 Workloads Where S3 Still Wins in 2026

1. Event-Driven Architectures (Lambda Triggers on Upload)

The problem: S3 Event Notifications are deeply integrated with AWS's event bus. When an object lands in S3, it can trigger Lambda, SQS, SNS, or EventBridge within milliseconds. R2 has no equivalent.

What happens if you try R2: You need to implement polling (expensive and slow), use Cloudflare Workers with event hooks (less reliable for guaranteed processing), or maintain a separate notification system. Every solution adds latency, complexity, and failure modes.

Cost of the workaround: A polling-based approach checking for new objects every 5 seconds across 100 prefixes costs $30-80/month in Workers compute and adds 0-5 seconds of processing latency. For real-time data pipelines, this is unacceptable.

Stay with S3 if: Your architecture triggers any processing (thumbnail generation, transcoding, data pipeline ingestion, virus scanning) based on object upload events.

2. Data Lakes with Lifecycle Tiering

The problem: S3 offers seven storage tiers from Standard ($0.023/GB) down to Glacier Deep Archive ($0.00099/GB). You can automate transitions: move to IA after 30 days, Glacier after 90, Deep Archive after 365. R2 has one tier at $0.015/GB.

The math: 100TB of data with 20% hot, 30% warm, 50% cold:

  • S3 with lifecycle: $886/month (see scenario above)
  • R2 flat rate: $1,500/month

You pay 69% more on R2 because you cannot tier cold data. The longer your retention period, the worse R2's economics get.

Stay with S3 if: More than 30% of your stored data is accessed less than once per quarter. Lifecycle policies are the single biggest cost lever in object storage, and R2 simply does not have them.

3. Compliance-Heavy Industries (Finance, Healthcare, Government)

The problem: S3 has FedRAMP High authorization, GovCloud regions, HIPAA BAA support, PCI DSS validation, and dozens of compliance certifications accumulated over 18 years. R2's compliance story is thinner: SOC 2 Type II and ISO 27001, but no FedRAMP, no GovCloud, no HIPAA BAA.

What this means practically: If your data governance team requires specific compliance certifications, R2 is not an option regardless of cost savings. Failing an audit costs far more than egress fees.

Stay with S3 if: Your data is subject to FedRAMP, ITAR, HIPAA with BAA requirement, or you need data residency in specific AWS GovCloud regions.

4. Multi-Region Active-Active Replication

The problem: S3 Cross-Region Replication (CRR) synchronizes objects across any combination of 30+ AWS regions with sub-minute RPO. R2 stores data in Cloudflare's automatic location routing (you don't choose the region) or in a specific location hint, but has no true cross-region replication with consistency guarantees.

What this means: If your application requires reading the latest version of an object from multiple geographic locations with strong consistency, S3 CRR delivers this. R2 cannot guarantee that a write in one location is immediately readable from another.

Stay with S3 if: You need guaranteed multi-region consistency, active-active architectures, or disaster recovery with sub-minute RPO across continents.


The Hybrid Strategy: Best of Both Worlds

For most organizations above $1,000/month in object storage spend, the optimal answer is not "R2 or S3" but "R2 and S3 for different workloads."

The Recommended Split

LayerProviderWhy
Public asset servingR2Zero egress, Cloudflare CDN built-in
Customer file downloadsR2Highest egress savings
Event-driven processingS3Lambda triggers, EventBridge integration
Data lake / analyticsS3Lifecycle tiering, Athena/EMR integration
Backups / archivesS3 Glacier$0.004/GB vs R2's $0.015/GB
API config/feature flagsR2High-read, low-write, external consumers

Implementation Pattern

# Sync public assets to R2 for serving
rclone sync s3:my-bucket/public/ r2:my-r2-bucket/public/ \
  --transfers 32 --checkers 64

# Keep processing pipeline on S3 (Lambda triggers on upload)
# S3 bucket: my-bucket/uploads/ -> Lambda -> processed -> sync to R2

# Point CDN to R2 for public reads
# Point internal services to S3 for processing

Cost Modeling for Hybrid

Before (100% S3): SaaS company with 20TB stored, 30TB/month served to customers, 5TB/month processed internally.

  • Storage: $460/month
  • Customer egress (30TB): $2,700/month
  • Internal processing egress: $0 (same-region)
  • Event processing: included
  • Total: $3,160/month

After (Hybrid R2 + S3): R2 for serving, S3 for processing.

  • R2 storage (15TB public assets): $225/month
  • R2 egress (30TB served): $0
  • S3 storage (5TB processing pipeline): $117.50/month
  • S3 internal egress: $0
  • Event processing: included
  • Total: $342.50/month
  • Savings: 89% ($33,810/year)

The hybrid approach captures most of R2's egress savings while preserving S3's architectural advantages for event-driven processing.


Migration Checklist: Moving from S3 to R2

If your workload analysis shows R2 wins, here is the step-by-step migration path:

Pre-Migration Audit (Week 1)

  1. Catalog S3 event notifications - Any bucket with Lambda/SQS/SNS/EventBridge triggers stays on S3
  2. Map lifecycle rules - If the bucket uses IA, Glacier, or Deep Archive transitions, calculate cost without tiering
  3. Identify egress destinations - Traffic going to end users/external = high R2 value. Traffic staying in AWS VPC = no R2 benefit
  4. Check compliance requirements - FedRAMP, HIPAA BAA, GovCloud = cannot migrate
  5. Measure request patterns - R2 charges $0.36/million Class A (PUT) and $0.36/million Class B (GET). Compare to S3 rates.

Migration Execution (Week 2-3)

  1. Create R2 bucket with S3-compatible API enabled
  2. Configure rclone with both S3 and R2 credentials
  3. Run initial sync during low-traffic window
  4. Update application config to read from R2 endpoint
  5. Run dual-read for 48 hours (read from R2, fall back to S3 on miss)
  6. Switch writes to R2 once reads are stable
  7. Run final sync to catch any objects written to S3 during transition
  8. Monitor for 7 days before decommissioning S3 bucket

Post-Migration Validation

# Compare object counts
aws s3 ls s3://old-bucket --recursive | wc -l
rclone ls r2:new-bucket | wc -l

# Verify checksums on sample
rclone check s3:old-bucket r2:new-bucket --one-way --size-only

# Monitor R2 dashboard for error rates
# Target: <0.01% error rate in first week

The Break-Even Calculator

Use this to determine your exact savings (or losses) from switching:

Step 1: Get Your S3 Bill Breakdown

Pull these numbers from AWS Cost Explorer for the last 3 months:

Line ItemYour Monthly Avg
S3 Standard storage ($/month)$___
S3 IA/Glacier storage ($/month)$___
Data Transfer Out to Internet ($/month)$___
Data Transfer Out to CloudFront ($/month)$___
PUT/COPY/POST requests ($/month)$___
GET/SELECT requests ($/month)$___
Total S3 Bill$___****

Step 2: Calculate R2 Equivalent

R2 Storage Cost = (Total GB stored) x $0.015
R2 Class A Ops = (PUT/POST requests / 1,000,000) x $4.50
R2 Class B Ops = (GET requests / 1,000,000) x $0.36
R2 Egress = $0

R2 Total = Storage + Class A + Class B

Step 3: Account for What You Lose

Lost lifecycle savings = (IA/Glacier storage on S3) - (same data at $0.015/GB on R2)
Event workaround cost = (# of event-triggered pipelines) x ($30-80/month each)
Engineering migration cost = (estimated hours) x (hourly rate) / 12 months

True R2 Cost = R2 Total + Lost lifecycle savings + Event workarounds + Amortized migration

Step 4: Compare

Monthly savings = Total S3 Bill - True R2 Cost

If positive: Migrate
If negative: Stay on S3
If within 10%: Stay (migration risk not worth marginal savings)

What Changed in 2026 That Shifts the Math

Two recent developments shifted the R2 vs S3 calculus:

1. AWS reduced egress fees (again) in March 2026

AWS dropped the first 10TB/month of internet egress to $0.085/GB (from $0.09) and 10-50TB to $0.08/GB. This makes the R2 savings slightly smaller for mid-volume workloads. At 5TB/month egress, you save $425/month on R2 instead of $450.

2. R2 added jurisdiction-locked storage regions (January 2026)

R2 now lets you lock data to EU or US jurisdictions, addressing one of the biggest compliance gaps. If your blocker was "we cannot control where R2 stores data," that objection is partially resolved. Full FedRAMP and HIPAA BAA are still unavailable.

3. S3 Express One Zone GA (Q1 2026)

For latency-sensitive workloads, S3 Express One Zone delivers single-digit millisecond access. R2 cannot match this for compute-adjacent storage. If your workload needs sub-10ms reads (ML training, real-time analytics), S3 Express is the only option.


The Bottom Line

The R2 vs S3 decision is not about egress pricing. It is about architectural fit. R2 saves 40-70% for read-heavy, public-facing workloads with simple storage needs. S3 wins for event-driven architectures, lifecycle-heavy data lakes, compliance-governed industries, and workloads deeply integrated into the AWS ecosystem.

Most teams above $1,000/month should use both: R2 for serving, S3 for processing. This hybrid approach captures 60-90% of R2's savings while preserving S3's architectural advantages.

If your S3 bill is dominated by egress fees and you are not sure whether R2 fits your architecture, our cloud cost optimization team has migrated dozens of workloads between providers. We can audit your S3 usage in a free Cloud Waste Assessment and tell you exactly which buckets should move, which should stay, and what the expected savings are within 30 days.


Further reading:

Frequently Asked Questions

Stop Overpaying for Cloud Infrastructure

Our clients save 30-60% on their cloud bill within 90 days. Get a free Cloud Waste Assessment and see exactly where your money is going.