A cloud storage bill rarely surprises you because of the storage itself. It surprises you because of everything else: the egress you pay every time you pull data out, the requests counted by the million, the penalties for deleting too early, and the forgotten gigabytes no one audits. In this guide we break down where the money really goes when reducing cloud storage costs and which concrete levers actually move the needle, with examples, real commands, and a complete monthly calculation.
Where the money really goes
The price per TB stored is the easy part to compare and, paradoxically, almost never where the bill balloons. Before optimizing anything, it's worth understanding the five line items that really throw an object storage budget off.
1. Egress and outbound transfer
On most hyperscalers, pulling data out costs several times what storing it for a month does. A full restore, an analytics pipeline that re-reads your bucket every night, or a misconfigured CDN can generate tens of TB of transfer. At €0.09/GB — a typical internet-egress rate at a major provider — moving 20 TB in a restore is more than €1,800 in a single operation, above what you'd pay to store that data for months.
Egress is treacherous because it doesn't show up until something happens: a migration, an incident, or an architecture change. Audit how many GB of outbound transfer you generate per month and where they go. If you restore backups often, egress can be your biggest hidden cost.
2. Request cost (PUT, GET, LIST)
Each operation against the S3 API can be billed separately. Workloads with many small files — logs, thumbnails, incremental backups, rclone syncs — generate millions of operations. A recursive LIST over a bucket with hundreds of thousands of objects, run on every deployment, adds up requests at a surprising rate. When the provider charges for every PUT, GET, and LIST, datasets with many small objects penalize far more than the space they occupy.
3. Cold-class retrieval
Deep-archive classes (Glacier-style) have a very low price per TB, but they hide two costs: the per-GB retrieval fee and the latency of hours until the data is available. If you need to restore quickly or restore often, the nominal savings evaporate. A cold class only pays off for data you truly almost never touch and whose retrieval you can plan.
4. Minimum retention
Many cold storage plans apply a billable minimum retention of 30, 60, or 90 days. If you upload an object and delete it a week later, you still pay for the full period. For data with rapid rotation — temporary files, caches, builds — that early-deletion penalty can double the real cost versus the advertised price.
5. Duplicate copies
The most common and least-watched source of overspend: redundant copies no one has counted. The same dataset replicated across three regions "just in case," snapshots that never expire, old versions piled up by versioning, daily full backups when incrementals would do. Multiplying copies multiplies the bill linearly, and there's almost always a copy or two that adds nothing.
Strategies to cut the bill
With the cost map clear, these are the levers that generate the most savings per unit of effort.
Automate lifecycle and expiration
Lifecycle rules are the most underrated cost-saving tool. They let you automatically expire temporary data, clean up noncurrent versions, and abort incomplete multipart uploads that take up phantom space. A well-defined policy works on its own and keeps junk from piling up for months.
{
"Rules": [
{
"ID": "expira-temporales",
"Filter": { "Prefix": "tmp/" },
"Status": "Enabled",
"Expiration": { "Days": 30 }
},
{
"ID": "limpia-versiones-antiguas",
"Filter": { "Prefix": "" },
"Status": "Enabled",
"NoncurrentVersionExpiration": { "NoncurrentDays": 90 },
"AbortIncompleteMultipartUpload": { "DaysAfterInitiation": 7 }
}
]
}
Apply it with the AWS CLI pointing at the OtterStorage endpoint:
aws s3api put-bucket-lifecycle-configuration \
--endpoint-url https://es-mad-1.s3.otterstorage.io \
--bucket backups-produccion \
--lifecycle-configuration file://lifecycle.json
You'll find the full detail on filters, prefixes, and expirations in the lifecycle rules guide.
Choose disk technology by data type
Not everything deserves the fastest disk. Instead of opaque "classes" with retrieval fees, OtterStorage lets you choose the technology directly based on the performance each piece of data needs:
- HDD at €8/TB per month: backups, cold archives, long-retention copies, data you rarely re-read.
- SSD at €16/TB per month: hot, frequently accessed data, assets served to users, working datasets.
- NVMe at €45/TB per month: workloads that demand maximum read speed, indexes, low-latency data.
Paying €8/TB for what you barely touch and reserving SSD or NVMe for what truly deserves it is the simplest, highest-impact lever. Since there's no retrieval fee or archive latency, moving something to HDD doesn't punish you when you need to read it. Check the details on the pricing page.
Deduplicate before uploading
Deduplication at the source keeps you from paying to store the same block a thousand times. Tools like Restic chunk the data, compute hashes, and only upload new blocks: two consecutive backups of a machine that has barely changed take up almost the same space as one. Applied to server fleets or daily backups, deduplication can cut the billed space by 60% to 90%.
export RESTIC_REPOSITORY="s3:https://es-mad-1.s3.otterstorage.io/backups-produccion"
export AWS_ACCESS_KEY_ID="AKIAOTTER..."
export AWS_SECRET_ACCESS_KEY="..."
restic backup /var/lib/postgresql --tag diario
restic forget --keep-daily 7 --keep-weekly 4 --keep-monthly 6 --prune
The forget --prune is key: it removes old snapshots and truly frees the blocks no snapshot references anymore.
Avoid deletion penalties
Before moving rapidly rotating data to a cold class, check the minimum retention. With a provider that has a 90-day minimum, deleting at day 10 still costs all 90. The practical rule: cold class is for data that will live longer than its minimum retention period; for everything else, a flat HDD with no penalties works out cheaper. In OtterStorage there's no deletion charge or minimum retention, so deleting early is never penalized.
Watch versioning and phantom deletions
With versioning active, deleting an object doesn't free space: it creates a delete marker and keeps all previous versions, which still count toward the bill. Without a NoncurrentVersionExpiration rule, a versioned bucket grows indefinitely even as you "delete" things. The same goes for Object Lock: an object retained in Compliance mode can't be deleted until it expires, so size your retention periods well to avoid paying for immutability you no longer need.
Cost-model comparison
The price per TB tells only part of the story. What separates a predictable bill from a surprise is what's charged on top of storage. This table sums up the cost models of the main S3-compatible object storage providers.
| Provider | Storage | Egress | Requests | Deletion charge / minimum retention |
|---|---|---|---|---|
| AWS S3 (Standard) | ~€21/TB | Paid per GB | Paid (PUT/GET/LIST) | Minimum on cold classes |
| Cloudflare R2 | ~€14/TB | No charge | Paid (Class A/B) | No |
| Wasabi | Flat rate ~€6.5/TB | Included (with usage limits) | No charge | 90-day minimum retention |
| Backblaze B2 | ~€5.5/TB | Paid above a free allowance | Paid (Class B/C) | No |
| OtterStorage | HDD €8 · SSD €16 · NVMe €45/TB | By plan | No charge | No deletion charge or minimum retention |
Third-party figures are approximate and vary by region and plan; always check them on the provider's site. The relevant point is the model: with OtterStorage, requests and deletions aren't billed, there's no minimum retention, and there's no penalty for moving data to HDD. That wipes out three of the five line items that throw bills off in one stroke, and with a 15% discount on annual payment and no commitment.
Sample monthly calculation
Let's take a realistic case: a company with 10 TB of hot data served to users and 40 TB of backups on long retention. It generates about 50 million requests a month (many small files) and deletes and rotates data frequently.
With a model that charges for requests and penalizes deletions
- 10 TB hot in a standard class: ~€210
- 40 TB in a cold class with retrieval: ~€200 + retrieval fees when restoring
- 50M requests: ~€150-250 depending on the PUT/GET/LIST split
- Early-deletion penalties on rotated data: variable, often hundreds of €
- Egress from the month's restores: the wildcard that blows up the bill
The real total easily exceeds €700-900/month, and that's without a large restore in the mix.
With OtterStorage
- 10 TB on SSD (hot data): 10 × €16 = €160
- 40 TB on HDD (backups): 40 × €8 = €320
- 50M requests: €0
- Deletions and data rotation: €0, no minimum retention
Total: €480/month. With the 15% annual discount, it comes to the equivalent of €408/month. And, above all, it's a predictable figure: no surprises from a restore, a recursive LIST, or a script that deletes too early. The difference from the first scenario lies not so much in the price per TB as in everything that isn't billed.
A six-step action plan
- Measure before optimizing: use per-bucket metrics to see what's growing and what no one touches.
- Apply lifecycle to expire temporary files, old versions, and incomplete multipart uploads.
- Classify by disk: HDD for cold, SSD for hot, NVMe only where latency rules.
- Deduplicate at the source with Restic or another hash-based block tool.
- Count your copies and remove the redundancy that adds no recovery value.
- Choose a model without surprises: no request charges, no deletion penalty, no minimum retention.
If you're coming from another provider, OtterBridge makes assisted migration easy without stopping your backups, and you can lock down the immutability of your backups with OtterVault. The golden rule stays simple: cheap storage + egress and requests without surprises + automatic lifecycle = a predictable bill.
Frequently asked questions
Which line item inflates a cloud storage bill the most? +
Is moving data to a cold class always worth it? +
Does OtterStorage charge for requests or for deleting objects? +
— The OtterStorage Team