E-commerce

Shopify Speed Optimization Without Breaking Your Theme

Shopify handles your hosting, your CDN and your checkout. Everything still slow after that is something you or an app installed — which is good news, because it means it is all fixable.

Shopify gives every store a decent starting position. Global CDN, managed hosting, an optimised checkout, image transformation built into the CDN. A stock Dawn theme with no apps scores in the high 80s on mobile.

Then a real store gets built on it, and six months later the same URL scores 31. Nothing Shopify did changed. Here is what did.

What the Shopify speed score does and doesn't tell you

The speed score in your Shopify admin is a weighted Lighthouse average across your home page, your most-visited product page and your most-visited collection page. It updates roughly daily and it is genuinely useful as a trend line.

What it is not: a measurement of real customers. For that you need field data — PageSpeed Insights on a live product URL, or Search Console's Core Web Vitals report. Stores routinely have a respectable admin score and failing field data, because the admin score does not measure INP and does not test on a real mid-range phone on 4G.

Test the right page

Most stores obsess over the home page. Most revenue enters through product pages from ads and search. Benchmark your top three product URLs first — that is where a lost second costs money.

Apps: the single biggest cost on most stores

Every Shopify app that touches the storefront injects scripts into your theme. Uninstalling the app from admin does not reliably remove that code — leftover snippets in theme.liquid, orphaned <script> tags, and dead app blocks stay behind and keep loading.

The audit, in order:

  1. List every installed app and write next to each one what it does and where it appears. Anything you cannot answer for is a candidate.
  2. Open your store in Chrome DevTools, Network tab, filter to JS, sort by size. Third-party domains you do not recognise are apps.
  3. Search your theme code for leftovers. In the code editor, check theme.liquid, layout/ and any snippet with a vendor name in it.
  4. Remove one app at a time. Duplicate the theme first. Test add-to-cart and checkout after every single removal.

Typical finding on a store that has been trading for two years: 14 apps installed, 5 actively used, 3 leaving code behind after uninstall. Removing the dead weight is often worth a full second on mobile with zero design change.

App categoryTypical storefront costUsually worth keeping?
Page buildersHeavyOnly if you use it weekly
Review widgetsMedium–HeavyYes — but load below the fold
Live chatMediumYes if staffed; defer it
Pop-ups / email captureMediumOne, not three
Upsell / bundlesMediumMeasure the revenue it adds
Currency convertersLight–MediumShopify Markets does this natively
Analytics / heatmapsMediumOnly if someone reads them
WishlistLightCheck usage data first

Images and the product page problem

Shopify's CDN will resize and convert images for you, but only if the theme asks it to. Older themes and custom sections frequently do not.

<!-- Serves the original upload, whatever size that is -->
<img src="{{ product.featured_image | img_url: 'master' }}">

<!-- Serves the right size, WebP, with dimensions reserved -->
<img src="{{ product.featured_image | image_url: width: 800 }}"
     srcset="{{ product.featured_image | image_url: width: 400 }} 400w,
             {{ product.featured_image | image_url: width: 800 }} 800w,
             {{ product.featured_image | image_url: width: 1200 }} 1200w"
     sizes="(min-width: 750px) 50vw, 100vw"
     width="800" height="800"
     alt="{{ product.featured_image.alt | escape }}"
     loading="eager" fetchpriority="high">

Three specific product-page mistakes worth checking today:

  • The main product image is lazy-loaded. It is the LCP element. It should be loading="eager" with fetchpriority="high". Every other gallery image should be lazy.
  • The full gallery loads at full resolution on mobile. Eight 2000 px images for a 390 px-wide screen.
  • Zoom libraries load upfront. Load them on first interaction with the image instead.

Theme code: the four edits worth making

You do not need to rewrite a theme to get most of the available gain. Four edits, in theme.liquid and your section files:

  • Preload the LCP image on your home and product templates.
  • Add defer to every custom <script> that is not required for first paint. Shopify's own scripts are already handled.
  • Cut your font weights. A theme requesting Regular, Medium, SemiBold, Bold and their italics, using two of them, is normal — and each unused weight is a file.
  • Remove unused sections and their assets. The slideshow you disabled in the customiser often still ships its CSS and JS.

Then check settings_data.json for sections that are disabled but still loading, and delete abandoned custom CSS blocks from the theme settings — they render inline on every page.

See your own numbers in 30 seconds

The free Softshelf audit runs your URL through Google's own PageSpeed data and returns your performance, SEO and accessibility scores plus the specific elements slowing the page down. No signup, no sales call.

Reviews, chat, pixels and pop-ups

These four categories account for most of the remaining weight on a well-run store, and none of them need to load in the first second.

Reviews. Social proof sells, so keep them — but the widget sits below the fold and can load when the visitor scrolls near it. An IntersectionObserver that boots the widget 400 px before it enters the viewport is invisible to customers and worth 300–600 ms.

Chat. Load on first scroll, first click, or after three seconds — whichever comes first. Nobody opens chat before the page has rendered.

Pixels. Use Shopify's Customer Events (Web Pixels) rather than pasting tags into theme.liquid. They run in a sandboxed worker, off your main thread, which is exactly what INP cares about.

Pop-ups. One email capture app, not three overlapping ones. Delay it — an exit-intent or 15-second trigger converts better than an immediate one and keeps the script off the critical path.

What not to touch

Some things are Shopify's job and interfering makes them worse:

  • Checkout. On Shopify Plus you have limited extensibility; on other plans you should not be trying. It is already the most optimised page you own.
  • The CDN. Adding Cloudflare in front of Shopify is a classic own goal — you are adding a hop, not removing one.
  • Shopify's core JS. Do not defer or async shopify_common.js or the cart scripts. You will break the cart, and you will find out on a Saturday.
  • "Speed booster" apps. Installing an app to fix the problem apps caused is how stores end up with three minification layers fighting each other. Remove weight; do not add a layer on top of it.

A safe change workflow

Store owners avoid this work because they are afraid of breaking a live store during trading hours. That fear is correct, and the workflow answers it:

  1. Duplicate the theme in Online Store → Themes. Always work on the copy.
  2. Baseline first. PageSpeed Insights on home, top collection and top product. Screenshot the numbers.
  3. One change per commit. Preview, then test the full path: browse → product → add to cart → cart → checkout, on a real phone.
  4. Publish during your quietest hour — check Shopify Analytics for it, not your intuition.
  5. Watch conversion rate for 48 hours. Speed work that drops conversion means something broke silently, and the number will tell you before a customer emails.
  6. Re-measure at day 7 and day 28 in Search Console for the field data.
Realistic expectations

On a store that has never been optimised, this work typically moves mobile LCP from around 4.5s to under 2.5s and lifts the admin speed score by 20–35 points. It will not make a heavy page builder feel like Dawn — at that point the honest answer is a theme migration.

Want this done for you this week?

Softshelf fixes performance and conversion problems on a flat fee — you approve a fixed number before anything starts, and you get a before/after report when it ships. Most speed sprints are delivered in 3–5 working days.

Frequently asked questions

Why is my Shopify store slow when Shopify hosts it?

Shopify handles hosting, CDN and checkout well. Slowness almost always comes from apps injecting scripts, oversized images in the theme, heavy page builders, and third-party widgets for reviews, chat and pop-ups. All of those are under your control.

Do Shopify speed booster apps work?

Rarely, and sometimes they make things worse by adding another script layer and duplicating minification the theme already does. Removing unused apps and fixing images gives far more improvement with less risk.

What is a good Shopify speed score?

The admin score is a Lighthouse average and 50+ puts you above most stores, but it is a trend line rather than a grade. What matters is mobile field data on your top product pages: LCP under 2.5 seconds, INP under 200 milliseconds, CLS under 0.1.

Will uninstalling an app remove its code from my theme?

Not always. Many apps leave snippets in theme.liquid or orphaned script tags behind. After uninstalling, search the theme code for the vendor name and remove leftovers manually, working on a duplicated theme.

Rasedul Islam

Founder of Softshelf. Builds and repairs high-performance websites for e-commerce brands and agencies across the US, UK, Canada and Australia. Run a free audit or email directly.