Skip to content

Now booking Shopify builds for Q4 2026.

Check availability

Shopify Store Speed: What Actually Makes a Shopify Site Fast (2026)

The real causes of slow Shopify stores in 2026, ranked by impact. App bloat, theme drift, and the Core Web Vitals fixes that hold rather than erode.

Shopify gives you good hosting, a global CDN, and modern themes with sensible defaults. And yet the median Shopify store still fails to hit "Good" on all three Core Web Vitals simultaneously, with mid-tier stores commonly sitting at 3-5 seconds LCP on mobile.

The reason is not the platform. It is that Shopify stores accumulate weight in two specific ways, neither of which has a built-in cleanup mechanism. This guide covers what actually makes a Shopify store slow, ranked by impact, and the fixes that hold rather than erode over the following year.

Why speed matters twice

Slow Shopify pages get penalised on two fronts simultaneously.

Organic: Core Web Vitals have been a confirmed ranking signal since 2021. Slow pages also get less crawl budget allocated to them.

Paid: Google Ads Quality Score factors landing page experience, so slow pages cost more per click. Meta's algorithm reads bounce signal as a negative outcome and prices delivery accordingly.

So a slow store gets less organic traffic, pays more per click for the paid traffic it buys, and converts a lower percentage of the clicks it does get. The compounding is what makes this worth taking seriously rather than treating as a vanity score.

The metrics, and what they actually measure

Metric Measures Good Poor
LCP (Largest Contentful Paint) How long until the main content appears Under 2.5s Over 4.0s
INP (Interaction to Next Paint) How responsive the page is to taps and clicks Under 200ms Over 500ms
CLS (Cumulative Layout Shift) Whether content jumps around while loading Under 0.1 Over 0.25

Two things worth knowing:

  • INP replaced First Input Delay in March 2024. They measure different things: FID only measured the first interaction, INP measures the worst interaction across the whole visit. Passing FID never guaranteed passing INP, and stores that never revisited this after the change are leaving measurable ranking performance on the table.
  • The bar is the 75th percentile of real visits, not the average. Your median shopper can have a good experience while you still fail, if the slowest quarter of visits are bad enough.

Field data, not lab data

The measurement mistake that wastes the most effort: optimising against the PageSpeed Insights lab score instead of the field data. Lab scores are a single synthetic run on simulated hardware. Field data is the trailing 28-day average from real users on real devices, and it is what Google actually uses for ranking. A store can score 90 in the lab and fail Core Web Vitals in the field.

Where to read field data:

  • PageSpeed Insights, top section, if the page has enough traffic. Read this, not the Lighthouse score below it.
  • Search Console > Core Web Vitals report. Grouped by URL pattern, which shows you whether the problem is product pages, collection pages, or the homepage.
  • Chrome UX Report directly, for origin-level trends over time.

Track field LCP monthly. If it creeps up 0.3 seconds month over month, something new broke and an audit is overdue. That is the early warning signal that catches problems before conversion rate starts dropping.

The real causes, ranked by impact

1. App JavaScript

The single biggest cause of slow Shopify stores. Each app that injects scripts adds roughly 150-300ms to LCP, and the effect on INP is worse because JavaScript on the main thread is exactly what INP measures. Stores with heavy app stacks frequently exceed 500ms INP, well into the Poor band.

The hidden version of this problem: removing an app from your Shopify admin does not always remove its theme code. Stores accumulate scripts from apps uninstalled months or years ago, still loading on every page, doing nothing.

The audit:

  1. Open Chrome DevTools > Coverage tab, reload a product page, and look at unused JavaScript by file. This tells you which scripts are loading and not being used.
  2. Search your theme files (theme.liquid and your snippets) for script tags. Cross-reference against your installed app list. Anything from an app you no longer have is dead weight.
  3. For each remaining app, ask whether it earns its load cost. A review app does. A third upsell app probably does not.

The fix order: remove dead code first (free, no downside), then uninstall apps you do not use, then evaluate whether apps you do use could be replaced by native functionality or theme code.

2. Theme drift

The slow-motion version of app bloat, and the one nobody notices happening.

Every "small" customization adds something: a custom announcement bar adds a stylesheet, a hero video adds a script, a new product card layout adds CSS. Themes have no built-in way to clean these up. So the codebase grows for two years, nobody removes anything, and the cumulative weight gradually strangles LCP.

The discipline that prevents it: treat theme code like app code. Every addition gets a removal somewhere else, or LCP keeps climbing. In practice that means when you add a new section, you check whether the old one it replaced is still loading.

3. Unoptimised hero and product media

The LCP element on most Shopify pages is the hero image on the homepage or the main product image on a PDP. If that image is large, uncompressed, or served in the wrong format, LCP is slow regardless of everything else you do.

The fixes, in order:

  • Preload the LCP image. A <link rel="preload" as="image"> in the head tells the browser to fetch it first.
  • Add fetchpriority="high" to the LCP image element. This bypasses render-blocking queues.
  • Serve WebP or AVIF. Shopify's image filters handle this; make sure your theme requests the right format and width.
  • Request the right size. Serving a 2400px image into a 600px container wastes most of the download.
  • Never lazy-load the LCP element. See below.
The most common self-inflicted speed wound: lazy-loading the hero image. Lazy loading helps off-screen images, but applied to the LCP element it delays the exact thing Google is measuring. Add loading="lazy" to below-fold images only, and explicitly not to your hero or first product image.

4. Render-blocking resources

CSS and JavaScript in the <head> that the browser must download and process before it can paint anything. On heavy themes this is a major LCP contributor.

The fixes:

  • Inline critical CSS for above-the-fold content, defer the rest
  • Add defer or async to non-critical scripts
  • Limit custom fonts to two families, use font-display: swap, and preload the primary font file
  • Move third-party tags (chat widgets, heatmaps, popups) to load after first paint

5. Layout shift from late-loading elements

CLS problems on Shopify usually come from four sources:

  • Images without width and height attributes. The browser does not know how much space to reserve, so content jumps when the image arrives. Set explicit dimensions in your theme templates.
  • App-injected content. Review widgets, badges, and banners that appear after page load and push everything down.
  • Web fonts loading late, causing a text reflow.
  • Announcement bars and cookie banners that insert themselves above existing content.

Reserve space for anything that loads asynchronously. A placeholder of the right dimensions eliminates the shift entirely.

6. Theme app extensions and app blocks

Generally better than script injection, because they load through Shopify's own mechanism. But a poorly implemented app block can still introduce CLS and INP regressions.

Test every new app install with a before-and-after field data comparison. Not a lab score; field data, a fortnight later. If an app degrades your numbers, that is a business decision about whether the feature is worth the cost.

7. Markets and geo-redirect scripts

Automatic redirect scripts for international visitors can delay LCP significantly, because the browser waits on a decision before rendering. If you run Shopify Markets with client-side geo-redirection, evaluate whether that logic can move server-side or to the edge instead.

8. Checkout extensibility components

If you have extended Shopify's checkout with custom UI components, audit them for INP specifically. Checkout steps are the highest-stakes interactions on the store, and responsiveness there affects conversion directly.

9. The base theme

Last, and by a distance. Modern Online Store 2.0 themes ship with reasonable defaults: lazy loading, responsive images, sensible script handling. A slow store on Dawn is slow because of the eight items above, not because of Dawn.

This matters because "we need a faster theme" is a common conclusion and rarely the right one. Replatforming to a custom theme with fifteen apps still installed produces a custom theme that is slow.

On speed optimisation apps

They occupy an awkward middle ground.

What they do well: automate image compression, add lazy loading to below-fold images, minify CSS. These help LCP and CLS and require no development work.

Where they fall short or backfire: INP is caused by JavaScript execution on the main thread. An app that injects its own JavaScript to "boost speed" is adding to the exact problem INP measures. Some do genuinely defer third-party scripts and help; others add a layer and call it optimisation.

The honest framing: real Shopify performance work usually comes from removing weight, not adding another layer of software. If an app claims to solve everything automatically, be sceptical. The durable fixes (pruning apps, editing theme code to defer scripts, breaking up long tasks) are structural theme-level developer work.

If you do use one, measure field data before and a fortnight after, and be willing to uninstall it if the numbers do not move.

The 90-minute audit

This is the practical version. Run it on a real product page, not the homepage, because product pages are where most sessions and most revenue sit.

Step Tool What you are looking for
1. Read field data PageSpeed Insights (top section) Current LCP, INP, CLS from real visits. This is your baseline.
2. Check by page type Search Console > Core Web Vitals Whether the problem is product pages, collections, or homepage
3. Identify the LCP element PageSpeed Insights diagnostics Which element is actually the LCP. Usually the hero or product image.
4. Find unused JavaScript DevTools > Coverage tab Scripts loading and not being used. Note the file sources.
5. Find dead app code Theme files, search for script tags Scripts from apps you have already uninstalled
6. Find long tasks DevTools > Performance, record a load and interact Tasks over 50ms blocking the main thread. These are your INP problem.
7. Check image handling View source on the LCP image Whether it is preloaded, has fetchpriority, is in WebP, and is NOT lazy-loaded
8. Check layout reservations View source on any image and app widget Whether width and height are set, whether async content has reserved space

Ship the fixes in a duplicated theme, never the live one. Then measure field data again in two weeks; field data is a trailing average so it does not move immediately.

The fix priority order

Priority Fix Effort Typical impact
1 Remove dead app code from theme files 1-2 hours High, free, no downside
2 Uninstall apps you do not use 1 hour High
3 Preload LCP image + fetchpriority, remove lazy-load from it 1 hour High on LCP
4 Compress and reformat hero and product images 2-4 hours High on LCP
5 Defer non-critical JavaScript 3-6 hours High on INP
6 Set explicit width and height on all images 2-4 hours High on CLS
7 Reserve space for app-injected content 2-4 hours High on CLS
8 Inline critical CSS, defer the rest 4-8 hours Moderate on LCP
9 Reduce custom fonts, add font-display swap 1-2 hours Moderate
10 Move geo-redirects server-side 4-8 hours Moderate, international stores only

Items 1 through 4 are usually a single day of work and account for most of the available gain. Do those before considering anything structural.

Making it stick

This is the part that separates a one-off improvement from a durable one.

The cadence that holds: stores that run a quarterly audit tend to stay under 2.5 seconds LCP indefinitely. Stores that optimise once and stop typically slide back past 3.5 seconds within 18 months, as new apps drift in and theme tweaks accumulate. The audit takes about 90 minutes and ships the same day in a draft theme.

Three habits worth building:

  1. Test every new app install against field data a fortnight later. If it degrades your numbers, that becomes a business decision rather than an accident.
  2. Every theme addition gets a removal. When you add a section, check whether what it replaced is still loading.
  3. Watch field LCP monthly. A 0.3-second month-over-month increase means something broke. Catching it there is much cheaper than catching it when conversion drops.

What good looks like

Metric Target Where most Shopify stores actually sit
Mobile LCP (field) Under 2.5s 3-5s
INP (field) Under 200ms 200-500ms+ with heavy app stacks
CLS (field) Under 0.1 0.1-0.25
Installed apps Under 10 that inject scripts 12-20
Custom font families 2 3-5

The conversion payoff is the reason to do this rather than the ranking signal. Stores that get mobile LCP under 2.5 seconds typically see conversion rate rebound 0.4-0.7 points within four weeks, which on most stores is worth considerably more than the ranking benefit.

Common speed mistakes

  • Optimising against the lab score. Field data is what Google uses and what your shoppers experience.
  • Lazy-loading the LCP image. Delays the exact thing being measured.
  • Installing a speed app and calling it done. Helps LCP and CLS at best; can hurt INP.
  • Assuming the theme is the problem. It is usually eighth or ninth on the list.
  • Not checking for dead app code. The cheapest win available and the most commonly missed.
  • Testing only the homepage. Product pages carry most of your traffic and revenue.
  • Optimising once and stopping. Without a quarterly cadence, gains erode within a year.
  • Chasing a PageSpeed score of 90+ as the goal. Score chasing is not the same as store speed. The goal is field LCP under 2.5 seconds and conversion rate moving.
  • Replatforming for speed before doing the app audit and theme cleanup. A custom theme with fifteen apps is still slow.

When to bring in help

The first four items in the priority table are within reach of a technically comfortable store owner and account for most of the available gain. Worth doing yourself before paying anyone.

Where outside help earns its cost is the structural work: deferring scripts without breaking functionality, breaking up long tasks, inlining critical CSS, and diagnosing which of nine possible causes is producing your specific problem. That last part is the real skill, because a checklist applied blindly to the wrong cause produces no movement.

See how we approach Shopify development and performance work: field data first, app and theme audit before any structural change, and a stated LCP target with a quarterly cadence to keep it there.

Frequently Asked Questions

What LCP should a Shopify store target on mobile?

Under 2.5 seconds, measured on real mobile visits in field data rather than a lab test. Many mid-tier Shopify stores sit in the 3-5 second range, primarily because of unoptimised hero images and render-blocking theme scripts. Stores that get LCP under 2.5 seconds typically see conversion rate rebound 0.4-0.7 points within four weeks.

Do Shopify speed optimization apps work?

Partially, and sometimes counterproductively. Apps can automate image compression and lazy loading, which helps LCP and CLS. But INP is caused by JavaScript, and an app that injects its own JavaScript to boost speed can make INP worse. The durable fixes are pruning apps and editing theme code to defer scripts, which is structural developer work rather than something an app can do for you.

How much does each Shopify app slow down my store?

Roughly 150-300ms of added LCP per app that injects scripts, though the range is wide and some apps are far worse. Stores with heavy third-party app stacks frequently exceed 500ms INP, which is well into the Poor band. The bigger problem is leftover code: removing an app from the admin does not always remove its theme code.

Should I use lazy loading on all Shopify images?

On below-fold images, yes. Never on your LCP element, which is usually the hero image or the main product image. Lazy loading the LCP image delays the exact thing Google is measuring and makes your score worse rather than better. Instead, preload it and add fetchpriority="high".

Why does my Shopify store slow down again after optimization?

Theme drift and app accumulation. Every new app and every small theme customization adds a script or a stylesheet, and themes have no built-in mechanism to clean them up. Stores that run a quarterly audit tend to stay under 2.5 seconds LCP indefinitely; stores that optimise once and stop typically slide back past 3.5 seconds within 18 months.

Want a real number for your store?

Send us the URL and the catalog size. We will come back with a fixed quote and the template list it covers, no call required unless you want one.

Get a build quote

Ritik Verma

Founder and Managing Director, 7SEA Marketing™

Ritik founded 7SEA in 2020 and still reviews every scope before it goes out. He writes here about the parts of running an ecommerce agency that nobody publishes.