Google has used Core Web Vitals as a search ranking factor since 2020. In 2024 INP (Interaction to Next Paint) replaced FID. In 2026 these metrics matter even more.
In 19 years I have optimized 100+ WordPress sites. Core Web Vitals was good practice before Google, now it is a measurable target. This post is about what the three main metrics are and how I actually optimize them.
LCP (Largest Contentful Paint)
How fast the “significant content” of the page loads. Large image, video poster, heading block, usually the hero element.
Target: under 2.5 seconds (good). 2.5 to 4 seconds (needs improvement). 4+ (poor).
Measurement: Chrome DevTools > Lighthouse. Or PageSpeed Insights.
Common LCP killers:
1. Large hero image. A 2MB JPEG is loading. Slow on any network.
Fix: WebP or AVIF format (30 to 50% smaller). Responsive images (srcset). Appropriate dimensions (do not serve 4K to mobile). Priority Hints: <img fetchpriority="high" src="hero.webp">.
2. Lazy-loaded hero image. You accidentally added loading="lazy". It does not load during first paint.
Fix: always eagerly load the hero image. Lazy load below the fold, fine.
3. CSS blocking render. Stylesheet is big and render-blocking.
Fix: inline critical CSS. Async load non-critical CSS. Minify CSS.
4. Slow server response. Backend TTFB is high.
Fix: database query optimization. Caching (page cache, object cache). CDN.
5. Web fonts blocking. FOIT (Flash of Invisible Text).
Fix: font-display: swap CSS property. Preload critical font files. System fonts fallback.
LCP benchmark target: push for 1.5 to 2.0 seconds. Good UX.
INP (Interaction to Next Paint)
Replaced FID in 2024. How long it takes for visual feedback after a user interaction (click, tap, keypress).
Target: under 200ms (good). 200 to 500ms (needs improvement). 500+ (poor).
Measurement: Lighthouse, Chrome UX Report (real user data).
FID vs INP:
- FID: only measured the first interaction.
- INP: measures the worst interaction in the entire session.
INP is more realistic. A user interacts many times in a session, and if one of those is slow the UX is broken.
Common INP killers:
1. Heavy JavaScript. Main thread blocked for too long, user input has nothing to respond to.
Fix: code splitting (dynamic import). Remove unused JavaScript. Web Workers (background thread). requestIdleCallback for non-critical work.
2. Slow event handlers. An onClick handler running for 500ms.
Fix: optimize the handler, defer heavy work. Debounce frequent events (scroll, input). requestAnimationFrame for visual updates.
3. Layout thrashing. DOM read/write interleaved.
// Bad
for (let i = 0; i < elements.length; i++) {
const height = elements[i].offsetHeight; // Read
elements[i].style.height = height * 2 + 'px'; // Write
}
// Good
const heights = elements.map(el => el.offsetHeight); // Batch read
heights.forEach((h, i) => elements[i].style.height = h * 2 + 'px'); // Batch write4. Third-party scripts. Google Tag Manager, analytics, chat widget holding the main thread.
Fix: async/defer scripts. Lazy-load third-party (after user interaction). Facade pattern (preview, load on demand).
CLS (Cumulative Layout Shift)
Does the content shift while the page loads? Broken reading experience.
Target: under 0.1 (good). 0.1 to 0.25 (needs improvement). 0.25+ (poor).
How CLS is computed: layout shift fraction times viewport coverage. 5 lines shifting with 80% coverage equals 0.4 CLS. Bad.
Common CLS killers:
1. Image without dimensions. Image loads, then space gets reserved, content pushes down.
Fix:
<img src="hero.jpg" width="800" height="400" alt="...">Explicit width and height in HTML. The browser pre-allocates space.
For responsive: CSS aspect-ratio property:
img {
width: 100%;
height: auto;
aspect-ratio: 2 / 1;
}2. Web fonts causing reflow. Fallback font metrics differ. Text reflows when the web font loads.
Fix: font-display: optional (no swap). size-adjust, ascent-override CSS (match fallback metrics). Preload critical fonts.
3. Ads and iframes. Banner ad loads, space opens up.
Fix: reserve space up front. Min-height on the ad container. Skeleton loader pattern.
4. Dynamically injected content. Banner injected during scroll.
Fix: pre-allocate a placeholder. Inject content in a non-CLS way (modal overlay, etc).
5. CSS-driven animations. top/left animation instead of transform.
Fix:
/* Bad: triggers layout */
.el { transition: top 0.3s; }
/* Good: GPU-accelerated, no reflow */
.el { transition: transform 0.3s; }Measurement tools
1. Lighthouse (Chrome DevTools). Single run. Synthetic test environment.
2. PageSpeed Insights (pagespeed.web.dev). Web-based. Mobile + Desktop.
3. Chrome User Experience Report (CrUX). Real user data. 28-day aggregate.
4. Search Console. Site-wide Core Web Vitals report.
5. Web Vitals library. A JavaScript library, real user monitoring (RUM).
import {onCLS, onINP, onLCP} from 'web-vitals';
onCLS(console.log);
onINP(console.log);
onLCP(console.log);Send metrics to the backend, visualise in Grafana or Datadog.
Real user data is more reliable than a synthetic test. Real users, real devices, real networks.
Field data vs lab data
- Lab data: Lighthouse, PageSpeed (one-time synthetic test).
- Field data: CrUX, web-vitals library (real users, aggregate).
The two sources usually give different numbers. Track both.
Field data is what Google uses for ranking. At minimum, improve field data.
Mobile-first optimization
Google uses mobile-first indexing. Mobile Core Web Vitals matter more than desktop.
On mobile:
Slower CPU. Slower network (3G, 4G). Smaller viewport. Battery concerns.
Optimize mobile first. Desktop usually takes care of itself.
Mobile-specific practices:
Responsive images (much smaller mobile versions than the full src). Reduced JavaScript on mobile. Touch-friendly UI (no hover-only interactions). Correct viewport meta tag.
WordPress-specific tips
I have optimized WordPress sites for 15+ years. The core patterns:
1. Caching plugin. LiteSpeed Cache (if you are on LiteSpeed), WP Rocket, W3 Total Cache.
2. Image optimization. ShortPixel, Imagify, or native WP WebP.
3. Critical CSS generation. Autoptimize with the critical path feature.
4. Native lazy loading: WordPress 5.5+ has it. No extra plugin needed.
5. Remove bloat plugins. Every plugin adds render overhead. Minimize.
6. Theme choice. A lightweight theme (GeneratePress, Blocksy, Astra) is better than a heavy one (Avada, Divi).
7. Headless WordPress. Advanced. Next.js frontend, WP backend. Best performance but complex.
Real impact
Core Web Vitals improvements translate into real business impact:
- SEO ranking. A direct Google factor.
- Conversion rate. 100ms delay drops conversion by 1 to 2% (Amazon).
- Bounce rate. Slow sites bounce higher.
- User satisfaction. Subjective but measurable.
I dropped LCP from 4.5s to 1.8s on an e-commerce client. Organic traffic went up 23%, conversion rate 12%.
Investment: 2 to 3 weeks of optimization work. ROI: ongoing revenue increase.
Continuous monitoring
A one-time fix is not enough. Regression creeps in as content and plugins get added.
Continuous monitoring:
- Weekly Lighthouse CI check (automated).
- Monthly CrUX review.
- Real user monitoring dashboard.
- Alerts for regression.
Without that discipline the improvements erode within 6 months.
Takeaway
Core Web Vitals sit at the core of technical SEO. In 2026 they carry even more weight in Google’s algorithmic ranking.
LCP (load), INP (interactivity), CLS (visual stability). Each has its own optimization strategy. Image optimization, JavaScript management, layout pre-allocation.
Measurement first, fix second, continuous monitoring. With that cycle most sites can hit Green (passing) Core Web Vitals. 2 to 3 weeks of focused work is usually enough.