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 Component | AWS S3 + CloudFront | Cloudflare 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 Component | AWS S3 | Cloudflare 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 processing | Included in Lambda cost | Must 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 Component | AWS 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 objects | N/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 Component | AWS S3 | Cloudflare 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:
| Factor | S3 Wins If... | R2 Wins If... | Weight |
|---|---|---|---|
| Egress volume | Under 5% of total bill | Over 20% of total bill | High |
| Lifecycle needs | Need Glacier/Deep Archive | All data stays hot | High |
| Event triggers | Lambda/SNS on upload required | No event processing needed | High |
| Compliance | FedRAMP, GovCloud, HIPAA BAA required | SOC 2 sufficient | Medium |
| Multi-region | Active-active replication needed | Single-region acceptable | Medium |
| AWS integration | Deep ties to Lambda, Athena, EMR | Standalone or Cloudflare stack | Medium |
| Object count | Billions of small objects with S3 Batch | Under 1 billion objects | Low |
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
| Layer | Provider | Why |
|---|---|---|
| Public asset serving | R2 | Zero egress, Cloudflare CDN built-in |
| Customer file downloads | R2 | Highest egress savings |
| Event-driven processing | S3 | Lambda triggers, EventBridge integration |
| Data lake / analytics | S3 | Lifecycle tiering, Athena/EMR integration |
| Backups / archives | S3 Glacier | $0.004/GB vs R2's $0.015/GB |
| API config/feature flags | R2 | High-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)
- Catalog S3 event notifications - Any bucket with Lambda/SQS/SNS/EventBridge triggers stays on S3
- Map lifecycle rules - If the bucket uses IA, Glacier, or Deep Archive transitions, calculate cost without tiering
- Identify egress destinations - Traffic going to end users/external = high R2 value. Traffic staying in AWS VPC = no R2 benefit
- Check compliance requirements - FedRAMP, HIPAA BAA, GovCloud = cannot migrate
- 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)
- Create R2 bucket with S3-compatible API enabled
- Configure rclone with both S3 and R2 credentials
- Run initial sync during low-traffic window
- Update application config to read from R2 endpoint
- Run dual-read for 48 hours (read from R2, fall back to S3 on miss)
- Switch writes to R2 once reads are stable
- Run final sync to catch any objects written to S3 during transition
- 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 Item | Your 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:



