Back to Blog
shopify performance e-commerce

Shopify Speed Optimization: A Technical Guide to Faster Store Performance

Ten Peaks Tech 10 min read

A slow Shopify store costs you money in ways that don’t show up on a dashboard. Visitors bounce before the page finishes loading. Google ranks you lower in search results. Conversion rates drop — studies consistently show that every additional second of load time reduces conversions by 7-10%.

We’ve optimized Shopify stores across several industries, including a deep performance overhaul for Audeze, a premium headphone manufacturer. That project took their mobile Lighthouse score from the low 30s to above 90 and cut their Largest Contentful Paint in half. This guide covers the same techniques we used, adapted so you can apply them to your own store.


Why Shopify Stores Are Slow (It’s Usually Not Shopify’s Fault)

Shopify’s infrastructure is actually fast. Their CDN is global, their servers are well-optimized, and their base themes load quickly out of the box. The performance problems come from what merchants add on top.

Three things account for 90% of Shopify performance issues:

  1. Theme bloat — Themes ship with features you don’t use, and every feature adds CSS and JavaScript.
  2. App overhead — Each Shopify app injects its own scripts, stylesheets, and sometimes iframes into your storefront.
  3. Unoptimized images — Large product images served without proper sizing, compression, or modern formats.

Let’s break each one down.


Theme Bloat: The Hidden Cost of “Feature-Rich” Themes

Premium Shopify themes compete on features. More features mean more sales on the theme marketplace. But every feature — mega menus, animation libraries, product quick-views, countdown timers — adds code that loads on every page, whether you use the feature or not.

How to Diagnose It

Open Chrome DevTools, go to the Coverage tab (Ctrl+Shift+P, type “coverage”), and reload your page. This shows you exactly how much of your CSS and JavaScript is actually used on that page. We routinely find that 60-80% of a theme’s CSS is unused on any given page.

How to Fix It

Option 1: Remove unused features. Most themes have settings to disable features like quick-view modals, product tabs, or animations. Disabling them in the theme settings sometimes removes the associated code, but not always — many themes load the code regardless.

Option 2: Audit and trim the theme code. This requires a developer who understands Liquid, CSS, and JavaScript. The process is:

  • Identify unused CSS with Coverage tools and remove it
  • Find JavaScript that initializes features you’ve disabled and remove those initializers
  • Remove Liquid snippets for features you don’t use
  • Consolidate CSS files where possible to reduce HTTP requests

Option 3: Start from a minimal base. Shopify’s Dawn theme is their reference implementation. It’s intentionally lean and well-structured. If your current theme is beyond saving, migrating to Dawn (or a Dawn-based theme) and adding only what you need often produces better results than trying to optimize a bloated theme.


App Overhead: Death by a Thousand Scripts

This is the biggest performance killer we see. A typical Shopify store has 8-15 apps installed, and each one adds code to the storefront.

Here’s what a single app injection can look like:

  • 1 JavaScript file (50-200kb)
  • 1 CSS file (10-50kb)
  • An API call to the app’s servers on page load
  • Sometimes a full iframe embedding another application

Multiply that by 10 apps and you’re loading an extra 1-2MB of resources before your actual page content renders.

How to Audit App Impact

  1. Disable apps one at a time and measure performance after each. Use WebPageTest or Lighthouse in an incognito window (to avoid browser extensions skewing results).
  2. Check your page source. View the HTML source of your storefront and search for script tags. Identify which ones belong to apps versus your theme.
  3. Use the Network tab in DevTools to see all requests. Filter by third-party domains to see what apps are loading.

How to Fix It

  • Uninstall apps you’re not using. This sounds obvious, but we’ve never audited a Shopify store that didn’t have at least 2-3 apps installed that the merchant forgot about. Uninstalling isn’t enough — check your theme’s layout/theme.liquid file for leftover code snippets from removed apps.
  • Replace apps with native Liquid code. Many apps do things that Shopify can do natively. Countdown timers, trust badges, custom product tabs, and FAQ accordions can all be built with Liquid, CSS, and a few lines of JavaScript — no app required.
  • Defer non-critical app scripts. If you must keep an app, check whether its script can be loaded with defer or async attributes. Some apps break when deferred, so test carefully.

When we optimized the Audeze store, app consolidation was one of the highest-impact changes. We replaced several apps with native theme functionality, reducing external script loads by over 60%.


Image Optimization: The Low-Hanging Fruit

Images are typically the largest assets on any e-commerce page. Shopify has built-in image optimization, but it only works if you use it correctly.

Use Shopify’s Image CDN Parameters

Shopify serves images through their CDN and supports URL parameters for resizing and format conversion. In Liquid, use the image_url filter with width parameters:

{{ product.featured_image | image_url: width: 600 }}

This serves a 600px wide image instead of the full-resolution upload. For responsive images, generate a srcset:

<img
  srcset="
    {{ image | image_url: width: 400 }} 400w,
    {{ image | image_url: width: 800 }} 800w,
    {{ image | image_url: width: 1200 }} 1200w
  "
  sizes="(max-width: 600px) 400px, (max-width: 1000px) 800px, 1200px"
  src="{{ image | image_url: width: 800 }}"
  loading="lazy"
  alt="{{ image.alt }}"
/>

Lazy Load Below-the-Fold Images

Add loading="lazy" to every image that isn’t visible on initial page load. Do NOT lazy-load your hero image or the first product image — those are your LCP elements and need to load immediately. For LCP images, add fetchpriority="high" instead.

Optimize Upload Quality

Before uploading to Shopify, run images through a tool like Squoosh, TinyPNG, or ImageOptim. Target 80-85% quality for product images — the visual difference is imperceptible, but the file size difference is 40-60%.


Liquid Rendering: Server-Side Performance

Liquid is Shopify’s templating language, and inefficient Liquid code slows down server-side rendering, increasing Time to First Byte (TTFB).

Common Liquid Performance Mistakes

Nested loops. Looping through all products inside a loop through all collections creates O(n*m) complexity. If you have 50 collections and 500 products, that’s 25,000 iterations on every page load.

{% comment %} BAD: Nested loop {% endcomment %}
{% for collection in collections %}
  {% for product in collection.products %}
    ...
  {% endfor %}
{% endfor %}

{% comment %} BETTER: Use a specific collection {% endcomment %}
{% for product in collections['featured'].products limit: 12 %}
  ...
{% endfor %}

Excessive include calls. Each {% include %} (or {% render %}) call has overhead. Rendering a snippet inside a loop of 50 products means 50 snippet calls. Where possible, inline the snippet content for performance-critical loops.

Unscoped for loops. Always use limit on loops that display product grids. Loading 200 products when you only display 12 wastes rendering time.

Use Shopify’s Built-In Caching

Section rendering and Liquid caching happen automatically for most content, but dynamic content (cart data, customer-specific pricing) bypasses the cache. Minimize the amount of dynamic content on high-traffic pages like your homepage and collection pages.


Core Web Vitals: What Google Actually Measures

Google uses three Core Web Vitals to evaluate page experience:

Largest Contentful Paint (LCP) — Target: Under 2.5 seconds

LCP measures when the largest visible element finishes rendering. On Shopify stores, this is almost always the hero image or the first product image.

How to improve it:

  • Preload your LCP image with <link rel="preload" as="image">
  • Serve the image at the correct size (not a 2000px image displayed at 600px)
  • Minimize render-blocking CSS and JavaScript
  • Use fetchpriority="high" on the LCP image element

Cumulative Layout Shift (CLS) — Target: Under 0.1

CLS measures visual stability — how much the page jumps around while loading. Common causes on Shopify: images without explicit dimensions, fonts that swap and change layout, and app widgets that inject content after page load.

How to improve it:

  • Set explicit width and height attributes on all images
  • Use font-display: swap with a fallback font that matches your custom font’s metrics
  • Reserve space for dynamic content (reviews widgets, popups) with CSS

Interaction to Next Paint (INP) — Target: Under 200ms

INP measures responsiveness — how quickly the page responds to user interactions. Heavy JavaScript from apps and themes is the usual culprit.

How to improve it:

  • Reduce JavaScript bundle size (see the theme and app sections above)
  • Break long tasks into smaller chunks using requestIdleCallback or setTimeout
  • Avoid synchronous DOM operations during scroll or click handlers

Real Results: The Audeze Case Study

When Audeze came to us, their Shopify store had a mobile Lighthouse score in the low 30s and page load times exceeding 6 seconds. For a brand selling $2,000+ headphones, that performance was actively losing sales.

Here’s what we did:

  1. Theme audit and cleanup. Removed unused CSS and JavaScript, streamlined the template structure, and eliminated redundant Liquid logic.
  2. App consolidation. Replaced 4 apps with native Liquid functionality. Deferred the remaining app scripts that couldn’t be removed.
  3. Image pipeline overhaul. Implemented responsive images with proper srcset, lazy loading for below-fold content, and preloading for LCP images.
  4. Font optimization. Subset custom fonts to include only the characters actually used, added proper font-display rules, and preloaded critical font files.

The results:

  • Lighthouse performance score: 30s to 90+
  • LCP: 5.8s to 2.1s on mobile
  • Total page weight: Reduced by over 60%
  • Bounce rate: Dropped measurably in the weeks following deployment

You can read more about this project and our other e-commerce work on our services page.


A Practical Optimization Checklist

If you want to tackle this yourself, here’s the order we recommend:

  1. Audit your apps. Remove what you don’t need. This is almost always the biggest win.
  2. Optimize images. Implement responsive images, lazy loading, and preloading for LCP elements.
  3. Audit your theme. Use Coverage tools to identify unused CSS and JavaScript.
  4. Fix CLS issues. Add image dimensions, reserve space for dynamic content.
  5. Reduce Liquid complexity. Limit loops, avoid nested iterations, scope your queries.
  6. Test on real devices. Lighthouse is a lab test. Use Chrome’s Real User Monitoring (CrUX) data or tools like WebPageTest to see what actual visitors experience.

When to Bring in Help

If your store’s Lighthouse score is below 50 on mobile, or your Core Web Vitals are failing in Google Search Console, optimization is likely costing you revenue every day you delay.

We offer Shopify performance audits that identify the specific bottlenecks on your store and prioritize fixes by impact. If you want to talk through your store’s performance, book a free consultation — we’ll take a look at your metrics and tell you where the biggest opportunities are.

Ready to work together?

Get in Touch