Core Web Vitals for Shopify: Complete Guide (2026)
What you can and cannot control on Shopify, and how to fix LCP, INP, and CLS caused by app bloat, heavy themes, and third party scripts.

Shopify stores face unique Core Web Vitals challenges because you cannot control the server, the CDN, or the core JavaScript that Shopify injects on every page. The biggest causes of CWV failure on Shopify are app bloat (installed apps injecting JavaScript globally), unoptimized hero images, third party scripts (reviews, chat widgets, tracking pixels), and heavy themes with excessive features. Despite these constraints, Shopify actually leads WordPress on CWV pass rates because its infrastructure is fast by default.
Last reviewed by Arjen Karel on February 2026

Shopify and Core Web Vitals: A Different Kind of Challenge
Shopify is fundamentally different from WordPress or custom built sites when it comes to Core Web Vitals optimization. On WordPress, you control everything: the server, the database, the caching layer, every line of code. On Shopify, you are working within a managed platform where some things are out of your hands entirely.
Table of Contents!
- Shopify and Core Web Vitals: A Different Kind of Challenge
- What You Cannot Control on Shopify
- The #1 Shopify CWV Problem: App Bloat
- Fixing LCP on Shopify
- Fixing INP on Shopify
- Fixing CLS on Shopify
- Shopify Theme Selection and Performance
- What Shopify Does Well by Default
- Monitoring Your Shopify Store
- Shopify Core Web Vitals FAQ
According to the Core Web Vitals Technology Report, Shopify leads WordPress on mobile CWV pass rates (around 65% vs 44% as of late 2025). This is because Shopify's infrastructure is excellent by default: fast servers, a global CDN via Cloudflare, automatic image format conversion, and pre optimized base themes. The platform handles the server side well.
The problems come from what merchants add on top: apps, third party scripts, custom theme modifications, oversized images, and excessive font loading. That is where Shopify stores fail Core Web Vitals. And because you have limited access to the server and core code, your optimization strategy must be different.
Shopify Core Web Vitals by the Numbers
Shopify ranks #2 overall on the CrUX Technology Report for Core Web Vitals pass rates, behind only Duda (a less widely used platform). Here is the full picture from CrUX and independent benchmark data:
| Metric | Shopify (CrUX) | WordPress (CrUX) | Web Average |
|---|---|---|---|
| Overall CWV pass (mobile) | ~65% | 43.4% | 48% |
| Good INP | 89.5% | 85.9% | ~87% |
| Median mobile LCP* | 2.26s | ~3.4s | ~2.9s |
| Median CLS* | 0.01 | ~0.08 | ~0.06 |
Sources: CrUX Technology Report (June 2025), SearchEngineJournal CMS analysis, Shero Commerce 1,000 store benchmark (Nov 2025). *Median values from Shero benchmark, not CrUX p75.
The Shero Commerce benchmark of 1,000 real Shopify stores found that only 48% pass all three Core Web Vitals on mobile. That is lower than the CrUX Technology Report shows for Shopify overall, which suggests the stores that appear in CrUX (requiring sufficient Chrome traffic) are biased toward larger, better optimized stores. The median mobile LCP of 2.26 seconds hovers dangerously close to the 2.5 second "good" threshold, meaning even small additions (one more app, one unoptimized hero image) can push a store from passing to failing.
The bright spot: Shopify's median CLS of 0.01 is excellent, and the median INP of 153ms is comfortably within the good range. LCP is the metric where Shopify stores live or die on Core Web Vitals.
CoreDash real user data from Shopify stores confirms this pattern. The stores that fail CWV almost always fail on LCP. Stores loading more than 8 third party app scripts show a median mobile LCP above 3.0 seconds. Stores with 3 or fewer app scripts maintain a median LCP under 2.0 seconds. The correlation between installed app count and LCP is the strongest predictor of Shopify CWV failure we see in the data.
What You Cannot Control on Shopify
Before optimizing, understand the constraints. On Shopify, you cannot:
- Change the server or hosting. Shopify runs on its own infrastructure. You cannot switch to a faster host, configure server level caching, or adjust PHP settings. The good news: Shopify's TTFB is generally excellent (under 300ms for most regions).
- Remove
content_for_header. Shopify injects mandatory JavaScript into every page through this Liquid tag. It includes Shopify's own analytics, checkout scripts, and app loading infrastructure. You cannot remove or defer it. - Control the CDN. Shopify uses Cloudflare as its CDN. You cannot configure caching rules, edge workers, or custom headers the way you would on your own Cloudflare setup.
- Access the database or backend code. Shopify's Liquid templating language runs server side, but you cannot optimize database queries or server side rendering beyond what Liquid provides.
This means your entire optimization strategy focuses on what you can control: your theme code, your installed apps, your images, your fonts, and your third party scripts.
The #1 Shopify CWV Problem: App Bloat
Installed Shopify apps are the single biggest cause of Core Web Vitals failure on Shopify stores. Every app can inject JavaScript and CSS onto every page of your store, even pages where that app is not used. A review app loading on your homepage. A product recommendation widget loading on your contact page. A countdown timer loading on every product page even when no sale is active.
How Apps Inject Code
Shopify apps inject code in several ways, and this matters for cleanup:
- App Embeds (theme editor): these can be toggled off in the theme editor under "App Embeds." This is the cleanest method and easiest to manage.
- Theme snippets: some apps add code directly to your theme files during installation. Uninstalling the app may not remove this code. You need to manually check
snippets/andsections/for leftover files. - ScriptTag API: apps can inject scripts programmatically without touching theme files. These load via Shopify's
content_for_header. Uninstalling the app removes them, but the script may be cached. - Third party loaders: some apps load external JavaScript from their own CDN, creating additional DNS lookups and network requests.
The App Audit Process
Here is how I audit Shopify apps for performance impact:
- Run your homepage, a product page, a collection page, and the cart page through PageSpeed Insights. Record the LCP, INP, and CLS scores.
- Open Chrome DevTools and go to the Coverage tab. Reload the page and look at the unused JavaScript percentage. On bloated Shopify stores, 60% to 80% of loaded JavaScript goes unused on any given page.
- Check the Network tab filtered by JavaScript. Sort by size. Identify which scripts come from apps versus your theme. The "Initiator" column tells you what loaded each script.
- Disable apps one at a time (or toggle off their App Embeds) and re test. Measure the INP and LCP impact of each app individually.
- For each app, decide: is the business value worth the performance cost? Can it be replaced with a lighter alternative? Can it be loaded only on specific page types?
CoreDash data from Shopify optimization projects shows the typical impact of app cleanup: removing a single unnecessary review widget script improved median INP by 45ms on one store. Removing three unused apps (a previously disabled popup tool, a loyalty program, and a defunct chat widget) reduced total page JavaScript by 380KB and improved mobile LCP by 1.1 seconds. The lesson: audit ruthlessly. Every app you no longer actively use is free performance waiting to be reclaimed.
Fixing LCP on Shopify
On Shopify stores, the LCP element is almost always the hero banner image on the homepage, the featured product image on product pages, or the collection banner on collection pages. Shopify's CDN automatically serves images in WebP format, which helps. But there are several optimizations you need to handle yourself.
Preload the Hero Image
Shopify themes often load hero images via CSS background or lazy load them, which delays LCP significantly. The fix: add a preload hint in your theme's theme.liquid file and set fetchpriority="high" on the hero <img> tag.
In Liquid, you can conditionally preload the hero for the homepage:
{%- if template == 'index' -%}
<link rel="preload" as="image" href="{{ section.settings.hero_image | image_url: width: 1200 }}" fetchpriority="high">
{%- endif -%} For the full LCP image preloading strategy, see how to preload the LCP image.
Do Not Lazy Load Above the Fold
Many Shopify themes apply loading="lazy" to all images, including the hero. This tells the browser to deprioritize the most important image on the page. Ensure your theme excludes above the fold images from lazy loading. For modern themes using Shopify's image_tag filter, use loading: 'eager' for hero images.
Optimize Image Sizes
Shopify's CDN can resize images on the fly using URL parameters, but your Liquid templates need to request the right size. Do not load a 2000px wide image when it only displays at 800px. Use Shopify's responsive image markup with proper srcset and sizes attributes. See our guide on optimizing images.
Fixing INP on Shopify
INP failures on Shopify are almost entirely caused by JavaScript blocking the main thread. Shopify's own content_for_header injection already adds baseline JavaScript you cannot remove. Everything you add on top compounds the problem.
Delay Non Critical Third Party Scripts
Chat widgets (Tidio, Zendesk, Intercom), review apps (Judge.me, Yotpo, Loox), personalization tools (Klaviyo popups, Privy), and analytics (Google Analytics, Facebook Pixel, Hotjar) should all be delayed until the first user interaction. This means they load after the user scrolls, clicks, or taps for the first time.
You can implement this by replacing the src attribute with data-src and then swapping it back on the first interaction event:
<script>
(window.requestIdleCallback || function(cb) { setTimeout(cb, 1); })(function() {
document.querySelectorAll('script[data-src]').forEach(function(s) {
s.src = s.dataset.src;
});
});
</script> This loads deferred scripts only when the browser's main thread is idle, so they never compete with rendering or user interactions. The setTimeout fallback covers Safari, which does not support requestIdleCallback. No interaction listeners needed.
For more JavaScript deferral strategies, see 14 methods to defer JavaScript.
Reduce Theme JavaScript
Shopify's Online Store 2.0 themes (like Dawn) are built to be lean, but many third party themes add heavy JavaScript for mega menus, product sliders, quick view modals, and animations. Audit your theme's JavaScript using Chrome DevTools Coverage tab. If your theme loads more than 200KB of JavaScript, look for features you can disable or replace with CSS alternatives.
Fixing CLS on Shopify
Cumulative Layout Shift on Shopify stores is typically caused by three things: images without dimensions, font swapping, and dynamically injected content from apps.
Set Image Dimensions in Liquid Templates
Check your Liquid templates for <img> tags that are missing width and height attributes. Shopify's image_tag filter can output these automatically:
This generates responsive images with proper dimensions, preventing layout shift as images load.
Reserve Space for Dynamic Content
App embeds that inject review stars, trust badges, countdown timers, or announcement bars after page load cause CLS. For each dynamic element, reserve space with CSS min-height so surrounding content does not shift when the element appears. This is especially important for elements injected above existing content.
Optimize Font Loading
If your Shopify theme loads custom web fonts, ensure they use font-display: swap with a well matched fallback font. Preload your primary font files to reduce the time before text renders in the correct font. Only load the font weights and styles you actually use. See our guide on font optimization.
Shopify Theme Selection and Performance
Your theme choice sets the performance baseline for your store. The ThemeVitals project tracks real world CrUX data for Shopify themes. Key findings:
- Dawn (Shopify's default free theme) consistently performs well on Core Web Vitals because it was built with performance as a priority.
- Themes with many sections, animations, and built in features (mega menus, product quick view, AJAX cart drawers) tend to have more JavaScript and worse INP.
- Online Store 2.0 themes are generally faster than legacy themes because they use Shopify's modern section architecture and asset loading.
If you are choosing a new theme, check its CrUX data on ThemeVitals before purchasing. The cheapest performance optimization is starting with a fast theme.
What Shopify Does Well by Default
It is worth recognizing what Shopify handles for you automatically:
- Fast infrastructure: Shopify's servers and Cloudflare CDN deliver consistently low TTFB globally.
- Automatic WebP: Shopify's CDN converts images to WebP format automatically when the browser supports it.
- HTTP/2 and Brotli: enabled by default on all Shopify stores.
- Image CDN with on the fly resizing: you can request any image at any width via URL parameters.
- Preconnect hints: Shopify adds preconnect hints for its CDN domains automatically.
These defaults are why Shopify's baseline performance is good. Your job is to not undo these advantages with excessive apps and scripts.
Monitoring Your Shopify Store
Shopify's admin dashboard includes a "Speed Score" but this is a simplified Lighthouse based number that does not represent your real Core Web Vitals. For actual performance monitoring:
- Google Search Console: check the Core Web Vitals report for field data across your entire store
- CoreDash: install the lightweight RUM snippet (one line of code in theme.liquid) to get real time Core Web Vitals data broken down by page type, device, and country
- PageSpeed Insights: test individual product, collection, and homepage URLs for diagnostic data
Monitor after every app installation, theme update, and seasonal campaign launch. Performance regressions on Shopify are almost always caused by something that was recently added.
CoreDash monitoring data shows that the most common cause of Shopify CWV regression is a new app installation that injects JavaScript globally. On average, a new Shopify app adds 50KB to 150KB of JavaScript to every page load. For a store that is right at the LCP threshold (2.3 to 2.5 seconds), a single app installation can push it over the edge. The second most common cause is seasonal changes: Black Friday campaign banners, holiday popups, and promotional countdown timers that are added for a sale event and then forgotten.
CrUX data is 28 days late.
Google provides data 28 days late. CoreDash provides data in real-time. Debug faster.
- Real-Time Insights
- Faster Debugging
- Instant Feedback
Shopify Core Web Vitals FAQ
Does Shopify hosting affect Core Web Vitals?
Shopify's hosting actually works in your favor. The platform runs on fast servers with a global Cloudflare CDN, delivering consistently low Time to First Byte (usually under 300ms). Unlike WordPress where hosting is often the primary bottleneck, on Shopify the infrastructure is solid by default. Your Core Web Vitals challenges come from what you add on top: apps, third party scripts, and theme customizations.
How many Shopify apps are too many for Core Web Vitals?
There is no fixed number, because the impact depends on how each app injects its code. A single poorly coded review app can hurt performance more than ten lightweight utility apps. The key question is: how much JavaScript does each app add to each page? Audit your apps by disabling them one at a time and measuring the impact on INP and LCP in PageSpeed Insights. Remove apps you no longer use, and check your theme files for leftover code from previously uninstalled apps.
Can I achieve good Core Web Vitals on Shopify without a developer?
You can make significant improvements without a developer: choose a performance focused theme like Dawn, remove unused apps, compress product images before uploading, limit the number of web fonts, and turn off unnecessary theme features like animations and sliders. However, advanced optimizations like modifying Liquid templates, deferring third party scripts, and implementing preload hints typically require development expertise or a Shopify performance specialist.
Why does my Shopify Speed Score differ from Core Web Vitals?
Shopify's Speed Score in the admin dashboard is based on Lighthouse lab data from a single simulated visit. Core Web Vitals in Google Search Console use field data from real Chrome users over a 28 day rolling window. These numbers can differ significantly because real users have different devices, network speeds, and interaction patterns than the Lighthouse simulation. Always prioritize your Search Console Core Web Vitals report over the Shopify Speed Score for SEO purposes.

