Guide · Speed

Why is my Shopify store so slow? 9 causes I find in speed audits

Short answer: Start by measuring which pages and devices are slow, then trace the cause before changing the theme. Heavy JavaScript, oversized images, third-party apps and theme architecture can all contribute, but a low Lighthouse score alone does not tell you what to fix. I use the checks below to prioritize confirmed bottlenecks and test the result.

I've optimized the speed of many Shopify stores, and on one store I brought Largest Contentful Paint down from about 14 seconds to about 3 seconds without installing a speed app. That is one documented project, not a result I promise for every store. Below are the 9 causes I find most often, and the signs I investigate before recommending changes.

Start with a measurement-first speed check

  1. Find the affected templates and devices. Choose representative homepage, collection and product URLs, plus any slow cart or landing page. Separate mobile from desktop and record the template, URL and behavior that feels slow.
  2. Capture a baseline. Run PageSpeed Insights for those URLs and record the device mode, test date and results. Use Chrome DevTools Network and Performance panels to trace slow requests, long JavaScript tasks and visible shifts; record interactions such as variant selection, filters and opening the cart.
  3. Separate field data from lab tests. PageSpeed Insights can show real-user CrUX data collected over a rolling 28-day window, while Lighthouse runs a controlled lab test. Check whether the field report covers this URL or the whole origin. Missing field data means insufficient samples, not a pass. Repeat lab runs to understand variation; a single score is not a verdict on all visitors.
  4. Identify the affected metric. Find the actual LCP element and what delays it. For interaction delays, record the action and the main-thread work around it. For CLS, locate the elements that move unexpectedly. A standard Lighthouse page-load run does not measure INP; Total Blocking Time is a lab clue, not an interchangeable INP measurement.
  5. Prioritize confirmed bottlenecks. Tie a slow request, long task or layout shift to the affected template and user action. Fix the strongest evidence first, whether it points to an image, third-party script or theme code. Change one related group at a time on a test theme and keep a rollback copy; an app count or warning alone is not a diagnosis.
  6. Repeat comparable measurements. Re-test the same URLs, device and throttling settings, cache state and interactions. Compare several runs and the affected metrics, not just the overall score. Check field trends after release when enough new real-user data has accumulated; the rolling window will not immediately reflect a fix.
  7. Check functional regressions. Test menus, search, filters, product variants, subscription or bundle options, cart updates and checkout entry. Confirm consent controls and tracking still work. A lighter page that breaks purchasing or measurements is not a successful optimization.

What LCP, INP and CLS tell me

  • LCP (Largest Contentful Paint): loading performance. It measures when the largest eligible visible image or text block is rendered in the viewport. I identify that element in the trace rather than assuming it is the hero image.
  • INP (Interaction to Next Paint): responsiveness. It measures interaction latency across a visit, including the time until the next visual update after a click, tap or keyboard action. Long JavaScript tasks can delay that response.
  • CLS (Cumulative Layout Shift): visual stability. It measures unexpected layout shifts. Images without reserved space, injected app content and font changes can move content while someone is reading or tapping.

For the definitions and measurement limits, see Google's Core Web Vitals guidance and how PageSpeed Insights uses field and lab data.

If you need help turning those measurements into a plan, my Shopify CRO and speed service starts with the affected pages and behavior. The Shopify speed optimization case study shows the scope of the existing LCP example. If the main symptom is a delayed cart or unreliable events, also check the cart diagnostic workflow and tracking and pixel guide.

Contents (9)

1. The theme loads all its code on every page #

Many themes, including some premium ones, put all of their features into one big JavaScript file (often called theme.js) and one big CSS file. That file contains the code for the product gallery, the cart drawer, the mega menu, sliders, pop-ups, filters and everything else.

So when a visitor opens a simple page, their phone may still have to download and process code for features that aren't on that page. I check the request waterfall and execution trace before splitting code: global CSS can delay rendering, while unnecessary JavaScript adds download, parsing and execution work and can delay interactions.

Signs this is happening on your store:

  • Your theme has one very large theme.js or global JavaScript file loaded on every page.
  • PageSpeed Insights shows "Reduce unused JavaScript" and "Reduce unused CSS" with large savings.
  • Even simple pages, like your About or Contact page, score poorly on mobile.

Why it costs you sales: Every page is slower than it needs to be, especially on mid-range phones, which is where most of your buyers shop.

2. JavaScript is scattered across the theme #

Over time, more scripts get added: inline scripts inside sections, snippets from old apps, code pasted in by different developers. Each one may be small, but together they block the page from becoming usable and are hard to track.

Signs this is happening on your store:

  • Your theme has many <script> tags spread across sections and snippets.
  • You (or past developers) have pasted code into theme.liquid "just to make something work".
  • Nobody is sure what some of the scripts do anymore.

Why it costs you sales: Scattered scripts slow down the page and make every future change riskier and slower.

3. Images aren't sized for each screen #

A phone doesn't need the same image file as a large desktop monitor. Properly set up images give the browser several sizes to choose from, so each screen downloads only what it needs.

Many stores just use whatever image setup the theme came with. Sometimes that means a phone downloads a 2000px-wide image to show it at 400px, or every image is loaded at the same size no matter where it appears.

Signs this is happening on your store:

  • PageSpeed Insights shows "Properly size images" or "Serve images in next-gen formats".
  • Your product and collection images look fine but take a while to appear on mobile.
  • You upload very large images and rely on the theme to "handle it".

Why it costs you sales: Images are usually the heaviest part of a page. Oversized images make the whole store feel slow.

Read more: Product images that are high quality and fast →

4. The most important image is lazy loaded #

Lazy loading tells the browser to wait before loading an image until the visitor scrolls near it. That's great for images further down the page. But many themes and apps lazy load everything, including the main hero or product image at the top of the page.

That image may be the Largest Contentful Paint element, but text or another image can be the LCP element instead. If the trace confirms an above-the-fold image is the LCP element, lazy loading can delay its discovery or request. I check the loading attributes and request timing before changing them; below-the-fold images can still benefit from lazy loading.

Signs this is happening on your store:

  • Your hero banner or main product image appears a moment after the rest of the page.
  • PageSpeed Insights shows "Largest Contentful Paint image was lazily loaded".
  • Your LCP is much worse than your First Contentful Paint.

Why it costs you sales: Buyers see an empty space where your main image should be, and Google scores your page as slow.

5. The same script loads more than once #

This one is surprisingly common. The same library or tracking script gets loaded twice or more: once by the theme, again by an app, and again from code pasted into the theme. Each copy adds weight, and it can also cause bugs and double-counted tracking events.

Signs this is happening on your store:

  • PageSpeed Insights or your browser's network tab shows the same file loading more than once.
  • Your analytics show duplicate events (like purchases or add-to-carts counted twice).
  • Removing an app didn't remove all of its code.

Why it costs you sales: You pay the speed cost several times for the same thing, and your data becomes unreliable.

Read more: Duplicate tracking events: why purchases get counted twice →

6. Apps you no longer use still slow you down #

Some apps add storefront scripts and styles; others do not affect the storefront at all. Uninstalling an app does not automatically mean it left residual scripts. Depending on how it was integrated, its storefront code may be removed cleanly, while manually inserted snippets or older integrations may need cleanup. I confirm what is still requested or executed, check the app developer's uninstall instructions and preserve a theme backup before removing code.

Signs this is happening on your store:

  • You've installed and uninstalled many apps over the years.
  • Your theme has snippets named after apps you no longer have.
  • PageSpeed Insights shows third-party scripts from services you don't recognize.

What to verify: A leftover snippet name alone is not proof of a performance cost. Confirm that unused code still loads or runs, and that no active feature depends on it. Shopify's uninstall guidance explains when extra cleanup may be needed.

7. Using apps for simple features #

Many stores install an app for things that could be built directly into the theme: a contact form, a size chart, a badge, a simple pop-up, a countdown. Some add third-party requests or JavaScript across the storefront. The impact depends on where they load and what they execute, not just how many apps are installed.

My rule is simple: if a feature can be built properly into the theme, I build it in the theme instead of adding another app. That can reduce dependencies, but custom code also needs maintenance. I compare the measured cost and required functionality before recommending a replacement.

Signs this is happening on your store:

  • The trace shows app scripts loading on pages where their features are not used.
  • Some apps only do one small thing, like a form or a badge.
  • PageSpeed Insights shows "Reduce the impact of third-party code" with a long list.

What to investigate: Third-party requests can compete for bandwidth, and their JavaScript can occupy the main thread. Use the trace to identify the cost, then test whether an embed can be scoped, deferred or removed without breaking its purpose.

Read more: A lighter newsletter form or pop-up →

Read more: An app for every cart feature →

8. "Speed fixes" that only fool Lighthouse #

Some store owners want a higher PageSpeed score fast, and some developers deliver exactly that: a better score, but not a faster store. A common trick is to detect the Lighthouse test and hide scripts from it, so the test sees a light page while real visitors still get the slow one.

The score goes up. The store doesn't get any faster, and your money and time are wasted. A Lighthouse score is not a ranking score. Check real-user Core Web Vitals alongside comparable lab traces; a test-only improvement does not establish a better visitor experience or promise a ranking change.

Signs this happened on your store:

  • Your PageSpeed score jumped after a "speed optimization", but the store doesn't feel faster.
  • The Core Web Vitals report in Search Console didn't improve.
  • The work was done very quickly, with little explanation of what was changed.

Why it costs you sales: You pay for a number instead of a faster store, and the real problems are still there.

I don't do this. When I optimize a store, I fix the real causes and check real-world results, not just the score.

9. When the theme itself is the problem #

Sometimes a theme can't be fixed without fighting it at every step. If it's built on years of added code, doesn't follow Shopify's current best practices, or loads everything everywhere, every new feature makes it slower. Optimizing it is like patching a leaking boat.

In those cases, I'll tell you honestly that optimizing your current theme isn't worth it, and that moving to a better foundation will save you money in the long run. I turn down speed optimization work when I can see it won't give you real results.

When I build a store, I usually start from Dawn, Shopify's own reference theme. It's a useful starting point for a simpler theme architecture, but the final result still depends on the sections, media, apps and custom code added to it. I check the resulting store rather than treating a theme choice as a speed guarantee. Then I add your design and features on top, the right way.

Signs your theme is the problem:

  • It's an older (pre-Online Store 2.0) theme, or heavily modified over many years.
  • Previous speed work only gave small or temporary improvements.
  • Every new feature or app makes the store noticeably slower.
Client reviews

What clients say about this kind of work #

“Another great project with Philip! Excellent work on improving our core vitals / schema, and great communication throughout. Thanks again!”

Upwork client · SEO Audit & Website Updates

“We have worked with Philip on multiple occasions and recommend him wholeheartedly. The quality of his work is exceptional, as is his response, speed and diligence with communication. We look…”

Upwork client · Website updates including changes to hosting and setting up a homepage

4.9 on Upwork · Read all 79 reviews →

Speed audit

Real speed, not just a score #

That project covered the homepage, collection and product pages. Third-party apps and web pixels remained the main factor affecting Speed Index. The published record does not provide enough detail about devices, test conditions or the field-data window to treat the LCP figures as a controlled benchmark; I have not reproduced the historical measurement here. About 3 seconds of LCP is not the same as a complete page-load time, and it is not a universal target or a conversion or ranking guarantee.

Every store is different. Some need a cleanup of apps and images. Others need their theme code restructured. And some are better off on a new foundation. The first step is finding out which one your store needs. I use Shopify's theme performance practices as implementation guidance, then validate the actual store and its required features.

Is your Shopify store slow?

Message me on Upwork to arrange a free 30-minute call. Send me your store URL. I'll check what's really slowing it down and tell you honestly whether it's worth optimizing or better to rebuild.

Free 30-Minute Call

Privacy

This site uses Google Analytics to understand how visitors use the page, such as which sections are viewed and which links are clicked. Google Analytics uses cookies and collects data like your approximate location, device and browser. I don't run ads on this site, I don't sell your data, and I don't collect your name or email here.

You'll be asked for your choice when you first visit. If you close the banner without choosing, analytics cookies stay off and you'll be asked again in 30 days. Your choice is saved in a small cookie for 6 months.

Learn how Google uses this data: policies.google.com/technologies/partner-sites

Philip DiazAvailable for new projects 4.9·Top Rated on Upwork Free 30-Minute CallFree 30-Min Call

Cookie settings

Strictly necessary

Remembers your cookie choice. Always on.

Analytics

Google Analytics, to see which sections are viewed and which links are clicked.