Skip to main content
Logo
Overview

Object Storage in 2026: R2 vs S3 vs B2 vs Wasabi vs Tigris

May 17, 2026
10 min read

The first time I got a surprise S3 bill, it was 2019 and I’d accidentally left a CloudFront distribution misconfigured. The second was last year — same bucket, different mistake, this one involved a hot-linked image hitting the front page of a popular subreddit. The egress line was $812 for a single weekend.

I’m not going to claim that’s typical. But here’s what is: every backend engineer I know has an S3 egress war story, and 2025 was the year a lot of those engineers actually got around to migrating. By spring 2026, the question isn’t “should I look at alternatives” anymore. It’s “which one fits my workload.”

This post is opinionated. The short version is that S3 is still the right call for some teams, and a worse call than people realize for others. The rest is the math.

Why the market broke open in 2025

A few things shifted at once.

Cloudflare R2 finally crossed from “promising challenger” to “validated at scale.” The reference customers are no longer all indie SaaS — there are eight-figure ARR companies running production object storage on R2 with no fallback. Zero egress means the math works at any scale where you’re serving content to users instead of to other AWS services.

AWS responded selectively. They quietly dropped some egress fees for customers actually leaving the platform, and they shipped S3 Express One Zone — a single-AZ tier with sub-millisecond latency aimed at teams who were threatening to leave for performance reasons. But per-request pricing and cross-AZ traffic still dominate real S3 bills, and that didn’t change.

Backblaze pushed the Bandwidth Alliance further. Free egress to Cloudflare, Fastly, Bunny, Vultr, and DigitalOcean turns B2 into a credible primary store for any team whose users live behind one of those CDNs. That’s most of the internet.

And then Tigris showed up. Globally distributed S3-compatible storage, Fly.io-native, with bucket policies that replicate to the edge automatically. For edge-rendered apps it’s genuinely interesting. For everything else it’s too new.

That’s the landscape. Now the vendors.

Cloudflare R2: the default for content-heavy workloads

R2 is the easiest recommendation to make. If your storage is “files we serve to users” — images, video, downloads, user-generated content — R2 is almost certainly the right pick.

Storage runs around $0.015/GB-month as of early 2026. Egress is zero. Class A operations (writes, lists) and Class B operations (reads) cost in line with S3, but the egress savings dwarf them for anything content-serving.

S3 API compatibility is good but not perfect. Multipart works. Presigned URLs work. Bucket policies don’t map cleanly to IAM — you’ll use Workers and Cloudflare Access for fine-grained auth instead. Lifecycle transitions are simpler than S3’s tier story because R2 doesn’t really have tiers. Object lock arrived in 2024 but the audit-log story is thinner than S3 + CloudTrail.

The pairing with Workers is the unfair advantage. R2 + Workers means you can serve, transform, and authenticate files at the edge without a single egress charge. The downside is you’re more locked into the Cloudflare platform than people admit — moving a Workers-fronted R2 setup to another provider is a real project, not a script.

Where R2 still loses to S3: if your access pattern is analytics pipelines reading 50TB to feed Snowflake or Athena, the egress was never your problem and the rest of the AWS ecosystem matters more than the storage layer. Stay on S3.

AWS S3: still right when you’re in the AWS ecosystem

S3 isn’t dying. It’s just being correctly diagnosed as the wrong tool for content-serving workloads that live outside AWS.

Cases where S3 still wins:

  • Data lake and analytics workloads. Your data sits in S3 because Athena, Glue, EMR, Redshift Spectrum, and your warehouse all read it cheaply within the AWS network. Moving the storage layer breaks the whole topology.
  • Sub-millisecond reads. S3 Express One Zone is genuinely the only object store in this class. Single-AZ, real availability tradeoff, but for a frequently-read cache layer it works.
  • Enterprise governance. IAM, Organizations, Control Tower, CloudTrail, KMS — the access control and audit story across regulated industries is still meaningfully better than the alternatives.
  • Glacier Deep Archive. Sub-cent per GB-month is hard to beat for cold archive, even accounting for the retrieval pain.

Cases where teams stay on S3 out of habit and then get the bill: serving user uploads, video, podcast audio, image CDNs, downloadable software. If your bucket has meaningful read traffic from the public internet, the math is brutal. A 10TB bucket with a 5:1 egress-to-storage ratio runs well over $4,000/month in egress alone at list prices.

Backblaze B2: the indie favorite that grew up

B2 is what I default to when a friend asks me where to host their podcast or video site. Storage is around $6/TB-month. Egress through the Bandwidth Alliance — Cloudflare, Fastly, Bunny, Vultr, DigitalOcean — is free. Egress to anywhere else is around $10/TB.

S3 API compatibility has come a long way. Multipart works. Presigned URLs work. Versioning, lifecycle policies, bucket policies — all functional. The gaps that bite: server-side encryption with customer-managed keys is more limited than S3, and S3 Select doesn’t exist (almost nothing outside AWS implements it).

The trade-off vs R2 is mostly philosophical. R2 ties you to Cloudflare’s CDN; B2 plus Bunny or Fastly gives you CDN optionality without giving up free egress. If you genuinely want to keep your CDN swappable, B2 is the better pick. If you’ve already standardized on Cloudflare for everything else, R2’s operational simplicity wins.

Wasabi: still the cheapest, with the asterisk

Wasabi sits at $6.99/TB-month flat. No egress charges. No API request fees. For steady-state storage, the math is the lowest in the market.

The asterisk is the 90-day minimum-storage commitment. Write an object, delete it after a day, you still pay for 90 days. This kills a lot of workloads: anything with rapid churn, heavy lifecycle transitions, temporary uploads, build artifacts that get pruned after a week.

Where Wasabi makes sense: backup targets that hold data for months or years, archive workloads where storage cost dominates everything else, media libraries with stable content. Where it doesn’t: anything resembling a hot cache or a working set that turns over.

I’ve used Wasabi for off-site backups for years. I would not put a user-upload bucket on it.

Tigris: interesting if you’re already at the edge

Tigris is the new one, and I want to be honest that I haven’t run it in anger at scale yet. The pitch is globally distributed S3-compatible storage with bucket policies that replicate to the edge automatically. Fly.io ships it as the default object store and the integration is genuinely tight.

If you’re building edge-rendered apps on Fly or you need read latency that’s good everywhere in the world without managing your own replication, it’s worth evaluating. Pricing is in the same neighborhood as R2 for storage with similarly-priced operations.

What I’d want to see before betting a production workload on it: more public reference customers, clearer durability numbers under the global replication model, and a longer track record on the obscure parts of S3 compatibility. By late 2026 it might be the obvious pick for a category of edge-deployed apps. Right now, it’s a calculated bet.

The rest of the field, briefly

Google Cloud Storage has the best multi-region durability story and is the obvious pick if you’re already on GCP. Standalone, it’s hard to justify over R2 or B2.

Azure Blob is the right pick if you’re on Microsoft 365 and need Active Directory integration. Otherwise the developer experience lags noticeably.

DigitalOcean Spaces has dead-simple pricing (a flat monthly base that includes a storage and egress allowance) but the API compatibility is shallower than B2. Fine for small projects.

Scaleway Object Storage is the EU-residency play. If you need data physically in France with European-owned infrastructure, it’s the cleanest option.

MinIO and SeaweedFS for self-hosting. If you have someone who wants to own the storage layer and the volume to justify it, MinIO is the more mature product. SeaweedFS wins on raw performance for object-heavy workloads.

The S3 compatibility gaps that actually matter

Every non-AWS vendor claims S3 compatibility. The reality is a spectrum.

What usually works: basic put/get/delete, listing, multipart upload, presigned URLs, server-side encryption with vendor-managed keys.

What’s often partial: bucket policies (most vendors implement a subset), lifecycle rules (transition mechanics between tiers vary), CORS (mostly works but check preflight behavior), object lock (implementations vary wildly), versioning (the API surface differs in small ways).

What rarely works outside AWS: IAM policies in the AWS sense (most vendors have their own auth model and you’ll translate), S3 Select, Glacier-style tier transitions, S3 Object Lambda, anything in the Analytics / Inventory / Storage Lens family.

The migration trap I keep seeing: presigned URLs. Every vendor implements them, but signing algorithm details differ enough that pre-existing URLs in the wild won’t validate on the new vendor. If your app generates presigned URLs and embeds them in emails or background job payloads with long TTLs, plan for a dual-write window during the cutover.

Rough pricing math at three scales

Numbers for 2026. Verify against current vendor pricing before you commit.

100GB with 1:1 egress (small SaaS): S3 runs about $11/month all-in. R2 runs roughly $1.50. B2 plus a Bandwidth Alliance CDN runs under a dollar. Wasabi sits around $0.70 once the 90-day commit kicks in. At this scale the absolute dollars don’t matter — pick on developer experience and platform fit.

10TB with 5:1 egress (a content site or media-heavy SaaS): S3 lands near $4,800/month, mostly egress. R2 is around $150. B2 with a Bandwidth Alliance CDN is around $60. Wasabi is in the same range if your access pattern fits the commitment. This is where the migration project pays back in a quarter.

100TB with 20:1 egress (a video platform): S3 is well into five figures monthly. R2 is roughly $1,500. B2 plus an Alliance CDN is around $600. At this scale you should also be talking to every vendor directly about committed-use discounts.

These are back-of-envelope. Request pricing, replication, lifecycle transitions, and inter-region transfer all add up. But the ratios are real, and they’ve been real for a while.

What I’d actually pick today

A short matrix:

  • Indie SaaS shipping fast: R2. The Workers integration removes whole categories of work.
  • Media-heavy site with an existing CDN: B2 if you want CDN optionality. R2 if you’ve standardized on Cloudflare.
  • Data lake or analytics-adjacent: Stay on S3. The ecosystem matters more than the line item.
  • Cold backup or archive: Wasabi if access patterns are stable. Glacier Deep Archive if you can tolerate the retrieval delay and want the absolute floor on cost.
  • Regulated EU app: Scaleway, or R2 in an EU-restricted bucket.
  • Edge-rendered consumer app on Fly: Tigris is worth a real evaluation.
  • Self-host because you have the people: MinIO.

The bigger takeaway: stop defaulting to S3 for content workloads. The egress math hasn’t worked in your favor since around 2022, and the migration tooling — rclone, native vendor importers, dual-write patterns — is mature enough that the cutover is a week or two of focused work, not a quarter.

Run your actual bill through the R2 and B2 calculators this week. If the projected savings cover an engineer-week, that’s your sign.