The cost surface: everything that bills money
coreintermediateEvery design decision has a line item attached to it, and most of those line items are not the one people think about first. Compute (CPU/RAM-hours) and storage (bytes held over time) are the obvious ones — but bandwidth (bytes leaving a cloud, especially across regions or to the public internet), database IOPS (each read/write operation against provisioned-throughput storage, billed separately from the storage itself), cache memory (an in-memory cache like Redis is billed by RAM provisioned, not by data touched), cross-region traffic (replicating data or calling services across regions multiplies both latency and a per-GB transfer charge) and observability (logs, metrics and traces ingested, indexed and retained, often billed per GB per day) all bill independently, and each one can dominate a bill in a design that looks cheap on compute alone. A system can be "efficient" in the metric an engineer optimized for and still be expensive, because a bill is the sum of every resource, not just the one that was watched.
Think of it as
Think of a cloud bill like a restaurant check that itemizes the meal, the drinks, the corkage fee, the delivery fee and the service charge separately — someone who only looks at the menu price of the meal (compute) is repeatedly surprised by a check that is twice as large, because the drinks (storage), corkage (IOPS), delivery (bandwidth) and service charge (observability) were never on their radar as things that cost anything at all. Cross-region traffic is the equivalent of ordering delivery from a restaurant in another city: the food itself may be identical, but now there is a distance-based fee stacked on top that a same-city order never incurs.
What we're doing: Read one month's bill for a service and attribute each line item back to a design decision.
- 3
- Instances sized for peak and never scaled down off-peak — a compute cost that looks fixed but is really a scaling decision nobody revisited.
- 6
- IOPS is the single largest line item here, larger even than compute, because the "last 7 days" query pattern is hot against a table holding three years of data with no separate hot/cold split.
- 7
- The cache is sized for a once-a-year peak (Black Friday) but billed at that size continuously — 11 months of the year it is paying for headroom nothing is using.
Why this works: Nothing on this bill is a single "cost" line — it is seven independent charges, and the two biggest ones (IOPS and cache memory) are not the ones most engineers would have guessed before reading it. A design review that only asks "how much compute do we need" misses over half of what this service actually costs.
Treating the compute estimate as the whole cost estimate
Wrong
Better
What you see: The pre-launch cost estimate and the first real invoice disagree by 2-3x, and the gap is never in compute — it shows up as a database-IOPS or observability line item nobody modeled, discovered only after finance asks why the bill jumped.
Why: Compute is the resource every engineer already thinks of as "the cost," because it maps directly onto the mental model of "how many servers do I need" — the other six surfaces bill independently and silently, so an estimate that stops at compute is not an incomplete estimate of the same thing, it is an estimate of a different, smaller bill than the one that will actually arrive.
- Compute — CPU/RAM-hours
- Storage — bytes held
- Bandwidth — egress bytes
- DB IOPS — per operation
- Cache memory — RAM provisioned
- Cross-region — per-GB transfer
The seven cost surfaces and the failure mode each one causes when ignored
Remember: A cloud bill is the sum of seven largely independent surfaces — compute, storage, bandwidth, database IOPS, cache memory, cross-region traffic and observability — and the ones people forget (IOPS, cache memory, observability) are frequently larger than the one they remember (compute). Review all seven before calling a cost estimate complete.

