Why Your Shopify Store Fails Core Web Vitals
Shopify stores fail Core Web Vitals for a short, predictable list of reasons: app bloat injecting third-party scripts on every page, oversized product and hero images, a heavy premium theme, and synchronous embeds like reviews widgets and chat tools. Unlike a self-hosted stack, the platform itself is rarely the problem. Shopify's own reference theme, Dawn, scores well out of the box. What drags a store down almost always arrives after launch, one app install at a time.
Why Shopify specifically struggles
Shopify's infrastructure handles the thing that sinks most self-hosted sites, server response time, for you. Static assets come off Shopify's own CDN, so a slow Time to First Byte is rarely the culprit here. What is left is everything a merchant adds on top:
- App sprawl. Every installed app can add its own script to the storefront, either injected into
theme.liquiddirectly or delivered through an app embed block, and it typically loads on every page whether it does anything there or not. The usual suspects: upsell and cross-sell widgets, product reviews, personalisation or recommendation engines, live chat, urgency and countdown-timer apps, and social feed embeds. - Unoptimised images. A full-resolution hero banner or product photo, dropped straight into a section without a resizing plan, is the single most common cause of a failing LCP on a Shopify storefront.
- Synchronous third-party embeds. Reviews, chat, and personalisation apps are frequent offenders for blocking render and for inflating INP, since many still load their JavaScript before the browser has painted anything.
- A heavy paid theme. Built-in mega menus, sliders, and animation libraries carry a real cost on every single page load, even on the pages that never use them.
What changed at checkout in 2026
Checkout used to be an exception: checkout.liquid let merchants and apps bolt on arbitrary scripts, for better or worse. That is over. Shopify stopped supporting checkout.liquid, additional scripts, and script tags for the Thank you and Order status pages, with the legacy Liquid file no longer injected into non-Plus storefronts from 1 July 2026. Checkout customisation now runs through Checkout Extensibility (UI extensions, Shopify Functions, a branding API, and Web Pixels), which are sandboxed and cannot block the main thread the way an old inline script could.
That is a genuine performance win, but it also means any app still trying to inject the old way will either break or fall back to Shopify's plain default checkout. If you migrated recently, it is worth confirming nothing quietly reverted.
The fix order that actually works
- Audit installed apps first, and uninstall, do not just disable. Disabling an app can still leave its script live via an app embed block. Go to Theme > Edit code > App embeds and remove anything not delivering a clear return.
- Fix hero and product images. Serve them through Shopify's built-in responsive image handling (the
image_urlfilter with width parameters, or the theme's nativesrcsetoutput), lazy-load anything below the fold, and never hand-place an uncompressed photo straight off a camera roll. - Defer non-critical embeds. Reviews, chat, and social widgets should load after first paint, not synchronously in
<head>. Most app settings panels have a "load after page load" or similar toggle; use it. - Choose a lean theme. Online Store 2.0 reference themes like Dawn ship minimal CSS and JavaScript. A heavy multipurpose theme with everything switched on is a cost you pay on every page, whether you use the feature or not.
- Recheck checkout after the extensibility migration. Confirm your tracking pixels, custom fields, and branding all survived the move, since a broken migration is both a UX regression and a performance one.
How to check whether you actually pass
Use field data, not a single lab run. The Core Web Vitals report in Google Search Console reads from real Chrome user data and groups your URLs as good, needs improvement, or poor. You can also see how your stack compares to others on the HTTP Archive Core Web Vitals Technology Report, filtered by platform, rather than trusting a single number quoted on a blog somewhere.
The takeaway
A Shopify store does not fail Core Web Vitals because Shopify is slow. It fails because of the apps, images, and embeds stacked on top of a fast platform, usually one reasonable-sounding install at a time. Not sure which of your apps is the actual problem? That is exactly what a Core Web Vitals audit rules out, app by app, so you stop guessing which ones to cut.
Frequently asked questions
Why do Shopify stores fail Core Web Vitals if the platform is fast?
Shopify's infrastructure handles server response time well, so the usual causes are added on top: app sprawl injecting third-party scripts on every page, oversized hero and product images, synchronous embeds like reviews and chat widgets, and a heavy paid theme with features running on every page whether they are used there or not.
Will removing apps fix my Core Web Vitals?
Partly, and only if you uninstall rather than disable. A disabled app can still leave its script live through an app embed block. Check Theme > Edit code > App embeds and remove anything not delivering a clear return, not just switch it off in the app's own settings.
Does Shopify checkout speed count toward my Core Web Vitals?
Checkout now runs through Checkout Extensibility rather than the old checkout.liquid script injection, which Shopify stopped supporting for non-Plus stores from 1 July 2026. Focus your Core Web Vitals fixes on the pages you fully control: home, collection, product, and cart.
Do I need a developer to fix Shopify performance issues?
Some fixes are configuration you can do yourself: uninstalling unused apps, toggling app embeds off, compressing images before upload. Theme-level Liquid and JavaScript changes, like deferring scripts in theme.liquid or migrating a hand-pasted tracking snippet to the Web Pixels API, usually need a developer.
Want this done for you and verified against real field data?
Book an audit