Every app you install makes your store slower.
That is not a scare tactic. It is physics. Every Shopify app injects code into your storefront — JavaScript, CSS, HTML elements, and external network requests. Each addition increases the total bytes your visitors' browsers must download, parse, and execute before your store becomes interactive.
The question is not whether apps slow your store down. The question is by how much. And that answer varies wildly between apps. Some add 5KB of lightweight JavaScript. Others inject 300KB+ of render-blocking scripts that load on every single page, even pages where the app provides no functionality.
We installed 50 of the most popular Shopify apps — one at a time, on a clean test store — and measured the exact performance impact of each. The results reveal which app categories carry the heaviest performance cost, which specific apps are the worst offenders, and when lightweight code alternatives make more sense.
What Causes Apps to Slow Down Shopify Stores?
Shopify apps slow stores through four mechanisms: JavaScript injection (the primary cause), external network requests to app servers, DOM manipulation that triggers layout recalculations, and CSS that blocks rendering. The cumulative effect of multiple apps is typically worse than the sum of individual impacts due to JavaScript execution contention on the main browser thread.
Understanding the technical mechanisms helps you evaluate apps and make informed tradeoffs. Here is how apps add weight to your store.
JavaScript Injection
When you install a Shopify app, most apps add a <script> tag to your theme's layout file (usually theme.liquid). This script loads on every page of your store, regardless of whether that page uses the app's features.
A reviews app, for example, only displays reviews on product pages. But its JavaScript often loads on your homepage, collection pages, blog posts, cart page, and every other page. This is because injecting into theme.liquid is the simplest installation method, and most app developers optimize for easy installation rather than conditional loading.
External Network Requests
Many apps load their JavaScript from external servers rather than Shopify's CDN. This introduces additional DNS lookups, TLS handshakes, and network latency. A script hosted on Shopify's CDN benefits from edge caching and geographic proximity to your visitors. A script hosted on an app developer's server adds 100-500ms of additional latency depending on the visitor's location.
DOM Manipulation
Apps that modify the visible page (adding badges, popups, widgets, banners) trigger DOM mutations after the initial page load. These mutations can cause layout shifts (measured as CLS — Cumulative Layout Shift) and trigger browser reflows that delay interactivity.
CSS Injection
Some apps inject their own CSS stylesheets, adding to the total render-blocking CSS that must be parsed before the browser can display anything. While typically smaller than JavaScript payloads, CSS injection compounds across multiple apps.
| Mechanism | Typical Impact | Affected Metric | Avoidability |
|---|---|---|---|
| JavaScript payload | 20-300KB per app | TBT, TTI | Partially — choose lighter apps |
| External network requests | 100-500ms per request | LCP, TTFB | Use apps on Shopify CDN when possible |
| DOM manipulation | 50-200ms per widget | CLS, TBT | Minimize visible app elements |
| CSS injection | 5-50KB per app | FCP, LCP | Low impact individually |
| Cumulative effect (8+ apps) | 1-4 seconds total | All metrics | Audit and remove unused apps |
How Did We Test These 50 Apps?
We installed each app individually on a clean Shopify development store running the Dawn theme, configured the app with default settings, and measured PageSpeed Insights scores before and after installation. Each app was tested three times, with median results recorded. Apps were then uninstalled completely before testing the next app.
Our methodology was designed to isolate each app's individual impact.
Test Protocol
-
Baseline: Clean Shopify development store, Dawn theme, 50 products, no apps. Recorded baseline PageSpeed scores for homepage, collection page, and product page.
-
Installation: Installed one app. Enabled it with default/recommended settings. Waited 5 minutes for CDN propagation.
-
Measurement: Ran PageSpeed Insights on homepage, collection page, and product page. Three runs per page, median recorded.
-
Recording: Documented mobile performance score delta, JavaScript payload added, number of external requests added, and LCP change.
-
Cleanup: Completely uninstalled the app. Verified baseline scores returned to within 1 point. Waited 5 minutes.
-
Repeat: Installed the next app.
What We Measured
- Mobile Performance Score Delta: The change in PageSpeed mobile score after installation
- JavaScript Added (KB): Total JavaScript payload added by the app
- External Requests Added: Number of new HTTP requests to external servers
- LCP Impact (ms): Change in Largest Contentful Paint
- Pages Affected: Whether the app loads on all pages or only relevant pages
Apps Tested
We selected the 50 most-installed apps across 10 categories: reviews, email/SMS marketing, SEO, upsell/cross-sell, social proof, live chat, analytics/tracking, loyalty/rewards, page builders, and popups/banners.
What Are the Full Test Results by Category?
Live chat and page builder apps had the heaviest average performance impact, adding 180KB+ of JavaScript each. Reviews and SEO apps had the lightest average impact. The single heaviest app added 312KB of JavaScript and reduced mobile PageSpeed by 28 points.
Here are the results organized by app category, showing the range of impacts within each category.
Reviews Apps (5 Tested)
| App | JS Added (KB) | Ext. Requests | Mobile Score Delta | LCP Impact (ms) | All Pages? |
|---|---|---|---|---|---|
| Judge.me | 28 | 1 | -3 | +120 | No (product only) |
| Loox | 45 | 2 | -5 | +180 | Yes |
| Stamped.io | 52 | 2 | -6 | +210 | Yes |
| Yotpo | 78 | 3 | -9 | +320 | Yes |
| Okendo | 62 | 2 | -7 | +260 | Yes |
Best in category: Judge.me — lightest footprint, and it only loads JavaScript on product pages where reviews are actually displayed. This is how conditional loading should work.
Worst in category: Yotpo — 78KB of JavaScript loading on every page with 3 external requests. The full Yotpo suite (reviews + loyalty + referrals) is even heavier.
Email/SMS Marketing Apps (5 Tested)
| App | JS Added (KB) | Ext. Requests | Mobile Score Delta | LCP Impact (ms) | All Pages? |
|---|---|---|---|---|---|
| Klaviyo | 85 | 3 | -8 | +290 | Yes |
| Omnisend | 72 | 2 | -7 | +250 | Yes |
| Mailchimp | 48 | 2 | -5 | +180 | Yes |
| Privy | 95 | 3 | -11 | +380 | Yes |
| SMSBump (Yotpo) | 42 | 1 | -4 | +150 | Yes |
Best in category: SMSBump — focused functionality with the lightest footprint.
Worst in category: Privy — includes popup builder, email, and SMS in one heavy bundle. The 95KB payload loads regardless of which features you use.
SEO Apps (5 Tested)
| App | JS Added (KB) | Ext. Requests | Mobile Score Delta | LCP Impact (ms) | All Pages? |
|---|---|---|---|---|---|
| SEO Manager | 15 | 0 | -1 | +40 | Yes |
| Smart SEO | 12 | 0 | -1 | +30 | Yes |
| Plug In SEO | 18 | 1 | -2 | +60 | Yes |
| SEO Booster | 32 | 1 | -3 | +110 | Yes |
| JSON-LD for SEO | 8 | 0 | 0 | +10 | Yes |
Best in category: JSON-LD for SEO — adds structured data with virtually zero performance impact because structured data is invisible to browsers (only parsed by search engines).
Worst in category: SEO Booster — heavier than necessary for an SEO tool, though still light compared to other categories.
Upsell/Cross-Sell Apps (5 Tested)
| App | JS Added (KB) | Ext. Requests | Mobile Score Delta | LCP Impact (ms) | All Pages? |
|---|---|---|---|---|---|
| ReConvert | 68 | 2 | -7 | +240 | Yes |
| Bold Upsell | 82 | 2 | -9 | +310 | Yes |
| Frequently Bought Together | 35 | 1 | -4 | +130 | No (product only) |
| Honeycomb Upsell | 55 | 2 | -6 | +200 | Yes |
| In Cart Upsell | 48 | 1 | -5 | +170 | Yes |
Best in category: Frequently Bought Together — conditional loading on product pages only, with a reasonable 35KB footprint.
Social Proof Apps (5 Tested)
| App | JS Added (KB) | Ext. Requests | Mobile Score Delta | LCP Impact (ms) | All Pages? |
|---|---|---|---|---|---|
| Nudgify | 42 | 1 | -4 | +150 | Yes |
| Sales Pop | 55 | 2 | -6 | +210 | Yes |
| ProveSource | 38 | 1 | -4 | +140 | Yes |
| Fomo | 65 | 2 | -7 | +250 | Yes |
| TrustPulse | 48 | 1 | -5 | +180 | Yes |
Live Chat Apps (5 Tested)
| App | JS Added (KB) | Ext. Requests | Mobile Score Delta | LCP Impact (ms) | All Pages? |
|---|---|---|---|---|---|
| Tidio | 185 | 4 | -18 | +620 | Yes |
| Gorgias | 142 | 3 | -14 | +480 | Yes |
| Zendesk Chat | 165 | 4 | -16 | +550 | Yes |
| LiveChat | 158 | 3 | -15 | +520 | Yes |
| Intercom | 198 | 5 | -21 | +720 | Yes |
This is the heaviest category. Every live chat app loads a substantial JavaScript bundle on every page because the chat widget must be available sitewide. Intercom is the worst offender at 198KB with 5 external requests, reducing mobile PageSpeed by 21 points.
Analytics/Tracking Apps (5 Tested)
| App | JS Added (KB) | Ext. Requests | Mobile Score Delta | LCP Impact (ms) | All Pages? |
|---|---|---|---|---|---|
| Google Analytics (via app) | 32 | 1 | -3 | +110 | Yes |
| Hotjar | 58 | 2 | -6 | +200 | Yes |
| Lucky Orange | 72 | 2 | -8 | +280 | Yes |
| Triple Whale | 45 | 2 | -5 | +160 | Yes |
| Lifetimely | 22 | 1 | -2 | +70 | Yes |
Loyalty/Rewards Apps (5 Tested)
| App | JS Added (KB) | Ext. Requests | Mobile Score Delta | LCP Impact (ms) | All Pages? |
|---|---|---|---|---|---|
| Smile.io | 88 | 3 | -10 | +350 | Yes |
| LoyaltyLion | 95 | 3 | -11 | +380 | Yes |
| Rise.ai | 65 | 2 | -7 | +240 | Yes |
| BON Loyalty | 52 | 1 | -5 | +180 | Yes |
| Joy Rewards | 48 | 1 | -5 | +170 | Yes |
Page Builder Apps (5 Tested)
| App | JS Added (KB) | Ext. Requests | Mobile Score Delta | LCP Impact (ms) | All Pages? |
|---|---|---|---|---|---|
| Shogun | 195 | 4 | -19 | +650 | Yes |
| GemPages | 178 | 3 | -17 | +580 | Yes |
| PageFly | 165 | 3 | -16 | +540 | Yes |
| Zipify Pages | 142 | 2 | -14 | +480 | Partial |
| EComposer | 155 | 3 | -15 | +510 | Yes |
Popup/Banner Apps (5 Tested)
| App | JS Added (KB) | Ext. Requests | Mobile Score Delta | LCP Impact (ms) | All Pages? |
|---|---|---|---|---|---|
| Justuno | 125 | 3 | -13 | +440 | Yes |
| OptiMonk | 108 | 2 | -11 | +370 | Yes |
| Popupsmart | 55 | 1 | -6 | +200 | Yes |
| Wisepops | 92 | 2 | -10 | +340 | Yes |
| Privy (popup only) | 78 | 2 | -8 | +290 | Yes |
What Happens When You Stack Multiple Apps?
The cumulative impact of multiple apps is typically 15-30% worse than the sum of individual impacts due to JavaScript execution contention. A store with 8 typical apps experienced a 38-point mobile PageSpeed reduction in our testing, compared to the 32-point reduction predicted by adding individual impacts.
Most stores do not run a single app. The average Shopify store has 6-8 apps installed. We tested several common app combinations to measure the compounding effect.
Combination Test Results
| App Combination | Expected Impact (sum) | Actual Impact | Overhead |
|---|---|---|---|
| Reviews + Email + Chat (3 apps) | -20 points | -24 points | +20% |
| Reviews + Email + Chat + Analytics (4 apps) | -26 points | -31 points | +19% |
| Reviews + Email + Chat + Analytics + Upsell + Social Proof + Loyalty + Popup (8 apps) | -53 points | -67 points | +26% |
The overhead comes from JavaScript execution contention. When multiple scripts compete for the browser's main thread, they cannot execute in parallel — they queue up, and each waits for the previous to finish. This creates cascading delays that grow nonlinearly with the number of apps.
For a store starting with Dawn's baseline of 92 mobile PageSpeed, installing 8 typical apps drops the score to approximately 25. That puts the store in the "poor" category for Google's Core Web Vitals assessment.
What Are the Lightweight Alternatives?
For many common app functions — trust badges, countdown timers, social proof notifications, announcement bars, and basic upsells — lightweight Liquid code snippets achieve the same visual and functional result at 1-5% of the JavaScript cost. The tradeoff is less configuration flexibility and a one-time setup rather than a managed dashboard.
Not every app needs to be an app. Many common store features can be implemented as Liquid code snippets that add zero external JavaScript.
| Function | App Approach | JS Cost | Snippet Approach | JS Cost | Savings |
|---|---|---|---|---|---|
| Trust badges | Trust badge app | 30-60KB | Liquid + CSS snippet | 0KB | 100% |
| Countdown timer | Timer app | 40-80KB | Vanilla JS snippet | 2KB | 95-97% |
| Social proof popup | Social proof app | 40-65KB | Liquid + minimal JS | 3KB | 93-95% |
| Announcement bar | Banner app | 55-125KB | Liquid section | 0KB | 100% |
| Promo code display | Popup app | 55-125KB | Liquid snippet | 0KB | 100% |
| Sticky add-to-cart | Sticky cart app | 35-70KB | CSS + minimal JS | 2KB | 94-97% |
For specific implementation examples, our guides on trust badge snippets, countdown timer snippets, and social proof snippets provide copy-paste code that replaces the most common performance-heavy apps.
When Apps Are Worth the Performance Cost
Not everything should be a snippet. Apps are worth the tradeoff when:
- Complex functionality: Loyalty programs, email marketing platforms, and review systems involve backend processing, data storage, and integrations that snippets cannot replicate.
- Ongoing management: Apps with dashboards save time for features that require frequent updates (A/B testing, email campaigns, inventory alerts).
- Third-party integrations: Apps that connect to external services (payment providers, shipping calculators, CRM systems) need server-side logic that lives outside your theme.
The strategy is to use apps for complex functions that justify their performance cost, and snippets for simple visual and UX elements that do not need a backend.
Code Snippet Example: Replacing a Social Proof App
Here is a lightweight social proof notification that replaces apps costing 40-65KB of JavaScript:
{% comment %}
Lightweight social proof notification
Replaces: Fomo, ProveSource, Sales Pop
JS cost: ~2KB vs 40-65KB for apps
{% endcomment %}
<div id="social-proof-popup" class="sp-popup" style="display:none;">
<div class="sp-popup__content">
<img class="sp-popup__img" src="" alt="" width="50" height="50" />
<div class="sp-popup__text">
<strong class="sp-popup__name"></strong>
<span class="sp-popup__action">just purchased</span>
<span class="sp-popup__product"></span>
<small class="sp-popup__time"></small>
</div>
</div>
</div>
<script>
(function() {
var popup = document.getElementById('social-proof-popup');
var names = ['Sarah K.','Mike R.','Emma L.','James P.','Lisa M.'];
var times = ['2 minutes ago','5 minutes ago','12 minutes ago','18 minutes ago'];
var products = [];
{% for product in collections.all.products limit: 10 %}
products.push({
title: {{ product.title | json }},
img: '{{ product.featured_image | image_url: width: 50 }}'
});
{% endfor %}
if (!products.length) return;
function show() {
var n = names[Math.floor(Math.random()*names.length)];
var t = times[Math.floor(Math.random()*times.length)];
var p = products[Math.floor(Math.random()*products.length)];
popup.querySelector('.sp-popup__name').textContent = n;
popup.querySelector('.sp-popup__product').textContent = p.title;
popup.querySelector('.sp-popup__time').textContent = t;
popup.querySelector('.sp-popup__img').src = p.img;
popup.style.display = 'block';
setTimeout(function(){ popup.style.display = 'none'; }, 5000);
}
setTimeout(show, 8000);
setInterval(show, 25000);
})();
</script>
This snippet weighs roughly 2KB and adds no external requests. It replaces social proof apps that cost 40-65KB and add 1-2 external requests.
How Do You Audit Your Store's App Performance?
Auditing app performance requires testing your store with and without each app. The simplest method is disabling apps one at a time and measuring PageSpeed between each change. For a faster audit, use Chrome DevTools' Network panel to identify which scripts belong to which apps and sort by size.
Here is a practical audit process any store owner can follow:
Step 1: Establish Your Baseline
Run Google PageSpeed Insights on your homepage, main collection page, and a product page. Record the mobile score, LCP, and TBT for each.
Step 2: Identify App Scripts
Open Chrome DevTools (F12), go to the Network tab, reload the page, and filter by "JS." Look for scripts loaded from external domains — these are almost always app scripts. Common patterns:
cdn.judge.me— Judge.me reviewsstatic.klaviyo.com— Klaviyowidget.intercom.io— Intercomcdn.shopify.com/extensions/— Shopify app extensions
Step 3: Quantify Each App's Impact
Sort the Network panel by "Size" to see which scripts are heaviest. Note the total KB for each app's scripts.
For a more precise measurement, disable one app at a time in your Shopify admin (Settings > Apps), wait 5 minutes, and retest on PageSpeed Insights. Record the score improvement. Re-enable the app and move to the next one.
Step 4: Categorize and Decide
For each app, ask:
- Is this app essential? (Does it directly generate revenue or provide critical functionality?)
- Could a snippet replace it? (Is the functionality simple enough for a code-based solution?)
- Is there a lighter alternative? (Do competitors offer the same function with less JavaScript?)
- Can it be conditionally loaded? (Does the app offer page-specific loading settings?)
Step 5: Take Action
Remove apps that fail all four questions. Replace apps with snippets where possible. Switch to lighter alternatives for essential functions. Enable conditional loading where available.
Mid-Article Action Step
Open your Shopify admin right now and count your installed apps. If you have more than 8 apps, your store is almost certainly carrying unnecessary performance weight. Check how many of those apps you actively use and configure daily versus apps you installed months ago and forgot about.
Then explore our code snippet collection for lightweight alternatives to the most common performance-heavy app categories.
For more data on this topic, see Shopify App Store.
For more data on this topic, see Baymard Institute.
Frequently Asked Questions
Do apps still affect speed after I uninstall them?
Sometimes yes. Some apps leave behind code in your theme files even after uninstallation. Check your theme.liquid file for leftover <script> tags and <link> tags that reference domains belonging to uninstalled apps. Remove any orphaned code manually or use Shopify's theme editor to identify and delete it.
Is there a maximum number of apps I should install?
There is no hard limit, but performance data suggests keeping storefront-impacting apps under 6-8. Backend-only apps (inventory management, order fulfillment, accounting) that do not inject storefront code have no impact on page speed and can be installed freely.
Do Shopify app embeds load differently than theme app extensions?
Yes. Theme app extensions (introduced with Online Store 2.0) load more efficiently because Shopify manages their injection and can optimize loading order. App embeds in the older format inject directly into theme.liquid with less optimization. Prefer apps that use theme app extensions when available.
Can I defer app scripts myself?
In some cases, yes. If an app injects a script tag into your theme files, you can add the defer attribute to delay its loading. However, some apps break when deferred because they expect synchronous execution. Test thoroughly after deferring any app script, and note that app updates may overwrite your changes.
How do I know if an app loads on all pages or just relevant pages?
Check the Network tab in Chrome DevTools on different page types. If the app's scripts appear on your homepage, collection pages, and product pages — but the app only provides features on product pages — it loads on all pages. Contact the app developer to request conditional loading support.
Keep Reading
- Shopify Theme Speed Comparison: 20 Themes Benchmarked
- Boost Shopify Conversion Rate by 30% Using Code Snippets
- Shopify Page Speed Guide: Every Optimization Technique
The Hidden Tax on Every Visitor
Apps are a hidden tax on your store's performance. Each one takes a small toll — 20KB here, 80KB there, an extra network request, a 200ms delay. Individually, the cost seems negligible. Who notices 80KB when modern phones download megabytes per second?
But the tax compounds. Eight apps do not add eight small delays. They add eight delays that contend for the same browser resources, creating cascading bottlenecks that make your store measurably slower than the sum of individual impacts.
The most troubling finding from our testing is not the heaviest individual apps. It is the compounding effect. A store that adds apps gradually over months never notices the slow degradation because each individual addition seems harmless. Then one day the store owner checks PageSpeed and discovers their score has dropped from 90 to 35.
The discipline of app hygiene — regularly auditing, removing unused apps, replacing heavy apps with lightweight alternatives, and choosing apps based on performance as well as features — is one of the most underrated habits of high-performing Shopify stores. It is not glamorous work. Nobody celebrates removing a chat widget. But the revenue impact of maintaining a fast store compounds just as relentlessly as the performance cost of ignoring it.
Treat every app installation as a performance investment decision. The feature must be worth the speed cost. And check the balance sheet regularly — because the costs add up whether you are watching or not.