A project without a performance budget gets slower
When we write Core Web Vitals targets into the contract, performance becomes a completion criterion.
Without an agreed number, performance becomes a value everyone defends and nobody owns. The team says it wants a fast product; ask how fast, and there is no shared answer.
The simplest way to solve that is to write the targets into the project's acceptance criteria. We set the thresholds during discovery and include them in the delivery terms.
Our default targets
- LCP (largest contentful paint): under 2.5 seconds
- INP (interaction to next paint): under 200 milliseconds
- CLS (cumulative layout shift): under 0.1
- JavaScript on first load: a 200 KB (compressed) limit
Once the number is in the contract, every new dependency that breaks the budget automatically starts a discussion. Having that discussion before release is far cheaper than having it afterwards.

