How a performance budget is set
The last post argued against fixed thresholds and this one is about the place they belong. A regression is a relative question — is this worse than it was? A budget is an absolute one — is this acceptable at all? Both are worth asking and they are not the same question.
Key takeaways
- Budget bytes and requests, which you control, rather than seconds, which you influence.
- A budget is per page, because a pricing page and an interactive tool are not comparable.
- Breaching a budget is a monthly conversation, not an alarm and never a gate.
- Set the initial budget from where the page is now, plus a little.
- A page that has been over budget for six months has a wrong budget or a real problem.
Bytes, not seconds
Seconds depend on the device, the network, the CDN’s mood and three other companies. Bytes and request counts depend on what you shipped. Budgeting the second kind gives you a number that is stable, attributable, and actionable by the person who caused it.
| Budget | Typical for a content page | Why this one |
|---|---|---|
| Total transferred | 800 KB | The single best proxy for how a page feels on a phone |
| JavaScript | 180 KB | The most expensive bytes; parsing costs more than downloading |
| Images | 400 KB | The easiest to blow accidentally through a CMS |
| Fonts | 100 KB | Two weights, subset. Four weights is a decision. |
| Requests | 45 | Catches the thing byte budgets miss: dozens of tiny files |
| Third-party bytes | 150 KB | Separated, because it is somebody else’s decision |
Separating third-party bytes is the row that produces the most useful conversations. A page that is over its total budget entirely because of a chat widget is not an engineering problem, and presenting it as one wastes everybody’s time.
Setting the first one
- Machine learning
- Analytics
- Front-end & mobile
- People
Current plus ten per cent
A budget set at an aspirational number is breached from the moment it is created, which makes it useless: everything is over budget, so being over budget carries no information. A budget set slightly above where the page actually is tells you the moment something meaningfully changes, which is what a budget is for.
If the current state is genuinely unacceptable, setting the budget below it is a legitimate choice — but then it is a stated intention with a person attached, recorded as such, rather than a permanent red mark that everybody stops seeing.
What a breach does
- Management
- Analytics
- People
The temptation to gate is strong and the reasoning is sound — a budget you can exceed freely is not much of a budget. In practice, gating produces one of two outcomes: the budget is set loose enough to never fire, or it fires on a legitimate change at a bad moment and somebody adds a way to skip it. Neither is better than a monthly conversation with the numbers in front of it.
A permanently breached budget
A page that has been over budget every day for six months is telling you something, and it is one of two things: the budget was wrong, or there is a real problem nobody has prioritised. Both are worth resolving, and the resolution is either an edit or a piece of work — not another six months of a red row.
The quarterly review exists mostly to force that: any budget breached in more than half the runs of a quarter is raised explicitly with the question of which of the two it is.
Next: what the report says.
All posts