Back to blog
cloudflare r2aws s3object storagepricing

Cloudflare R2 vs AWS S3 in 2025: Zero-Egress vs Ecosystem

A practical, pricing-first comparison (who should pick which, and why), plus a simple migration checklist using your Mac app.

Picking an object store in 2025 comes down to deciding how much you value zero egress fees versus the AWS ecosystem moat. This guide compares Cloudflare R2 and Amazon S3 with the latest pricing notes, workload scenarios, and a migration checklist tailored to BucketMate on macOS.

Snapshot: who should choose which?

  • Cloudflare R2 is ideal when outbound bandwidth dominates your bill, you are serving public assets, or you want predictable pricing for cross-cloud architectures.
  • AWS S3 is the safer play if you live inside AWS already, need deep integrations with native analytics and event services, or require every regulatory checkbox in one place.
  • Hybrid strategies increasingly pair R2 for hot, bandwidth-heavy workloads with S3 for private data lakes and AWS-native processing.

2025 pricing comparison

ItemCloudflare R2AWS S3 Standard (us-east-1)
Storage$0.015 per GB-month$0.023 per GB-month
Egress$0.00 per GB$0.09 per GB (first 10 TB)
Class A requests (PUT, COPY, POST, LIST)$4.50 per million$0.005 per 1,000
Class B/GET requests$0.36 per million$0.0004 per 1,000
Early deleteNone30-day minimum on Intelligent-Tiering tiers

Numbers reflect public rate cards on October 16, 2025; double-check regional variations before committing.

See how the math changes for your footprint by adjusting storage and bandwidth sliders below.

Stored data4.9 TB
Monthly bandwidth9.8 TB
Cloudflare R2
$75.00
Storage$75.00
Egress$0.00
AWS S3
$1,015.00
Storage$115.00
Egress$900.00
Monthly savings if you switch to R2$940.00

Scenario math: when the dollars diverge

  • Bandwidth-heavy SaaS: 5 TB stored, 30 TB outbound each month. R2 lands near $75 for storage plus request traffic. S3 crosses $2,900 once transfer fees stack, even before CloudFront relief.
  • Embedded in AWS analytics: 50 TB stored, negligible egress, thousands of Lambda and Glue jobs. S3 stays close to $1,150 on storage plus request charges, and the built-in IAM, EventBridge, and Athena hooks save operational work that R2 would push to third-party tools.
  • Cross-cloud content distribution: Teams running on Fly.io, Vercel, or Kubernetes clusters in multiple clouds often push build artifacts and static bundles to R2, avoiding interconnect surprises while keeping a backup copy in S3 Glacier or Deep Archive.

Ecosystem and feature depth

  • Integrations: S3 still owns deeper integrations with AWS services (EventBridge, Lambda notifications, S3 Select, Lake Formation). R2 covers S3-compatible APIs, Workers bindings, and Queues, plus open-source tooling.
  • Compliance: Both offer SOC 2 Type II, ISO 27001, and GDPR coverage, but certain regulated workloads (FedRAMP High, DoD IL5) remain AWS-only for now.
  • Identity and IAM: AWS IAM delivers fine-grained policies, SCPs, and Control Tower guardrails. Cloudflare leans on scoped API tokens and service bindings; Workers AI and Access help extend policies, but per-request condition keys are still richer on AWS.
  • Performance: Latency differences shrink when R2 sits behind Cloudflare’s global edge, while S3 benefits from multi-AZ durability and features like Transfer Acceleration. Benchmark heavy workloads with realistic object sizes; R2 shines with large sequential transfers, S3 retains an edge on metadata-intensive jobs.

Hidden costs and operational overhead

  • Networking: AWS credits egress when traffic flows through CloudFront or PrivateLink, but only for supported patterns. R2 eliminates egress fees entirely, yet you still pay for Workers invocations or HTTP requests at the edge.
  • Request amplification: Highly transactional apps (millions of small PUTs) can be cheaper on S3 because of lower per-request pricing. Consider buffering writes or using Cloudflare Queues to batch traffic into R2.
  • Data mobility: R2’s no-egress stance is compelling for multi-cloud migrations, while S3 lifecycle policies and replication across regions (or to Glacier tiers) reduce manual data wrangling.

Decision matrix for 2025

  • Choose Cloudflare R2 if you prioritize zero egress, operate outside AWS, or want predictable spend for public assets, SaaS downloads, gaming content, or AI model distribution.
  • Choose AWS S3 if your data pipelines, ML training, or governance stack already depends on AWS-native services, or if you need every storage class variation, object-level logging, and mature replication policies.
  • Run dual providers when you want R2 serving customer-facing assets and S3 retaining a canonical copy for compliance, analytics, or cross-region restores.

Migration checklist with BucketMate on macOS

  1. Map buckets and workloads: Inventory object counts, size distribution, lifecycle policies, and identity providers. Flag applications tightly coupled to S3-only features such as EventBridge or Lambda triggers.
  2. Create destination storage: Set up Cloudflare R2 buckets with matching naming conventions and retention requirements. Ensure API tokens carry read and write scope. On AWS, create staging buckets or Glacier targets if you plan to keep a backup.
  3. Connect accounts in BucketMate: Open BucketMate on macOS, add an AWS S3 connection with IAM user credentials, then add Cloudflare R2 using the account ID endpoint and API token.
  4. Test head-to-head transfers: Use BucketMate’s dual-pane view to drag a sample folder from S3 to R2. Confirm metadata, storage class choices, and object versions copy correctly. Validate permissions by attempting reads from your application.
  5. Plan bulk migration: For large datasets, schedule aws s3 sync to a local cache or directly to R2 endpoints, or rely on BucketMate’s queueing to move collections in batches during off-peak windows. Track API rate limits to avoid throttling.
  6. Cut over and monitor: Update application endpoints, CDN origins, or signed URLs to point at R2. Keep S3 replication or lifecycle policies running until you confirm durability parity. Watch BucketMate’s transfer logs and Cloudflare analytics for errors.
  7. Optimize ongoing spend: Enable Cloudflare cache rules, review S3 Intelligent-Tiering or Glacier transitions for remaining copies, and automate health checks via Workers or AWS CloudWatch.

Have questions? Please contact us 👇

Contact Us