
Table of Contents
By Khimananda Oli | Last reviewed: August 2026
Choosing between object storage providers often comes down to a single line item on your monthly invoice: egress fees. This Cloudflare R2 vs AWS S3 cost breakdown cuts through the marketing to show exactly where each platform wins or loses based on real-world access patterns. While S3 remains the industry standard for ecosystem depth, R2’s zero-egress model fundamentally changes the total cost of ownership (TCO) for read-heavy workloads. Before you commit to either, understanding these unit economics is essential for building sustainable infrastructure, especially when optimizing cloud spend is a primary engineering goal.
How does the Cloudflare R2 vs AWS S3 cost breakdown compare for storage and requests?
The base unit economics reveal two different philosophies. AWS S3 charges a premium for storage but offers granular tiers; Cloudflare R2 offers a single, low storage rate with no complexity tax. For standard object storage in 2026, S3 Standard costs $0.023 per GB/month in us-east-1, while R2 charges $0.015 per GB/month globally. That 35% storage discount compounds quickly at scale.
Request pricing is where the gap widens dramatically. S3 charges per 1,000 requests: $0.005 for PUT/COPY/POST/LIST and $0.0004 for GET/SELECT. R2 charges per million operations: $0.36 for writes and $0.00 for reads. Yes, R2 read requests are free. If you serve 10 million images monthly from S3, that’s $4.00 just for GETs. From R2, it’s $0.00. For write-heavy ingestion pipelines, R2’s $0.36/million still undercuts S3’s effective $5.00/million by over 90%.
Hidden cost multipliers in S3
- Data Transfer Out: The first 100 GB/month is free, then $0.09/GB up to 10 TB. Serving 5 TB of video monthly adds $450 in egress alone.
- S3 Inventory & Analytics: Enabling storage lens, replication metrics, or inventory reports incurs additional per-object and per-GB scanned fees that rarely appear in initial estimates.
- Cross-Region Replication: S3 CRR doubles storage costs and adds inter-region transfer fees. R2 includes global replication in the base storage price for most use cases.
When do egress fees make AWS S3 prohibitively expensive?
Egress is the single largest variable in any Cloudflare R2 vs AWS S3 cost breakdown. AWS S3 egress pricing starts at $0.09/GB after the free tier. For a media platform serving 20 TB/month to global users, that’s $1,800 in pure transfer costs. CloudFront can reduce this to ~$0.06/GB with committed use discounts, but you’re now managing a CDN configuration, cache behaviors, and invalidation costs on top of storage.
R2 eliminates this entire category. Egress to the internet is free. Egress to Cloudflare Workers is free. Egress to any origin within Cloudflare’s network is free. This isn’t a promotional teaser—it’s the permanent business model designed to lock you into their compute layer. In practice, I’ve seen teams migrate thumbnail generation services from S3+Lambda to R2+Workers and see their monthly bill drop from $2,400 to $180 because the egress component vanished entirely.
The break-even analysis
If your workload is write-heavy with minimal reads (e.g., compliance archives, backup targets), S3 Glacier Deep Archive at $0.00099/GB beats R2’s $0.015/GB by 15x. But the moment your read-to-write ratio exceeds 1:1 and egress crosses ~500 GB/month, R2 becomes cheaper on pure unit economics. Use this rule of thumb: if your monthly egress cost would exceed your monthly storage cost on S3, migrate to R2 immediately.
What are the technical trade-offs beyond pricing in the R2 vs S3 comparison?
Cost is only one axis. As someone who has managed petabyte-scale stores across both platforms, I can confirm that S3’s maturity shows in operational tooling. When evaluating this Cloudflare R2 vs AWS S3 cost breakdown, you must weigh savings against capability gaps.
| Feature | AWS S3 | Cloudflare R2 |
|---|---|---|
| S3-Compatible API | Native (reference implementation) | Yes (most operations supported) |
| Lifecycle Policies | Full (transition, expiration, replication) | Basic expiration only (no tiering) |
| Event Notifications | SQS, SNS, Lambda, EventBridge | Workers only (no native queue fanout) |
| Object Lock / WORM | Yes (compliance & governance modes) | No (as of mid-2026) |
| Select / SQL Query | S3 Select supported | Not supported |
| Multi-Region Replication | Configurable CRR / RTC | Automatic (managed by CF) |
| IAM / Policy Engine | Granular bucket & object policies | API tokens + basic bucket policies |
| Consistency Model | Strong read-after-write | Strong read-after-write |
The missing Object Lock is a dealbreaker for SEC/FINRA-regulated firms requiring WORM retention. Similarly, if your pipeline depends on S3 event notifications triggering SQS queues for downstream processing, R2’s Workers-only notification model requires architectural rework. These aren’t insurmountable, but they add engineering hours that offset raw savings.
How do you migrate from S3 to R2 without downtime or hidden costs?
Migration itself has costs that rarely appear in vendor comparisons. Here’s the battle-tested sequence I use for production cutover:
- Audit access patterns first. Use S3 Storage Lens or Access Logs to identify hot prefixes, egress volume, and request rates. Don’t migrate cold archive data to R2—it’s more expensive there.
- Set up dual-write during transition. Configure your application to write to both S3 and R2 simultaneously for 30 days. This validates R2 compatibility without risking data loss.
- Backfill historical data with rclone. Use
rclone sync s3:bucket r2:bucket --transfers 32 --checkers 64for parallel copy. Monitor R2 write operations—each file is a billed operation. - Update DNS/CDN origin. Point Cloudflare CDN to R2 origin. Since egress is free, this eliminates CloudFront costs entirely.
- Decommission S3 only after validation. Keep S3 as read-only fallback for 60 days. Delete in phases: current month → previous quarter → remainder.
<!-- Example: Terraform R2 bucket with public access disabled -->
resource "cloudflare_r2_bucket" "media_assets" {
account_id = var.cloudflare_account_id
name = "prod-media-assets"
location = "enam" # North America East
# No public access - serve only via authenticated Workers
public_access = false
}
# Bind to Worker for signed URL generation
resource "cloudflare_workers_script" "media_server" {
name = "media-server"
content = file("${path.module}/worker.js")
r2_bucket_binding {
name = "MEDIA_BUCKET"
bucket_name = cloudflare_r2_bucket.media_assets.name
}
} A common mistake is migrating without updating IAM-equivalent permissions. R2 uses API tokens scoped to specific buckets, not IAM roles. If your app assumes instance profile credentials, it will fail silently. Always test with least-privilege tokens before cutover. For teams managing secrets across environments, integrating with Kubernetes secrets management ensures R2 credentials rotate safely during migration.
Which platform should you choose for your specific workload in 2026?
After running this Cloudflare R2 vs AWS S3 cost breakdown across dozens of production systems, my decision framework is straightforward:
Choose Cloudflare R2 if: You serve public content (images, video, assets), your egress exceeds 1 TB/month, you already use Cloudflare for DNS/CDN/WAF, or you’re building on Workers. The zero-egress model is unbeatable for distribution workloads. Teams building static sites on Cloudflare Pages get particularly tight integration.
Stay on AWS S3 if: You need Object Lock for compliance, rely on S3 Select/Athena for analytics, require complex lifecycle tiering to Glacier, or your workload is VPC-internal with minimal egress. S3’s ecosystem depth—Lambda triggers, EventBridge integration, Macie scanning, Athena queries—has no R2 equivalent. For Nepal-based teams handling sensitive financial data, S3’s compliance certifications and regional controls may outweigh cost savings.
Hybrid approach: Many mature teams use both. Store hot public assets in R2, keep regulated/private data in S3, and use Cloudflare Workers as a unified access layer. This captures R2’s egress savings where they matter most while retaining S3’s compliance features where required.
Making the Final Call on Object Storage Costs
This Cloudflare R2 vs AWS S3 cost breakdown proves that neither platform is universally cheaper—they optimize for different access patterns. Run your own numbers using actual S3 billing export data, not vendor calculators that assume idealized workloads. If egress dominates your bill today, R2 deserves a serious pilot. If compliance or advanced data processing anchors you to AWS, focus on S3 Intelligent-Tiering and CloudFront commitments instead.
Need help modeling your specific workload or executing a zero-downtime migration? Reach out directly—I’ve guided teams through this exact decision and can help you avoid the costly pitfalls that generic comparisons miss.