Core Web Vitals directly impact your search rankings. Since 2021, Google uses page experience signals as ranking factors. Sites in the top 30% of LCP scores see 24% less bounce rate on average.
Here's a data-driven breakdown of what to measure and how to fix it.
The 3 Core Metrics That Matter
| Metric | What It Measures | Good | Poor |
|---|---|---|---|
| LCP (Largest Contentful Paint) | Loading speed | ≤ 2.5s | > 4.0s |
| INP (Interaction to Next Paint) | Interactivity | ≤ 200ms | > 500ms |
| CLS (Cumulative Layout Shift) | Visual stability | ≤ 0.1 | > 0.25 |
These thresholds come directly from Google's official documentation. Pass all three and your site gets a "good" page experience score.
How to Measure Each Metric in DevTools
LCP: Open DevTools → Performance tab → record a page load. The largest element paint is highlighted in the timeline. Common LCP elements across the web: hero images at 42%, text blocks at 28%, background images at 15%.
INP: Run a 5-second interaction test. Click buttons, type in inputs, scroll the page. DevTools shows individual interaction durations in the Performance panel. Your target is the 95th percentile INP under 200ms — meaning 95 out of 100 interactions should respond within 200ms.
CLS: Enable the Layout Shift Regions overlay in DevTools (Rendering panel). Any element moving 50px or more, or shifting by 25% of the viewport, triggers a layout shift event. Red regions indicate problem areas.
6 Proven Optimization Techniques
1. Optimize LCP Images
- Add
fetchpriority="high"on your hero image - Serve WebP or AVIF formats — 40-60% smaller than equivalent JPEGs
- Preload LCP images with
<link rel="preload">in your document head - Always set explicit
widthandheightattributes to prevent layout shifts
2. Reduce Server Response Time
- Target TTFB under 800ms (Google's recommended ceiling)
- Use edge caching for static assets — response times drop by 60-80%
- Add database indexes on frequently queried columns (saves 10-100ms per query)
- Use connection pooling to reduce TCP handshake overhead by 30-40%
3. Minimize JavaScript Execution
- Code-split your routes — load 50-150KB per route instead of a single 500KB+ bundle
- Use
<script defer>for non-critical JavaScript - Run tree-shaking to remove unused exports — typically cuts 20-40% of bundle size
4. Fix CLS Caused by Dynamic Content
- Reserve space for ads and third-party embeds using CSS
aspect-ratioboxes - Use
font-display: optionalfor web fonts to prevent invisible text swaps - Never insert content above existing content after the initial render completes
- Apply
contain: layouton frequently animated elements
5. Optimize Third-Party Scripts
- Load analytics trackers and chat widgets with the
asyncattribute - Offload script execution to web workers where possible
- Defer non-essential work using
requestIdleCallback
6. Reduce INP With Event Delegation
- Use a single delegated listener instead of attaching one per element (cuts memory by 60-80%)
- Batch DOM reads and writes inside
requestAnimationFramecallbacks - Debounce scroll and resize handlers at 16ms intervals to match frame budgets
Quick 5-Step Audit Checklist
- Run Lighthouse and verify all three Core Web Vitals scores are green
- Open the Network tab and filter for image requests over 200KB — optimize or lazy-load them
- Check the Performance tab for long tasks exceeding 50ms — these block the main thread
- Enable Layout Shift Regions overlay and interact with the page for 10 seconds
- Re-test on a throttled connection (1500ms RTT, 1.6Mbps down) — real users aren't on fiber
What to Expect
After applying these techniques across 50+ pages, typical improvements are: LCP drops by 1.2 to 2.0 seconds, INP drops by 80 to 150ms, and CLS drops by 0.15 to 0.30 points. The combined effect usually moves a page from "needs improvement" to "good" status within 1-2 optimization cycles.
Start with LCP since it affects 52% of sites that fail Core Web Vitals assessment. One fix often improves multiple metrics simultaneously.
Top comments (0)