A slow store costs money twice: shoppers bounce before they buy, and Google factors Core Web Vitals into rankings, so slow pages surface less often. The good news is that Shopify's own infrastructure is fast — when a Shopify store is slow, it's almost always things layered on top: apps, heavy Liquid, unoptimised images, and third-party scripts. Here's the audit I run to find what's actually slowing a store, in the order that finds the biggest wins first.
Measure before you touch anything
Optimising by feel wastes time. Start with data from tools that report the real metrics: PageSpeed Insights / Lighthouse for lab data, and Chrome's field data (from real users) which is what Google actually ranks on. Watch the three Core Web Vitals:
- LCP (Largest Contentful Paint) — how fast the main content appears. Usually the hero image or headline. Target under 2.5s.
- INP (Interaction to Next Paint) — how responsive the page feels to taps and clicks. Heavy JavaScript is the usual culprit.
- CLS (Cumulative Layout Shift) — how much the page jumps as it loads. Images without dimensions and injected banners are common causes.
Test the templates that matter — home, collection, product — on a throttled mobile profile, because that's where most shoppers and most problems are.
The usual suspects, worst first
1. Apps you're not using
The single most common cause. Many apps inject CSS and JavaScript into every page whether or not the feature is used, and leftover code from uninstalled apps often lingers in the theme. Audit every installed app: is it earning its performance cost? Remove the dead ones and clean out orphaned script tags and Liquid snippets they left behind. This ties directly into the apps vs custom question — ten script-injecting apps is a measurable slowdown.
2. Unoptimised images
Images are typically the heaviest thing on the page and the most fixable. Serve them at the size they're displayed (not a 4000px original shrunk in CSS), use Shopify's responsive image tooling and modern formats, lazy-load below-the-fold media, and give every image explicit width and height so it doesn't cause layout shift. Fixing the LCP image alone often moves the score more than anything else.
3. Render-blocking scripts
Third-party tags — analytics, chat widgets, reviews, marketing pixels — load in the <head> and block rendering. Defer or async what you can, load non-critical widgets after interaction, and question whether every tag still needs to be there. A chat widget that adds 400ms to every page for a feature 2% of visitors use is a bad trade.
4. Heavy or sloppy Liquid
Themes accumulate cruft: nested loops over large collections, redundant queries, sections rendering things no one sees. On a big catalogue this shows up as slow server response before the page even starts painting. Profiling the theme and trimming the expensive Liquid is unglamorous but effective.
Nine times out of ten, a slow Shopify store isn't a Shopify problem. It's the accumulated weight of apps, scripts and images no one has audited in two years.
The order I actually work in
- Measure the key templates on mobile and record the baseline.
- Audit apps — remove unused ones and clean their leftovers.
- Fix images — sizing, format, lazy-loading, dimensions.
- Tame third-party scripts — defer, async, or drop.
- Profile the theme and fix expensive Liquid.
- Re-measure and confirm the field data improves over the following weeks.
When performance is a rebuild, not a tune-up
Sometimes the theme is so weighed down that patching it costs more than replacing it — and occasionally the honest answer is a cleaner custom theme, or for the right store a headless build where you control the whole rendering path. That's a bigger decision, but for a large, performance-sensitive store it can be the one that finally moves the numbers.
The honest summary
Speeding up a Shopify store is detective work, not magic. Measure first, go after apps and images before anything clever, and re-measure with real-user data. Most stores can hit good Core Web Vitals without a rebuild — they just need someone to audit what got bolted on over the years and take the dead weight back off.