Frederick Sona
HomeCase Studies › Core Web Vitals
Surface Playbook · CWV Playbook

Core Web Vitals

LCP, INP, CLS as a program that survives contact with product. Measurement, budgets, and regression prevention that keeps the site fast six months after launch, not one week after.

Surface code: CWV Metrics: LCP, INP, CLS Adjacent: SEO, VxSO, FEO
Surface playbook. One of 19 discovery surfaces inside Search Everywhere Optimization. Methodology first, then applied against the industry that fits.

TL;DR

Core Web Vitals reward brands that treat performance as a shipped feature with budgets, not a one-time audit. The three moves that matter: measure real users with CrUX and RUM, gate every deploy against page-level budgets in CI, and cut third-party JavaScript by 40% before touching anything else. Sites without a budget always regress.

The surface, in one paragraph

Core Web Vitals are Google's three field metrics for perceived performance: Largest Contentful Paint (how fast the biggest thing loads), Interaction to Next Paint (how fast the page responds to a tap or click), and Cumulative Layout Shift (how much the page jumps around while loading). Google measures these on real Chrome users through the Chrome User Experience Report, ranks the site at the 75th percentile, and uses the pass/fail signal as an input to search ranking. CWV is not the biggest ranking factor, but it is a tie-breaker that decides who takes position three when the top ten are all otherwise well-optimized. It also drives conversion. A one-second LCP improvement typically lifts ecommerce conversion by 2 to 8%, which is a bigger dollar impact than the ranking effect on most sites.

Where this fits in Search Everywhere Optimization

CWV is a horizontal signal that touches nearly every surface.

SEO uses CWV as a tie-breaker. On competitive queries, CWV decides which top-ten result gets the higher slot. Not a rocket, but consistently the last 10% of ranking gains.

VxSO depends on image loading. LCP work forces good image discipline: correct sizes, next-gen formats, priority hints. That discipline flows into Lens and Merchant Center compliance.

FEO reads speed signals. Google Discover downweights slow pages. Apple News prioritizes fast article loads.

Conversion is downstream. Every 100ms of LCP improvement moves ecommerce conversion. This is the surface where "SEO ROI" and "product ROI" agree.

E-E-A-T reads UX signals. Slow, janky sites feel untrustworthy. E-E-A-T is holistic, and CWV feeds it indirectly.

The five levers

1. LCP: image and origin discipline

LCP is the big picture (literally). The largest visible element on load is usually a hero image or a headline. The fix stack: serve the hero as AVIF or WebP with proper srcset and sizes, mark it with fetchpriority="high" and preload if it is above the fold, put the origin behind a CDN so time to first byte stays under 200ms, remove render-blocking resources, and lazy-load anything below the fold. On WordPress and Shopify, most LCP problems come from the theme's hero block loading a 4MB image with no priority hint. Fix the block, LCP drops.

2. INP: main-thread discipline

INP replaced FID in 2024 and is harder to pass. It measures the delay from every interaction (tap, click, keypress) to the next paint. The killer is third-party JavaScript blocking the main thread. Fix stack: audit third parties with Chrome DevTools performance panel, defer anything not needed above the fold, move analytics to a queue-based tag manager (GA4 with delayed initialization), lazy-load chat widgets and personalization scripts on interaction, break up long tasks with scheduler.postTask or setTimeout, use web workers for expensive computations. Personalization scripts and A/B testing SDKs are the biggest offenders.

3. CLS: reserve space, always

CLS measures unexpected layout shifts. The fix is philosophical: reserve space for everything before it loads. Set width and height on every img, iframe, and video. Reserve slots for ads with min-height. Do not inject banners at the top after page load. Use CSS transform for animations, not layout properties. Ban late-loading web fonts that swap and shift text. On sites with dynamic content, the fix is to preallocate skeleton loaders that match the final element's dimensions.

4. Budgets in CI

Without a budget gate, CWV always regresses. Product ships a new feature, the vendor adds a script, an image sneaks in without srcset. Six weeks later the site is 30% slower. The gate: run Lighthouse CI or a bundle size check on every PR. Fail the build if LCP exceeds budget, if bundle size grows past the threshold, if a third-party script is added without an owner. Enforcement matters more than the initial improvement.

5. Real user monitoring, not just lab

Lab data (Lighthouse, PageSpeed Insights) misses network variability, device diversity, and location. CrUX gives 28-day-averaged field data. RUM tools (SpeedCurve, DebugBear, or a self-hosted web-vitals script piped to BigQuery) give real-time visibility. I set up RUM before doing any optimization. Optimizing what the lab shows without RUM often makes the field metric worse.

First 30 / 60 / 90 days

Days 1 to 30: measure and target

Field data pull. CrUX report on top URLs. Which URLs pass and fail LCP, INP, CLS. Which device tier fails harder.

Real user monitoring installed. web-vitals.js library shipped, piped to GA4 custom events or a RUM platform. First 30-day baseline collected.

Lab audit. Lighthouse CI baseline on the top 20 URLs. Chrome DevTools performance profile for INP outliers.

Third-party inventory. Every script in the tag manager, every embed on every page, every SDK in the app. Ownership assigned to each. Anything unowned gets flagged for removal.

Budget draft. Per-URL LCP, INP, CLS budgets. Bundle size ceilings. Image weight ceilings.

Deliverable at day 30: a live RUM dashboard, a ranked bad-URL list, a documented third-party inventory, and a proposed budget with target dates.

Days 31 to 60: fix the biggest problems

Hero image discipline shipped. Formats converted, priority hints added, srcset filled out, oversized files replaced.

Third-party trim. Remove or defer 40% of the third-party scripts. Move analytics to a delayed init pattern. Lazy-load chat and personalization on interaction.

CLS fixes on top offenders. Missing image dimensions added. Ad slots reserved. Late banners removed or preallocated.

CDN and caching review. Origin TTFB check. Edge-cache HTML where possible. Full-page cache for anonymous traffic.

CI budget gate. Lighthouse CI or DebugBear check on PRs. Failing threshold, blocking merge.

Deliverable at day 60: measurable improvement on the top 20 URLs, live CI gate, deferred third-party stack, and clean image discipline in the CMS template.

Days 61 to 90: sustain and expand

Field data re-check. CrUX 28-day trend. RUM comparison to baseline.

Long-tail URL cleanup. Templates that produce systematic problems (blog post template, category page template) get fixed at the template level.

Vendor pushback documentation. Any third party that costs more than the budget allows gets a written escalation. Chat widget vendors, personalization vendors, and heavy analytics libraries are the usual escalation targets.

Ownership and playbook. Documented runbook for the team on how to keep CWV green after I leave.

Deliverable at day 90: a passing CrUX status on the top templates, a live budget gate, and a maintenance playbook that the internal team can run.

Tools I use

  • PageSpeed Insights. Combined lab and field snapshot for a single URL.
  • Chrome User Experience Report (CrUX). Field data at scale. BigQuery for historical trends.
  • Google Search Console. Core Web Vitals report for site-wide status by URL group.
  • Lighthouse and Lighthouse CI. Lab audit and PR-time regression gate.
  • DebugBear or SpeedCurve. Continuous synthetic monitoring with alerting.
  • web-vitals.js library. Client-side RUM data collection, piped to GA4 or a RUM platform.
  • Chrome DevTools Performance panel. INP root cause investigation.
  • ImageOptim, Squoosh, or Cloudinary. Image transformation and format conversion.
  • WebPageTest. Deep waterfall analysis and multi-location testing.
  • Bundle Analyzer (webpack, esbuild, Rollup). Bundle size regression investigation.

What kills the program

One-time audits with no ownership. The consultant leaves, product ships three features, CWV regresses. Without an owner and a gate, the improvement dies.

Optimizing for the lab, not the field. A pretty Lighthouse score does not help if real users on 4G phones still see 5-second LCP.

Third-party denial. Marketing insists on the chat widget, the personalization SDK, the six analytics tools. Nothing gets fixed until someone pushes back.

Hero images shipped by the marketing team. A 6MB PNG lands in the CMS, LCP tanks, nobody notices until CrUX reports it 28 days later.

Skipping RUM. Sites without RUM cannot see regressions in real time. By the time GSC surfaces the problem, the release is a month old.

Fixing everything at once. Big-bang refactors miss the point. Iterative work with budget enforcement compounds.

Ignoring INP. Sites that passed FID are often failing INP. INP is stricter. Old passes do not carry over.

KPIs that matter

  • CrUX pass rate. Percent of URLs passing all three vitals at the 75th percentile.
  • LCP p75. Field-measured LCP at the 75th percentile, by device tier.
  • INP p75. Field-measured INP at the 75th percentile.
  • CLS p75. Field-measured CLS at the 75th percentile.
  • Third-party count. Number of third parties loaded on the top templates.
  • Bundle size (compressed). Top templates, tracked over time.
  • CI gate pass rate. Percent of PRs that pass without waivers.
  • Conversion lift per LCP improvement. Business KPI attribution.

FAQ

Do Core Web Vitals actually affect rankings?

Yes, but as a tie-breaker. CWV is part of Google's page experience signal. It rarely moves a page from position 20 to position 3. It regularly moves a page from position 5 to position 3.

What are the current CWV thresholds?

LCP under 2.5 seconds, INP under 200 milliseconds, CLS under 0.1, all measured at the 75th percentile of real user visits.

Should I trust PageSpeed Insights lab scores?

Only as a starting point. Lab scores catch bad code. CrUX field data is what Google actually uses for ranking. I trust CrUX first, lab second.

What is the biggest INP killer?

Third-party JavaScript. Analytics, tag managers, chat widgets, and personalization scripts stack up on the main thread and delay interaction response. Budgeting third parties is the most productive INP work.

How do I stop CWV regressions after launch?

Real user monitoring plus performance budgets in CI. If a PR pushes LCP above the budget, the build fails. Without a gate, CWV always regresses.

Does hosting matter?

Yes. Time to first byte from origin is a hard ceiling on LCP. A slow origin makes any front-end work look worse than it is. Edge-cached HTML is the cheapest LCP win.

Want CWV run as a program? Send me the top URL group and I will scope it.

Start a conversation
← Back to case studies