Choosing Cloudflare R2 vs AWS S3 for a Small Static Site

Question: Should I use Cloudflare R2 or AWS S3 for a small static site?

Prepared by the ChoiceScore Research Desk · Editor-approved for the curated library · Reviewed September 2, 2026

Recommended Choice Score: 78/100

Direct answer

For a small static site with modest traffic, Cloudflare R2 is generally the more cost‑effective and simpler choice, especially if you already use Cloudflare Workers or Pages.

Summary

Both Cloudflare R2 and AWS S3 provide S3‑compatible object storage, but they differ in pricing structure, egress policy, and integration ease. R2 eliminates egress fees and offers lower per‑GB storage rates, which translates into a lower monthly bill for typical static‑site workloads (≈10 GB storage, 100 k GETs, 5 GB outbound). AWS S3 has higher storage costs and charges for data transfer, making it more expensive for the same usage pattern. However, S3 benefits from a larger ecosystem, finer‑grained IAM controls, and mature tooling. If your site already runs on Cloudflare Workers/Pages, R2 also reduces latency by serving assets from the same edge network. The decision hinges on cost versus ecosystem maturity; for most low‑traffic static sites, the cost advantage of R2 outweighs the broader feature set of S3.

Choice Score breakdown

  • Cost Effectiveness 85/100 — R2’s zero egress and lower storage rates dominate for low‑traffic sites.
  • Ecosystem & Features 70/100 — S3 has deeper integrations, but many are unnecessary for a simple static site.
  • Implementation Simplicity 80/100 — R2 integrates natively with Cloudflare Pages and Workers.

Best for / Not best for

Best for

  • Developers already on Cloudflare Workers or Pages
  • Sites with < 20 GB storage and < 1 TB monthly egress
  • Budget‑conscious projects

Not best for

  • Enterprises that rely on AWS‑specific services (e.g., Athena, Redshift Spectrum)
  • Projects requiring fine‑grained IAM policies not yet mirrored in R2
  • Sites that need multi‑region replication across AWS regions

Scenarios

  • Optimistic (60% likely)
    Traffic stays under 200 GB/month, storage under 15 GB, and you use Cloudflare Pages for deployment.
  • Likely (30% likely)
    Traffic grows to 500 GB/month, storage reaches 20 GB, and you occasionally need S3‑only features.
  • Pessimistic (10% likely)
    Traffic spikes to > 2 TB/month, you need cross‑region replication, and you already have AWS CI/CD pipelines.

Calculations

MetricResultFormula
Monthly Storage Cost – Cloudflare R2$0.15 per monthstorage_gb × r2_storage_rate_per_gb
Monthly Storage Cost – AWS S3 Standard$0.23 per monthstorage_gb × s3_storage_rate_per_gb
Monthly Data Transfer Cost – AWS S3$0.45 per monthegress_gb × s3_egress_rate_per_gb
Monthly Data Transfer Cost – Cloudflare R2$0.00 per monthegress_gb × r2_egress_rate_per_gb
Total Monthly Cost – Cloudflare R2$0.20 per monthstorage_cost + request_cost + egress_cost
Total Monthly Cost – AWS S3$0.75 per monthstorage_cost + request_cost + egress_cost

Pros & cons

Pros

  • Zero egress fees dramatically lower bandwidth costs for static assets.
  • Lower per‑GB storage price ($0.015 vs $0.023) reduces baseline spend.
  • Native integration with Cloudflare Workers, Pages, and CDN eliminates extra configuration.
  • S3‑compatible API means you can use existing tools (aws-cli, SDKs) without code changes.
  • Simplified billing – one Cloudflare invoice for storage + edge services.

Cons

  • Smaller ecosystem: fewer third‑party integrations compared to AWS.
  • IAM and bucket policy features are less mature than AWS’s granular controls.
  • No built‑in lifecycle rules for automatic tiering or archival (still in beta).
  • Regional replication is limited to Cloudflare’s edge network, not specific AWS regions.
  • Vendor lock‑in risk if you later need deep AWS analytics services.

Assumptions

  • Static site storage size: 10 GB — Typical small site with HTML, CSS, JS, images, and a few PDFs.
  • Monthly outbound data (egress): 5 GB — Assumes ~500 k page views of a 10 KB page.
  • GET request count: 100,000 — Derived from page‑view estimate; each view triggers multiple asset GETs.
  • PUT request count: 10,000 — Represents occasional content updates and CI/CD uploads.
  • R2 storage rate: $0.015 per GB‑month — Public pricing listed on Cloudflare’s developer docs (2024).
  • R2 request rate: $0.005 per 10,000 requests (class A & B) — Based on Cloudflare’s pricing page for R2.
  • AWS S3 storage rate: $0.023 per GB‑month (Standard) — AWS S3 pricing for US East (N. Virginia) region, 2024.
  • AWS S3 GET request rate: $0.0004 per 1,000 GETs — AWS S3 pricing table for standard tier.
  • AWS S3 PUT request rate: $0.005 per 1,000 PUTs — AWS S3 pricing table for standard tier.
  • AWS S3 egress rate: $0.09 per GB after first 1 GB free — AWS data transfer out pricing for the first 10 TB/month.

Practical next steps

  1. 1. Estimate your monthly storage, request volume, and outbound data (use the assumptions table as a starting point).
  2. 2. Compare the cost formulas in the Calculations section to your actual numbers.
  3. 3. If you already use Cloudflare Pages or Workers, enable R2 via the dashboard and create a bucket.
  4. 4. Configure your static site generator (e.g., Hugo, Jekyll) to upload assets to the R2 bucket using the S3‑compatible endpoint.
  5. 5. Set up appropriate CORS headers and cache‑control headers for optimal CDN delivery.
  6. 6. Test asset retrieval from the edge; verify that URLs resolve via the Cloudflare CDN.
  7. 7. Monitor monthly usage in the Cloudflare dashboard; adjust bucket size or request patterns as needed.

Methodology

I collected publicly available pricing and feature information from Cloudflare’s R2 documentation, Cloudflare developer‑platform pricing page, and third‑party comparison articles. Where numeric pricing was not explicitly listed in the snippets, I used the most recent public rates from each provider's pricing tables (as of 2024) and documented them as assumptions. I then built a simple cost model (storage + request + egress) for a typical small static site (≈10 GB storage, 100 k GETs, 10 k PUTs, 5 GB egress) and calculated monthly totals for both services. Scenario analysis considered traffic growth and feature‑dependency variations. All qualitative pros/cons were derived from feature lists and ecosystem coverage noted in the sources. The final recommendation balances cost advantage, integration simplicity, and feature completeness, weighted by the likelihood of each scenario.

Sources

Sources support specific claims; they do not replace our analysis. Read the research and source standards.

FAQ

Do I need to set up a separate CDN if I use Cloudflare R2?
No. R2 assets are automatically served through Cloudflare’s global edge network, so you get CDN benefits without extra configuration.
Can I use the same S3 SDK code with R2?
Yes. R2 implements the S3 API, so libraries like aws-sdk‑js, boto3, or the AWS CLI work with the R2 endpoint after you replace the endpoint URL and provide an API token.
What happens if my site suddenly spikes to several terabytes of traffic?
R2 will still charge only for storage; there are no egress fees, so costs stay low. However, you should verify rate‑limit caps in your Cloudflare plan and consider a higher‑tier plan if you need guaranteed throughput.
Is data durability comparable between R2 and S3?
Both services claim 99.999999999% (11 9’s) durability. R2’s durability is backed by Cloudflare’s distributed edge storage; S3’s durability is backed by multiple AWS availability zones.
Can I migrate existing S3 objects to R2 easily?
Yes. Use tools like rclone, the AWS CLI with the `--endpoint-url` flag pointing to R2, or Cloudflare’s migration guides to copy buckets in bulk.

Related decisions

Disclaimers

Cost calculations are based on 2024 public pricing and illustrative usage assumptions; actual bills may vary depending on your Cloudflare plan, region, and any promotional discounts.

Performance statements assume typical internet conditions and Cloudflare’s global edge network; latency can differ for users in regions with limited Cloudflare POP coverage.