4 May 2026

Your Shopify Store Is Slow. Here's Exactly What to Fix.

Bottom Line:

  • A slow Shopify store is a conversion tax on every channel. Each additional second of load time costs roughly 7% in CVR.
  • Most speed problems come from six sources: theme bloat, uncompressed images, app overload, render-blocking fonts, bad third-party scripts, and unoptimized Liquid.
  • You can fix all of them without a redesign, without changing your visual identity, and without losing functionality.

Your PageSpeed score is 38 on mobile. You know it's bad. You've been told to "optimize your images" and "remove unused apps." That's not a plan. That's a to-do list missing context.

Here's the actual playbook, in the order that produces the fastest measurable improvement.

Why the score matters (and why obsessing over it doesn't)

Google PageSpeed Insights scores your site 0-100 based on lab data. The score itself is a proxy. What matters is the underlying metrics it measures - specifically, Core Web Vitals:

LCP (Largest Contentful Paint): How fast the main content appears. Target: under 2.5 seconds. Most Shopify stores sit between 4 and 8 seconds on mobile. That's 10-40% of avoidable conversion loss before anyone has seen your product.

INP (Interaction to Next Paint): How quickly the page responds when a customer taps something. Target: under 200ms. Heavy JavaScript from apps and themes is the usual cause.

CLS (Cumulative Layout Shift): How much the page jumps around while loading. Target: under 0.1. Caused by images without dimensions, dynamically injected content, and late-loading fonts.

A 90+ score is nice. But the goal isn't a number - it's a fast store that converts. Focus on the metrics, not the badge.

The six things actually slowing your store down

1. Theme bloat

Years of edits, abandoned app code left in theme.liquid, snippets that reference products or collections that no longer exist. Most stores running a theme for 2+ years have 30-50% dead code.

Fix: Audit theme.liquid and snippets/ for orphaned references. If you're on a pre-OS 2.0 theme, migrate to a Dawn-based theme or a modern premium alternative. Rebuilding on a clean base is faster than patching a legacy theme - and the performance difference is usually 1-3 seconds of LCP improvement.

2. Uncompressed images

The single fastest fix on most stores. A 3MB hero image served as PNG when it could be a 150KB WebP is common. Multiply by every product image, collection banner, and lifestyle photo across the site.

Fix: Use Shopify's image_url filter with explicit width parameters. Serve WebP or AVIF. Set above-fold images to preload. Set everything below the fold to lazy-load. Target: no individual image above 200KB, hero images under 100KB where possible.

Do not lazy-load the LCP image. This is the most common mistake - it tells the browser to deprioritize the one image that matters most.

3. App overload

Every Shopify app injects JavaScript, CSS, or both into your storefront. A review app, a chat widget, a pop-up tool, an upsell app, an analytics pixel - each one adds 50-300ms to load time. Ten apps can easily add 2-3 seconds.

Fix: Go to your app list. For each app, ask: is this generating measurable revenue or solving a problem I can't solve otherwise? If the answer is no, remove it. Uninstalling an app from the Shopify admin doesn't always remove its code from your theme - check theme.liquid and snippets/ for leftover script tags after uninstalling.

4. Render-blocking fonts

Custom fonts look good. They also block rendering if loaded incorrectly. A font file served without font-display: swap will show invisible text (FOIT) until the font downloads - which on a slow connection can take several seconds.

Fix: Self-host fonts via theme assets instead of loading from Google Fonts CDN. Use font-display: swap so text appears immediately in a fallback font. Preload only the weights you actually use above the fold - typically one regular and one bold weight. Every additional weight is another 20-50KB of blocking download.

5. Third-party scripts

Tracking pixels (Meta, TikTok, GA4), chat widgets, personalisation tools, A/B testing scripts. Each one makes external network requests that the browser has to wait for. Some load synchronously, blocking everything else.

Fix: Defer or async every third-party script that isn't critical to first render. Move tracking to server-side where possible - Meta CAPI, Google Enhanced Conversions, TikTok Events API all reduce client-side JavaScript while improving data quality. Chat widgets should load on interaction, not on page load.

6. Unoptimized Liquid and JavaScript

Liquid for loops iterating over large collections on every page load. Inline JavaScript that could be deferred. CSS loaded as render-blocking <link> tags when it's only used on specific templates.

Fix: Profile with Shopify's Theme Inspector for Chrome. Identify which Liquid renders take the longest. Move template-specific CSS out of the global stylesheet. Defer JavaScript that doesn't need to run before first paint.

The audit process

Run PageSpeed Insights on your five highest-traffic pages - usually homepage, a top collection, a bestselling PDP, cart, and a landing page. Test mobile, not desktop. Desktop scores are always higher and hide real problems.

For each page, note:

  • LCP value and what element is the LCP (usually hero image or product image)
  • Total Blocking Time (proxy for INP in lab data)
  • Number of third-party requests
  • Total page weight

Then fix in this order: images first (fastest win), apps second (biggest sustained impact), theme and code third (deepest improvement).

What "done" looks like

  • Mobile LCP under 2.5 seconds on your top landing pages
  • INP under 200ms
  • CLS under 0.1
  • Total page weight under 2MB
  • Fewer than 10 third-party requests per page

You don't need a 100 score. You need a store that loads in under 3 seconds on a real phone on a real network. That's the bar. Everything above it is incremental. Everything below it is a conversion tax you're paying on every session, every day, across every channel.

Speed is not a project. It's a constraint.

Every new app install, every theme update, every campaign landing page can regress performance. The stores that stay fast treat speed as a constraint, not a one-time project.

Check PageSpeed after every app install. Check it after every theme update. Check it monthly as a baseline. The teams that do this never have a "speed problem" because they catch regressions before they compound.

A fast store doesn't announce itself. It just converts better - quietly, permanently, across every channel you run.

Want to see if this applies to your store?