Part II · Chapter 2 · One Service · lesson 3
What one request costs you, in cents
12 min
Part II · Chapter 2 · One Service · lesson 3
12 min
Last month the serving tier cost $5,597. Last month the access log held 304 million requests.
Divide one by the other and you have the number that answers questions like "can we afford to call this on every page load?" — the only form of the cost question an engineer can actually act on.
Guess the figure before you see it. One request, in cents.
Predict
A serving bill is not proportional to traffic. It is a staircase.
You buy capacity in discrete units — a bigger instance, then a bigger one — and inside a step the bill is flat however many requests arrive. So the per-request cost falls as you fill a step and jumps the moment you leave it, and neither movement reflects anything about a request.
Two asymmetries make the staircase steeper than people expect. Each doubling of instance size costs more than twice the one below it, because the biggest shapes carry a premium. And when you run out of vertical room, going sideways adds a coordination cost to the whole bill: a second node needs routing, a shared cache, and a story about which shard a request belongs to.
The result is a bill that is cheap to grow into and expensive to grow out of.
The service holds 20,000 users per base box at $200 a month, with four doublings available before the largest shape runs out and a 25% coordination cost once there is more than one node.
Scale steps
Hypothetical model, not a forecast
Monthly cost against user count, where cost is a staircase: bigger boxes up to a ceiling, then more boxes. Rows sweep the user count, so period is users rather than time.
It assumes
It ignores
Find the point where one box stops being enough. Raise the user count past the largest single box this service can buy, and read what happens to the bill at that instant.
Four doublings means the largest box is sixteen times the base.
| Users served | Monthly cost |
|---|---|
| 0 | 200 |
| 2500 | 200 |
| 5000 | 200 |
| 7500 | 200 |
| 10000 | 200 |
| 12500 | 200 |
| 15000 | 200 |
| 17500 | 200 |
| 20000 | 200 |
| 22500 | 460 |
| 25000 | 460 |
| 27500 | 460 |
| 30000 | 460 |
| 32500 | 460 |
| 35000 | 460 |
| 37500 | 460 |
| 40000 | 460 |
| 42500 | 1,058 |
| 45000 | 1,058 |
| 47500 | 1,058 |
| 50000 | 1,058 |
| 52500 | 1,058 |
| 55000 | 1,058 |
| 57500 | 1,058 |
| 60000 | 1,058 |
| 62500 | 1,058 |
| 65000 | 1,058 |
| 67500 | 1,058 |
| 70000 | 1,058 |
| 72500 | 1,058 |
| 75000 | 1,058 |
| 77500 | 1,058 |
| 80000 | 1,058 |
| 82500 | 2,433 |
| 85000 | 2,433 |
| 87500 | 2,433 |
| 90000 | 2,433 |
| 92500 | 2,433 |
| 95000 | 2,433 |
| 97500 | 2,433 |
| 100000 | 2,433 |
| 102500 | 2,433 |
| 105000 | 2,433 |
| 107500 | 2,433 |
| 110000 | 2,433 |
| 112500 | 2,433 |
| 115000 | 2,433 |
| 117500 | 2,433 |
| 120000 | 2,433 |
| 122500 | 2,433 |
| 125000 | 2,433 |
| 127500 | 2,433 |
| 130000 | 2,433 |
| 132500 | 2,433 |
| 135000 | 2,433 |
| 137500 | 2,433 |
| 140000 | 2,433 |
| 142500 | 2,433 |
| 145000 | 2,433 |
| 147500 | 2,433 |
| 150000 | 2,433 |
| 152500 | 2,433 |
| 155000 | 2,433 |
| 157500 | 2,433 |
| 160000 | 2,433 |
| 162500 | 5,597 |
| 165000 | 5,597 |
| 167500 | 5,597 |
| 170000 | 5,597 |
| 172500 | 5,597 |
| 175000 | 5,597 |
| 177500 | 5,597 |
| 180000 | 5,597 |
| 182500 | 5,597 |
| 185000 | 5,597 |
| 187500 | 5,597 |
| 190000 | 5,597 |
| 192500 | 5,597 |
| 195000 | 5,597 |
| 197500 | 5,597 |
| 200000 | 5,597 |
| 202500 | 5,597 |
| 205000 | 5,597 |
| 207500 | 5,597 |
| 210000 | 5,597 |
| 212500 | 5,597 |
| 215000 | 5,597 |
| 217500 | 5,597 |
| 220000 | 5,597 |
| 222500 | 5,597 |
| 225000 | 5,597 |
| 227500 | 5,597 |
| 230000 | 5,597 |
| 232500 | 5,597 |
| 235000 | 5,597 |
| 237500 | 5,597 |
| 240000 | 5,597 |
| 242500 | 5,597 |
| 245000 | 5,597 |
| 247500 | 5,597 |
| 250000 | 5,597 |
Not there yet — keep moving the controls.
At 250,000 users the bill is $5,597 a month on one node, which is sixteen base units of capacity. That tier covers 320,000 users, so there are 70,000 users of headroom. Those users are free: the bill does not move until the last one of them arrives.
Then it does. One user past 320,000 the bill is $13,992 — two of the largest box, plus the coordination cost on the whole total. The bill multiplies by 2.5 and nothing about a request changed. Per request, the cost goes from about two thousandths of a cent to about three and a half thousandths, on a day when no code was deployed.
Divide the whole bill, not the compute line. The per-request figure is only honest if its numerator includes everything: instances, the managed database, load balancers, egress, and log and metric ingestion. Compute is usually not the largest of those, which is the surprise.
Check observability and egress before assuming compute is the big line. Log and trace ingestion is priced per gigabyte — Datadog, New Relic and CloudWatch Logs all bill this way as of late 2026 — which means it grows with request volume exactly as compute does, and on a chatty service it can rival the compute line. How large a share it actually is depends entirely on how much you emit per request, so the number to trust is the one on your own invoice rather than any figure quoted here. Sampling traces at a low rate for successful requests and keeping everything for errors is the largest cost lever most teams have never pulled.
Then compute a second figure: the cost of your most expensive request class. The average hides everything. A CSV export that scans a year of rows can cost a thousand times a note fetch, and it is the only request on the service where the per-request cost is worth engineering against. Tag it in the load balancer logs, count it separately, and price it on its own.
Tag resources before you need to. Cost allocation tags on every resource, applied from the day it is created, are the difference between a per-service figure and an afternoon of guesswork. Retrofitting them across an existing account is miserable and nobody ever finishes.
Check
The condition is worth stating sharply: the number is meaningless when fixed costs dominate it.
Put 1,000 users on this service and the bill is $200 a month, because $200 is what one box costs and one box is the smallest thing you can buy. That is about 1.2 million requests, so roughly 0.016 cents each — ten times the figure at 250,000 users, and a figure that is about how empty the box is rather than about anything in your code. Divide a mostly-fixed bill by a small number and you measure your own emptiness.
Which cuts the other way too, and is the useful half: between here and the ceiling, growth is nearly free. The 70,000 users of headroom in that tier cost nothing, and the discipline is to notice when they are gone rather than to worry about the cost of a request.
The 25% in the model is the part you can see on a bill. The part you cannot is larger.
Crossing from one node to several means something now has to decide which node a request belongs to. That is a routing key, a rebalancing story, a cache that is no longer one cache, and a class of bug — a request that lands on the node without the data — that did not previously exist. It also means the single-process assumptions in your code quietly become false: an in-memory rate limiter now limits per node, a scheduled job now runs several times.
None of that is in any price list, and it typically costs weeks. Which is the strongest argument for the unglamorous move: take the next vertical step while one remains, and spend the time you save working out whether you will ever need the horizontal one.