---
title: "Core Web Vitals Optimization: What Works"
source: https://refact.co/insights/digital-product/core-web-vitals-optimization
author: "Hossein Karami"
date: "2026-10-02"
---

# Core Web Vitals Optimization: What Works

Your homepage scores 95 in Lighthouse, yet Search Console still marks your product pages as failing. Both numbers can be right, because they measure different things. That gap explains why so much Core Web Vitals optimization goes nowhere. The team improves the score it can see right away, on the page it looks at most, and then waits for a ranking jump that usually doesn’t come.

This guide is for teams that own a site that makes money, such as a store, a publication, or a lead-generation site, and want performance work that shows up in real-user data. It covers what the three metrics measure, how to read field data before anyone writes code, which fixes tend to pay off first, and how to stop the gains from slipping away after the next marketing tag goes live.

## Why Most Core Web Vitals Work Disappoints

The metrics are rarely the problem. One summary of practitioner discussion put it this way: the failures are “usually measurement and expectation failures more than mysterious metric bugs.” The same five mistakes come up again and again:

-   **Optimizing lab scores instead of field data.** Lighthouse gives instant feedback. Google judges pages on real-user data, which lags by weeks.
-   **Averaging mobile and desktop.** One blended number hides the phone experience that usually costs you conversions.
-   **Checking the homepage instead of revenue templates.** A green homepage can hide failing product, article, or checkout pages.
-   **Expecting a ranking jump.** Core Web Vitals is a minor ranking signal. When rankings don’t move, teams decide the work failed, even when it didn’t.
-   **Treating performance as a one-time project.** New scripts, plugins, hero images, and consent banners wear down the gains release by release.

Every one of these mistakes is about measurement or expectations. That is why this article spends as much time on what to measure and how to keep results as it does on code fixes.

## What LCP, INP, and CLS Measure, and the Thresholds That Count

Core Web Vitals turn three parts of the user experience into numbers. You don’t need to write JavaScript to use them in planning, but you do need to know what question each one answers.

| Metric | What it measures | Good threshold | The user’s question |
| --- | --- | --- | --- |
| LCP (Largest Contentful Paint) | When the largest visible element renders | 2.5 seconds or less | “Can I see the page yet?” |
| INP (Interaction to Next Paint) | How fast the page responds to taps, clicks, and keys across the whole visit | 200 milliseconds or less | “Did my click work?” |
| CLS (Cumulative Layout Shift) | How much visible content moves unexpectedly | 0.1 or less | “Why did the button move?” |

Google checks these numbers at the 75th percentile of real-user visits over a rolling 28-day window. A page passes only when all three metrics are in the good range. In practice, three out of four visits need a good experience, measured on real devices and networks. [Google’s Search Central documentation](https://developers.google.com/search/docs/appearance/core-web-vitals) explains the pass condition and how field data is used.

The metric set has changed before. Google introduced Core Web Vitals in May 2020 with LCP, FID, and CLS. INP replaced FID in March 2024 because a page shouldn’t get credit for answering one early tap quickly while later interactions lag. [This history of Core Web Vitals](https://ppc.land/core-web-vitals/) shows why older checklists go stale. Practitioners still find FID targets in team SLAs and agency playbooks. If your performance documents mention FID, they are tracking a metric Google no longer uses.

Some teams set tighter internal targets, such as INP under 150 ms or LCP under 2 seconds. That can be a sensible choice in a competitive market, but it is your choice, not Google’s. The “good” band that Search Console reports hasn’t changed.

## What Core Web Vitals Will and Won’t Do for SEO

Core Web Vitals feeds into Google’s page experience signals, but practitioners consistently describe it as a small factor. Plenty of sites with a “Core Web Vitals Assessment: Failed” banner still rank well, because relevance and links carry far more weight. If you start this work expecting to climb three positions, you will probably call it a failure even when the engineering worked.

The stronger case is conversions. In a web.dev case study from June 2026, the ecommerce platform Nuvemshop raised its Core Web Vitals pass rate from 48% to 72% by prioritizing storefront images, and conversions rose 8.9%. Fotocasa, Adevinta’s Spanish real estate marketplace, reported a 27% lift in key conversion metrics that correlated with its INP and Core Web Vitals work (web.dev, October 2025). Both case studies are published by Google, which has a stake in promoting these metrics, and Fotocasa’s result is explicitly a correlation. Even so, they are the clearest outcome data available, and they point at revenue, not rankings.

Plan the work as a conversion and user-experience project that also helps SEO a little. That framing keeps budgets realistic and keeps the team focused on the pages where slowness costs money.

## Read Your Field Data Before Anyone Touches Code

Start in Google Search Console, under Experience, then Core Web Vitals. The report groups similar URLs and gives each group the status of its worst-performing metric. [Google’s Core Web Vitals report documentation](https://support.google.com/webmasters/answer/9205520?hl=en) describes how those URL groups and statuses work. Grouping helps because one slow component, such as an unoptimized hero image or a heavy review widget, usually breaks a whole template, not one page.

![Google Search Console Core Web Vitals report showing mobile and desktop URL groups](https://cdn.refact.co/uploads/2026/10/image_placeholder_1-2.avif)

Segmenting real-user data by mobile and desktop in Google Search Console immediately reveals whether performance bottlenecks are isolated to specific device experiences across your URL inventory. · Source: www.searchenginejournal.com

Work through the data in this order:

1.  **Split by device.** Search Console and CrUX already separate mobile and desktop. Keep them apart in your own reports too. On mobile, LCP may paint a different element after the responsive layout changes, INP runs on slower processors, and CLS can come from banners that only show up on small screens.
2.  **Group by template.** Product detail, category, article, checkout, account, and campaign landing pages each have their own causes.
3.  **Find the failing metric for each group.** One template might fail only on LCP. Another might fail only on CLS because of an ad slot.
4.  **Rank by business value.** Start with the failing group that drives sales, subscriptions, ad revenue, or qualified leads. For a store, that is often the product page, not the homepage.
5.  **Track INP on interactive flows.** Search, filters, cart, forms, and checkout are where responsiveness problems cost the most.

We take this revenue-page-first approach in our [Shopify speed optimization playbook](https://refact.co/insights/ecommerce/shopify-speed-optimization). Shoppers arrive on product URLs from Google Shopping, paid social, and email, and each of those pages has its own images, apps, and scripts.

### Why Lighthouse and Search Console Disagree

Questions like “poor CLS in Search Console but not in Lighthouse” come up constantly on Stack Overflow. The explanation is the same each time. A Lighthouse run is one simulated visit, on one device profile, with no real interaction. Field data covers slower phones, patchy networks, users who scroll and tap, and third-party scripts that act differently in production. A practitioner observation that circulates widely says a large share of pages scoring 90 or higher in Lighthouse still fail at least one threshold in the field. Nobody has published a precise figure, but anyone who has compared the two reports knows the pattern.

[Google’s PageSpeed Insights documentation](https://developers.google.com/speed/docs/insights/v5/about) explains that the tool shows both: CrUX field data at the top and a Lighthouse lab run below. Use the lab run to reproduce and debug a problem. Use the field data to decide whether it is fixed.

Low-traffic pages may not have enough CrUX data to report. In that case, collect your own field data with real user monitoring, for example the open-source `web-vitals` library sending results to your analytics. This [practical guide to real user monitoring](https://fivenines.io/blog/rum-real-user-monitoring/) covers what to capture from real sessions and how to tie it to the rest of your operations data.

## Fix LCP First, and Start With the Hero Image

LCP is where the web struggles most. Web Almanac 2025 figures shared by practitioners suggest that roughly half of mobile pages still fail the Core Web Vitals assessment, and that LCP passes on only about 62% of mobile pages. Those figures are approximate and secondhand, but the direction matches the [HTTP Archive Web Almanac performance chapter](https://almanac.httparchive.org/en/2024/performance) from the year before. In 2024, 48% of sites had good Core Web Vitals under the old FID definition, and only 43% passed once INP replaced FID.

The usual cause is simple. A slow or badly prioritized hero image looks fine on office Wi-Fi and stalls on a mid-range phone over a cellular connection. The low-cost fix needs no redesign:

-   Add `fetchpriority="high"` to the LCP image so the browser fetches it before less important resources.
-   Never lazy-load the LCP element. Use `loading="lazy"` only for images below the fold. Many themes and plugins lazy-load every image by default, including the hero.
-   Serve the image at the right size in WebP or AVIF, with responsive `srcset` values so phones don’t download desktop files.
-   Preload the LCP resource when the browser can’t discover it early, for example a background image set in CSS. Preconnect to the image CDN if it sits on another domain.
-   Preload critical fonts, or self-host a subset, when text is the LCP element.

One practitioner estimate says getting priority and lazy-loading right is “often worth about a second on LCP.” Treat that as a rule of thumb, not a promise. Still, it matches the Nuvemshop result, where image priority alone moved the storefront pass rate by 24 points.

![Chrome DevTools Performance panel identifying the LCP element for Core Web Vitals optimization](https://cdn.refact.co/uploads/2026/10/image_placeholder_2-2.avif)

Locating the Largest Contentful Paint marker in Chrome DevTools pinpoints the exact moment of render, ensuring developers verify the true bottleneck before applying fixes. · Source: developer.chrome.com

Find the LCP element before you change anything. In Chrome DevTools, the Performance panel marks the LCP event and the element behind it. On mobile layouts it is sometimes a headline or a product title, not the image you expected. That changes the fix entirely.

If the image is already prioritized and LCP is still slow, look at server response time. A perfectly compressed image still arrives late when the HTML takes 1.5 seconds to show up. That problem lives on the backend, which we cover below.

## INP Is a Main-Thread and Third-Party Script Problem

INP measures the delay between a user’s action and the next frame the browser paints. When that delay is long, the browser is almost always busy running JavaScript on the main thread. Usually that is your own event handlers combined with analytics, A/B testing, chat widgets, tag managers, and ad code all competing for the same thread.

The fixes are well known, but they take engineering discipline:

-   **Audit third-party scripts for long tasks.** The Performance panel shows which scripts block the main thread. Remove tags nobody uses, and load the rest after the page becomes interactive.
-   **Break up long tasks.** Split heavy event handlers into smaller pieces and yield between them with `scheduler.yield()` or `setTimeout`, so the browser can paint feedback first.
-   **Keep handlers light.** Update the UI right away to show the click registered, then do the expensive work. Debounce search-as-you-type and filter inputs.
-   **For single-page apps, treat hydration as the real problem.** Server-side rendering gets content on screen fast. If the page then hydrates a large JavaScript bundle, the first taps feel dead. Practitioners point to efficient hydration, not SSR alone, as the core INP issue for framework-heavy sites.

Third-party sprawl usually builds up for business reasons, not technical ones. When Teton Gravity Research came to us, the team had bolted critical business functions onto a legacy ExpressionEngine site through third-party services over the years. As we describe in the [Teton Gravity Research rebuild](https://refact.co/work/teton-gravity-research), the strategic work came before any code: deciding which features still earned their place. That same question settles most INP backlogs. Which scripts still pay for the main-thread time they use?

Single-page apps should also watch a change in measurement. Core Web Vitals has historically measured full page loads and ignored client-side route changes. The Soft Navigations API extends measurement to those route changes. Practitioner reports say it went through a final origin trial in Chrome 147 to 149 and reached DevTools, `web-vitals` v6, Lighthouse, PageSpeed Insights, and RUM vendors by late 2026. We haven’t confirmed those details against primary Chrome documentation. Even so, if your site is a React or Vue SPA, test route-level measurement now so your field scores don’t shift without warning.

## CLS: Reserve Space for Everything That Loads Late

Layout shift happens when something shows up after the first render and pushes content out of its way. Three common sources show up again and again on Stack Overflow: AdSense auto ads, Google Fonts swapping in after fallback text has rendered, and consent banners injected above the page.

Every CLS fix follows one rule: reserve the space before the content arrives.

-   Set `width` and `height` attributes, or a CSS `aspect-ratio`, on every image, video, and embed.
-   Give ad slots fixed minimum dimensions for each breakpoint, even when an ad doesn’t fill them. Auto-placed ads that insert themselves into the content are hard to control, so publishers with CLS problems often move to fixed placements.
-   Show consent UI and promo banners as overlays, or in space you reserved, instead of pushing the page down.
-   Preload key fonts and match fallback font metrics so the swap doesn’t reflow headlines.

Check CLS on mobile on its own. A banner that only appears on narrow screens can fail the mobile group while desktop looks perfect.

## Hosting and Backend Choices Set the Floor for LCP

Front-end work can’t save a slow origin. Time to First Byte (TTFB) counts against your LCP budget before the browser even starts on images or fonts. Cheap shared hosting combined with a heavy plugin stack is a common reason a WordPress site can’t get mobile LCP under 2.5 seconds, however well the hero image is tuned.

Check the LCP route for database queries, unindexed lookups, and server-side calls to slow external services. A product page that waits on inventory, reviews, recommendations, and personalization before sending any HTML has an architecture problem, not a caching problem. On WordPress, [WordPress query optimization](https://refact.co/insights/wordpress/wordpress-query-optimization) is often where the TTFB savings are.

Then match the fix to the cause:

-   **A CDN with proper caching** is enough when the origin is healthy and the delay comes from distance or uncached assets. Use `Cache-Control` correctly, consider `stale-while-revalidate` for content that can refresh shortly after delivery, and keep personalized responses out of public caches.
-   **A hosting change** makes sense when field data shows the origin itself is the bottleneck. Our [cloud versus shared hosting comparison](https://refact.co/insights/digital-product/cloud-hosting-vs-shared-hosting) walks through that decision.
-   **A route rewrite** is the answer when one slow page stays slow after caching. Rewrite the page instead of adding more configuration.

Be careful with big architectural fixes. Some commerce teams go headless to improve their vitals, but Shopify’s own field data shows traditional Liquid themes generally beat most headless builds on Core Web Vitals. We cover that tradeoff in our look at [when headless WooCommerce pays off](https://refact.co/insights/ecommerce/headless-woocommerce). Re-architect when field data shows the current stack is the constraint, not because a new stack promises speed.

## Where Plugins and Automated Optimizers Help, and Where They Stop

The tool market is crowded: WordPress plugins that minify and defer assets, cloud services that rewrite pages, Magento performance themes, and lately AI agent “skills” built around Lighthouse audits. Several of them advertise a 100/100 PageSpeed score. That is a lab target, and it can drift away from what real users experience.

These tools are useful for mechanical work, such as image compression, deferring non-critical scripts, and caching. They break down where judgment is needed. A plugin can’t decide that your chat widget isn’t worth 300 ms of main-thread time, and it won’t notice your hero image is lazy-loaded if the theme sets that up in an unusual way. Stack Overflow is full of people asking how to minify CSS and JavaScript “without breaking the site layout,” or why WordPress keeps serving stale cached CSS. Automated optimization can break layouts, and the person who installed it often can’t tell why.

If you use a plugin, run it on staging first, check your key templates visually on a real phone, and judge it by field data four weeks later, not by the PageSpeed score the next morning.

## Keep the Gains: Budgets, Deploy Tracking, and Monitoring

Core Web Vitals gains erode quietly. Marketing adds a heatmap tool, a new campaign hero ships at 2 MB, a consent platform update injects a banner, and three months later the template fails again. Field data makes this worse. The 28-day window plus publishing delay means a regression can show up in Search Console weeks after the release that caused it. The same lag makes teams declare victory too early after a fix.

Three habits prevent most of the decay:

-   **Performance budgets that block a release.** Treat the thresholds as constraints a release must meet, not goals on a slide. Run Lighthouse CI on pull requests against a few guardrail pages, such as your top product page, a key article template, and a major landing page. A lab check won’t prove field performance, but it catches the 2 MB hero before it merges. Our guide to [continuous performance testing](https://refact.co/insights/digital-product/continuous-performance-testing) covers how to set this up.
-   **Deploy tracking.** Log releases next to your RUM data so a jump in mobile INP points to a specific deploy, not a vague “something changed last month.”
-   **Ongoing field monitoring by template and device.** Review it alongside errors and conversions. A [site monitoring setup](https://refact.co/insights/digital-product/site-watch-web-monitoring-setup) that alerts on real-user slowdowns beats a dashboard nobody opens.

Ownership matters as much as tooling. Fotocasa described its project as starting with performance and ending as a culture change, where “ownership and collaboration mattered more than any single technique.” That is one company’s story, but it matches what we see. Performance holds up when someone owns it in the same meeting where errors and revenue get reviewed.

Redesigns and relaunches carry the most risk, because everything ships at once. When we redesigned [SingularityHub’s publishing platform](https://refact.co/work/singularity-hub), performance was part of the brief from the start, alongside a mobile-first layout and new editorial controls. That is far cheaper than fixing it after launch. If a relaunch is coming, add Core Web Vitals baselines to your [website relaunch playbook](https://refact.co/insights/migration/website-relaunch-playbook) so you can tell whether the new site is faster or just looks newer.

## When to Handle It In-House and When to Get Help

You can probably handle this yourselves if the site has a few templates, one clearly failing metric, and a developer who can own the fix from diagnosis to release. Typical examples are a lazy-loaded hero, a missing ad slot size, or one bloated tag.

Outside help pays off in harder situations. The site has many templates failing for different reasons. INP problems trace back to application code or SPA hydration. A rebuild is already planned and performance needs to be designed in, not patched later. Before you hire anyone, check whether you can name the failing page group and metric, whether one person owns performance, and whether the work ties to a business result this quarter. If you can’t answer two of those, start with a fixed-scope diagnosis, not an open-ended retainer.

The lasting principle is simple. Judge by field data, segment by device and template, and treat the thresholds as a standard every release has to meet. If you want a clear map of which templates fail, why, and what to fix first, our [SEO audit and optimization](https://refact.co/services/seo-audit) work starts with your Search Console and field data, so the fix list comes from your real users.

## FAQ

### What are the current Core Web Vitals thresholds?

A good score is LCP of 2.5 seconds or less, INP of 200 milliseconds or less, and CLS of 0.1 or less. Google checks these at the 75th percentile of real-user visits over a rolling 28-day window, and a page passes only when all three are good. Some teams set tighter internal targets, but Search Console's good band hasn't changed.

### How long does it take for Core Web Vitals fixes to show up in Search Console?

Expect several weeks. Field data uses a 28-day rolling window plus a publishing delay, so a fix shipped today blends in gradually as old visits drop out. Use your own real user monitoring to confirm the change sooner, and don't declare victory from a Lighthouse run the next morning.

### Will improving Core Web Vitals boost my Google rankings?

Probably not by much. Core Web Vitals is a minor ranking signal, and plenty of sites that fail the assessment still rank well because relevance and links matter more. The more dependable payoff is conversions. Nuvemshop, for example, reported an 8.9% conversion lift after raising its pass rate from 48% to 72%.

### Why is my PageSpeed score good but Search Console says my pages fail?

The PageSpeed score comes from one simulated Lighthouse run. Search Console uses real-user field data from slower phones, variable networks, and live third-party scripts. Use the lab run to debug, but let the field data decide whether a problem is fixed.

### Why do Google Fonts, ads, and analytics tags hurt Core Web Vitals?

Fonts can cause layout shift when the real font swaps in after fallback text renders, and they can delay LCP when text is the largest element. Auto-placed ads and consent banners shift the layout unless space is reserved for them. Analytics and tag scripts compete for the main thread, which slows interactions and can delay LCP.

### Can a WordPress plugin fix Core Web Vitals on its own?

Plugins handle mechanical tasks like compression, caching, and deferring scripts well. They can't decide which third-party scripts are worth their cost, and aggressive minification or deferral sometimes breaks layouts. Test on staging, check key templates on a real phone, and judge the result by field data a few weeks later.
