Cloudflare R2 vs AWS S3 Cost Breakdown

Khimananda Oli 8 min read Cloud
Cloudflare R2 vs AWS S3 Cost Breakdown

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.

Cost Architecture ComparisonAWS S3 StandardStorage: $0.023 / GBPUT: $0.005 / 1k reqEGRESS: $0.09 / GBGET: $0.0004 / 1k req$$$ High TCOCloudflare R2Storage: $0.015 / GBPUT: $0.0036 / 1M opsEGRESS: FREEGET: $0.00 / 1M ops$ Low TCO
Visualizing the fundamental pricing divergence in the Cloudflare R2 vs AWS S3 cost breakdown: egress fees dominate S3 bills for public content.

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.

Monthly Cost vs Egress Volume (10 TB Stored)Monthly Egress (TB)Cost (USD)05 TB10 TB15 TB20 TB$0$500$1,000$1,500$2,000S3 + CloudFrontR2 (Flat)At 15 TB egress:S3: ~$1,350 | R2: $150
Cost divergence accelerates with volume: the Cloudflare R2 vs AWS S3 cost breakdown shows R2’s flat pricing vs S3’s linear egress growth.

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.

FeatureAWS S3Cloudflare R2
S3-Compatible APINative (reference implementation)Yes (most operations supported)
Lifecycle PoliciesFull (transition, expiration, replication)Basic expiration only (no tiering)
Event NotificationsSQS, SNS, Lambda, EventBridgeWorkers only (no native queue fanout)
Object Lock / WORMYes (compliance & governance modes)No (as of mid-2026)
Select / SQL QueryS3 Select supportedNot supported
Multi-Region ReplicationConfigurable CRR / RTCAutomatic (managed by CF)
IAM / Policy EngineGranular bucket & object policiesAPI tokens + basic bucket policies
Consistency ModelStrong read-after-writeStrong 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:

  1. 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.
  2. 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.
  3. Backfill historical data with rclone. Use rclone sync s3:bucket r2:bucket --transfers 32 --checkers 64 for parallel copy. Monitor R2 write operations—each file is a billed operation.
  4. Update DNS/CDN origin. Point Cloudflare CDN to R2 origin. Since egress is free, this eliminates CloudFront costs entirely.
  5. 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.

Zero-Downtime Migration FlowApp Writes(Dual-Write Phase)AWS S3(Legacy / Fallback)Cloudflare R2(Target Store)Validation(Checksum + Test)CutoverDNS → R2rclone backfill (historical data)Runs in parallel during dual-write
Safe migration sequence for the Cloudflare R2 vs AWS S3 cost breakdown: dual-write ensures zero data loss during transition.

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.

Frequently Asked Questions

Yes, R2 charges zero egress fees while S3 charges per GB. This makes R2 significantly cheaper for read-heavy workloads or content delivery where outbound bandwidth costs dominate monthly cloud bills in 2026.

Yes, R2 implements the S3-compatible API. You can use existing AWS SDKs and CLI tools by simply changing the endpoint URL and credentials, requiring minimal code changes for migration.

R2 Class A operations cost $4.50 per million versus S3 Standard PUT at $5.00. R2 Class B reads are $0.36 per million compared to S3 GET at $0.40, making R2 slightly cheaper for high-volume API interactions.

No, R2 requires an active Cloudflare account and zone. However, you can access buckets via public S3-compatible endpoints or custom domains without routing traffic through Cloudflare's proxy network.

R2 offers a single storage tier priced at $0.015 per GB monthly. Unlike S3, there are no infrequent access or glacier tiers, simplifying billing but limiting optimization for cold data archives.

Both services target 99.999999999% durability. S3 achieves this across multiple availability zones by default, while R2 uses automatic multi-region replication within its global network to ensure equivalent object persistence and safety.

R2 has no egress or retrieval fees, but lacks lifecycle transition savings. S3 has complex pricing with potential NAT gateway or cross-region replication charges that often inflate actual costs beyond listed storage rates.

Yes, use rclone or Cloudflare's Super Slurper tool. These handle multipart uploads and metadata preservation. Always verify checksums post-transfer since R2 does not support all S3 headers like tagging during initial sync.

Yes, R2 supports object versioning with identical semantics. Enable it via bucket configuration to protect against accidental deletes. Note that non-current versions consume storage at the same flat rate as current objects.

R2 works well for backups due to low storage costs and zero egress for restores. Ensure your backup tool supports S3 APIs and test restoration regularly, as R2 lacks some advanced S3 compliance features required by regulated industries.

R2 includes 10GB storage, 10M Class A, and 10M Class B operations monthly forever. S3 offers 5GB storage and limited requests only for the first twelve months, making R2 more sustainable for long-term hobby projects.

Yes, generate presigned URLs using standard AWS Signature Version 4 logic. R2 validates these signatures identically to S3, allowing time-limited secure access without exposing objects publicly or requiring additional authentication middleware.

Not directly. R2 integrates natively with Cloudflare Workers. For AWS Lambda, treat R2 as an external S3 endpoint. Latency may increase compared to same-region S3 access, impacting serverless function performance and cost efficiency.

Billing switches to pay-as-you-go rates automatically. There is no service interruption or hard cap. Monitor usage via the dashboard to avoid surprises, as overages apply immediately once free allocations reset each month.

R2 allows specifying regional hints for data placement but does not guarantee strict EU-only residency like S3 EU regions. Review Cloudflare’s data localization controls carefully before storing regulated personal data requiring geographic restrictions.