Apps are the fastest way to add functionality to Shopify and the fastest way to wreck your store's speed. Every installed app adds JavaScript, CSS, and network requests to your storefront. A store running 20 apps might be loading 600KB of extra code visitors never interact with. The fix is a systematic audit: identify what each app costs you, remove what you do not need, replace heavy apps with lighter alternatives, and lazy load what stays.
How Shopify Apps Actually Affect Speed
When you install a Shopify app, it does not just sit quietly in your admin. It gets access to your storefront and almost always injects code into your live store pages.
Apps inject scripts in two ways. The first is through Shopify's ScriptTag API. The app registers a JavaScript file that Shopify automatically adds to every page of your storefront. No theme code required. The app controls when and how its script loads. Most apps default to loading globally, meaning every page, every visitor, every time.
The second method is direct theme injection. During installation, some apps add code directly to your theme.liquid file or specific template files. This gives the app more control over placement and behavior, but it also means the code stays in your theme permanently, even after you uninstall the app.
The performance cost stacks in three layers:
Every app script is a separate HTTP request. Ten apps mean at minimum ten extra network connections. Each connection has overhead: DNS lookup, TCP handshake, TLS negotiation, before a single byte of the script is transferred.
App scripts range from a few kilobytes to hundreds of kilobytes. A loyalty program app, a product recommendation engine, and a size guide widget together might add 400KB of JavaScript to every page load.
Downloaded JavaScript has to be parsed and executed by the browser. On a mid-range mobile device, 400KB of JavaScript can take 2 to 4 seconds to process. During this time, taps and clicks feel unresponsive and your INP score climbs.
How to Audit Your Installed Shopify Apps
A proper audit takes about an hour and gives you a clear picture of what each app costs you in performance terms.
Go to your Shopify admin and click Apps. Write down every app, including ones you installed and forgot about. It is common to find 5 to 8 apps in this list that nobody on the team actively uses.
Group your apps into categories: revenue-generating (reviews, upsells, subscriptions), operational (inventory, shipping, accounting), customer experience (chat, loyalty, wishlists), and marketing (email capture, pixels, social proof).
Open Chrome DevTools on your homepage. Go to the Network tab and filter by JS. Look at the domain names of every loading script. Each app loads from its own domain. Match each external domain to an installed app. Build a table with: App Name, Domain, File Size, Pages Loaded On, Last Used.
Create a duplicate of your theme under Themes > Actions > Duplicate. On the duplicate, disable or remove one app's code. Run Lighthouse on both the live theme and the duplicate. The score difference is that app's real cost. Focus on the five largest scripts you found in Step 3.
How to Identify Heavy Apps
File size is one signal, but it is not the only one. Some apps load small scripts that trigger large external resources. Others load modest scripts but fire dozens of API calls on every page interaction.
Signs an app is disproportionately heavy:
- It loads on every page without restriction. A review widget has no reason to load on your Contact page or your blog archive. If an app loads globally and only functions on product pages, it is loading 80 to 90 percent of the time for no reason.
- It loads external fonts or icon libraries. Some apps bundle their own icon font (Font Awesome, Material Icons) rather than using your theme's existing icon system. Loading a 50KB icon font for three icons used inside an app widget is wasteful.
- It makes API calls on every page load. Social proof notification apps often poll a server every few seconds. This creates ongoing network activity that competes with your page's own resources.
- It injects large DOM structures. Apps that inject floating buttons, persistent chat windows, or complex overlay widgets add to your DOM size and require layout calculations the browser has to perform on every resize and scroll.
How to Remove Unused Shopify Apps Safely
Removing apps incorrectly can leave broken code in your theme and orphan scripts that fire against dead URLs.
Before removing any app: Check if the app injected code into your theme files. Go to Online Store > Themes > Actions > Edit Code. Use the search function to look for the app's name or domain. Look in theme.liquid and any template files the app might have modified. Screenshot or copy any code you find before removing the app.
The safe uninstall process:
- Open the app in your Shopify admin
- Check the app's settings for a "remove code" or "uninstall" option. Some apps offer to clean up their own code.
- Go to Shopify admin > Apps and click the trash icon next to the app
- Confirm the uninstall
- Go back to your theme code editor and search for the app's domain name
- Remove any remaining script tags, CSS links, or Liquid code the app left behind
- Run a PageSpeed test to confirm the script no longer loads
<script src="https:// tags in your theme.liquid that do not match any current app. Look for empty Liquid snippets that apps created. Look for unused CSS files in your assets folder referencing app domains. A store that has cycled through 30 apps over its lifetime can accumulate significant orphan code.Replacing Apps with Custom Code
Several common app functions can be replicated with small amounts of custom code that add zero external dependencies. This is the most impactful long-term optimization: eliminate the app entirely and own the functionality yourself.
A static countdown can be built with 15 lines of JavaScript placed directly in a theme snippet. No external script, no API calls, no ongoing performance cost.
Shopify has native back-in-stock notification functionality built in for most plan levels. Check Products > Inventory before installing a third-party app for this.
A basic GDPR cookie banner is a few lines of HTML, CSS, and JavaScript. Unless you need granular consent management, a custom snippet handles this without an app.
Static trust badge images embedded in a theme section cost nothing. Upload your badge images to Shopify Files, add them to a custom section, done.
A Shopify metafield or a simple Liquid snippet that renders a table can replace most size guide apps for stores with straightforward sizing information.
Here is a simple countdown timer you can add directly to your theme with no app required:
function startCountdown(endDate, elementId) {
const timer = setInterval(function() {
const now = new Date().getTime();
const distance = new Date(endDate) - now;
if (distance < 0) { clearInterval(timer); return; }
const hours = Math.floor(distance / (1000 * 60 * 60));
const minutes = Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60));
const seconds = Math.floor((distance % (1000 * 60)) / 1000);
document.getElementById(elementId).innerHTML =
hours + "h " + minutes + "m " + seconds + "s";
}, 1000);
}
How to Lazy Load App Scripts
For apps you need to keep, lazy loading shifts their JavaScript from page load time to user interaction time. The script only downloads when the visitor actually needs it.
The most practical approach is interaction-triggered loading: load the app script the first time a user engages with the page, not when the page first loads.
function loadAppScript(src) {
const script = document.createElement('script');
script.src = src;
script.async = true;
document.head.appendChild(script);
}
// Load chat widget only when user scrolls or moves mouse
let appLoaded = false;
function triggerAppLoad() {
if (appLoaded) return;
appLoaded = true;
loadAppScript('https://chatwidget.example.com/widget.js');
window.removeEventListener('scroll', triggerAppLoad);
window.removeEventListener('mousemove', triggerAppLoad);
}
window.addEventListener('scroll', triggerAppLoad, { passive: true });
window.addEventListener('mousemove', triggerAppLoad);
For review widgets specifically, load them when the reviews section scrolls into view using Intersection Observer:
const reviewSection = document.querySelector('.reviews-section');
if (reviewSection) {
const observer = new IntersectionObserver(function(entries) {
if (entries[0].isIntersecting) {
loadAppScript('https://reviewapp.example.com/widget.js');
observer.disconnect();
}
}, { rootMargin: '200px' });
observer.observe(reviewSection);
}
The 200px root margin loads the script 200 pixels before the section enters the viewport, so by the time the visitor sees it, the widget is already loaded.
Shopify App Alternatives Worth Knowing
For the most common heavy apps, lighter alternatives exist. These are apps built with performance as a priority rather than feature breadth.
Judge.me is one of the lightest full-featured review apps available. It loads significantly faster than Yotpo, which carries substantial JavaScript overhead. Worth evaluating if you are on a performance-sensitive store.
Shopify's native email capture under Marketing has improved. For basic newsletter signup forms, the native option loads no external scripts. Klaviyo's popup is lighter than many alternatives for advanced needs.
ReConvert and Frequently Bought Together are generally lighter than enterprise-tier upsell platforms. Test the JavaScript impact of any upsell app before committing.
Smile.io and BON Loyalty both run well on most stores. Heavier enterprise loyalty platforms often add significant JavaScript overhead that smaller stores do not need.
Ecom: Page Speed Expert is purpose-built for Shopify performance. It handles image compression, script management, and performance monitoring without adding the kind of bloat it is designed to remove.
How to Test After App Removal
Testing after app changes requires a structured approach. You want to confirm three things: the performance improved, the store still functions correctly, and no orphan code was left behind.
Performance testing: Run Lighthouse on your homepage, product page, and collection page immediately after removing an app. Wait 24 hours and run it again. Shopify's CDN cache clears over time and the second test is often more accurate. Look specifically at:
- Total Blocking Time (lower is better, reflects fewer render-blocking scripts)
- Main thread work (should decrease after removing heavy scripts)
- Number of third-party domains (should match your reduced app count)
Functional testing: Check every page type after each app removal. Homepage, collection, product, cart, and checkout. Click through the buying flow completely. Test on mobile. Open DevTools Console and look for errors after your app removals. A 404 error fetching a script from an app's domain is a sign of leftover code.
Revenue monitoring: Track your conversion rate for 7 to 14 days after significant app removals. If you removed a high-friction app, conversion should improve. If you removed something that was genuinely helping conversion, you will see it in the data quickly enough to reinstall.
How to Monitor App Performance Ongoing
App creep, the slow accumulation of new apps over time, is the reason most stores end up in the situation this guide addresses. Preventing it is easier than fixing it after the fact.
Decide your store will run a maximum number of apps. When someone wants to add a new app, they make the case for which existing app it replaces. This forces a real cost-benefit analysis every time.
On the first of each month, open Chrome DevTools Network tab on your homepage, filter by JS, and count external script domains. If the number is higher than last month, investigate what was added.
Install the app, configure it, run Lighthouse. If the performance cost is significant and the app is not yet deeply integrated, it is much easier to remove it now than after three months of use.
Every three months, go through every installed app and ask: is this generating measurable value? Has Shopify or our theme added native functionality that makes this app redundant?
Summary
Apps are not the enemy. Unexamined, unaudited apps are. The difference between a 35 and a 70 on PageSpeed is often 6 to 8 apps loading scripts globally that serve no purpose on most of your pages.
Tools like Ecom: Page Speed Expert fit into this workflow by handling the optimization layer that sits between your app stack and your actual page performance. But no optimization tool replaces the discipline of keeping your app list lean in the first place.
Start with your audit today. The data will tell you exactly where to focus.