The short version
Cloud object storage is one of those line items that looks tiny on day one and quietly grows into a second rent payment by month twelve. The reason is not that storage is expensive — it’s that the pricing model you pick changes what your bill actually measures. Three shapes dominate the market right now:
- Pure usage-based (AWS S3, Cloudflare R2, Backblaze B2 standard tier). You pay per GB stored, per GB sent out, and per million API calls.
- Flat-rate subscription (Wasabi, Backblaze B2 Reserve, some “unlimited” backup services). One predictable monthly or annual fee, with caps or minimums baked in.
- Hybrid tiered (S3 with Standard-IA or Glacier, R2’s occasional access tiers on competitors). Cheaper per GB if you promise the data will sit still.
Each model bills a different shape of workload fairly. The mistake is choosing one because the headline price looks low. For a founder running a small product, the right question is not “which is cheapest per GB” but “which model matches how my data actually behaves.”
What you are actually paying for
Object storage bills fall into three buckets, and every provider mixes them differently.
1. Storage (the data sitting in the bucket). Charged per GB-month, usually averaged across the month. This is the line everyone quotes.
2. Egress (data leaving the bucket). Charged per GB sent out to your users, to another cloud, or to the public internet. Egress is where the surprise invoices come from. AWS S3 charges roughly $0.09/GB to the internet; Cloudflare R2 charges $0; Backblaze B2 charges around $0.01/GB with a small daily free allowance.
3. API operations (the requests your app makes). Writes (PUT, multipart uploads, list operations) usually cost more than reads (GET, HEAD). R2 charges about $4.50 per million Class A operations and $0.36 per million Class B operations after a generous free tier.
A useful mental model: storage is rent, egress is shipping, and operations are the door opening every time. A static-asset workload opens the door a lot and ships a lot. A backup workload pays rent for years and rarely ships.
How each pricing model behaves
Pure usage-based
You pay nothing when you store nothing and pay more as you grow. There is no commitment, no contract, and no penalty for testing. The downside is that the bill is a moving target, and a sudden traffic spike — a Hacker News post, a viral demo, a misconfigured cron job — can multiply your egress charges overnight.
For an indie founder in the first year, this is usually the safest model. You are still learning your real storage and bandwidth shape. Locking into a flat rate before you know the shape is a guess with money attached.
Flat-rate subscription
You pay one number per month or per year and get a bucket of storage, sometimes with egress included, sometimes with caps. Wasabi is the clearest example: roughly $0.0049/GB-month with a 90-day minimum storage commitment and egress folded into the storage price. Backblaze B2 Reserve offers a capacity-based annual plan with bundled egress and API transaction fees.
The appeal is budget predictability. The trade-off is the minimums and caps. A 90-day minimum means deleting a test bucket on day ten does not save you. A “free egress up to 3× your stored data” clause is generous for backups and punishing for serving user uploads. Read the small print.
Flat-rate models shine when your workload is steady, well-understood, and your egress is either very low or very predictable. They are a poor fit when you do not yet know what your workload looks like.
Tiered storage
Standard, infrequent access, archive, cold archive — each tier gets cheaper per GB the longer you promise the data will sit untouched. In exchange, you pay retrieval fees and, often, minimum storage duration penalties.
This is a real optimization, but it is also a place where founders quietly overpay. The classic error is moving backups to an archive tier, then needing to restore after an incident and discovering the retrieval fee plus minimum-duration charge wipes out six months of savings. Only use tiers when your access pattern is genuinely predictable.
A worked example at three sizes
Imagine an indie app that stores user-uploaded images and serves them through a CDN. The app stores 100 GB, serves about 500 GB out per month, and makes a moderate number of API calls (a few million reads, a few hundred thousand writes).
| Model | Approximate monthly bill |
|---|---|
| AWS S3 Standard, no CDN | Storage ≈ $2.30, egress ≈ $45, operations ≈ $1. Total: roughly $48. |
| Cloudflare R2 | Storage ≈ $1.50, egress $0, operations under the free tier. Total: roughly $2–$3. |
| Backblaze B2 + Cloudflare CDN (Bandwidth Alliance) | Storage ≈ $0.60, egress $0 via the alliance, operations small. Total: roughly $1–$2. |
Scale that to 10 TB stored and 5 TB egress per month, and the picture flips again: R2’s higher per-GB storage rate becomes meaningful, S3’s egress becomes painful, and B2 + Cloudflare still wins on total bill because the storage rate is so low.
The point is not the exact numbers. The point is that the cheapest provider at 100 GB is often not the cheapest provider at 10 TB. Re-run the math every few months.
How to estimate your real bill before signing up
Step 1. Measure three numbers from your current setup (or a realistic forecast):
- Average GB stored per month
- Average GB egress per month
- Estimated monthly API operations, split into reads and writes
Step 2. Plug those into each provider’s published pricing page. Do not trust third-party calculators that round aggressively.
Step 3. Add a 2–3× multiplier to egress for the first year. Indie products grow unevenly. A viral moment, a podcast mention, or a bot scraping your public assets can triple your bandwidth overnight. If the bill still looks comfortable at 3× your estimate, the model fits.
Step 4. Look for the hidden clauses: minimum storage durations, fair-use caps on “unlimited” tiers, request charges billed per 10,000 versus per million, and whether intra-region transfer is free.
Step 5. Re-run the calculation at 10× your current size. The pricing model that looks great at 100 GB can become the most expensive one at 10 TB.
When each model fits
- Pick pure usage-based when you are pre-launch, pre-PMF, or serving variable traffic. AWS S3 only if you need its advanced features and are already deep in AWS; otherwise Cloudflare R2 for egress-heavy workloads, Backblaze B2 for storage-heavy, low-egress workloads.
- Pick flat-rate subscription when your storage and bandwidth are steady, your egress is predictable, and you value one line item on your books over optimizing the per-GB rate. Wasabi or Backblaze B2 Reserve fit here.
- Pick tiered storage when you genuinely have cold data — finished video projects, compliance archives, monthly database snapshots older than 90 days — and you are confident you will not need to retrieve it often.
- Consider the Backblaze + Cloudflare combination when you already use Cloudflare as a CDN. Egress from B2 to Cloudflare’s network is free, which gives you B2’s cheap storage with R2-like delivery economics. It is the lowest-cost path for serving static assets at scale, with one caveat: the free path only works while traffic flows through Cloudflare.
The trade-off nobody mentions
Every pricing model is also a lock-in model. Switching providers is technically easy — all the major services speak the S3 API, so a credential and endpoint change is usually enough — but the operational costs add up. Bucket policies, lifecycle rules, CORS settings, IAM roles, and CDN configurations all need to be rebuilt. Build a small migration budget into your decision: even if the new provider is 40% cheaper, a weekend of careful work has a real cost for a solo founder.
FAQ
Is egress really that expensive on AWS S3? Yes. For data-heavy applications, egress can dominate the bill by a factor of five to ten compared to storage costs. That is the main reason R2 and B2 exist.
Does Cloudflare R2 really charge zero egress? Yes — no caps, no fair-use thresholds, no partner-network requirement.
Is the Backblaze + Cloudflare Bandwidth Alliance still free? It has historically been free for traffic from B2 to Cloudflare’s network. Treat any specific clause as worth re-checking on the provider’s pricing page before you commit.
When is S3 still the right choice? When you need advanced features (lifecycle policies across many tiers, Object Lock for compliance, deep integration with the rest of AWS), or when you are already paying AWS for compute and the consolidated billing matters.
Should I optimize storage cost or egress cost first? Egress, almost always. It is the line item that grows the fastest and is the hardest to predict.
The bottom line
For most indie founders in the first year, a usage-based provider like Cloudflare R2 — or Backblaze B2 paired with Cloudflare’s CDN if you need cheaper storage — is the right default. It costs almost nothing at small scale, scales without contract negotiations, and removes the egress line item entirely. Move to flat-rate or tiered storage only when you have real data showing your workload is steady enough to benefit from the trade. Re-estimate every quarter. The provider that is cheapest at launch is rarely the cheapest at 10×.
Sources
- https://trybuildpilot.com/423-cloudflare-r2-vs-aws-s3-vs-backblaze-b2-2026
- https://algeriatech.news/object-storage-price-war-r2-s3-2026
- https://www.wmtips.com/technologies/compare/backblaze-b2-vs-cloudflare-r2
- https://leanopstech.com/blog/cloudflare-r2-pricing-2026
- https://onidel.com/blog/cloudflare-r2-vs-backblaze-b2
- https://www.backblaze.com/cloud-storage/pricing







