Why machine counts stop working
In a small environment, asking each team how many machines they want for the next planning window can feel refreshingly tidy. One spreadsheet, a few estimates, a quick round of email replies, and the capacity planning meeting’s done before anyone’s time to lose patience. For a while, that can even work well enough. People know the systems, the traffic patterns are familiar and the same engineers who ask for capacity usually have a decent feel for what their services need.
That starts to unravel as the org gets bigger.
At scale, a machine count stops being a forecast and turns into a cautious guess with a little costume on. Teams are asked to predict usage months in advance, often with partial information and a healthy respect for being the person who underestimates. So they pad the number. Then they pad it again for the next traffic spike, the next launch, the next “we should probably be safe” conversation. None of that is irrational. It’s just what happens when infrastructure planning is split into many separate requests, each made by a group trying to avoid getting caught short.
A server request usually contains more fear than math, and the fear gets more expensive when everyone adds their own buffer.
That buffer stacking’s where the plan starts to drift. One team asks for ten percent extra. Another adds enough room for a future feature that may or may not ship. A third rounds up because their service had one ugly week in Q2 and nobody wants a repeat. By themselves, those cushions look harmless. Together, they can add a surprising amount of headroom across dozens of services and suddenly the hardware forecast’s more generous than the actual business needs.
The awkward part is that the final number often looks precise. It sits in a spreadsheet with commas, maybe even a tidy chart. But precision and accuracy are not the same thing. A forecast made from many isolated machine counts can look clean while being built on assumptions nobody has written down. How much of the request came from product growth? How much came from expected churn in a service? How much was just a polite way of saying, “please don’t page us later”? Once those answers are buried, the whole plan gets harder to trust.
It also becomes harder to explain. Leadership wants to know why infrastructure spend is rising, and the answer cannot just be, “well, every team asked for a bit more.” That may be true. It is also not a satisfying sentence when you’re trying to connect infrastructure planning to product growth. If the forecast is built from individual machine counts, the business story gets chopped into pieces before anyone can read it. You end up with a total that is expensive, a process that is tedious, and a line back to demand that is faint at best.
There’s a practical problem here too. Machine counts focus attention on the container, not the load inside it. Two teams can both ask for four more servers and mean very different things. One might be preparing for a product launch that could drive steady traffic for the next year. Another might be bracing for a short-lived campaign that’ll peak for a week and fade. The number is the same, but the business logic isn’t. When those distinctions disappear, so does the chance to make a plan that matches real product movement.
That’s why machine counts stop working as organizations grow. They create the illusion of control while quietly absorbing every team’s caution, guesswork and spare room. The result is a capacity plan that costs more than it should, takes too long to untangle and only loosely reflects where the product’s actually headed. The next question, then, is how to get a cleaner input in the first place.

How buffers quietly inflate spend
A team rarely asks for exactly what it needs. That would be tidy, and planning almost never is. Instead, people build in room for the stuff they can see coming and the stuff they can’t. A release might drive a burst of traffic. A quarterly promotion could land harder than expected. A support queue might jump after a product change. So the request turns into, “We need 18 servers,” when the real answer might be 12 for steady load, 3 for a known spike, and 3 because nobody wants to get caught flat-footed on a Friday afternoon.
That extra room makes sense inside one team. If you run the service that gets hammered during billing week, you don’t want to be the person who saved a little compute spend and bought a fire drill instead. The trouble shows up when dozens of teams do the same thing in parallel. Each group adds a modest cushion. Simple as that. Each cushion looks reasonable on its own. Put them together and the organization’s quietly planned for a much larger fleet than actual usage demands.
Buffers feel cautious at the team level, then start acting like a tax at the company level.
This is where machine-count requests get slippery. Once the conversation starts with “how many servers do you want,” the number takes on a false sense of precision. It looks clean enough to paste into a spreadsheet, which is probably why it gets copied around so easily. What gets lost is the reasoning behind it. Was the team planning for a single product launch, a recurring traffic pattern, or a vague fear of future work? Was the extra capacity meant for one week, one quarter, or an optimistic guess about next year? A count by itself doesn’t answer any of that.
That opacity makes server forecasting harder than it first appears. A request for 24 instances might include 8 for baseline traffic, 4 for spike protection, 6 for a new feature no one wants to underfund, and 6 because the team’s been burned before. The spreadsheet sees one number. The budget sees one number. And the people writing the request know it contains four different assumptions, but those assumptions often vanish as soon as the planning meeting ends. By the time the forecast reaches leadership, the shape of the decision’s gone.
Google’s SRE book treats capacity work as part of reliability, not a guessing game, which is a useful reminder that numbers should connect back to behavior, load, and service goals rather than habit alone. The same idea shows up in AWS guidance on sustainability and reducing overprovisioned resources: if you keep buying slack you never use, you pay for it anyway. The bill lands in a few places at once. There’s direct compute spend, of course, but also the softer costs of carrying idle capacity, refreshing hardware too early, and explaining why the forecast keeps outrunning actual demand.
The compound effect is easy to miss because each buffer feels defensible in isolation. One team wants headroom for a launch. Another wants safety for an API rewrite. A third wants extra capacity for “unplanned work,” which is often code for “we don’t have enough detail yet.” None of that is absurd. Real systems do need slack. But when those requests are made separately, nobody is looking across the whole set and asking whether the same uncertainty has been padded three different times.
Predictive scaling tools can reduce some of that guesswork by using historical patterns to add capacity ahead of demand, as AWS describes in its application auto scaling predictive scaling docs. That helps in a narrow technical sense. It still doesn’t solve the bigger planning problem if the inputs are fuzzy. If every team is forecasting from its own comfort level, automation may just help the organization overbuy faster and with nicer charts.
The trickiest part’s that these buffers become hard to trace back to specific product bets or usage changes. A finance lead can see total instances. An ops lead can see cluster size. What they can’t easily see is which new checkout flow, which retention campaign, or which internal tool drove the bump. The causal chain gets thin, once the request’s been reduced to a machine count. You end up debating totals instead of decisions.
That’s why decentralized planning so often creates a forecast that looks orderly on paper and bloated in practice. The numbers don’t scream. They arrive politely, one team at a time, each with its own rationale and a little extra padding for safety. By the end, the organization has a plan that’s expensive to run and awkward to explain. The next step is to stop treating hardware as the starting point and ask what demand’s actually expected to move.
Start with demand, not hardware
When the previous section’s pile of cautious server guesses starts to look silly, the fix is refreshingly unglamorous: stop asking for machine counts first. Ask product teams what they expect to happen over the planning window. Not “how many servers do you want?” but “what growth are you planning for, and where do you expect the load to move?”
That question changes the whole conversation. A product manager can usually talk about sign-ups, order volume, seat growth, traffic shifts, or customer segments with far more confidence than they can talk about CPU reservations. And a support lead might know that a new self-service flow will cut ticket volume in one area while pushing more activity into another service. A developer may know that a feature launch will make one API busier, or that a background job will become much more active once a batch process goes live. Those are demand signals, and they’re messy, yes, but they’re real. Hardware counts often aren’t.
Capacity planning gets cleaner when it starts with what the business expects to do, not with a guess about how many servers that will someday require.
This is where IT planning gets a little less like arm wrestling and a little more like translation. Product teams bring the story of demand. Infrastructure teams turn that story into cloud capacity, storage, network and platform needs. The handoff works best when the questions stay simple and concrete. What products are expected to grow? Which customer segments are likely to move? Which services will see more reads, more writes, more background processing, or more bursts at peak times? If a team expects a launch, a migration, or a seasonal jump, that belongs in the plan before anyone starts tallying instances.
That order matters because services don’t all react the same way. One product might add traffic to a single web tier. Another might shift load into a queue, a cache, or an analytics pipeline. A third might barely move at all, because it’s experimental and only a small slice of users will touch it. If you ask for server counts too early, those differences get flattened into vague numbers. The pressure points show up where they actually live, if you ask about demand first.
The same idea applies to product maturity. A durable product, the one that’s a real customer base and a steady release cadence, deserves a different treatment from a short-lived experiment or a feature that may be cut after two sprints and a grim retrospective. That doesn’t mean experiments get ignored. It just means they shouldn’t pull the same weight in capacity planning as the product lines that are likely to stick around. Otherwise, infrastructure gets sized for projects that may vanish before anyone finishes the deployment notes.
A central translation step helps here. One group can collect the demand assumptions, compare them and turn them into infrastructure requirements in one place. That keeps the view consistent. It also stops every team from inventing its own version of the future. Without that central step, engineering management ends up reconciling three slightly different forecasts, operations gets stuck checking whether two teams counted the same service twice and product gets asked to restate the same growth estimate in three meetings because the numbers changed shape somewhere along the way. Nobody enjoys that. It feels a bit like being asked to re-enter a password because the computer’s feeling philosophical.
The practical benefit is that demand becomes traceable. If a product team expects a 30 percent increase in active customers, the capacity estimate can point back to that assumption. If a service is likely to see heavier write traffic because of a feature rollout, that can be called out directly. If an internal tool is experimental, the plan can treat it accordingly instead of giving it the same infrastructure posture as the revenue line that keeps the lights on. That makes cloud capacity decisions easier to defend later, which matters when finance asks why spend rose and the only answer is “because several teams sounded nervous.”
For teams that already use cloud tooling, this approach fits the way modern capacity planning is supposed to work. Azure’s guidance on capacity planning starts from expected demand and service behavior, which is the right instinct here. AWS says much the same in its Auto Scaling plans documentation, where scaling decisions are tied to predicted need rather than random hope. And for containerized workloads, AWS’s ECS capacity availability best practices are a useful reminder that service placement and capacity strategy should be planned together, not patched in after the fact.
Once product demand becomes the input, the back-and-forth eases up. Engineering spends less time translating server guesses into plain English. Operations spends less time checking whether the assumptions even make sense. Product spends less time defending a number that was never the real question. You still need judgment, because forecasts are forecasts and nobody has a crystal ball tucked into their sprint board. But the discussion gets anchored to actual business movement instead of to a stack of isolated machine requests, which is a much better place to start the next planning pass.
Build a demand-to-capacity planning loop
Once the demand numbers are in, the work shifts from collecting guesses to running a repeatable planning loop. That’s where the whole exercise gets less fuzzy and a lot easier to defend. Instead of asking every team to hand over a server count and hoping the numbers somehow add up, create one translation layer that turns product growth assumptions into the things infrastructure actually consumes: compute, storage, network, queue depth, database headroom and platform services.
That translation layer doesn’t need to be fancy. In many orgs, it can start as a shared planning sheet with a few agreed conversion rules and one owner who keeps the math consistent. If a product team expects 18% growth in active users, the model should show what that means for request volume, cache pressure, storage growth and any managed services tied to the workload. That should flow into the same model too, if another team expects a new feature to drive more background jobs or longer retention. The point isn’t perfect precision. And the point is to stop treating every request as a standalone snowflake.
One shared translation model beats a dozen separate guesses with different safety margins.
Scenario comparison helps here. A base case, a cautious case, and a stretch case tell a much better story than one flat number that pretends the future will behave itself. Leadership can see what happens if growth lands where product expects, what happens if adoption runs hotter and where the expensive surprises sit. Maybe the database upgrade is only needed in the upside case. Maybe object storage grows in every scenario, just at different rates. Maybe a platform service has to move now because the next release will push usage across a threshold. When those differences live in one model, the tradeoffs are visible instead of buried in a pile of team-by-team requests.
That also makes the output easier to read. A good planning loop should produce something a finance lead, a VP of engineering, and an operations manager can all understand without a decoder ring. Show the assumption, the service impact, and the spend. For example, “new checkout traffic adds 12 percent to API requests, which adds one application node in steady state and one more database replica by Q3” is clear enough to discuss. “Team A wants three machines, Team B wants five, and Team C wants a little cushion” is not. The first version connects growth to spend. The second one just asks for a rubber stamp.
Revisit the model on a regular cadence, because product priorities do change. A quarterly review often works well, though faster-moving groups may need a monthly pass on the hottest services. The update doesn’t have to be a grand ceremony. Quick aside. Pull in the latest usage trends, confirm which products are still priority work, adjust the conversion assumptions if the workload shifted and refresh the scenarios. If a feature gets delayed, the capacity plan should loosen. If a launch lands earlier than expected, the plan should catch it before the team starts pleading for emergency hardware like it’s a sitcom season finale.
A loop like this gives you a plan that can survive actual business motion. Product teams can talk in demand, and engineering can talk in workload characteristics. Infrastructure can turn that into concrete capacity needs. Leadership gets one view of how growth turns into spend, and that view can be checked, adjusted, and explained without a week of back-and-forth. The result is a cleaner plan, fewer surprise purchases and less of that awkward moment where everyone realizes the server request was really just a guess with a nicer font.





