App script overload
Every installed Shopify app adds JS to every page. 20+ apps easily adds 500ms+ of blocking time.
Most Shopify stores fail Core Web Vitals. Third-party app scripts, unsized images, and render-blocking theme code are the three root causes — and all are fixable.
Every installed Shopify app adds JS to every page. 20+ apps easily adds 500ms+ of blocking time.
Product images without width/height attributes cause layout shifts (CLS) on every product page.
Without monitoring, you don't know when a new app install or theme update broke your scores.
Shopify's app ecosystem is its biggest strength for merchants and its biggest performance liability. Every app that promises a popup, review widget, loyalty programme, or personalisation layer adds JavaScript that runs on every page — including pages where the app is irrelevant. A store with 25 installed apps commonly loads 20–30 separate third-party scripts, many of them synchronously in the <head>.
The second problem is product images. Shopify's native image components handle optimisation well, but many Liquid themes and third-party app sections inject images without explicit width and height attributes — meaning the browser doesn't know the size until the image loads, causing a CLS penalty on the product grid.
The third problem is TTFB. Shopify's CDN is fast for cached pages, but uncached requests to dynamic pages (personalised content, cart pages, recently-viewed sections) can have 400–800ms TTFB depending on your theme's server-side rendering complexity.
Open your Shopify admin, go to Apps, and identify every installed app. For each one, ask: is this app actively generating revenue or directly serving customers? If you're unsure, disable it temporarily and monitor your conversion rate. Most stores have 5–10 apps they installed to try and never removed.
Use Chrome DevTools' Network panel to see which third-party scripts are loading on your product pages. Look for scripts from apps that are no longer in use — their scripts often continue loading even after you stop using the app feature, because the Liquid snippet remains in your theme.
The LCP element on a Shopify product page is almost always the main product image. To ensure it loads as fast as possible:
fetchpriority="high" to the main product image tag in your theme's product.liquidimage_tag filter with explicit width and height attributesformat: 'webp' in your image_url filter)theme.liquid's <head> for the first product imageCollection pages are the most common source of CLS on Shopify stores. The product grid loads images without reserved dimensions, then pops into place as each image loads. Fix it by adding an aspect-ratio container to your product card Liquid template:
{% comment %} In your product-card.liquid {% endcomment %}
<div style="aspect-ratio: 1 / 1; overflow: hidden;">
{{- product.featured_image | image_url: width: 600
| image_tag:
widths: '300, 600, 900',
sizes: '(min-width: 768px) 33vw, 100vw',
width: 600, height: 600,
loading: 'lazy'
-}}
</div>
Apps that inject scripts you cannot remove (review widgets, loyalty programmes, live chat) can often be loaded after the page is interactive rather than blocking first paint. In your theme's theme.liquid, move app script tags from <head> to just before </body>, or add defer attribute to scripts that don't need to run before the page renders.
For apps that absolutely must load early (A/B testing, personalisation), check if the vendor provides an async loading option. Many modern Shopify apps have a lightweight async loader that defers heavy logic until after the page is interactive, which reduces TBT significantly.
INP on Shopify stores is most commonly caused by the add-to-cart button triggering a synchronous re-render of the entire cart drawer. When a user clicks "Add to cart", Shopify's AJAX cart API fetches the updated cart state, and then the whole cart drawer re-renders — which can take 200–600ms on themes with complex cart templates.
The fix is to optimise what re-renders on cart update: instead of re-rendering the full cart drawer, update only the quantity count and total price. Many themes and apps do a full drawer refresh unnecessarily.
Shopify performance regressions are sneaky. A new app install, a theme update, or a seasonal campaign asset swap can push your LCP from "Good" to "Poor" overnight. Without continuous monitoring, you'll discover it when conversion data catches up — typically 2–5 days later.
AuditJet runs hourly Lighthouse audits on your Shopify store's key pages — product pages, collection pages, cart — and alerts your team when any metric regresses. Run a free audit to see your current scores.
AuditJet catches performance regressions on product, collection, and checkout pages within hours — before they damage rankings and conversion rates.