Core Web Vitals for online stores: LCP, INP and CLS explained
What LCP, INP and CLS measure, the good and poor thresholds at the 75th percentile, lab vs field data, and the usual fixes on Shopify and WooCommerce stores.
FixReports editorial team12 min read
Core Web Vitals are three Google metrics that describe how real visitors experience a page: Largest Contentful Paint (LCP) for loading, Interaction to Next Paint (INP) for responsiveness, and Cumulative Layout Shift (CLS) for visual stability. A page passes when at least 75% of visits are in the "good" range: LCP within 2.5 seconds, INP within 200 milliseconds and CLS of 0.1 or less, measured separately for mobile and desktop. On online stores, failing scores usually trace back to large or lazy-loaded hero and product images, app and tracking scripts, web fonts, and banners or review widgets that push content down after the page appears.
Key points
- Good, needs improvement and poor are judged at the 75th percentile of page loads: LCP poor is over 4 seconds, INP poor is over 500 ms, CLS poor is over 0.25 (web.dev (opens in a new tab)).
- INP replaced First Input Delay (FID) as a Core Web Vital on March 12, 2024 (web.dev (opens in a new tab)).
- Chrome UX Report field data is a rolling 28-day average and does not include Chrome on iOS (Chrome for Developers (opens in a new tab)).
- Shopify's
image_tagfilter loads images eagerly in the first three sections of a template and lazily from the fourth section on, unless you override it (Shopify (opens in a new tab)). - Since WordPress 6.3, core adds
fetchpriority="high"to the image it judges most likely to be the LCP element (Make WordPress Core (opens in a new tab)).
What are the Core Web Vitals thresholds?
A page meets the Core Web Vitals when the 75th percentile of its page loads falls in the good range for all three metrics.
| Metric | What it measures | Good | Needs improvement | Poor |
|---|---|---|---|---|
| LCP | Time until the largest image, video or text block in the viewport renders | 2.5 s or less | Over 2.5 s up to 4.0 s | Over 4.0 s |
| INP | Time from a click, tap or key press until the next frame is painted | 200 ms or less | Over 200 ms up to 500 ms | Over 500 ms |
| CLS | How much visible content moves unexpectedly | 0.1 or less | Over 0.1 up to 0.25 | Over 0.25 |
Thresholds are from web.dev's LCP (opens in a new tab), INP (opens in a new tab) and CLS (opens in a new tab) guides, as of October 2026.
The 75th percentile means the result reflects most visitors, not just the fastest, and Google segments mobile and desktop (opens in a new tab). PageSpeed Insights passes a page when all three metrics are good; without enough INP data, it judges LCP and CLS alone (PageSpeed Insights docs (opens in a new tab)). Google says stable Core Web Vitals won't change more than once per year.
On a store, the LCP element is often the hero banner or the main product image, which is why image handling matters so much.
Why did INP replace FID in March 2024?
INP replaced FID because FID measured only the first interaction and only part of its delay, while INP looks at interactions across the whole visit.
Google announced in May 2023 that INP would become a Core Web Vital, and the switch took effect on March 12, 2024 (opens in a new tab). FID reported only the first interaction, and only its input delay, not the time spent running event handlers or painting the result. INP observes clicks, taps and key presses for the whole visit and reports the longest one, ignoring outliers; scrolling and hovering don't count. Users of the CrUX and PageSpeed Insights APIs had until September 9, 2024 to switch (web.dev (opens in a new tab)).
Each interaction has three parts: input delay (waiting for busy scripts), processing duration (running the handlers) and presentation delay (painting the next frame) (web.dev (opens in a new tab)).
On a store, those interactions are the variant picker, quantity buttons, add to cart, cart drawer, filters and menus. A page could pass FID on a quick first tap and still feel slow when someone opens the filters later.
What is the difference between lab data and field data?
Lab data comes from one test under fixed conditions, while field data is collected from real visitors over time, and Google recommends using field data to decide what to fix first (web.dev (opens in a new tab)).
| Lab data | Field data | |
|---|---|---|
| Source | One simulated page load (Lighthouse, Chrome DevTools, the lab section of PageSpeed Insights) | Real Chrome visitors (Chrome UX Report), or your own real user monitoring |
| Conditions | Fixed device and network. Lighthouse's default mobile test (opens in a new tab) uses "Slow 4G" (150 ms round trip, 1.6 Mbps down) and a 4x CPU slowdown | Whatever devices, networks and locations your visitors have |
| INP | Not measured on a plain page load. Total Blocking Time (TBT) is a rough proxy | Measured from real interactions |
| Best for | Debugging and checking a change before release | Knowing what visitors actually get |
TBT adds up the part of each main-thread task beyond 50 ms; web.dev suggests under 200 ms on average mobile hardware but says it is no substitute for INP (web.dev (opens in a new tab)).
Three details of the Chrome UX Report (CrUX) matter for stores:
- It is a 28-day rolling average (opens in a new tab), updated daily.
- It covers Chrome on desktop and Android for users who meet Chrome's reporting conditions. Chrome on iOS is excluded, so a store with mostly iPhone shoppers sees field data from only part of its audience (methodology (opens in a new tab)).
- Pages and origins appear only when they are publicly discoverable and popular enough, so a low-traffic store may have origin-level data only, or none.
Shopify's web performance dashboard (opens in a new tab) also reports real-user LCP, INP and CLS at the 75th percentile, over 30 days rather than 28, so expect some differences from CrUX.
What slows down LCP on store pages?
LCP is usually slow on stores because the main image is too heavy, discovered late, or deliberately delayed by lazy loading or an animation.
- Lazy-loading the LCP image. web.dev says never to do this (web.dev (opens in a new tab)). Its analysis of WordPress pages found slower 75th-percentile LCP on sites using native lazy loading, and not lazy-loading above-the-fold images removed the regression (web.dev (opens in a new tab)).
- An image found late. A hero set as a CSS
background-image, or injected by a slider script, is not in the HTML the browser first scans. Shopify advises against CSS backgrounds for hero content and fade-in effects on the LCP image (Shopify (opens in a new tab)). - Low priority. Images load at low priority until layout is complete, so Shopify recommends
fetchpriority="high"on the LCP image (Shopify (opens in a new tab)). web.dev notes that setting it on more than one or two images reduces its usefulness (web.dev (opens in a new tab)). - Render-blocking CSS and scripts. Large stylesheets and synchronous scripts in the
<head>delay rendering even after the image arrives (web.dev (opens in a new tab)). - File size and fonts. Use modern formats,
srcsetandsizes, and a CDN. For web fonts, use afont-displayvalue other thanautoorblock.
<!-- Main product image: real src in the HTML, eager, high priority -->
<img src="/images/linen-shirt-1200.webp"
srcset="/images/linen-shirt-600.webp 600w, /images/linen-shirt-1200.webp 1200w"
sizes="(min-width: 990px) 50vw, 100vw"
width="1200" height="1500"
fetchpriority="high"
alt="Natural linen shirt, front view">
<!-- Gallery images below the first screen: lazy -->
<img src="/images/linen-shirt-back-600.webp" loading="lazy"
width="600" height="750" alt="Natural linen shirt, back view">
What makes INP slow on store pages?
Slow INP on stores usually means too much JavaScript on the main thread, much of it from apps, tracking tags and theme features, so taps have to wait.
If a shopper taps "Add to cart" while review, chat and analytics scripts are still running, the tap waits. A variant picker that re-renders the whole product form adds processing time. Huge mega menus and collection grids with many swatches add presentation delay.
web.dev recommends breaking up long tasks and yielding to the main thread, updating the screen first and deferring the rest, and keeping the DOM smaller (web.dev (opens in a new tab)). Shopify adds store-specific steps: audit every app, pixel and theme script, defer what isn't critical, load features on interaction, and turn off A/B testing anti-flicker snippets when no test is running (Shopify (opens in a new tab)).
What causes layout shifts on product and collection pages?
Layout shifts on stores mostly come from content that appears or resizes after the first render: images without dimensions, announcement and cookie bars, review widgets, app blocks and font swaps.
web.dev lists the common causes as media with unknown dimensions, content added above existing content, third-party widgets that resize themselves, and web fonts that differ in size from their fallback (web.dev (opens in a new tab)). On stores that means a free-shipping bar inserted at the top, star ratings that load after the title, installment messaging under the price, and recommendation carousels. Shopify notes that pop-up content can also cause shifts (Shopify (opens in a new tab)).
Shifts within 500 ms of a user's input don't count, but shifts while scrolling do, and lab tools often miss them (web.dev (opens in a new tab)). Give images width and height or a CSS aspect-ratio, reserve space for widgets, show banners as overlays, reduce font swap shifts with size-adjust, and animate with transform rather than top or left.
/* Reserve space for a reviews summary that loads after the page */
.product-reviews-summary { min-height: 24px; }
/* Keep product cards from jumping while images load */
.product-card img { width: 100%; height: auto; aspect-ratio: 4 / 5; }
How do you improve Core Web Vitals on Shopify?
On Shopify, most gains come from loading the first image eagerly with high priority, trimming app scripts, and checking the result in the admin's web performance reports.
Check the data in your admin
A summary appears on the Online Store > Themes page, and full LCP, INP and CLS reports are under Analytics > Reports. The data can be delayed by up to 36 hours, and private mode must be off (Shopify Help Center (opens in a new tab)).
Control image loading in Liquid
The image_tag filter lazy-loads images in sections further down the page unless you set preload (image_tag reference (opens in a new tab)): eager for sections 1 to 3, lazy from section 4. Because section.index is nil in the theme editor, test with > 3 rather than <= 3:
{%- if section.index == 1 -%}
{{ section.settings.image | image_url: width: 1600 | image_tag: loading: 'eager', fetchpriority: 'high', widths: '600, 900, 1200, 1600', sizes: '100vw' }}
{%- elsif section.index > 3 -%}
{{ section.settings.image | image_url: width: 1600 | image_tag: loading: 'lazy', sizes: '100vw' }}
{%- else -%}
{{ section.settings.image | image_url: width: 1600 | image_tag: sizes: '100vw' }}
{%- endif -%}
In product grids, Shopify suggests eager loading only the first few cards (for example forloop.index <= 4) (Shopify (opens in a new tab)). Use preload: true sparingly; Shopify recommends preloading only one or two late-discovered resources.
Remove what apps leave behind
Turn off unused app embeds under Online Store > Edit theme > App embeds (Shopify Help Center (opens in a new tab)). Uninstalling an app removes its app blocks, but apps that edited theme files directly can leave "ghost code" that Shopify says can cause quality and performance issues (Shopify (opens in a new tab)). Shopify also says script tags will stop running on March 1, 2027. For fonts, Shopify recommends its own CDN or system fonts over external font services (Shopify (opens in a new tab)).
How do you improve Core Web Vitals on WooCommerce?
On WooCommerce, make sure plugins don't override WordPress's image prioritization, cache everything except cart and checkout, and remove scripts that load everywhere without need.
- Keep core's image handling. Since WordPress 6.3 (released August 8, 2023), core adds
fetchpriority="high"to the likely LCP image (at least 50,000 square pixels by default) and skips lazy loading for the first three content images (Make WordPress Core (opens in a new tab)). If an optimization plugin adds its own lazy loading, check that it excludes the hero and the main product image. - Cache pages, not carts. WooCommerce's guide recommends server or plugin page caching and a CDN, while keeping cart and checkout pages uncached (WooCommerce developer docs (opens in a new tab)).
- Check cart fragments. Since WooCommerce 7.8, the cart fragments script loads only where a Cart widget is present, but some themes hard-code that widget. The Mini-Cart block does not use cart fragments (WooCommerce developer blog (opens in a new tab)).
- Find heavy plugins. WooCommerce suggests Query Monitor to find slow plugins, and deferring non-critical JavaScript.
If your layout shows more than three images above the fold, you can raise WordPress's threshold:
// functions.php: skip lazy loading for the first 4 content images (default is 3)
add_filter( 'wp_omit_loading_attr_threshold', function () {
return 4;
} );
How long does it take for fixes to show up?
Lab tests show the effect of a fix right away, but field data needs up to about four weeks to reflect it fully, because CrUX averages the previous 28 days.
Run the lab test several times before and after a change, because single runs vary, then watch field numbers in PageSpeed Insights, Search Console's Core Web Vitals report or Shopify's reports. A free scan gives a first read in about a minute. The Performance Fix Report runs a throttled mobile lab test (slow 4G, 4x CPU) and adds Chrome UX Report field data, including INP when Google has enough data for your store.
Frequently asked questions
Do Core Web Vitals affect Google rankings?
Google says Core Web Vitals are used by its ranking systems, but that good scores do not guarantee top rankings and that it still shows the most relevant content even when page experience is poor (Google Search Central (opens in a new tab)).
Why does PageSpeed Insights show no field data for my store?
CrUX includes only pages and origins that are publicly discoverable and have enough eligible Chrome visitors. A low-traffic store may have origin-level data only, or none, so rely on lab tests and your platform's own reports.
Do I need a Lighthouse score of 90 or more to pass?
No. The Lighthouse performance score is a lab result, while the Core Web Vitals assessment uses field data at the 75th percentile, so a page can pass with a modest Lighthouse score and fail with a high one.
Should I lazy-load all product images?
No. Lazy-load images below the first screen, but load the hero and main product image eagerly, with fetchpriority="high" on one of them.
Why are my mobile results worse than desktop?
Google measures mobile and desktop separately, and phones have slower processors and networks. Lighthouse's mobile test simulates that with a Slow 4G profile and a 4x CPU slowdown.
Sources
- Web Vitals (opens in a new tab), web.dev (Google), updated October 31, 2024
- Largest Contentful Paint (LCP) (opens in a new tab), web.dev, updated September 4, 2025
- Interaction to Next Paint (INP) (opens in a new tab), web.dev, updated September 2, 2025
- Cumulative Layout Shift (CLS) (opens in a new tab), web.dev, updated April 12, 2023
- Advancing Interaction to Next Paint (opens in a new tab), web.dev, May 10, 2023
- Interaction to Next Paint becomes a Core Web Vital on March 12 (opens in a new tab), web.dev, March 12, 2024
- Why lab and field data can be different (opens in a new tab), web.dev, updated July 18, 2022
- Optimize Largest Contentful Paint (opens in a new tab), web.dev, updated March 31, 2025
- Optimize Interaction to Next Paint (opens in a new tab), web.dev, updated September 2, 2025
- Optimize Cumulative Layout Shift (opens in a new tab), web.dev, updated February 7, 2025
- Total Blocking Time (TBT) (opens in a new tab), web.dev, accessed October 22, 2026
- The performance effects of too much lazy loading (opens in a new tab), web.dev, updated March 31, 2022
- CrUX methodology (opens in a new tab), Chrome for Developers, updated June 20, 2024
- CrUX API (opens in a new tab), Chrome for Developers, updated October 13, 2026
- About PageSpeed Insights (opens in a new tab), Google for Developers, updated October 21, 2024
- Lighthouse throttling documentation (opens in a new tab), GoogleChrome on GitHub, accessed October 22, 2026
- Understanding page experience in Google Search results (opens in a new tab), Google Search Central, updated September 22, 2026
- Performance best practices for Shopify themes (opens in a new tab), Shopify, accessed October 22, 2026
- Never lazy load the LCP image (opens in a new tab), Shopify, accessed October 22, 2026
- Set fetchpriority high on the LCP image (opens in a new tab), Shopify, accessed October 22, 2026
- Liquid filters: image_tag (opens in a new tab), Shopify, accessed October 22, 2026
- Web performance dashboard (opens in a new tab), Shopify Help Center, accessed October 22, 2026
- Web performance (opens in a new tab), Shopify Help Center, accessed October 22, 2026
- Apps in your theme (opens in a new tab), Shopify Help Center, accessed October 22, 2026
- Migrate to theme app extensions (opens in a new tab), Shopify, accessed October 22, 2026
- Image performance enhancements in WordPress 6.3 (opens in a new tab), Make WordPress Core, July 13, 2023
- Version 6.3 (opens in a new tab), WordPress.org documentation, release dated August 8, 2023
- How to optimize performance for WooCommerce stores (opens in a new tab), WooCommerce developer docs, accessed October 22, 2026
- Best practices for the use of the cart fragments API (opens in a new tab), WooCommerce developer blog, June 16, 2023
All guides
- Accessibility overlays and the FTC's accessiBe order: what store owners should knowThe FTC's 2025 order made accessiBe pay $1 million over WCAG compliance claims. What the order says, what it doesn't, and what stores using overlays should do.
- Got an ADA website demand letter? What to check firstWhat ADA website demand letters usually allege, how WCAG fits in, what to gather, why overlays don't fix code, and when to call a lawyer. Not legal advice.
- Product page checklist: what stops shoppers from buyingA product page checklist based on Baymard and WebAIM research: price, shipping and returns, images, reviews, mobile add to cart, pop-ups, search, keyboard use.