Originally published at devtoolpicks.com
Your app lets users upload profile photos. Three months later, you get an AWS bill and the egress line item is three times your storage cost. Sound familiar?
This is the most common object storage mistake solo devs make. They pick S3 because it is the default, everything seems fine until traffic grows, and then egress fees quietly become the largest line item on their cloud bill. Cloudflare R2 and Backblaze B2 both exist specifically to fix this problem. But they fix it differently, and the right pick depends on your workload.
Here is the honest breakdown.
Quick Verdict
| Storage | Best For | Storage Cost | Egress Cost | Free Tier |
|---|---|---|---|---|
| Cloudflare R2 | Most indie hackers, high-download workloads | $0.015/GB/month | Free | 10GB + 10M ops/month |
| AWS S3 | AWS-native stacks, cold storage tiers | $0.023/GB/month | $0.09/GB | 5GB for 12 months |
| Backblaze B2 | Backup, archival, Cloudflare-paired workloads | $0.006/GB/month | Free up to 3x storage | 10GB |
Cloudflare R2
R2 launched in 2022 as Cloudflare's direct answer to S3 pricing. The name is a deliberate jab at Amazon's S3: R2 is one step below S3 in chemical notation. The pitch is simple: S3-compatible object storage with zero egress fees.
What Does R2 Actually Cost?
- Storage (Standard): $0.015/GB/month
- Storage (Infrequent Access): $0.010/GB/month
- Egress: Free, always, no caps
- Class A ops (writes, lists): $4.50/million requests
- Class B ops (reads): $0.36/million requests
- Free tier: 10GB storage, 1 million Class A ops, 10 million Class B ops per month
At 100GB stored with 500GB egress per month: R2 costs roughly $1.35/month. The same workload on S3 would cost about $47/month ($2.30 storage + $45 egress). The gap widens fast as traffic grows.
Where R2 Wins
Zero egress is the obvious one and it is not a gimmick. Cloudflare can offer free egress because they built a global network and their CDN and R2 share the same infrastructure. Serving a file from R2 does not incur additional network transit costs for them the way it does for AWS.
The free tier is also genuinely useful for solo projects. 10GB storage and 10 million Class B ops per month covers a lot of small SaaS applications at no cost. You can build a real product on R2 before you pay a single cent.
R2 has an S3-compatible API. Any library that works with S3 works with R2 with a simple endpoint change. No code rewrites. Migration from S3 typically takes an afternoon.
Where R2 Falls Short
R2 has one storage class, not six. AWS has Standard, Standard-IA, One Zone-IA, Glacier Instant, Glacier Flexible, and Deep Archive. If you need to tier cold data automatically to reduce storage costs, R2 cannot do that yet. For a SaaS storing large volumes of rarely-accessed files (logs, old backups, compliance records), the lack of a cold tier means you pay $0.015/GB for everything, including data you have not touched in two years.
R2 is also newer than S3 and the ecosystem around it is smaller. Some third-party tools and backup software that have native S3 integration do not yet have native R2 support. Usually the S3-compatible mode works fine, but occasionally you hit an edge case.
Compliance certifications are also thinner than S3. If your SaaS handles regulated data that requires specific certifications, check the R2 compliance page before committing.
Who Should Use Cloudflare R2
You are building a SaaS where users upload and download files regularly. Your app serves media assets, documents, or attachments. You want predictable bills with no egress surprises. You are not already locked into the AWS ecosystem.
Who Should NOT Use Cloudflare R2
You need automated cold storage tiers for large volumes of infrequently accessed data. You rely on AWS services that integrate natively with S3 (Lambda triggers on S3 events, CloudFront distributions, Athena queries). You have compliance requirements that require specific certifications not yet covered by R2.
AWS S3
S3 has been the default object storage choice since 2006. It is battle-tested, has the deepest ecosystem, and comes with every tool, SDK, and integration imaginable. The problem is that AWS designed S3 pricing to generate revenue at scale, and egress fees are the mechanism.
What Does S3 Actually Cost?
- Storage (Standard): $0.023/GB/month
- Storage (Standard-IA): $0.0125/GB/month (with $0.01/GB retrieval)
- Egress: Free for the first 100GB/month, then $0.09/GB
- PUT/COPY/POST/LIST requests: $0.005/1,000
- GET/SELECT requests: $0.0004/1,000
- Free tier: 5GB Standard storage for 12 months (new accounts only)
At 100GB stored with 500GB egress per month: roughly $47/month. At 1TB stored with 5TB egress: around $460/month in egress alone.
Where S3 Wins
The ecosystem is unmatched. Every backup tool, deployment platform, data pipeline service, and infrastructure product has native S3 support. Lambda function triggers on S3 events, CloudFront distributions pull from S3 directly, Athena queries S3 data. If you are building on AWS, S3 is the path of least resistance.
Storage classes are the other genuine advantage. Standard-IA, Glacier Instant Retrieval, Glacier Flexible Retrieval, and Deep Archive give you granular control over the cost-to-access-speed tradeoff for cold data. For a SaaS that needs to retain years of user data but rarely accesses old records, S3 lifecycle policies can move objects to Glacier automatically and cut storage costs by 80-90%.
Durability and compliance certifications are also the strongest of the three. S3 claims eleven nines of durability and holds certifications for SOC 1/2/3, PCI DSS, HIPAA, FedRAMP, and more. For regulated industries, this matters.
Where S3 Falls Short
Egress pricing is the problem. $0.09/GB adds up faster than anyone expects before they see the bill. A SaaS where users download their data regularly, a media platform, a file sharing tool, a backup service. Any workload with meaningful egress will pay for it. AWS knows this and has not changed the pricing model because it works for them.
The complexity is also real. S3 configuration options are extensive. IAM policies, bucket policies, ACLs, presigned URLs, CORS configuration, lifecycle rules, versioning, replication. There is a lot to learn and a lot of ways to accidentally make a bucket public or misconfigure permissions.
Who Should Use AWS S3
You are already running significant infrastructure on AWS and the native integrations save real engineering time. You need cold storage tiers for large volumes of infrequently accessed data. You are in a regulated industry that requires specific compliance certifications.
Who Should NOT Use AWS S3
You are building a new project from scratch with no existing AWS dependency. Your app has meaningful egress (users downloading files frequently). You want predictable monthly bills without usage monitoring.
Backblaze B2
Backblaze started as a consumer backup company and built B2 as their developer-facing storage product. The headline is $0.006/GB, the cheapest storage of the three. The catch is that the egress story is more complicated than R2's.
What Does B2 Actually Cost?
- Storage: $0.006/GB/month (first 10GB free)
- Egress: Free up to 3x your average monthly stored data, then $0.01/GB
- Through Cloudflare Bandwidth Alliance: Free egress, no cap
- Class B operations: Free up to 2,500/day, then $0.004/10,000
- Class C operations: $0.004/1,000
The Cloudflare Bandwidth Alliance is key. When you serve B2 files through Cloudflare (which is free to set up), egress from B2 to Cloudflare is completely free. No cap, no ratio. This makes B2 + Cloudflare CDN one of the cheapest combinations available: $0.006/GB storage with effectively zero egress cost for most workloads.
Where B2 Wins
Raw storage cost. At $0.006/GB, B2 is 2.5x cheaper to store than R2 and nearly 4x cheaper than S3. For workloads where data mostly sits at rest (backups, archives, compliance records, logs), that storage cost differential is real money at scale.
The Cloudflare partnership makes egress free for most developer workflows. If you are already using Cloudflare (and most devtoolpicks readers are), pairing B2 behind Cloudflare costs you almost nothing.
B2 is also S3-compatible, so migration is straightforward. Backblaze added S3 API compatibility in 2018 and it covers the vast majority of common operations.
Where B2 Falls Short
The egress story is more complex than R2. Without Cloudflare in front of B2, you get 3x free egress then $0.01/GB. For an app serving lots of files directly from B2 to users, you need to understand your egress-to-storage ratio. R2 is simpler: egress is always free, full stop.
The ecosystem is thinner than S3. Some tools that claim S3 compatibility work fine with B2, others have subtle incompatibilities. It is worth testing your specific stack before committing.
B2 also has no cold storage tier. Like R2, everything is one storage class. AWS's lifecycle policies for tiering to Glacier have no equivalent here.
Who Should Use Backblaze B2
You have large volumes of data that mostly sit at rest: backups, archives, logs, compliance records. You are already on Cloudflare and can pair B2 behind it for free egress. You want the absolute lowest storage cost and are willing to manage the Cloudflare setup.
Who Should NOT Use Backblaze B2
You need an integrated CDN without a separate Cloudflare setup. Your app serves files directly from storage to users at high volume without going through Cloudflare. You need AWS ecosystem integrations.
How to Choose
The decision comes down to your workload pattern.
Pick Cloudflare R2 when:
Your app has meaningful egress: users download files, view images, stream assets. You want zero surprise bills. You are starting fresh with no AWS dependency. You want the simplest setup with the fewest moving parts.
Pick AWS S3 when:
You are already on AWS and native integrations save you real engineering work. You need cold storage tiers with lifecycle policies. You are in a regulated industry with specific compliance requirements.
Pick Backblaze B2 when:
You are storing large volumes of mostly-at-rest data (backups, archives). You are already on Cloudflare and can get free egress through the Bandwidth Alliance. You want the lowest possible storage cost per GB.
For most solo devs and indie hackers building SaaS in 2026, R2 is the right default. Zero egress eliminates the category of billing surprise that catches most people, the free tier covers early-stage projects, and the S3-compatible API means you can migrate from S3 in an afternoon if you are already using it.
The infrastructure decision does not live in isolation either. If you are hosting on a VPS and want full control, the Vercel vs Hetzner comparison covers the tradeoffs at the server level. For your backend database, the Supabase vs Firebase breakdown addresses a similar build-vs-managed decision. And if you are choosing where to run your app alongside your storage, Railway vs Render vs Fly.io is worth reading before you commit to a platform.
Top comments (0)