Cloudflare R2 has the same API as S3 but a different promise: zero egress costs. For anyone running public buckets behind a CDN, it sounds too good. Real numbers from a client below.
The case
A B2B media client of ours has 12 TB of assets (photos and videos) and ~8 TB/month egress. On AWS S3 + CloudFront they paid ~620 USD/month, mostly egress.
The migration
R2 exposes an S3-compatible API. We used rclone with multipart, and in 26 hours all files were in the new bucket. The codebase (Node.js uploader) needed one change: the endpoint.
Post-migration numbers
- Storage: ~180 USD/month (S3 was ~140, R2 slightly more).
- Egress: 0 USD (was ~480 USD).
- Operations: ~12 USD/month (S3 was ~8).
- Total: ~192 USD/month vs ~620 → −69%.
Trade-offs
R2 is younger: fewer regions, some operational gaps (e.g. leaner lifecycle policies). Latency is great inside Cloudflare's network, marginally worse in regions where S3 has dedicated PoPs. For most web-facing use, invisible.
When NOT to move
- Heavy AWS compliance (Config Rules, GuardDuty, native audit logs).
- Analytics workloads with Athena/Glue.
- Event-driven architectures tightly coupled to SNS/SQS.
Otherwise R2 is an upgrade with no real lock-in (API is S3, you can move both ways). We'll propose it as default for new projects.