Why Is My Shopify Store Slow? Diagnosing and Fixing Performance Issues

·8 min read·Ecommerce

Systematically diagnose why your Shopify store is slow — identify the real bottlenecks in themes, apps, images, and third-party scripts, then fix them with measurable results.

Why Is My Shopify Store Slow? Diagnosing and Fixing Performance IssuesAI Generated Image

Your Shopify store is slow and you do not know why. The product pages take four seconds to load. The checkout feels sluggish. Customers leave before the page finishes rendering.

The instinct is to blame Shopify. Usually Shopify is not the problem. The problem is what you have added on top of it: a theme with too much JavaScript, twelve apps each injecting their own scripts, uncompressed hero images, and third-party tracking pixels that block rendering.

This guide walks through a systematic diagnosis. You will measure, identify the actual bottlenecks, fix them in priority order, and verify the improvements with numbers.

# Who This Is For

  • Store owners who have noticed their Shopify site is slower than it used to be
  • Marketing teams who see high bounce rates and suspect page speed is the cause
  • Vibe coders helping clients optimise their Shopify stores
  • Agencies managing multiple Shopify stores and needing a repeatable performance audit process

No coding required for most fixes. Some advanced optimisations involve Liquid template editing — those are clearly marked.

# The Diagnosis Framework

flowchart TD
  M["Measure\nBaseline"] --> T["Test Theme\nImpact"]
  T --> A["Audit Apps\n& Scripts"]
  A --> I["Inspect Images\n& Assets"]
  I --> N["Network &\nThird-Party"]
  N --> F["Fix in\nPriority Order"]
  F --> V["Verify\nImprovements"]
  V -.-> M

Speed optimisation is iterative. Measure, fix one thing, re-measure. Never change multiple variables at once or you cannot attribute the improvement.

# Step 1: Measure Your Baseline

Before touching anything, establish numbers. Without a baseline, you cannot prove any fix worked.

text
Tools to use:
─────────────
1. Google PageSpeed Insights    → pagespeed.web.dev
2. GTmetrix                     → gtmetrix.com
3. WebPageTest                  → webpagetest.org
4. Chrome DevTools              → Network tab + Lighthouse
5. Shopify Theme Inspector      → Built into admin

# Key Metrics

Metric Target Why It Matters
LCP (Largest Contentful Paint) < 2.5s Main content visible to user
FID (First Input Delay) < 100ms How fast the page responds to clicks
CLS (Cumulative Layout Shift) < 0.1 Visual stability while loading
TTFB (Time to First Byte) < 200ms Server response speed
Total Page Weight < 2 MB Total data downloaded
Requests < 50 Number of files loaded

# Record Your Baseline

text
Store Performance Baseline — [Date]
────────────────────────────────────
Page              │ LCP    │ FID   │ CLS   │ Weight │ Requests
Homepage          │ ____s  │ ____ms│ ____  │ ____MB │ ____
Product page      │ ____s  │ ____ms│ ____  │ ____MB │ ____
Collection page   │ ____s  │ ____ms│ ____  │ ____MB │ ____
Cart page         │ ____s  │ ____ms│ ____  │ ____MB │ ____

Test the same pages every time. Use an incognito window to avoid cache effects.

# Step 2: Isolate Theme Impact

Your theme is the single biggest factor in page speed. A poorly built theme sets a floor that no amount of optimisation can drop below.

# Quick Theme Test

The fastest way to test theme impact: temporarily switch to Shopify Dawn (the default free theme) and re-run your measurements.

text
Theme Comparison
────────────────
Metric         │ Your Theme │ Dawn   │ Difference
LCP            │ 4.2s       │ 1.8s   │ -2.4s
Total Weight   │ 4.1 MB     │ 1.2 MB │ -2.9 MB
JS Files       │ 18         │ 4      │ -14
CSS Files      │ 6          │ 2      │ -4

If Dawn is dramatically faster, your theme is the bottleneck.

# Common Theme Problems

Problem Impact Fix
Hero carousel/slider +1-3s LCP Replace with static image
Multiple custom fonts +0.5-1s LCP Limit to 2 weights
Unused theme sections +200-500KB Remove from templates
Large CSS bundles +0.3-1s render Audit and inline critical CSS
jQuery dependency +90KB+ Check if theme needs it
Animations/transitions CLS issues Disable or simplify

# Hero Image Fix (Biggest Single Win)

text
Before: Hero carousel with 3 slides
  → 3 full-width images loaded (total 2.1 MB)
  → Carousel JavaScript loaded (180 KB)
  → LCP: 4.1s

After: Single static hero image
  → 1 optimised image (220 KB WebP)
  → No carousel JavaScript
  → LCP: 1.9s

Improvement: -2.2s LCP, -2.06 MB page weight

# Step 3: Audit Every App

Every Shopify app you install injects JavaScript and CSS into your storefront. Even apps you have disabled may still load their scripts.

# The App Audit Process

python
"""
Script to identify app-injected scripts on a Shopify storefront.
Run this against your store URL to find which apps are adding weight.
"""

import requests
from bs4 import BeautifulSoup
from urllib.parse import urlparse

def audit_shopify_scripts(store_url: str) -> list[dict]:
    """Find all third-party scripts injected into a Shopify store."""
    response = requests.get(store_url)
    soup = BeautifulSoup(response.text, "html.parser")

    scripts = []
    for tag in soup.find_all("script", src=True):
        src = tag["src"]
        parsed = urlparse(src)
        domain = parsed.netloc

        # Shopify's own scripts
        is_shopify = "shopify" in domain or "cdn.shopify" in domain
        # App scripts are usually on third-party domains
        is_app = not is_shopify and domain != urlparse(store_url).netloc

        scripts.append({
            "src": src,
            "domain": domain,
            "is_app_script": is_app,
            "is_shopify": is_shopify,
            "async": tag.get("async") is not None,
            "defer": tag.get("defer") is not None,
            "blocking": not tag.get("async") and not tag.get("defer"),
        })

    app_scripts = [s for s in scripts if s["is_app_script"]]
    blocking = [s for s in app_scripts if s["blocking"]]

    print(f"Total scripts: {len(scripts)}")
    print(f"App scripts: {len(app_scripts)}")
    print(f"Blocking app scripts: {len(blocking)}")

    return scripts

# Usage
scripts = audit_shopify_scripts("https://your-store.myshopify.com")

# App Impact Assessment

App Type Typical Impact Action
Reviews / ratings 100-300 KB JS + CSS Keep if used, switch to lighter alternative
Live chat widgets 200-500 KB, often blocking Load on click instead of page load
Upsell / cross-sell 100-200 KB Evaluate conversion lift vs speed cost
Analytics (beyond GA) 50-200 KB each Consolidate to one provider
Social proof popups 100-200 KB Test removing — most do not convert
Currency converters 50-150 KB Use Shopify Markets instead
Trust badges 50-100 KB Replace with static images

# The Test

Remove apps one at a time. After each removal, re-run PageSpeed. Record the delta.

text
App Removal Impact Log
──────────────────────
App Removed           │ LCP Before │ LCP After │ Weight Saved
Review widget         │ 3.8s       │ 3.2s      │ 280 KB
Chat widget           │ 3.2s       │ 2.7s      │ 420 KB
Social proof popups   │ 2.7s       │ 2.5s      │ 150 KB
Currency converter    │ 2.5s       │ 2.4s      │ 90 KB

# Step 4: Optimise Images

Images are often the heaviest single category on a Shopify store. A single unoptimised product image can be 3-5 MB.

# Image Checklist

text
✓ Use WebP format (30-50% smaller than JPEG at same quality)
✓ Set explicit width and height attributes to prevent CLS
✓ Lazy load below-the-fold images (loading="lazy")
✓ Preload the hero/LCP image (rel="preload")
✓ Use Shopify CDN image transforms (?width=800&format=webp)
✓ Limit product images to 2000px max width
✓ Compress hero images to under 200 KB

# Shopify CDN Transforms

Shopify's CDN supports on-the-fly image transformation. Use URL parameters instead of uploading multiple sizes:

text
Original:  //cdn.shopify.com/s/files/hero.jpg          (3.2 MB)
Optimised: //cdn.shopify.com/s/files/hero.jpg?width=1200&format=webp  (180 KB)

That is a 94% reduction with no visible quality loss.

# Step 5: Tame Third-Party Scripts

After theme and apps, the remaining bottleneck is usually third-party scripts: analytics, tracking pixels, remarketing tags, and social embeds.

# Third-Party Script Audit

flowchart LR
  subgraph Blocking["Render-Blocking"]
    GA["Google Analytics"]
    FB["Facebook Pixel"]
    HJ["Hotjar"]
  end
  subgraph Deferred["Can Be Deferred"]
    INT["Intercom"]
    CHAT["Chat Widget"]
    SOC["Social Embeds"]
  end
  subgraph Remove["Consider Removing"]
    DUP["Duplicate Analytics"]
    OLD["Old Pixels"]
    UN["Unused Tags"]
  end

# Fixes

Script Fix
Google Analytics Use gtag.js with async, not analytics.js
Facebook Pixel Load after page interaction (requestIdleCallback)
Chat widgets Load on button click, not page load
Multiple analytics Consolidate to one provider
Old tracking pixels Remove — they collect data nobody checks
Social share buttons Replace with static links (no JavaScript)

# Step 6: Verify and Monitor

After each fix, re-measure the same pages from Step 1.

text
Performance After Optimisation
──────────────────────────────
Page              │ LCP Before │ LCP After │ Δ
Homepage          │ 4.2s       │ 1.8s      │ -57%
Product page      │ 3.8s       │ 2.1s      │ -45%
Collection page   │ 3.1s       │ 1.6s      │ -48%
Cart page         │ 2.4s       │ 1.3s      │ -46%

# Ongoing Monitoring

Speed degrades over time as new apps are added and content changes. Set up automated monitoring:

text
Monthly Performance Audit Checklist
────────────────────────────────────
✓ Run PageSpeed on homepage, top product, and collection pages
✓ Compare to baseline numbers
✓ Check if new apps were installed since last audit
✓ Review image sizes for recently added products
✓ Verify no new render-blocking scripts were added
✓ Test on mobile (60%+ of ecommerce traffic)

# What This Replaces

Guessing Systematic Approach
"The site feels slow" Measured LCP, FID, CLS baseline
Try random fixes Isolated each bottleneck category
Change multiple things at once Fix one variable, re-measure
Blame Shopify Identified actual cause (theme, apps, images)
One-time optimisation Ongoing monitoring process

# Next Steps

For automating the performance monitoring process with Python scripts, see How to Fix Slow Shopify Stores: A Performance Checklist. If your store also needs better reporting, see How to Automate Shopify Reports.

For building automated ecommerce data pipelines, see Ecommerce Reporting API: Automate Store Data. To improve conversion rates alongside speed, see Improve Ecommerce Conversion with Data Automation.

For A/B testing whether speed improvements actually increase conversions, see A/B Testing for Ecommerce.

Ecommerce optimisation services include performance audits and ongoing speed monitoring for Shopify stores.

Get in touch to discuss improving your store's performance.

Enjoyed this article?

Get notified when I publish new articles on automation, ecommerce, and data engineering.

why is my shopify store slowshopify store slowshopify performance issuesslow shopify store fixshopify speed diagnosisshopify loading slowshopify theme slowshopify app speed impactshopify core web vitals fixfix slow shopify site