Search nomadLab

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

Store a terabyte, serve five, and S3 bills $464 while R2 bills $15. The egress line is the whole comparison, and two of the cheap options have fine print that undoes it.

Updated

Storage price per gigabyte is the number every vendor puts on the slide, and it is the number that decides almost nothing. Across the five providers below, storage ranges from $6.95 to $23 per terabyte per month. That spread is real but small. Egress ranges from free to $90 per terabyte, and that is where the bills come from.

So here is the comparison in one line: hold a terabyte and serve five terabytes a month to the public internet, and S3 charges about $464 while R2 charges about $15. Everything else in this post is either the arithmetic behind that or the fine print that changes it.

All prices below came off the vendor pricing pages on 21 August 2026.

The arithmetic

Monthly cost of storing one terabyte as egress rises from zero to five terabytes. S3 climbs in a straight line from $23 to $464 while R2, Backblaze B2, and Tigris stay in a band between $15 and $27 across the whole range. 1 TB stored, monthly cost as egress rises $500 $0 0 1 TB 2 TB 3 TB 4 TB 5 TB egress per month R2, B2, Tigris: $15 to $27, flat S3, $464 every dollar of the climb is egress at $0.09/GB
S3 Standard at $0.023/GB-month plus $0.09/GB egress, against the three zero-egress options at list rates. On a $500 axis the cheap providers are not distinguishable from each other, which is the point.

The numbers behind the lines, for one terabyte stored and five terabytes served:

storageegressmonthly
S3 Standard$23.00$441.00$464
Backblaze B2$6.95$20.00$27
Backblaze B2 behind Cloudflare or Fastly$6.95$0$7
Cloudflare R2$14.85$0$15
Tigris$19.90$0$20
Wasabi$7.99$0see below

S3’s egress is $0.09/GB for the first 10 TB in us-east-1, after 100 GB free per month across all AWS services. That single rate accounts for 95% of the S3 column.

Cloudflare R2

$0.015 per GB-month for Standard, $0.01 for Infrequent Access, and no egress charge at any volume. Class A operations (writes and lists) are $4.50 per million, Class B (reads) $0.36 per million. The free tier is 10 GB of storage, 1 million Class A, and 10 million Class B per month.

R2 grew a tier since the last time most comparison posts were written. Infrequent Access is a third cheaper to store, charges $0.01/GB to retrieve, and bills a 30-day minimum duration even if you delete sooner. That is a smaller trap than S3’s tier ladder but it is a trap, and lifecycle rules that move objects around quickly will find it.

S3 API compatibility is good rather than perfect. Multipart and presigned URLs work. Bucket policies do not map onto IAM, so fine-grained auth ends up in Workers and Cloudflare Access instead. The audit trail is thinner than S3 plus CloudTrail, which matters if someone is going to ask you to prove who read an object in March.

This site runs on Cloudflare Workers, so I am not neutral about the pairing: serving and transforming files at the edge with no egress line is genuinely a different working experience. The cost is that moving a Workers-fronted R2 setup elsewhere is a project rather than a script. That is a real form of lock-in and worth naming even when the bill is $15.

AWS S3

S3 is not in trouble. It is the wrong tool for content served to the public internet, and the right one for a surprising amount of everything else.

It still wins for analytics. Your data sits in S3 because Athena, Glue, EMR, and your warehouse read it inside the AWS network, where the egress you were worried about does not exist. Moving the storage layer to save on egress you were never paying breaks the topology for no gain.

It also wins on two specific tiers nobody else matches. S3 Express One Zone is $0.11/GB-month for single-digit-millisecond reads out of one availability zone, which is a different product from anything on this list. And Glacier Deep Archive sits at $0.00099/GB-month, a tenth of a cent per gigabyte, which is untouchable for cold archive if you can live with the retrieval delay and the 180-day minimum.

Request pricing is the part people forget: $5 per million PUTs and $0.40 per million GETs. For a bucket full of small objects with heavy write traffic, requests can outrun storage.

Backblaze B2

$6.95 per terabyte per month, the cheapest per-byte figure here, with the first 10 GB free and no minimum retention period. Delete an object an hour after writing it and you pay for the hour.

The egress model changed and most write-ups have not caught up. B2 now includes free egress up to three times your average monthly stored volume, and charges $0.01/GB beyond that. Separately, egress through a partner is unlimited and free, and Backblaze’s own pricing page currently names Fastly, Cloudflare, and CoreWeave. The older Bandwidth Alliance list that included Bunny, Vultr, and DigitalOcean is not what the vendor page says today, so check before you plan around it.

There is also B2 Overdrive at $15 per terabyte per month with unlimited free egress to anywhere, which is aimed at teams that want the bill to be one number.

The honest comparison against R2 is about CDN optionality. B2 plus Fastly keeps your CDN swappable. R2 does not, and is simpler if you were going to be on Cloudflare anyway.

Wasabi

$7.99 per terabyte per month, with no egress fee and no request fee. It was $6.99 until 1 July 2026, which was the first price rise in the company’s history. If you read a comparison quoting $6.99, it predates that.

Three pieces of fine print decide whether the flat rate is real for you.

The minimum billable capacity is 1 TB. Store 50 GB and you pay for a terabyte. The minimum storage duration on pay-as-you-go is 90 days: write an object, delete it tomorrow, and you are billed for the remaining 89. Reserved capacity cuts that to 30.

And the free egress has a stated ratio. Wasabi’s pricing FAQ puts it plainly: if your monthly egress is less than or equal to your stored volume, you are a good fit. The 1 TB stored and 5 TB served example at the top of this post is a 5:1 ratio, which is outside that policy. This is why Wasabi has no number in the table. It is not a hidden charge, it is an eligibility line, and hitting it gets you a conversation rather than an invoice.

Wasabi is a good backup target and a bad user-upload bucket. Those two workloads have opposite churn and opposite read ratios, and its pricing is built for exactly one of them.

Tigris

$0.02 per GB-month, zero egress, $5 per million writes and $0.50 per million reads, first 5 GB free. Globally distributed and S3-compatible, and the default object store on Fly.io, where the integration is tight enough that it stops being a decision.

I have not run it at scale, so take this as reading the docs rather than reporting. What I would want before betting a production workload on it: clearer durability numbers under the global replication model and a longer track record on the awkward corners of S3 compatibility. For an edge-rendered app already on Fly, it is the obvious thing to try. I wrote about Fly and its neighbors separately if that is the deployment question you are actually asking.

The compatibility gaps that bite

Everyone claims S3 compatibility and everyone means something slightly different by it.

Reliably fine: put, get, delete, list, multipart upload, presigned URLs, server-side encryption with vendor-managed keys. Usually partial: bucket policies, lifecycle rules, CORS preflight behavior, object lock, versioning. Rarely present outside AWS: IAM policies in the AWS sense, S3 Select, Object Lambda, and the whole Inventory and Storage Lens family.

The one that catches migrations is presigned URLs. Every vendor implements them and the signing details differ enough that URLs already in the wild will not validate against the new provider. If your app mints presigned URLs with long expiries and drops them into emails or queued jobs, you need a dual-read window during cutover, not a flag flip.

Where I would put things

Files served to users, and you are on Cloudflare already: R2. Files served to users, and you want to keep your CDN swappable: B2 behind Fastly. Anything feeding Athena or your warehouse: leave it on S3, the egress you are afraid of is not being charged. Backups measured in months: Wasabi if the churn is low, Glacier Deep Archive if you want the floor.

If you are staring at an S3 bill right now, the number to pull is not total spend. It is the ratio of bytes out to bytes stored. Below 1:1 the migration is probably not worth the week. Above 3:1 the arithmetic at the top of this post is your bill, and it has been for years.

Keep reading