Cloudflare R2 vs S3: the egress question, answered properly

Filed under Comparison

By Gerald · 9 September 2026

A dense bundle of blue network patch cables plugged into a server rack switch

Cloudflare R2 charges nothing to move data out to the internet. Amazon S3 charges for every gigabyte past a small free allowance. If your workload serves a lot of downloads, images, or video, that single difference can be the largest line on your storage bill, and R2 wins it outright. If your workload does not move much data out, the egress advantage barely shows up, and the decision comes down to ecosystem maturity, where S3 still leads.

What egress actually costs on S3

Amazon includes 100 GB of free data transfer out to the internet per month. Past that, S3 charges $0.09 per GB for the first 10 TB, dropping to $0.085 per GB for the next 40 TB, $0.07 per GB for the next 100 TB, and $0.05 per GB beyond that, based on AWS's published pricing in July 2026. Transfer between S3 and other AWS services in the same region stays free.

Run the numbers on a modest media-serving app: 2 TB of downloads in a month, after the free allowance, lands around $175 at the first-tier rate. A product that serves images or video at real scale can see this become the single largest storage-related expense, well past what the storage itself costs.

Double the traffic and the egress bill roughly doubles with it, because the rate is flat within a tier. That is the uncomfortable part: the cost scales directly with the thing you actually want, which is more people using your product.

Where R2 saves real money and where it does not

Grayscale industrial pipes and valves mounted on a wall, standing in for the flow of data out of storage
Egress is the metered valve most storage bills forget to mention until it matters.

R2's headline feature is genuinely simple: egress to the internet is free, on every plan, with no tier or cap. For any workload where the dominant cost is people downloading things (images, video, backups people restore, software distribution), this removes a cost that scales with usage and traffic success, which is an uncomfortable thing to have scaling against you.

For workloads where egress was never the bottleneck, R2's advantage shrinks. An application that stores data and rarely serves it back out to the public internet (internal backups, data lake storage queried by services within the same cloud, logs retained for compliance) was not paying much egress on S3 to begin with. In that case the decision is closer, and the newer or narrower feature set matters more than the price difference.

Storage and operations, plus the fine print

These figures were shown on the official pricing pages in July 2026.

Cloudflare R2 (Standard) AWS S3 Standard
Storage $0.015 per GB-month $0.023 per GB-month (first 50 TB)
Write-type requests (per million) $4.50 $5.00 (per million PUT/COPY/POST/LIST)
Read-type requests (per million) $0.36 $0.40 (per million GET)
Egress to internet Free Free for first 100 GB/month, then tiered from $0.09/GB
Free tier 10 GB storage, 1M write requests, 10M read requests per month No ongoing free tier for storage beyond the 12-month new account trial

R2 also bills in whole-million increments, rounding a million-and-one requests up to two million, which matters more for low-volume workloads than high-volume ones where the rounding is a rounding error either way.

S3's storage price is higher per gigabyte than R2's at every published tier, and its request pricing is close but slightly higher too. Combined with free egress, R2 is cheaper on paper for nearly every workload shape. The place S3 claws it back is scale discounts and reserved capacity options for very large, predictable workloads, which R2 does not currently offer in the same form.

S3 API compatibility in practice

R2 implements the S3 API well enough that most SDKs and CLI tools built for S3 work against R2 with only an endpoint and credential change. For the common case, uploading files, generating signed URLs, listing objects, that compatibility holds up in practice, not just on paper.

The gaps show up in less common operations. According to Cloudflare's own compatibility documentation, R2 does not support S3 Object Lock in its compliance-mode form, S3 Glacier or Deep Archive storage tiers, S3 Batch Operations, Intelligent-Tiering automatic class transitions, or S3 Inventory reports. Multipart upload behavior also differs from S3 in some edge cases worth testing before you cut over a production upload path.

None of those gaps matter for a typical web application storing user uploads, generated files, or media assets. They matter a great deal for regulated workloads that depend on Object Lock for compliance immutability. They also matter for data lake architectures that lean on Glacier tiering and Batch Operations to manage lifecycle at scale.

Ecosystem, lifecycle rules, and tooling gaps

Lifecycle rules exist on R2, letting you auto-delete objects after a set number of days or transition them to a cheaper storage class. There is a 1,000-rule cap per bucket, and managing them requires an API token with the correct write permission scope. S3's lifecycle tooling is older and more granular. It is also more deeply integrated with the rest of AWS's storage ecosystem, because it has had over a decade longer to accumulate features.

The bigger gap is not any single feature. It is the surrounding ecosystem: AWS-native tools, third-party backup software, compliance certifications, and infrastructure-as-code modules were mostly written assuming S3 first. Most of it works against R2 through the S3-compatible API, but "mostly works" is a different guarantee than "built and tested for this."

If your infrastructure already lives entirely inside AWS, and the object storage is one piece of a stack that leans on other AWS services for compute and queuing, plus IAM for identity, staying on S3 avoids a cross-cloud dependency for a cost saving that may be marginal if egress was never your biggest line item. If your stack is already multi-cloud or Cloudflare-centric (Workers, Pages, D1), R2 fits without adding a new vendor relationship at all.

R2's price advantage is real. The decision that actually matters is whether your workload was ever paying much for egress in the first place.

Who should move and who should stay

Move to R2 if you serve a meaningful volume of downloads, images, or video to end users and your current S3 egress bill is a real number you can point to. Also consider it if you are already building on Cloudflare's platform and want one fewer vendor to manage.

Stay on S3 if your workload lives deep inside AWS-native tooling, or depends on Object Lock, Glacier tiering, or Batch Operations. It is also the safer choice if your egress costs were never significant to begin with, since the migration effort would outweigh the saving.

For most small products and side projects, user uploads like avatars, attachments, and generated files are the actual workload. My Cloudinary review covers a different tradeoff worth knowing about first: paying for transformation and delivery as a service rather than managing raw object storage yourself. Flow, for what it is worth, still uses direct Cloudinary uploads for user files rather than rolling its own S3 or R2 bucket. The transformation pipeline solves a problem plain object storage does not.

Storage is only one line item in what a small SaaS costs to run. It is usually not the largest one unless your product is genuinely media-heavy. Weigh a storage migration against where the rest of your infrastructure bill actually goes, whether that is where to run the backend or the compute layer serving your application, before treating egress savings as the whole story.

Frequently asked questions

Is Cloudflare R2 really free to download from? Yes, on every plan. R2 does not charge for data transferred out to the internet, which is the core of its pricing pitch compared with S3's tiered egress fees.

Is R2 fully S3 compatible? Mostly, for common operations like uploads, downloads, listing, and signed URLs. It does not support S3 Object Lock in compliance mode, Glacier or Deep Archive tiers, Batch Operations, or Intelligent-Tiering, according to Cloudflare's own compatibility documentation.

When is S3 still cheaper than R2? Rarely on a per-gigabyte basis, since R2 undercuts S3 on storage and request pricing too. S3 becomes the more practical choice when reserved capacity discounts, deep AWS integration, or features R2 lacks outweigh the raw price difference.

Can I use R2 with existing S3 tooling? Most S3-compatible SDKs and CLIs work against R2 with an endpoint and credential change. Test multipart uploads and any lifecycle automation specifically, since behavior can differ from S3 in edge cases.

What about image transformations and CDN delivery? Neither R2 nor S3 does image transformation on its own. Cloudflare offers Images as a separate product that pairs with R2, and AWS pairs S3 with CloudFront or a service like Cloudinary for on-the-fly resizing and format conversion.

Related reading

My verdict

R2 is cheaper than S3 on nearly every published number, and free egress is a real, non-marginal advantage for anything that serves data back out to users. Choose it when that describes your workload. Stay on S3 when your infrastructure and compliance needs are already built around features R2 does not yet match.

Own your notes and tasks

Flow puts notes, tasks, and a capture inbox in one place you pay for once, connected to your AI tools.

Create your account

Read this on flowproductivity.space · More from The Flow Journal · Try the Flow demo