Time to first byte is not page speed
A 90ms server response feels irrelevant when the page then loads 2MB of images, four font files and a chat widget. Measure what the visitor waits for, not what the server reports.
The usual culprits, in order
From the worst offenders down:
- Uncompressed hero images
- Render-blocking CSS and fonts
- Third-party scripts loaded synchronously
- No caching headers on static assets
Fix the cheap things first
Convert images to WebP, add width and height attributes to stop layout shift, defer non-critical JavaScript, and set a long cache lifetime on anything with a versioned filename. That sequence usually halves load time before any server tuning.