The best object storage for SaaS in 2026

The best object storage for SaaS in 2026 is Cloudflare R2 for most teams, because its downloads are free with no cap. On a 200 GB document app, R2 bills $2.85 a month and Amazon S3 bills $31.60. Backblaze B2 costs $1.32 while downloads stay under three times what you store, and Hetzner wins for EU media apps.
Key Takeaways
- Downloads and request fees drive most storage bills, more than the space you use.
- Cloudflare R2 is the safest default because downloads are free with no cap.
- Amazon S3 costs about 11 times more than R2 for a typical document app.
- Backblaze B2 is cheapest on paper until downloads pass three times your storage.
- Hetzner’s flat plan is cheapest for download-heavy apps with users in Europe.
What makes object storage expensive for a SaaS?
Most comparisons start with the price per gigabyte stored. For a SaaS, that line is usually the smallest one on the bill. The big lines are egress, which is the data your users download, and the per-request fees for every upload and read.
Take a small app on S3 that stores 50 GB and serves 500 GB of downloads a month. The S3 pricing page charges $0.023 per GB-month for storage, so the storage line is $1.15. Downloads cost $0.09 per GB after the first 100 GB, so egress comes to $36.00. The download line is 31 times the storage line.
AWS pools that free 100 GB across every service and region on the account, the same allowance its EC2 pricing page counts against. An app that also serves API traffic from EC2 has already spent it.
Request fees then shift the order for apps with many small files. On S3, R2, Tigris and Upstash Blob, a write costs 10 to 15 times more than a read. So an app that saves millions of thumbnails pays mostly for uploads.
The best object storage for SaaS, priced line by line
Every rate below comes from the provider’s own pricing page. Egress is per GB downloaded to the internet, and requests are per million.
| Provider | Storage /GB | Egress /GB | Writes /1M | Reads /1M |
|---|---|---|---|---|
| AWS S3 Standard | $0.023 | $0.09 | $5.00 | $0.40 |
| Cloudflare R2 | $0.015 | $0 | $4.50 | $0.36 |
| Backblaze B2 | $0.00695 | $0.01 past 3x stored | $0 | $0 |
| Wasabi | $0.00799 | $0 up to 1x stored | $0 | $0 |
| Tigris | $0.02 | $0 | $5.00 | $0.50 |
| Hetzner | $7.99 per TB flat | $1.20/TB past 1 TB | $0 | $0 |
| Upstash Blob | $0.02 | $0.02 | $4.50 | $0.30 |
| Vercel Blob | $0.023 | $0.05 | $5.00 | $0.40 |
Free tiers and minimums change the math for small apps:
| Provider | Free each month | Minimums and extras |
|---|---|---|
| AWS S3 Standard | 100 GB egress, pooled | none |
| Cloudflare R2 | 10 GB, 1M writes, 10M reads | none |
| Backblaze B2 | 10 GB | none |
| Wasabi | none | 1 TB billed, 90 days per object |
| Tigris | 5 GB, 10k writes, 100k reads | none |
| Hetzner | 1 TB storage and egress in the base plan | 64 KB per object |
| Upstash Blob | free plan only, hard caps | none |
| Vercel Blob | Hobby plan only, non-commercial | $0.06 per GB on cache misses |
Backblaze has dropped its request fees. The B2 transaction pricing page lists uploads, downloads and listing calls as free, and only event notifications cost money. DevToolPicks’ indie hacker comparison still charges B2 for reads and listing calls, which makes B2 look worse than it is.
Outside the table, DigitalOcean Spaces costs $5 a month for 250 GiB and 1 TiB of transfer. Bunny Storage starts at $0.01 per GB with free traffic to its own CDN. Supabase Storage charges $0.0213 per GB past its plan quota. Google Cloud Storage starts egress at $0.12 per GB, higher than S3.
What does a SaaS pay each month?
I priced three SaaS shapes on all eight providers with cost.py , a small calculator in the object-storage-for-saas benchmark folder . The rates are pinned as constants, so anyone can rerun it.
- Early-stage app: 20 GB stored, 50 GB downloaded, 100k uploads and 1M reads a month.
- Document SaaS: 200 GB stored, 300 GB downloaded, 1M uploads and 10M reads.
- Media SaaS: 1 TB stored, 10 TB downloaded, 2M uploads and 50M reads.
| Provider | Early-stage | Document | Media |
|---|---|---|---|
| Cloudflare R2 | $0.15 | $2.85 | $33.75 |
| Backblaze B2 | $0.07 | $1.32 | $76.88 |
| Hetzner | $7.99 | $7.99 | $18.79 |
| Wasabi | $7.99, breaks egress rule | $7.99, breaks egress rule | $7.99, breaks egress rule |
| Tigris | $1.20 | $13.80 | $54.80 |
| Upstash Blob | $2.15 | $17.50 | $244.00 |
| Vercel Blob | $4.48 | $31.20 | $719.00 |
| AWS S3 | $1.36 | $31.60 | $944.00 |
The Vercel row assumes a 70% cache hit rate, the figure from Vercel’s own pricing example, and leaves out the Pro seat fee.
Document SaaS
S3: 4.60 storage + 18.00 egress + 5.00 writes + 4.00 reads = $31.60
R2: 2.85 storage + 0.00 egress + 0.00 writes + 0.00 reads = $2.85
B2: 1.32 storage + 0.00 egress + 0.00 writes + 0.00 reads = $1.32
Hetzner: 7.99 base plan, all usage inside the included 1 TB = $7.99
Media SaaS
S3: 23.00 storage + 891.00 egress + 10.00 writes + 20.00 reads = $944.00
R2: 14.85 storage + 0.00 egress + 4.50 writes + 14.40 reads = $33.75
B2: 6.88 storage + 70.00 egress (7 TB over the 3x cap) = $76.88
Hetzner: 7.99 base + 10.80 egress (9 extra TB at $1.20) = $18.79Early-stage verdict
Every provider costs pocket change at this size, apart from the ones with a base fee. R2’s free tier covers all the requests, and B2 charges seven cents. Wasabi and Hetzner cost $7.99 because both bill a full terabyte from day one. Pick on developer experience here, since price can’t separate the options.
Document verdict
B2 is cheapest at $1.32 because it charges for nothing but storage, and 300 GB of downloads fits under its 600 GB free limit. R2 comes second at $2.85 because its free tier absorbs every request. S3 costs 11 times what R2 does and 24 times what B2 does, almost all of it egress and request fees.
Media verdict
Hetzner’s flat plan wins at $18.79. Its extra egress costs $1.20 per TB and requests are free, so 10 TB of downloads barely moves the bill. R2’s gap to Hetzner is almost all read fees: 40M billable reads cost $14.40. S3 comes in at 28 times R2, and $891 of its $944 is egress.

Hetzner runs in three EU locations only: Falkenstein, Nuremberg and Helsinki. It has no built-in CDN, and each bucket takes at most 750 requests per second, per the Hetzner Object Storage docs . Put a CDN in front of it for a global audience.
LeanOps prices a CDN-origin app with 20 TB stored and 100 TB downloaded at $9,040 a month on S3 with CloudFront, against $372 on R2.
R2 hits the intersection of low cost and low complexity better than any other option for media workloads.
The limits behind free egress
- Backblaze B2: downloads are free up to three times your average stored data for the month, then $0.01 per GB. Downloads through partner CDNs such as Cloudflare, Fastly and bunny.net are free with no cap. On the media workload, that would cut B2’s bill from $76.88 to $6.88.
- Wasabi: the Wasabi pricing FAQ calls a use case a good fit only while monthly downloads stay at or below active storage. Past that, Wasabi reserves the right to limit or suspend the account. All three workloads above break that rule, so Wasabi suits backups and archives.
- Wasabi’s minimums: billing starts at 1 TB and files under 4 KB bill as 4 KB. Deleted data bills for 90 days under its minimum storage duration policy . A SaaS that writes short-lived export files pays for 90 days of each one.
- Cloudflare R2 Infrequent Access: storage drops to $0.01 per GB, but every read costs $0.01 per GB. Writes cost $9.00 per million, and objects bill for at least 30 days. The free tier doesn’t apply to this class.
- Tigris: its Infrequent Access class has a 30-day minimum and its archive tiers 90 days, both with retrieval fees.
- Vercel Blob: files over 512 MB never enter the cache, so every download of a large file pays origin transfer too. Going over a Hobby limit locks Blob for 30 days.
- Upstash Blob: free-plan allowances are hard caps that stop the bucket until the window resets, and the paid plan bills from the first byte.

Metered egress also opens the door to abuse. A public S3 bucket can be downloaded in a loop, and S3 has no default spend cap. In a Hacker News thread comparing S3 and R2 , one commenter points out that anyone hammering your public files can run up that bill. The same comment adds that Cloudflare’s built-in DDoS protection makes the same attack less likely to land on R2.
Switching providers later without a big bill
Every provider in the table except Vercel Blob speaks the S3 API. The same AWS SDK code runs against each one with a different endpoint and keys.
Leaving costs egress. Mixpeek’s escape-cost table puts moving 100 TB out of S3 at $9,000 and out of B2 at $1,000. With S3’s tiered rates, the S3 figure is closer to $7,812. B2’s own rules make the move free, since 100 TB is under three times what you store. R2, Tigris and Wasabi charge nothing, and Hetzner about $119.
AWS will waive that $7,812 if you ask. Since 2024 it credits data transfer out for customers moving to another provider . You open a request with AWS Support, it reviews the account, and you get 90 days to finish the move. You don’t have to close the account.
rclone sync copies between any two S3 endpoints. The destination can also do the copying for you:
- Cloudflare R2 offers Super Slurper for a bulk copy and Sippy , which copies each object the first time someone requests it. Both are free apart from R2’s usual write fees. Super Slurper skips objects over 1 TB, and ETags can change on the way because it may re-upload files in parts.
- Tigris shadow buckets fetch objects from the old bucket on first read, like Sippy. Write-through mode also copies new uploads back to the old bucket, so you can switch back if something breaks. Sources include S3, Google Cloud Storage, R2, B2, Wasabi and Hetzner.
- Backblaze runs Universal Data Migration and pays the source’s egress for customers who sign a qualifying commitment. Its sales team sets the terms.
Lazy copies like Sippy and shadow buckets keep the old provider billing for storage until the last object moves, and each first read still pays the source’s egress. Run a bulk copy afterwards to finish the move.

Test the gaps before you switch. Tigris notes that R2 doesn’t fully support multipart copy parts, some ACL calls or some list parameters. R2 also lacks presigned POST. Mixpeek claims R2 has no object lock, but the R2 docs now list bucket locks, so check the docs over any comparison, this one included.
S3 wins on ecosystem, not price.
Which object storage should your SaaS pick?
- Most SaaS apps, especially read-heavy ones: Cloudflare R2. It costs $2.85 a month for the document workload, downloads are free with no cap, and the first 10 GB and 10M reads are free.
- Storage-heavy apps with modest downloads: Backblaze B2, at $1.32 for the document workload. Keep downloads under three times storage, or serve them through a partner CDN.
- Download-heavy media apps with EU users: Hetzner Object Storage. It costs $18.79 for 10 TB of downloads, but plan on a CDN and three EU locations.
- Backups and archives: B2 at $6.95 per TB, or Wasabi if downloads stay below what you store.
- Global low-latency reads without a CDN setup: Tigris, at $13.80 for the document workload.
- A serverless stack that wants an SDK and signed uploads out of the box: Upstash Blob, at $17.50 against R2’s $2.85.
- A team already running everything on AWS: S3 with CloudFront in front, at the highest price.
Botmonster Tech