The Per-GB Price Is a Lie
Every object storage comparison starts with the same number: price per GB per month. AWS S3 Standard is $0.023/GB. Wasabi is $0.0069/GB. Cloudflare R2 is $0.015/GB. Backblaze B2 is $0.006/GB.
Based on those numbers alone, Backblaze B2 looks like the obvious winner. It is 74% cheaper than S3.
But here is what actually happens when a SaaS company moves 50TB to Backblaze B2 expecting to save thousands: their first bill includes API request charges they did not budget for, retrieval fees they did not know existed, and data transfer costs that are only free if they route through Cloudflare. The "cheapest" option is suddenly not cheap at all.
Per-GB pricing is the least useful number in an object storage comparison. What matters is the fully-loaded cost: storage + egress + API requests + retrieval fees + minimum storage duration charges. And that equation looks completely different depending on how your SaaS application actually uses storage.
This guide will give you the real numbers at real SaaS scale, the hidden fees each provider buries in their pricing page, and the exact architecture strategies that cut object storage costs by 35-60%.
The 6 Cost Components Nobody Compares Properly
Most storage comparisons show a table with per-GB pricing and call it a day. That covers maybe 30-40% of your actual storage bill. Here are all six components you need to model:
1. Storage Price (The Obvious One)
What you pay per GB per month just to keep data stored.
| Provider | Standard Storage (per GB/month) | 50TB Monthly Cost | 100TB Monthly Cost |
|---|---|---|---|
| AWS S3 Standard | $0.023 | $1,150 | $2,300 |
| AWS S3 Infrequent Access | $0.0125 | $625 | $1,250 |
| GCP Cloud Storage Standard | $0.020 | $1,000 | $2,000 |
| Azure Blob Hot | $0.018 | $900 | $1,800 |
| Cloudflare R2 | $0.015 | $750 | $1,500 |
| Wasabi | $0.0069 | $345 | $690 |
| Backblaze B2 | $0.006 | $300 | $600 |
At this point, Backblaze and Wasabi look like clear winners. But keep reading.
2. Egress (Data Transfer Out)
This is the cost that flips the comparison upside down for high-traffic SaaS applications. Every time a user downloads a file, views an image, streams a video, or your application reads data from storage, you pay egress.
| Provider | Egress per GB | 5TB Egress/Month | 20TB Egress/Month |
|---|---|---|---|
| AWS S3 | $0.09 (first 10TB) | $450 | $1,700 |
| GCP Cloud Storage | $0.12 (first 1TB), $0.11 thereafter | $530 | $2,120 |
| Azure Blob | $0.087 (first 10TB) | $435 | $1,540 |
| Cloudflare R2 | $0.00 | $0 | $0 |
| Wasabi | $0.00 (with conditions*) | $0 | $0 |
| Backblaze B2 | $0.01 (or free via Cloudflare) | $50 (or $0) | $200 (or $0) |
*Wasabi's "free egress" has a catch: if your monthly egress exceeds your total stored data, they can charge or throttle you. A 50TB account downloading 60TB/month would trigger this. For most SaaS use cases, you will stay within the limit.
The impact at SaaS scale: A SaaS platform storing 50TB on S3 with 10TB/month egress pays $1,150 (storage) + $900 (egress) = $2,050/month. The same data on R2 costs $750 (storage) + $0 (egress) = $750/month. That is $1,300/month saved, or $15,600/year, just by switching providers for a single workload.
3. API Request Charges
Every PUT, GET, LIST, and DELETE operation costs money. Most providers bury these in their pricing page, and most comparisons ignore them entirely.
| Provider | PUT/POST (per 1,000) | GET (per 1,000) | LIST (per 1,000) |
|---|---|---|---|
| AWS S3 Standard | $0.005 | $0.0004 | $0.005 |
| GCP Cloud Storage | $0.005 | $0.0004 | $0.005 |
| Azure Blob Hot | $0.0065 | $0.0004 | $0.0065 |
| Cloudflare R2 | $0.0045 | $0.00036 | $0.0045 |
| Wasabi | Included | Included | Included |
| Backblaze B2 | Free (Class B) | $0.004 (Class C) | $0.004 (Class C) |
For low-traffic storage (backups, archives), API costs are negligible. For SaaS applications with millions of small object reads per day, they add up fast.
SaaS example: An application serving 50 million image thumbnails per month (small objects, GET-heavy). API costs alone: S3 = $20/month, R2 = $18/month, Wasabi = $0/month, Backblaze B2 = $200/month. Backblaze, the "cheapest" per-GB provider, has the highest API costs for read-heavy workloads.
4. Minimum Storage Duration
This is the fee that catches teams who use object storage for temporary data.
| Provider | Standard Tier Min Duration | Infrequent Access Min Duration | Archive Min Duration |
|---|---|---|---|
| AWS S3 | None | 30 days | 90-180 days |
| GCP Cloud Storage | None | 30 days | 365 days |
| Azure Blob | None | 30 days | 180 days |
| Cloudflare R2 | None | None (no tiers) | N/A |
| Wasabi | 90 days on all data | N/A | N/A |
| Backblaze B2 | None | None | N/A |
The Wasabi trap: Wasabi charges a 90-day minimum storage duration on all data. If you upload 10TB of temporary files and delete them after 7 days, you still pay for 90 days of storage. For SaaS applications that use object storage for temporary uploads, processing queues, or short-lived caches, this effectively triples the per-GB cost.
5. Retrieval Fees
Retrieving data from cold or archive tiers costs money beyond just the egress. This trips up teams that aggressively tier data to save on storage costs.
| Tier | AWS Retrieval Fee | GCP Retrieval Fee | Azure Retrieval Fee |
|---|---|---|---|
| Standard | $0 | $0 | $0 |
| Infrequent Access | $0.01/GB | $0.01/GB | $0.01/GB |
| Glacier Instant | $0.03/GB | N/A | N/A |
| Glacier Flexible | $0.03-10/GB (speed dependent) | $0.05/GB (Coldline) | $0.02/GB |
| Deep Archive | $0.02/GB + 12hr wait | $0.05/GB + hours wait | $0.02/GB |
A SaaS platform that tiers 80TB to Glacier Instant Retrieval ($0.004/GB/month storage) but retrieves 5TB per month pays: $320 storage + $150 retrieval + $450 egress = $920/month. The "cheap" archive tier is not so cheap when you access it regularly.
6. Cross-Region Replication
If your SaaS serves users globally, you need data in multiple regions. Replication costs include both the storage in the secondary region and the transfer to get it there.
| Provider | Replication Transfer Cost | Secondary Region Storage |
|---|---|---|
| AWS S3 | $0.02/GB (S3 Replication) | Same as primary region |
| GCP | $0.01-0.08/GB (depending on regions) | Same as primary region |
| Azure | $0.02/GB (GRS included in some tiers) | Included in GRS/RA-GRS pricing |
| R2 | Not yet available natively | N/A |
| Wasabi | Included (11 regions) | Same price all regions |
The Real Cost at SaaS Scale: 5 Scenarios
Let me model five common SaaS storage patterns with their fully-loaded costs. These are the numbers you should compare, not per-GB pricing.
Scenario 1: User File Storage (High Egress)
A SaaS platform where users upload and download files. 50TB stored, 15TB egress/month, 30M GET requests/month, 5M PUT requests/month.
| Provider | Storage | Egress | API Calls | Total/Month |
|---|---|---|---|---|
| AWS S3 Standard | $1,150 | $1,300 | $37 | $2,487 |
| GCP Standard | $1,000 | $1,590 | $32 | $2,622 |
| Azure Blob Hot | $900 | $1,170 | $49 | $2,119 |
| Cloudflare R2 | $750 | $0 | $36 | $786 |
| Wasabi | $345 | $0 | $0 | $345 |
| Backblaze B2 | $300 | $0 (via CF) | $120 | $420 |
Winner: Wasabi ($345/month), as long as egress stays below stored data volume. R2 wins if you need truly unlimited egress with no conditions.
Scenario 2: Media/CDN Origin (Very High Egress)
A SaaS platform serving images, videos, or documents through a CDN. 20TB stored, 100TB egress/month (CDN pulls from origin), 200M GET requests/month.
| Provider | Storage | Egress | API Calls | Total/Month |
|---|---|---|---|---|
| AWS S3 + CloudFront | $460 | $8,500 | $80 | $9,040 |
| Cloudflare R2 | $300 | $0 | $72 | $372 |
| Backblaze B2 + CF | $120 | $0 | $800 | $920 |
Winner: R2 by a landslide ($372 vs. $9,040). For CDN-origin workloads, egress-free providers save 90%+. This is why so many SaaS companies are migrating their static asset serving to R2.
Scenario 3: Application Logs and Analytics (Write-Heavy, Low Egress)
Collecting application logs and event data. 100TB stored (growing 10TB/month), 500GB egress/month, 100M PUT requests/month, 10M GET requests/month.
| Provider | Storage | Egress | API Calls | Total/Month |
|---|---|---|---|---|
| AWS S3 Standard | $2,300 | $45 | $504 | $2,849 |
| AWS S3 Intelligent-Tiering | $1,400-2,300 | $45 | $504 + monitoring | $2,000-2,900 |
| Wasabi | $690 | $0 | $0 | $690 |
| Backblaze B2 | $600 | $5 | Free (PUT) + $40 (GET) | $645 |
Winner: Backblaze B2 ($645/month) for write-heavy, low-egress workloads. But consider that log data has a lifecycle. Using S3 Intelligent-Tiering or lifecycle policies to move older logs to Glacier can bring AWS costs close to the alternatives while keeping the full AWS ecosystem integration.
Scenario 4: AI/ML Training Data (Large Volume, Burst Reads)
Training data for ML models. 200TB stored, 50TB egress/month during training (burst), negligible egress otherwise. 500M GET requests during training month.
| Provider | Storage | Egress (training month) | API Calls | Total/Month (training) |
|---|---|---|---|---|
| AWS S3 Standard | $4,600 | $4,250 | $200 | $9,050 |
| GCP Cloud Storage | $4,000 | $5,350 | $200 | $9,550 |
| Cloudflare R2 | $3,000 | $0 | $180 | $3,180 |
| Wasabi | $1,380 | $0* | $0 | $1,380 |
*Wasabi egress limit alert: 50TB egress on 200TB stored is within the policy (egress < stored), so it stays free. Barely.
Winner: Wasabi ($1,380/month) for AI training data, but R2 is safer for workloads where egress might exceed stored data during training bursts.
Scenario 5: Multi-Region SaaS with Global Users
A SaaS platform serving users in US, EU, and Asia. 30TB stored, replicated to 3 regions. 10TB egress/month per region.
| Provider | Storage (3 regions) | Replication | Egress (30TB total) | Total/Month |
|---|---|---|---|---|
| AWS S3 (3 regions) | $2,070 | $600 (initial) | $2,550 | $5,220 |
| Azure Blob RA-GRS | $1,620 | Included | $2,610 | $4,230 |
| Wasabi (3 regions) | $621 | Included | $0 | $621 |
| R2 (single region + CDN) | $450 | N/A | $0 | $450 |
Winner: R2 at $450/month if you can use Cloudflare's edge cache instead of true multi-region replication. Wasabi at $621/month if you need data actually stored in multiple regions.
The SaaS Storage Architecture Playbook
Based on these numbers, here is how to architect your object storage for maximum savings:
Strategy 1: Split Storage by Access Pattern
Do not put everything in one bucket on one provider. Separate your data by how it is accessed:
- Hot data (user-facing files, CDN origin): Cloudflare R2. Zero egress makes it the clear winner for anything users download. Pair with Cloudflare CDN for global delivery.
- Warm data (application data, moderate access): AWS S3 or GCP Cloud Storage with Intelligent-Tiering enabled. The AWS/GCP ecosystem integration is worth the premium for data your application actively processes.
- Cold data (logs, backups, archives): Wasabi or Backblaze B2. Low per-GB price wins when egress is rare. For deeper cold storage, S3 Glacier Deep Archive at $0.00099/GB ($1/TB/month) is unbeatable for data you rarely retrieve.
Strategy 2: Use a CDN to Eliminate Origin Egress
If your application serves files to end users, put a CDN in front of your object storage. The CDN caches files at edge locations and reduces origin fetches by 80-95%.
The math: 100TB/month egress from S3 costs $8,500. Route it through CloudFront and 90% is served from cache, reducing origin egress to 10TB ($850). CloudFront data transfer is $850 at that volume. Total: $1,700 vs. $8,500 direct. Or use Cloudflare (free CDN tier with R2 integration) and pay $0 egress.
For SaaS applications where files are accessed repeatedly (profile images, shared documents, product media), CDN cache hit rates above 90% are common.
Strategy 3: Implement Lifecycle Policies Automatically
Do not manually manage storage tiers. Automate transitions based on access patterns:
Day 0-30: Standard storage (frequently accessed)
Day 30-90: Infrequent Access (46% cheaper than Standard on S3)
Day 90-365: Glacier Instant Retrieval (83% cheaper)
Day 365+: Glacier Deep Archive (96% cheaper)
Or enable S3 Intelligent-Tiering and let AWS optimize automatically. The monitoring fee is $0.0025 per 1,000 objects, which pays for itself if even 20% of your data transitions to a cheaper tier.
For a deep dive into storage tier pricing, read our cloud storage pricing comparison.
Strategy 4: Compress Before Storing
This sounds basic, but the number of SaaS applications storing uncompressed JSON, CSV, and log data is staggering.
- gzip compression on JSON/text data: 70-90% size reduction
- Parquet format for analytics data: 75%+ reduction vs. raw CSV
- WebP for images: 25-35% smaller than JPEG at equivalent quality
- Modern video codecs (H.265/AV1): 30-50% smaller than H.264
Compressing 100TB of log data to 15TB saves $1,955/month on S3 Standard. That is $23,460/year from a one-time pipeline change.
Strategy 5: Monitor and Alert on Storage Growth
Storage costs creep up slowly because data accumulates continuously. Set up monitoring to catch runaway growth:
- Track total storage per bucket weekly
- Alert when month-over-month growth exceeds 20%
- Audit the largest buckets quarterly for data that should be archived or deleted
- Use AWS Cost Explorer S3 lens or equivalent for storage-specific cost visibility
For comprehensive cost monitoring across your entire cloud stack, read our guide on real-time cloud cost optimization.
Provider Selection Guide for SaaS
Use this decision matrix to pick the right provider for each workload:
| Your Situation | Best Provider | Why |
|---|---|---|
| User file downloads (high egress) | Cloudflare R2 | Zero egress, decent per-GB price |
| CDN origin / static assets | Cloudflare R2 | Zero egress + native CDN integration |
| Application data (needs AWS/GCP ecosystem) | S3 or GCS with Intelligent-Tiering | Best integration, lifecycle automation |
| Backups with rare retrieval | Wasabi or Backblaze B2 | Lowest per-GB, egress is rare |
| Long-term archive (years) | S3 Glacier Deep Archive | $0.00099/GB, unbeatable for cold storage |
| AI/ML training data | Wasabi (if egress < stored) or R2 | Low cost + burst reads during training |
| Multi-region with global users | R2 + Cloudflare CDN or Wasabi multi-region | Zero/low egress across regions |
| Regulatory compliance requiring specific regions | AWS/GCP/Azure | Broadest region coverage, compliance certs |
5 Object Storage Mistakes SaaS Companies Make
Mistake 1: Choosing a Provider Based on Per-GB Price Alone
You now know why this does not work. A provider that is 70% cheaper per GB can be 300% more expensive when you factor in egress, API calls, and retrieval fees. Always model the fully-loaded cost for your specific access patterns.
Mistake 2: Storing Everything in Standard Tier
If data has not been accessed in 30 days, it does not belong in Standard storage. Enable lifecycle policies or Intelligent-Tiering on every bucket. The amount of money SaaS companies waste by storing three-year-old log data in S3 Standard ($23/TB/month) instead of Glacier Deep Archive ($1/TB/month) is genuinely painful to see.
Mistake 3: Ignoring Small Object Overhead
Object storage is optimized for objects larger than 128KB. Storing millions of tiny objects (thumbnails, metadata files, session data) is significantly less cost-efficient due to API request charges and per-object overhead. For small objects accessed frequently, consider consolidating them into archives or using a different storage system (Redis, DynamoDB) entirely.
Mistake 4: Not Using Multipart Upload for Large Files
Uploading files larger than 100MB as single objects risks timeout failures and requires re-uploading the entire file. Multipart upload splits large files into parts, uploads them in parallel, and retries only failed parts. It is faster, more reliable, and costs the same. Every SaaS application handling user uploads should use multipart upload for files above 50-100MB.
Mistake 5: Not Setting Up Cross-Region Replication Properly
If your SaaS has users in multiple continents but stores all data in us-east-1, every request from Europe and Asia incurs cross-region latency and egress fees. Either replicate data to regional buckets or use a CDN with long cache TTLs. The replication cost is almost always less than the egress cost of serving from a single region.
Frequently Asked Questions
What is the cheapest object storage for SaaS in 2026?
It depends entirely on your egress pattern. For high-egress workloads (user downloads, CDN origin), Cloudflare R2 is the cheapest because egress is free. For low-egress workloads (backups, archives), Backblaze B2 at $0.006/GB is the cheapest per-GB. For mixed workloads, Wasabi at $0.0069/GB with included egress (up to stored volume) offers the best balance. There is no single cheapest option.
Should I migrate from S3 to Cloudflare R2?
If egress is a significant portion of your S3 bill (check your cost breakdown), R2 can save 50-90%. R2 is S3-compatible, so migration is straightforward. The tradeoffs: R2 has no lifecycle policies (yet), no native cross-region replication, and fewer integrations than S3. For user-facing file storage and CDN origin, R2 is an easy win. For application data tightly integrated with AWS services (Lambda triggers, Athena queries, EMR), stay on S3.
How much does object storage egress actually cost at scale?
At 10TB/month egress: S3 costs $900, GCS costs $1,070, Azure costs $870, R2 costs $0, Wasabi costs $0. At 50TB/month: S3 costs $4,250, GCS costs $5,350, Azure costs $3,870, R2 costs $0. Egress is the single largest hidden cost for SaaS applications with high read traffic. It often exceeds storage costs by 2-5x.
Is Wasabi reliable enough for production SaaS data?
Wasabi provides 99.999999999% (11 nines) durability, same as S3. Availability is 99.99% for their standard tier. They operate 11 regions globally. For most SaaS use cases, Wasabi is production-ready. The main limitations are: no lifecycle tiering (everything is one tier), the 90-day minimum storage charge, and the egress policy that limits free egress to your stored data volume.
How do I reduce S3 costs without switching providers?
Four quick wins: (1) Enable S3 Intelligent-Tiering on all buckets to automatically move data to cheaper tiers. (2) Set lifecycle policies to move data to Glacier after 90 days. (3) Use S3 Storage Lens to identify buckets with inefficient access patterns. (4) Put a CDN in front of user-facing buckets to reduce origin egress. These changes typically save 30-50% with no application code changes.
What object storage architecture do you recommend for a growing SaaS?
Use R2 for user-facing file storage (zero egress), S3 with Intelligent-Tiering for application data (ecosystem integration), and Glacier Deep Archive for long-term backups and compliance data. Put Cloudflare CDN in front of everything user-facing. This split typically costs 40-60% less than putting everything on S3 Standard while maintaining the AWS integration where you need it. For a comprehensive cloud cost strategy, explore our FinOps services.
Start Saving on Object Storage This Week
Look at your last month's storage bill. Break it into three numbers: storage cost, egress cost, and API request cost. If egress is more than 30% of your total, you have an immediate optimization opportunity.
Move your highest-egress buckets to Cloudflare R2. Enable Intelligent-Tiering or lifecycle policies on everything else. Set up a CDN for user-facing content. Those three actions typically cut total object storage costs by 35-55%.
For help redesigning your storage architecture across providers, reach out to our team. We help SaaS companies build storage strategies that scale without surprise bills. And for broader cloud cost optimization beyond storage, explore our cloud operations services and migration planning.
Because your object storage bill should grow with your data, not with your egress.