The three things actually slowing down your Shopify theme
Most Shopify speed audits end in a long list nobody actions. In practice three issues cause the majority of Core Web Vitals failures, and two of them are not in your theme code at all.
Shopify store speed reports tend to produce forty recommendations, and the merchant actions none of them. Having done this work across storefronts and an AMP implementation, the distribution is heavily skewed: three problems account for most of the damage, and the biggest one is usually not in the theme code.
1. App-injected scripts
Every app a merchant installs can inject script tags into the storefront. Uninstalling the app does not always remove them. A store that has trialled a dozen apps over two years often ships several hundred kilobytes of JavaScript for features nobody uses any more, and it blocks the main thread, which is what INP measures.
- Audit the rendered page source for script tags that no live feature depends on.
- Check for leftover ScriptTag API entries from apps that were removed.
- Load anything non-critical, such as chat widgets and review widgets, after interaction or on idle.
- Consolidate tracking through a single tag manager rather than five separate snippets.
Before optimizing a single line of Liquid, open the page source on a product page and count the third-party script tags. That number is usually the story.
2. The hero image, which is nearly always the LCP element
On the majority of storefronts the Largest Contentful Paint element is the first banner or the product image. Getting that one image right moves the score more than everything else combined.
{{ section.settings.hero
| image_url: width: 1600
| image_tag:
loading: 'eager',
fetchpriority: 'high',
sizes: '100vw',
widths: '400, 600, 800, 1200, 1600',
alt: section.settings.hero.alt
}}Three details matter here and are commonly missed. The hero must not be lazy-loaded, because lazy loading the LCP element delays the exact thing being measured. It should carry fetchpriority high so the browser fetches it ahead of other resources. And widths plus sizes must be present so mobile does not download a desktop-sized file.
3. Layout shift from images and fonts without reserved space
CLS is almost always images without width and height attributes, web fonts swapping in at a different metric, or content injected above the fold after paint. Each is straightforward once identified.
- Set explicit width and height, or an aspect-ratio, on every image so the browser reserves the box before the file arrives.
- Use font-display swap with a fallback stack chosen for similar metrics, or preload the primary font.
- Never inject banners or announcement bars above existing content after first paint. Reserve the space in the initial HTML.
Measure field data, not just Lighthouse
Lighthouse runs a simulated load on a synthetic device. Google ranks on the Chrome UX Report, which is real visitors on real connections. A store can score in the nineties in Lighthouse and still fail Core Web Vitals in the field. Check the CrUX data in Search Console before deciding the work is done.
Where AMP still fits
AMP is no longer required for the mobile search carousel, so it is rarely worth adopting for SEO alone in 2026. Its constraints remain a useful teacher, though: the reason AMP pages felt fast was a hard cap on third-party JavaScript. Applying that same discipline to a normal theme gets most of the benefit without the format.