Why Is My Shopify Store Slow? Diagnosing and Fixing Performance Issues
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.
AI Generated ImageYour 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.
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
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.
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)
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
"""
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.
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
✓ 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:
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.
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:
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.