The Instant Fix (Before We Dig In)
Before spending hours diagnosing individual causes, try the one-click solution that fixes most of them automatically:
Thunder fixes 7 of these 10 causes automatically:
Free plan · 30-second install · Average +27 PageSpeed points
For the remaining causes (leftover app code, Liquid loops, homepage bloat), you'll need manual intervention. Check Thunder's pricing plans to see which optimizations are included at each tier. Now let's go through all 10.
How Fast Is Your Shopify Store?
Get a free speed report with personalized recommendations. Compare your store against industry benchmarks.
Free · Takes ~60 seconds · Report delivered to your inbox
Analyzing your store...
This usually takes 30-60 seconds
Report Sent!
Check your inbox in 2-3 minutes. We've sent a detailed speed report with personalized recommendations.
Leftover Code from Uninstalled Apps
Impact: High — can add 500ms–2s of unnecessary load time
This is the #1 hidden speed killer. When you uninstall a Shopify app, its code often stays behind in your theme. Script tags in theme.liquid, CSS files in your assets folder, Liquid snippets in the snippets directory — all still loading on every page view, slowing down your store for an app you no longer use.
We've seen stores with code from 10+ uninstalled apps still loading. Each one adds JavaScript and CSS that the browser has to download, parse, and execute — even though the app does nothing.
⚡ Thunder Fix
Thunder defers all scripts — including orphaned app scripts — so they don't block rendering. While the code still loads, it won't impact your PageSpeed score or initial load time. For a complete fix, you'll still want to remove the code manually.
🔧 Manual Fix
Open your theme editor. Search theme.liquid for script tags referencing apps you've removed. Check the snippets/ and sections/ folders for app-related files. Always duplicate your theme first. Remove any code that references uninstalled apps.
Render-Blocking Third-Party Scripts
Impact: Very High — typically the single biggest speed killer (adds 1–4s)
Every Shopify app that shows something on your storefront (reviews, pop-ups, chat, upsells) injects JavaScript that blocks your page from rendering. The browser has to download, parse, and execute each script before it can show your page content.
Five apps can easily add 1–3 seconds of blocking time. This is why stores with many apps score 20–35 on PageSpeed even with a fast theme — the scripts overwhelm everything else. If you want a broader fix list, read our guide on how to speed up your Shopify store.
⚡ Thunder Fix
Thunder's app detection engine recognizes 200+ Shopify app scripts and defers each one with app-specific strategies. It knows which scripts can be delayed until after interaction and which need to load before specific page sections. This is Thunder's biggest advantage — no manual configuration needed.
🔧 Manual Fix
Add defer or async to script tags in your theme. Warning: this often breaks app functionality. Each app's scripts have different dependencies — deferring Klaviyo wrong breaks pop-ups, deferring Judge.me wrong breaks reviews. Extensive testing required.
Unoptimized CSS Delivery
Impact: High — delays first paint by 500ms–1.5s
Your theme's CSS file must be completely downloaded before the browser can render anything. A typical Shopify theme ships 200–500KB of CSS, but only 10–20% is needed for the initial viewport (above-the-fold content). Your visitors wait for CSS they don't need yet.
The fix is to extract the critical CSS (just what's needed for the first screen), inline it directly in the HTML, and load the full stylesheet asynchronously. This is one of the most impactful optimizations — and one of the hardest to do manually.
⚡ Thunder Fix
Thunder automatically generates critical CSS for each page template (homepage, product, collection, etc.), inlines it in the HTML head, and async-loads the full stylesheet. Regenerates automatically when your theme changes.
🔧 Manual Fix
Use a tool like Critical (npm package) to extract above-the-fold CSS. Inline it in theme.liquid, then load the full stylesheet with media="print" onload="this.media='all'". Needs updating every time you change your theme. Different per template.
Too Many Web Fonts (or Wrong Loading Strategy)
Impact: Medium-High — adds 300ms–1.5s and causes layout shift
Custom web fonts are one of the sneakiest performance drains. Each font weight (regular, bold, italic) is a separate file download — typically 20–100KB each. A theme using 4 weights of a Google Font is loading 80–400KB of font data before text is visible.
Worse, without font-display: swap, the browser shows invisible text (FOIT — Flash of Invisible Text) until fonts load. Your visitors stare at a blank page wondering if the store is broken.
⚡ Thunder Fix
Thunder adds font-display: swap to prevent invisible text, preloads your primary font file for faster loading, and optimizes the font loading cascade. Text shows immediately in a fallback font, then swaps to your custom font when ready.
🔧 Manual Fix
Limit to 2 font weights max (regular + bold). Self-host fonts instead of Google Fonts. Add font-display: swap to @font-face rules. Preload your primary font with <link rel="preload">. Consider system fonts for maximum speed.
Excessive Liquid Template Loops
Impact: Medium — increases server response time (TTFB) by 200ms–1s+
This one is invisible in PageSpeed results but affects everything downstream. Complex Liquid loops — like iterating over all products in a large collection, nested loops for variant options, or running metafield lookups inside loops — make Shopify's servers work harder, increasing your Time to First Byte (TTFB). Our Shopify slow diagnosis guide walks through how to pinpoint exactly which templates are causing the bottleneck.
A product page template that loops through 100 products for "You May Also Like" recommendations, each with nested variant loops, can add 500ms+ to TTFB. That delays everything — FCP, LCP, the entire waterfall.
⚡ Thunder Fix
Thunder can't fix Liquid complexity directly (that requires theme code changes). However, its other optimizations compensate — faster CSS/JS delivery buys back the time lost to slow server response.
🔧 Manual Fix
Reduce collection page product counts (12–16 instead of 48+). Use pagination. Avoid nested Liquid loops. Minimize metafield lookups inside loops. Use Shopify's limit filter on forloops. Consider AJAX loading for "related products" sections.
Unoptimized Hero Images
Impact: High — hero image is usually the LCP element (adds 1–4s to LCP)
Your hero/banner image is almost always the Largest Contentful Paint (LCP) element — the metric Google cares most about. If it's unoptimized (large file size, wrong dimensions, not preloaded), it directly tanks your LCP score, which is 25% of your overall PageSpeed score.
Common mistakes: uploading a 4000x3000px image when the display area is 1600x600px, using JPEG instead of WebP, not preloading the hero, and lazy-loading the hero image (it should be eager-loaded since it's above the fold). For a deeper dive into every image technique, see our Shopify image optimization guide.
⚡ Thunder Fix
Thunder preloads the hero image with high priority, ensures it loads eagerly (not lazy-loaded), and optimizes the loading cascade so the hero image starts downloading as early as possible.
🔧 Manual Fix
Resize hero images to actual display dimensions. Compress to under 200KB. Use WebP format (Shopify converts automatically if you use image_tag). Add loading="eager" fetchpriority="high" to the hero image. Add a preload link in the head.
Missing Preconnect Hints
Impact: Medium — saves 100–300ms per third-party domain
Every time your store loads a resource from a third-party domain (fonts from Google, scripts from Klaviyo, images from a CDN), the browser needs to perform DNS lookup + TCP connection + TLS handshake. This takes 100–300ms per domain.
Preconnect hints tell the browser to start these connections early — before it even discovers it needs them. Most Shopify stores connect to 5–15 third-party domains but preconnect to zero of them.
⚡ Thunder Fix
Thunder automatically detects which third-party domains your store connects to and adds preconnect hints for the critical ones. Updates automatically as your apps change.
🔧 Manual Fix
Add <link rel="preconnect" href="https://domain.com"> to your theme.liquid head for critical third-party domains. Common ones: fonts.googleapis.com, cdn.shopify.com, cdn.klaviyo.com. Limit to 4–6 preconnects — too many can backfire.
Slow DNS Resolution
Impact: Medium — adds 50–500ms before anything starts loading
Before your store can even start loading, the visitor's browser must resolve your domain name to an IP address. If your DNS provider is slow, this adds delay to every single page load.
Many merchants use their domain registrar's default DNS, which is often slow. Upgrading to a fast DNS provider (like Cloudflare DNS) can shave 100–300ms off every page load — completely free.
⚡ Thunder Fix
Thunder can't change your DNS provider, but its other optimizations (preconnect, resource prioritization) minimize the impact of DNS on subsequent resource loads during the page.
🔧 Manual Fix
Switch to Cloudflare DNS (free). Go to your domain registrar, update nameservers to Cloudflare's. This alone can improve TTFB by 100–300ms. Cloudflare also adds a global CDN layer for free. Takes about 15 minutes to set up.
Homepage Section Overload
Impact: Medium-High — each section adds HTML, CSS, JS, and images
Shopify's section-based themes make it easy to add content blocks — slideshow, featured collection, testimonials, Instagram feed, newsletter, blog posts, video, map, countdown timer… Before you know it, your homepage has 15+ sections.
Each section adds HTML, CSS, JavaScript, and often images to your page. A homepage with 15 sections can easily be 3–5MB of total page weight. More sections = more code = slower load.
⚡ Thunder Fix
Thunder lazy-loads offscreen images and defers non-critical scripts in below-fold sections, reducing the initial load impact. But the HTML and CSS for all sections still loads — reducing sections is the only true fix.
🔧 Manual Fix
Audit your homepage sections. Keep 5–8 max. Remove or consolidate low-value sections. Ask: "Does this section help visitors buy?" If not, consider removing it. Fewer sections = faster homepage = better first impression.
Inline JavaScript in Liquid Templates
Impact: Medium — blocks rendering and prevents browser caching
Many Shopify themes and apps inject <script> tags directly into Liquid templates — not as external files, but as inline code blocks. This code blocks rendering, can't be cached by the browser (it reloads every page), and can't be deferred with a simple defer attribute.
Inline scripts are especially tricky because they often depend on Liquid variables (like product data), so they can't simply be moved to an external file.
⚡ Thunder Fix
Thunder intercepts and defers inline scripts where safe, using its app detection engine to understand dependencies. Scripts that depend on Liquid data are handled carefully to maintain functionality while minimizing rendering impact.
🔧 Manual Fix
Wrap inline scripts in DOMContentLoaded or requestIdleCallback. Move non-Liquid-dependent code to external files. Use type="module" for modern code. Requires careful testing — inline scripts often have hidden dependencies.
The Bottom Line
Most slow Shopify stores suffer from multiple hidden causes at once. The good news: you don't need to fix all 10 manually. Thunder handles the 7 most impactful ones automatically, and the remaining 3 (leftover app code, Liquid loops, section overload) are straightforward manual fixes. For a complete walkthrough, see our full Shopify speed optimization guide.
Quick Action Plan
- Install Thunder (free, 30 seconds) — instantly fixes causes #2, #3, #4, #6, #7, #10, and partially #1
- Clean up leftover app code (30 minutes) — search theme for uninstalled app snippets
- Reduce homepage sections (10 minutes) — aim for 5–8 sections max
- Switch to Cloudflare DNS (15 minutes) — free, improves TTFB globally
- Optimize Liquid loops (if technical) — reduce collection sizes, avoid nested loops
Start with the Biggest Impact, Fastest Fix
Thunder handles the hardest speed optimizations automatically. Most stores see +27 PageSpeed points in under a minute.
Fix Your Slow Store Now — Free →Free plan · No credit card · Works with all themes
Frequently Asked Questions
Why is my Shopify store loading so slowly?
The most common hidden causes are: leftover code from uninstalled apps, too many render-blocking scripts from active apps, unoptimized images, excessive Liquid template loops, render-blocking CSS, too many web fonts, slow DNS resolution, heavy homepage sections, unoptimized third-party scripts, and missing browser caching headers. Most stores have 3–5 of these issues simultaneously. Thunder Page Speed Optimizer fixes the majority of these automatically.
How do I find what's making my Shopify store slow?
Run your store through Google PageSpeed Insights (pagespeed.web.dev) and look at the 'Opportunities' and 'Diagnostics' sections. Common red flags: 'Eliminate render-blocking resources,' 'Reduce unused JavaScript,' 'Properly size images,' and 'Reduce unused CSS.' You can also check your theme code for leftover app snippets, and use Chrome DevTools Network tab to see which scripts take longest to load.
Does Shopify itself slow down my store?
Partially. Shopify's platform scripts (checkout, analytics, payment processing) consume a baseline of your performance budget. You can't remove these — they're required for your store to function. However, the platform overhead is small compared to what themes and apps add. The good news is that Thunder optimizes around Shopify's core scripts, deferring everything that can safely be delayed.
Can uninstalling Shopify apps speed up my store?
Yes, but with an important caveat: uninstalling an app from the Shopify admin doesn't always remove its code from your theme. Many apps inject script tags, CSS, and Liquid snippets into your theme.liquid and snippets folder. You need to manually check for and remove this leftover code. Thunder takes a different approach — instead of removing apps, it optimizes how their scripts load.
How many apps is too many for Shopify speed?
There's no magic number — it depends on what the apps do. Five well-optimized apps can be lighter than two poorly coded ones. The real issue is how many scripts each app injects into your storefront. Apps that add pop-ups, chat widgets, analytics, and review systems tend to be the heaviest. Thunder's app detection engine optimizes scripts from 200+ apps, so you can keep the apps you need without the speed penalty.
Will a faster Shopify theme fix my slow loading?
A theme sets your performance baseline, but it won't fix all speed issues. Even the fastest theme (like Dawn) can be slow if you have many apps, large unoptimized images, or excessive homepage sections. Switching themes is a big project — try optimizing your current setup first with Thunder, which works with any theme.
How do I fix leftover app code in my Shopify theme?
Check your theme's theme.liquid file for script tags and link tags from apps you've uninstalled. Also check the snippets and sections folders for files named after removed apps. Be careful — removing the wrong code can break your store. Always duplicate your theme before making changes. If this sounds risky, Thunder automatically handles script optimization without modifying your theme code.
Does image size really affect Shopify loading speed?
Absolutely. Images are typically the largest assets on any Shopify store. A single unoptimized hero image can be 2–5MB, adding 2–5 seconds of load time on mobile. Best practices: compress images to under 200KB, use Shopify's built-in WebP conversion, set explicit width and height attributes, and lazy-load images below the fold. Thunder handles lazy-loading and hero image preloading automatically.