Averages hide the problem
The median load time on a dashboard is a comforting number and a useless one. What matters is the slowest quarter of sessions, because that is where the abandonment lives — and it is almost never the same users as the fast quarter.
We look at the 75th percentile on mobile, on the network profile of the market the product actually serves. It is a less flattering number and it moves the right decisions.
The four things that usually fix it
- Ship less JavaScript. The cheapest script is the one that was never sent. Check what a route pulls in before optimising what it does.
- Size the images. An image served at three times its rendered width is the most common single win we find, and it needs no architectural change.
- Fetch on the server. A spinner waiting on a browser request waiting on a database is two round trips that could have been none.
- Stop layout shift. It costs no bandwidth, and it is the thing users describe as "broken" without knowing why.
Measure what users feel
Largest Contentful Paint and Interaction to Next Paint correspond to something a person experiences: when did I see it, and did it answer when I touched it. Bundle size does not — it is a proxy, useful for diagnosis and misleading as a goal.
One rule we keep
Every performance fix carries its before and after number in the pull request. Not because anyone doubts the change, but because half the fixes everyone "knows" work turn out to be worth nothing on the route in question.
Part of the team building and running the products behind these posts at Hedaya Global Solutions.