A slow website costs you visitors, sales and search rankings. Google measures how fast and stable a page feels to real people using three metrics called Core Web Vitals. The good news: most problems come from a handful of common causes.
The three metrics
| Metric | What it measures | Good score |
|---|---|---|
| LCP — Largest Contentful Paint | How quickly the main content (usually a hero image or headline) appears | 2.5 s or less |
| INP — Interaction to Next Paint | How quickly the page responds when you tap, click or type | 200 ms or less |
| CLS — Cumulative Layout Shift | How much the layout jumps around while loading | 0.1 or less |
Google looks at the 75th percentile of real visits, so your site needs to be fast for most users — including those on mid-range phones and slow mobile data.
How to measure
- PageSpeed Insights (pagespeed.web.dev) — shows real-user data plus a lab test
- Chrome DevTools → Lighthouse and Performance panels — for debugging locally
- Google Search Console → Core Web Vitals report — shows which groups of pages fail
Lab scores (Lighthouse) are useful for debugging, but the real-user “field data” is what Google actually uses. Don’t panic over a single bad lab run.
Fixing LCP (slow main content)
The LCP element is usually a big image. Common fixes:
- Serve modern formats — WebP or AVIF are typically much smaller than JPEG/PNG
- Size images correctly — don’t send a 4000px photo to a 400px phone screen; use
srcset - Don’t lazy-load the hero image — lazy-loading is great below the fold, but it delays the main image
- Tell the browser it’s important:
<img src="hero.webp" alt="..." width="1200" height="630"
fetchpriority="high" decoding="async">
- Speed up the server — use page caching, a CDN and good hosting. A slow Time to First Byte delays everything else.
Fixing INP (sluggish interactions)
INP suffers when the browser’s main thread is busy running JavaScript.
- Ship less JavaScript — audit plugins, sliders, chat widgets and trackers. Each one adds up.
- Defer non-critical scripts with
deferor load them after user interaction - Break up long tasks — split heavy work into smaller chunks so the browser can respond in between
// Let the browser breathe between chunks of work
async function processItems(items) {
for (const item of items) {
doWork(item);
await new Promise(r => setTimeout(r, 0));
}
}
Fixing CLS (jumping layout)
Nothing is more annoying than tapping a button just as an ad pushes it down. To prevent shifts:
- Always set
widthandheight(oraspect-ratio) on images, videos and iframes - Reserve space for ads, embeds and cookie banners
- Use
font-display: swapwith similar fallback fonts so text doesn’t reflow dramatically - Never insert content above existing content unless the user asked for it
.video-embed { aspect-ratio: 16 / 9; width: 100%; }
Quick wins for WordPress sites
- Install a reputable caching plugin and enable page caching
- Use an image optimisation plugin that converts to WebP/AVIF
- Remove plugins you don’t use — every active plugin can add CSS and JS
- Choose a lightweight theme (like this one!) instead of a heavy multipurpose builder
- Put the site behind a CDN such as Cloudflare
Don’t stack multiple caching or optimisation plugins on top of each other. They often conflict and can make things slower or break your layout.
Conclusion
Core Web Vitals boil down to three questions: Does the main content appear quickly? Does the page respond instantly? Does the layout stay still? Fix images first, trim JavaScript second, and reserve space for everything that loads late. Your visitors — and your search rankings — will thank you.