Field guide

Amazon S3 vs Cloudflare R2

Compare regional integration and direct-delivery economics without assuming the products are interchangeable.

Reviewed 2026-09-07 · Editorial analysis, not a performance test

The decision depends on the route

An application that runs beside its storage has different requirements from one whose main job is distributing public files. Start with the application’s read path. If each end-user request goes directly to storage, public transfer charges matter immediately. If compute reads objects internally and returns a transformed result, the full path includes compute and potentially another transfer bill.

The CloudOverview model compares S3 Standard in N. Virginia with R2 Standard. It does not compare a complete AWS application with a complete Cloudflare application. CloudFront, Workers, KMS and transformations are outside this estimate. Add them when the architecture needs them.

Work through the same quantities

The default image workload stores 1,000 decimal GB, delivers 2,000 GB and makes 100,000 writes plus 10 million reads. Its S3 row converts bytes to binary billing units and includes direct internet transfer. R2 uses its Standard capacity and operation rules, including allowances and rounding. Both assume monthly allowances remain available.

Monthly estimates · images · no currency conversion
Service / pricing regionStorageDeliveryWrites / readsMinimum top-upTotal / month
Amazon S3US East · N. VirginiaUSD 21.42158.640.50 / 4.000.00USD 184.56
Cloudflare R2Automatic placement / EU jurisdictionUSD 14.850.000.00 / 0.000.00USD 14.85
Backblaze B2US / EU / CanadaUSD 6.880.000.00 / 0.000.00USD 6.88
WasabiAll commercial regionsOutside modelOutside the published egress policy. Obtain provider approval; no estimate shown.
Bunny StorageOne storage region · EU/NA deliveryUSD 10.0020.000.00 / 0.000.00USD 30.00
ScalewayParis · fr-parEUR 16.0619.250.00 / 0.000.00EUR 35.31

The full table provides context, but focus on the S3 and R2 component columns. Change only outbound traffic in the calculator and observe which component changes. Then restore traffic and change writes to just beyond one million. That second experiment exposes the R2 rounding boundary. These are cost-model experiments, not provider performance tests.

Examine integration costs

For an existing AWS application, list every S3-specific dependency before moving. If a migration requires changing permissions, event handling or an SDK operation, include that work in the decision. The compatibility checklist is designed to surface those dependencies before a bulk transfer.

For a new public-asset application, map the intended delivery and access-control path first. Evaluate a production-like custom-domain setup and private-access scenario if needed. Avoid treating a public development endpoint as evidence that the final architecture is ready.

Treat placement explicitly

S3’s calculator row is a specific AWS region. R2 has location hints and jurisdiction controls with different meanings. If location is a requirement, a cheap total does not settle the question. Follow the European storage guide and the profile sources to verify the configuration that meets your operational requirements.

A useful decision record

Record the chosen route, required operations, monthly quantities, dataset version and excluded services. Add one normal month, one high-download month and one high-operation month. Note which assumptions came from measured application usage and which are projections.

Choose only after the required behavior is demonstrated in your own environment. A lower modeled storage bill is a reason to test an alternative, not an instruction to migrate regardless of integration effort. Read the S3 profile and R2 profile for the exact pricing and API sources checked for this release.