FIX EACH CORE WEB VITAL
Three metrics, three different jobs. The specific fixes that move each one, without the theory dump.
← Guides All Performance & Core Web Vitals guides
LCP: make the main thing load fast
Largest Contentful Paint is usually a hero image, a big headline, or a poster frame. Find that element. Everything else is secondary until it is fast.
Levers that move LCP: compress and resize the resource, use a modern format, set dimensions, preload the exact URL when it is discoverable late, put it on a CDN, and reduce TTFB so the bytes can start. Avoid lazy-loading the LCP image. Avoid carousels that delay the real LCP node.
Server angle: if HTML itself is late, no image trick saves you. Fix cache and origin first.
Key takeaway: Name the LCP element, then make that file and its discovery path boringly fast.
INP: keep the main thread free
Interaction to Next Paint cares about how quickly the page responds after a tap or click. Heavy JavaScript on the main thread is the usual villain: big hydration, expensive handlers, third-party scripts that run forever.
Levers: delete or defer third parties, split handlers, avoid large synchronous components on marketing pages, prefer server-rendered HTML with small islands, and test on a real mid-tier Android device, not only a desktop throttling preset.
Key takeaway: INP improves when you remove work from the main thread, not when you micro-optimise a CSS transition.
CLS: stop the page from jumping
Cumulative Layout Shift is visual instability. Images without dimensions, fonts that swap late and resize text, ads and embeds that open a hole in the layout, banners injected above content.
Levers: width and height or CSS aspect-ratio on media, reserved slots for ads, font-display strategies that do not detonate layout, and no late-loading UI above existing content. Prefer transforming existing space over inserting new blocks at the top.
Key takeaway: If something appears later, reserve its space earlier.
The mistakes that keep failing each
| Metric | Common miss | Better move |
|---|---|---|
| LCP | Lazy-loading the hero | Eager + preload the real LCP URL |
| LCP | Optimising a non-LCP image | Identify the LCP node first |
| INP | Blaming CSS animations | Cut JS and third parties |
| INP | Testing only on desktop | Use a mid-tier phone |
| CLS | Ignoring font metrics | Subset fonts, reserve space |
| CLS | Cookie banners without space | Reserve or overlay carefully |
Key takeaway: Most repeat failures are process mistakes, not missing micro-optimisations.
How to pass all three
Order of operations on a failing site: clear LCP, then INP, then CLS. Re-measure field data between steps. Use the CWV checklist as the launch gate and the slow-site guide when you still cannot tell server from front end.
Passing all three at the 75th percentile on mobile is enough. Do not hold a release hostage for lab 100s once field data is healthy.
Key takeaway: Clear LCP first. INP and CLS are easier once the main content path is honest.
A one-week rescue plan
Day 1: pull field data, name the LCP element on the top three templates, list every third-party script with an owner. Day 2 and 3: ship the LCP media and discovery fixes only. Day 4: remove or defer the worst third parties and re-check INP on a phone. Day 5: reserve space for the CLS offenders you can see in the field experience. Day 6 and 7: re-measure, document what remains, and decide whether the leftover work is launch-blocking.
That week beats a month of mixed refactors because each day has one metric and one evidence loop. If LCP is still red after day 3, do not start a design system cleanup. Stay on the LCP element until it moves.
Key takeaway: One metric per day with a re-measure beats a mixed performance backlog.
WHEN YOU ARE READY TO TALK
If you are mid-build on something this guide touches and want a second pair of eyes, the fastest path is a 30-minute call.
BOOK YOUR 30-MIN CALL