// Performance
Shopify Page Speed Optimization: How to Fix the 6 Biggest Slowdowns
Shopify stores slow down in predictable ways: app scripts, theme bloat, unoptimized images, render-blocking fonts, third-party pixels, and large videos. Specific fixes for each.
In this article
Why Shopify stores have a speed problem
Shopify stores typically score worse on PageSpeed Insights than comparable sites on other platforms — not because Shopify's infrastructure is slow, but because every app you install adds JavaScript and CSS to your storefront. A store with 15 apps might load 15 separate script bundles, some synchronously blocking rendering.
Core Web Vitals directly affect search rankings, and a slow Shopify store pays a search penalty in addition to a conversion penalty. Research shows conversion rates drop ~1% per 100ms of additional load time. Fix the six issues below and most stores see 30–50% improvement in PageSpeed scores.
1. App script bloat
Every Shopify app injects code into your storefront — including apps you installed, evaluated, and stopped using. Deleted apps don't always clean up their JavaScript. Open Chrome DevTools, go to the Network tab, and count third-party script files loading on your homepage. More than 10–12 is a problem.
Audit every app: does it generate measurable revenue or save significant time? If not, uninstall it. Many stores have 5–8 unused apps each adding 50–200ms of load time. After uninstalling, manually verify the app's code is removed from theme.liquid. For apps you keep, check whether the developer supports async loading.
2. Unoptimized images
Product images are the single largest contributor to page weight on most Shopify stores. A product page with 8 images at 2MB each loads 16MB before any scripts. Shopify converts to WebP and generates responsive sizes, but doesn't reduce quality of unnecessarily large uploads.
Target under 200KB per product image, under 100KB for hero images. Compress before uploading, or use Crush.pics for bulk compression of existing images. Check that images beyond the first product shot load lazily — most modern themes do this correctly, but verify in DevTools.
3. Render-blocking fonts
Custom fonts cause render-blocking and cumulative layout shift. Use font-display: swap in font declarations so the browser shows the fallback font immediately and swaps when the custom font loads. Preload your most important font file using rel=preload in the head. Limit yourself to 2 custom fonts maximum.
- Add font-display: swap to @font-face declarations in theme CSS
- Preload the WOFF2 file for your primary font in theme.liquid's <head>
- Consider system font stack for body text — zero network cost
- Limit custom fonts to headings only if performance is critical
4. Third-party pixels and tracking scripts
Facebook Pixel, GA4, Klaviyo, TikTok Pixel, Pinterest Tag, Hotjar — each adds a network request and JavaScript parsing time. Audit active pixels against active advertising channels; remove everything else. Use Shopify's native Customer Events to consolidate tracking. For scripts added manually, defer them until after the critical rendering path.
5. Theme code bloat
Shopify premium themes include features for every use case — sliders, countdown timers, lookbooks, bundle builders. The JavaScript for unused sections still loads on every page unless the theme uses section-specific loading. Work with a Shopify developer to audit the theme JavaScript bundle; unused sections should load conditionally. Unused theme JavaScript commonly accounts for 200–400KB per page.
6. Large product videos
Never self-host product videos directly in Shopify — use YouTube, Vimeo, or Shopify's native video hosting via the Files section. Load videos lazily: don't start loading the video file until the user scrolls to or clicks it. Use a poster image as the initial state. A 50MB video loading on your product page tanks your LCP regardless of everything else being optimized.
WebEnture's Shopify Store Audit Agent identifies all six speed issues in your specific store, prioritized by estimated performance impact — surfacing the specific scripts causing the most blocking time and the images above the size threshold.
Related reading: