Skip to content
Performance4 min read

How to audit app bloat on your Shopify store in 30 minutes

A step-by-step audit for finding which apps are slowing your storefront down, what they left behind after uninstall, and what to do about each one.

Shopyra TeamProduct & Engineering
Share

The average Shopify store runs six apps. The average store we audit is running two it forgot about, one that was uninstalled but left code behind, and one that loads 200KB to display a badge.

This is the audit we run. It takes about half an hour and you need nothing but a browser.

Step 1: Inventory what actually loads (10 minutes)

Open your storefront homepage in Chrome. Open DevTools, go to the Network tab, tick Disable cache, and reload.

Now:

  1. Filter to JS.
  2. Sort by Size, descending.
  3. Screenshot it.

You are looking at every script your storefront loads, biggest first. Your theme’s own JavaScript is usually near the top and that is fine. Everything else needs a justification.

Repeat this on a product page and a collection page. Some apps only load on specific templates, and some load everywhere when they should not.

What to write down: for each script over 30KB, the domain it came from and its size. The domain tells you the app.

Step 2: Find the orphans (5 minutes)

Uninstalling an app in Shopify admin removes its app embed. It does not always remove code that was injected into your theme — particularly for apps installed before app embeds existed, or apps that asked you to paste a snippet.

In your admin:

  1. Online Store → Themes → ⋯ → Edit code
  2. Open layout/theme.liquid and read the <head> and the bottom of <body> carefully.
  3. Look in snippets/ for files with vendor names you do not recognise.
  4. Search the whole theme for <script src= and for .myshopify.com/apps.

Anything referencing an app you no longer use is dead weight — often a request that 404s, which is still a request.

Before you delete anything, duplicate the theme. This is a two-click backup and you will want it.

Step 3: Check the app embeds you do have (5 minutes)

Online Store → Themes → Customize → App embeds (the plug icon in the left sidebar).

Every embed here is loading on every page. Toggle off anything you are not actively using. You do not have to uninstall the app to stop it loading — this is useful for seasonal apps.

Step 4: Classify each app (10 minutes)

For every app still standing, put it in one of four buckets:

Keep as-is. It is small, it is used, it earns its weight.

Keep but defer. It is used but it does not need to load during the initial render. Chat widgets, review widgets below the fold, popups, loyalty widgets. Check the app settings for a “load on interaction” or “defer” option — many have one that is off by default. If it does not have one, ask support. It is a reasonable request.

Replace. It does something you need, but there is a lighter option. Sliders, badges, countdowns and popups all have a wide spread of implementation quality — the difference between the heaviest and lightest option in each category is frequently 5–10×.

Remove. You are not using it, or the feature is not worth the weight. Be honest here. An app that produced a measurable lift when you installed it eighteen months ago may not be earning anything now.

Step 5: Measure before and after

Run PageSpeed Insights on your homepage before you change anything and screenshot the result. This is your baseline.

Make your changes, then re-run the lab test immediately to confirm the direction. Do not expect the field data to move — that is a rolling 28-day window of real visits and it will take about a month to reflect the change.

What “good” looks like

For a mid-sized store on a modern theme:

Metric Target
Total JS on homepage Under 300KB compressed
Third-party JS Under 100KB compressed
Requests to non-Shopify domains Under 10
LCP (field, mobile) Under 2.5s
INP (field, mobile) Under 200ms

If your third-party JavaScript is more than your theme’s, you have found your problem.

The uncomfortable part

Most stores can remove two apps without anyone noticing. The reason they do not is that each app individually seems defensible — it does something, someone installed it for a reason, removing it feels like a loss.

The cost is not per-app though. It is cumulative, it is paid by every visitor on every page load, and it is invisible in your admin. Nobody sends you a report saying “your reviews widget cost you 140 sales this month by pushing your INP over 200ms.”

That is what makes this audit worth thirty minutes a quarter.

What we do about it

Every app we build publishes its compressed bundle size on its page, and we treat that number as a product constraint rather than an outcome. It is why our apps do fewer things than the suites they compete with — and why installing three of ours is still lighter than installing one of theirs.

You can see the numbers on the apps page. Compare them to what you are running now.

Read next

All posts

Get started free

Put this into practice

Our apps are built on exactly the principles in these posts — small, fast, theme-native, and honest about what they do.

  • Free to install
  • OS 2.0 app blocks
  • No code required