Evaluat is in private access. Demos open through July. Book a slot

Blog Ecommerce Performance

Why your Shopify store slows down under load

Shopify is hosted, so buyers assume it scales, and its cached storefront genuinely does. The slowdown lives somewhere else: the theme, apps, and third-party JavaScript a merchant adds run in every shopper's own browser, where an HTTP load test never looks. Under load, that is where a Shopify store actually slows. Here is why, and how to see it.

Written by: Ahmad Farzan ·

On a Shopify store, the platform sends a cached page fast, but each shopper's browser still has to run the theme, app, and third-party JavaScript, which pushes Core Web Vitals from good toward poor under load.

Doesn’t Shopify scale automatically?

Mostly, yes, and that is the trap. Shopify serves your storefront from a global content delivery network with full-page caching, so the server half of the response stays fast at almost any traffic. What it cannot cache is the JavaScript your theme and apps run inside each shopper’s browser, and that half slows down when a crowd arrives.

A hosted platform runs the servers, the database, and the network for you, and Shopify’s scaling is real. It renders storefront pages on its own servers, stores the finished HTML in a cache, and serves it through a global CDN, which Shopify’s developer docs name as Cloudflare. A 2020 Shopify engineering write-up describes the mechanism: once its renderer builds a page, it stores the output and hands that cached copy to later visitors, so a cached collection page costs the origin almost nothing even under heavy traffic. The result shows up in the field. Across the latest versions of its themes, Shopify’s own data puts a median 87.6% of shops at good Core Web Vitals (Google’s three metrics for loading, responsiveness, and visual stability) for at least 75% of their real users, as of June 2026. For contrast, only 48% of mobile sites across the web clear the same bar, according to the 2025 Web Almanac. On average, Shopify stores are fast.

So where does the slowdown come from? The other half of the page load. Every response Shopify sends still has to be turned into pixels by the shopper’s own browser, which downloads and runs the theme’s JavaScript, each app’s scripts, and every third-party tag before the page is usable. That work runs on the visitor’s device, not on Shopify’s servers, and no cache can do it for them. The cart and account pages sharpen the split, because they are specific to one shopper and are not shared from the full-page cache the way a product listing is.

It is like flat-pack furniture. The warehouse ships the box in minutes, but every customer still assembles it at home, and the more parts you add, the longer each assembly takes. Warehouse speed never changes that. Shopify’s 87.6% is a rolling average of ordinary traffic, and it is exactly the figure that builds false confidence: it tells you the store is usually fine, not what happens to your store, with your apps, at your busiest minute. That minute is what a real-browser performance test is built to show, and it is the one an ordinary load test misses.

What actually runs in the browser on a Shopify store?

Three layers of JavaScript stack up on a typical storefront: the theme’s own scripts, the apps a merchant installs, and the third-party tags like analytics, reviews, and chat. Each layer is downloaded, parsed, compiled, and executed on the shopper’s device, and each can call a server that Shopify does not control and cannot cache.

Start with the weight. The median mobile page across the web now ships 2,164 KB in total and 646 KB of JavaScript, per the 2025 Web Almanac, and commerce pages tend to sit heavier than the median because they carry more of the third layer. (Liquid, Shopify’s templating language, renders on the server, so it is not the client-side cost. The cost is the JavaScript the theme and its apps ship.)

Theme JavaScript

The theme is the store’s front end, and its scripts run the cart drawer, the product gallery, search, the variant picker, and animation. A well-built theme keeps this lean, but customizations accumulate over time: a slider here, a currency converter there, a countdown timer for the next sale, each adding code the browser has to run on every page.

Apps and the scripts they inject

Every app can add its own scripts to the storefront, and a typical store runs around half a dozen apps by Shopify’s own reckoning, with heavily customized stores running many times that. Each app is more main-thread work and, just as important, an independent backend the script calls out to. This is a structural cost, not a verdict on any one app: more apps means more code to execute and more separate services that can fail or slow on their own.

Third-party tags

Analytics, consent banners, A/B testing, personalization, and chat widgets load from other companies’ servers and run in the shopper’s browser. They are nearly universal: more than nine in ten pages use at least one third party, and scripts are the largest single category of third-party requests. Because these tags only execute inside a browser, they are precisely the part of the page that a test without a browser never sees.

Why does a Shopify store only slow down under load?

Because two costs compound at peak, and neither one is the server. The browser render tax is paid in full by every visitor on their own device and never amortizes, so peak simply means the most people paying it at once. And the app and tag servers that JavaScript depends on reach their own peak at the same moment, so they slow exactly when your traffic does.

The render tax is paid per device, and it never amortizes

Server caching is powerful because it builds a page once and serves it to many. Client-side execution is the opposite: every visitor’s browser parses and runs the same JavaScript from scratch, on its own processor, with no sharing between them. A weak phone feels this most, and most shoppers are on phones. The 2025 Web Almanac measured the median mobile page spending 1,916 milliseconds in total blocking time, the stretch where the main thread is too busy to react to a tap, against just 92 milliseconds on desktop, more than twenty times as much.

Here is the part that is easy to state wrong. Your shopper’s phone does not get slower because other people’s phones are busy; each device is independent. What changes at peak is how many devices are doing this at once, and which ones. The older phones on slower networks, your worst sessions, are present in their largest numbers exactly when you are busiest, so the aggregate experience is at its worst when it matters most. The render tax did not rise. The number of people paying it did.

The services your scripts depend on slow down exactly when you do

The second cost is genuinely load-coupled. The app backends and third-party tag servers your scripts call serve many sites at once, often thousands, and your sale peak is their peak too. When one of them slows or times out, the shopper’s browser sits waiting, long tasks pile up on the main thread, and the page stalls. A long task is any main-thread task over 50 milliseconds, and a run of them is measured directly as poor Interaction to Next Paint (INP). Late or render-blocking scripts hit Largest Contentful Paint (LCP) instead, and reflowing content shifts Cumulative Layout Shift (CLS). All of it happens while Shopify’s cached HTML still came back fast. For the metric-by-metric detail, see how to improve LCP and Interaction to Next Paint, explained.

Why doesn’t an HTTP load test catch this?

Because an HTTP load test never opens a browser. In HTTP mode, a protocol tool sends requests, reads the response bytes and status codes, and paces them to mimic users. It is fast, cheap, and accurate for what it measures, but it does not parse HTML, run JavaScript, load third-party tags, or paint a page. So it sees Shopify’s quick cached response and a 200 status, and reports that the store is healthy.

That is a property of the model, not a fault in the tools. Protocol tools like k6 and JMeter are genuinely the right instrument for API and protocol concurrency, where there is no browser to run and a real one would be wasted overhead. Some of them now reach further: k6 ships a browser module that drives real Chromium and reports Core Web Vitals, which is a different mode from its HTTP core. But the default HTTP load test, the one most teams run first, measures the server’s half of the page and stops where the browser’s half begins.

That gap is wide, and not only on Shopify. In a 2025 Catchpoint benchmark of SaaS websites, one site’s server answered in 52 milliseconds while its page took 8.4 seconds to finish loading. An HTTP load test pointed at that site would have reported 52 milliseconds and a clean pass. The user waited eight seconds. That is the distance between what the server returns and what users see, not what scripts pretend.

A single Shopify page-load timeline. An HTTP load test sees only the first segment, the server's response. A real browser sees the rest: HTML parse, theme and app JavaScript execution, third-party calls, and the Largest Contentful Paint and Interaction to Next Paint that decide what the shopper feels.

What an HTTP test sees versus what a real browser sees

The two tests answer two different questions about two different layers. An HTTP test answers “did the server respond quickly,” which on a cached Shopify storefront is almost always yes. A real-browser test answers “did the page stay fast for the shopper at peak,” which is the question your revenue actually turns on. The table maps what each one can and cannot record during a single Shopify page load.

What happens during a Shopify page loadHTTP load test (HTTP mode)Real-browser test
Server sends the cached HTMLMeasured, and fastMeasured, and fast
Theme and app JavaScript parse and executeNot runMeasured
App and third-party servers respond under loadNot calledMeasured
Largest Contentful PaintNot producedCaptured per session
Interaction to Next PaintNot producedCaptured per session
Cumulative Layout ShiftNot producedCaptured per session
Evidence of why one session was slowNoneSession video, network log, console log

The lesson is not that HTTP testing is wrong. It is that it measures a layer that rarely breaks on Shopify, and is blind to the layer that does. To see the layer that breaks, the test has to run the page the way a shopper’s device runs it. That is real-browser load testing: every virtual user is a real browser.

How to load test a Shopify storefront safely

Test the storefront experience, in a real browser, against an environment you control. Walk the journey a shopper takes, from collection to product to cart, with the apps and theme configured the way production is, and watch the metrics climb as concurrency rises. The goal is to find the load at which the page stops feeling fast, before a sale finds it for you. A flash sale or a product drop is the hardest version of this, because the load lands in minutes rather than hours; that sharp case is spike testing.

  1. Test what you control: the storefront and cart, not checkout. Shopify hosts checkout itself. Since it retired checkout.liquid for the checkout steps in 2024, checkout customizations run as sandboxed extensions in a web worker with no access to the page’s DOM, so you cannot weigh checkout down with arbitrary scripts the way you can a theme. The storefront and cart, the part you assemble, are where the performance risk and the test belong.
  2. Run it in a real browser. Only a browser executes the theme, app, and third-party JavaScript that decides felt speed. A protocol run against the same store measures the cache, not the experience.
  3. Test a development store or staging theme, and check the terms first. Drive load at an environment you own, not your live shop. Shopify’s public terms do not mention load testing, but they do prohibit automated access and working around technical limits, and stores sit behind bot mitigation, so heavy automated traffic at production can be blocked or breach the terms. Review Shopify’s terms and your third-party providers’ terms before you start.
  4. Give every virtual user its own data. A virtual user is one simulated shopper the test drives, and each needs a unique cart and session to keep caching and app behavior close to a real crowd. Hundreds of users sharing one cart measure a scenario that cannot happen in production.
  5. Watch Core Web Vitals at load, per URL and per session. Core Web Vitals at load usually degrade before any error appears, so the early warning is in the Vitals, not the error rate. Run from the region closest to your customers, and read the slowest sessions rather than the average. The margin is worth real money: Google and Deloitte’s 2020 study found a 0.1 second mobile speedup lifted retail conversions by 8.4% and average order value by 9.2%.

How Evaluat tests a Shopify storefront under load

Evaluat is a real-browser performance testing platform: every virtual user is a real, isolated browser that walks your storefront the way a shopper would, capturing Core Web Vitals under load along with session video, network logs, and console logs for each user. You build the journey once in a visual scenario editor, with no scripting; Datasets feed each virtual user its own cart and search terms; popup handlers dismiss the cookie and consent banners every storefront carries. Tests run from the region closest to your customers.

When the page slows at peak, the report shows where. The per-URL view separates the collection pages that held from the product or cart step that did not, and the network log of any session shows which call stalled, an app’s backend, a tag server, a personalization request. Aggregate percentiles tell you something broke; they do not tell you who or why. A failure at peak isn’t a percentile. It’s a session. Open the session. Watch the moment it broke.

Two honest boundaries. Evaluat watches your store from the outside: it shows which request was slow and what the shopper experienced, but tracing that slowness inside a third-party vendor’s backend still takes that vendor’s own monitoring. And for raw protocol concurrency, thousands of API requests per second with no rendering, an HTTP tool is the lighter, cheaper instrument. The real-browser model earns its cost on the JavaScript-heavy, browser-side path this article is about. The same divide on a self-hosted platform, where the bottleneck is the server you own rather than the browser, is the subject of why Magento checkout dies first under load.

Test the store you assembled, not the platform underneath

The asymmetry is the lesson. Shopify gives you a platform that scales and a set of themes that, on their own, are fast. What it cannot give you is a guarantee about the store you built on top, with its apps, its tags, and its customizations, at the load you are about to put it under. That store lives in your shoppers’ browsers, and the only way to see it is to test it there. Stop reading “Shopify scales” as proof that your store is fast, and measure the journey that carries your revenue, in a real browser, at the load you expect.

Test in real browsers. Debug in real sessions. Book a demo.

Ahmad Farzan, Founder at Evaluat

About the author

Ahmad Farzan · Founder at Evaluat

Founder of Evaluat. Has spent years building and load-testing Adobe Commerce and Magento storefronts, and built Evaluat to test sites the way real browsers actually hit them.

More from Ahmad →

Common questions

FAQ

Why is my Shopify store slow even though Shopify is fast?

Shopify's servers and CDN are fast, but server speed is not page speed. The slow part is the theme, apps, and third-party scripts that run in each shopper's browser after the fast response arrives, plus the app and tag servers those scripts call. Shopify caches the storefront HTML; it cannot cache what your JavaScript does once it reaches the browser.

Do Shopify apps slow down your store?

They can. Each app you install can inject scripts that download, parse, and execute on the shopper's main thread, and each one depends on its own vendor's backend. More apps means more main-thread work and more independent services that can slow at peak. The fix is not to fear apps, but to measure which ones add the most weight.

Does Shopify slow down under high traffic?

Shopify's cached storefront scales well, so the server side usually holds. What degrades at peak is the browser-side experience, because the largest number of shoppers are all running the theme and app JavaScript at once, and the third-party services that JavaScript depends on hit their own peak at the same time. There is no single "maximum users" number that captures this.

Can you load test a Shopify store?

Yes, with two cautions. Test the storefront and cart you control, because Shopify hosts and sandboxes its own checkout, and test against a development store or staging theme rather than driving heavy automated traffic at your live shop. Review Shopify's terms and your third-party providers' terms first, since high-volume automated traffic can run into acceptable-use limits.

Why do third-party scripts hurt Shopify performance?

Third-party scripts download from servers you do not control and execute on the shopper's main thread, where they can block rendering and delay interaction. Their backends serve many sites at once, so they can slow at exactly the moment your traffic peaks. That combination drags Largest Contentful Paint and Interaction to Next Paint down even when Shopify's own response was fast.

Does an HTTP load test measure Shopify Core Web Vitals?

No. In HTTP mode, a protocol load test sends requests and reads the response bytes without ever running a browser, so there is nothing to render and no Largest Contentful Paint, Interaction to Next Paint, or Cumulative Layout Shift to record. Measuring Core Web Vitals under load requires a real browser that executes the page the way a shopper's device does.

How do I improve Shopify Core Web Vitals under load?

Start by reducing and deferring theme and third-party JavaScript, and audit which apps inject the heaviest scripts. Then measure the storefront journey in a real browser at your expected peak, reading Core Web Vitals per page and per session so you can see which call stalled. Optimizing without measuring under load tends to fix the wrong thing.

Is a slow Shopify store a Shopify problem or a theme problem?

Usually it is the front end the merchant assembled, not the platform underneath. Shopify hosts and scales the infrastructure and its themes are well built, but the apps, tags, and theme customizations you add are the part you control and the part that slows under load. That is also the part you can test and fix.

See it on your site

Test in real browsers.
Debug in real sessions.

Want to see this measured on your app?

30 minutes. We build a scenario on your real customer journey, run a small test, and walk you through the report with your data in it.