Analyzing the impact of Shopify apps on Total Blocking Time and Core Web Vitals
How installed apps slow a Shopify storefront, how to measure what each one costs and how to remove, replace or defer scripts without losing function.

The hidden cost of "just one more app"
Most Shopify stores do not become slow in a single decision. They become slow one reasonable choice at a time. A reviews app is added because social proof helps conversion. A popup tool is added for email capture. A chat widget goes in so customers can ask questions, a loyalty program follows, then an upsell tool, a currency converter, a size guide, a countdown timer and a few tracking pixels from the advertising team. Each one solves a real problem, and each one arrives with code that visitors' browsers have to download, parse and run.
The result is a storefront whose theme was fast on the day it was installed and whose pages now take several seconds before they respond to a tap. Search engines notice the symptoms, and shoppers notice them sooner. This guide looks at the effect of apps on one specific measure, Total Blocking Time, and on the Core Web Vitals that sit around it. It belongs to our series on Shopify SEO, and it builds on the general explanation in our Core Web Vitals guide. The aim is practical: to give you a method for finding out which apps cost you speed, deciding which are worth it and reducing the cost of the ones you keep.

What Total Blocking Time measures
The browser does most of its work on a single main thread. It parses the page, runs scripts, calculates styles, lays out the page and responds to taps and clicks, all in the same place. While it is busy with one long job, it cannot do anything else. If the visitor taps a button during that time, nothing happens until the job finishes.
Any task that keeps the main thread busy for more than 50 milliseconds is called a long task. Total Blocking Time, or TBT, adds up the portion of each long task that exceeds 50 milliseconds, measured between the first moment content appears and the moment the page becomes reliably interactive. A page with three long tasks of 80, 120 and 200 milliseconds has blocking time of 30, 70 and 150 milliseconds, a total of 250 milliseconds.
Two points matter for how you use this number. First, TBT is a lab metric. It comes from a simulated load in a tool such as Lighthouse or PageSpeed Insights, not from real visitors. Second, it is not itself one of the Core Web Vitals. Google's Core Web Vitals use Interaction to Next Paint (INP) as the measure of responsiveness, which is collected from real users. TBT is useful because it tends to move in the same direction as INP, and because it can be measured in a test that you can repeat after each change. Think of TBT as a diagnostic that helps you find and fix the causes of poor responsiveness, and INP as the result that counts.
Google's published thresholds for INP are 200 milliseconds or less for a good result and more than 500 milliseconds for a poor one. Lighthouse has its own scoring bands for TBT, and Google updates them from time to time, so use the current ones in the tool you are running rather than relying on figures remembered from older articles.
How apps add cost to a storefront
Apps affect performance through several routes, and knowing which one an app uses explains its cost.
Scripts loaded on every page
The most common pattern is a JavaScript file loaded on every page of the store, whether or not the page needs the app. A reviews widget script might load on the home page, the cart and the blog, though reviews appear only on product pages. The browser pays the download and execution cost each time.
Large third-party bundles
Many apps load not one file but a chain. The first script loads a second, which loads a third, along with fonts, stylesheets and images from the vendor's servers. Each new connection adds delay, and each script competes for the main thread.
Work done at the worst moment
Some scripts do heavy work immediately on load, such as scanning the page, building a widget or sending data to a server. That work occupies the main thread during the very period when the visitor is trying to read or tap.
Layout changes and injected content
Apps that insert banners, badges or popups after the page loads can shift the layout and hurt Cumulative Layout Shift, or delay the main content and hurt Largest Contentful Paint. A countdown timer or announcement bar added late is a common culprit.
Code left behind
Older apps modify theme files directly, adding snippets and script tags. Uninstalling the app removes it from the admin but may not remove those edits, so scripts that no longer do anything, or call servers that no longer respond, can remain in your theme.
The newer, lighter route
Shopify has promoted theme app extensions, which let apps add blocks and embeds to themes in a standard way, without editing theme code. Apps built this way are easier to remove cleanly and can be loaded more carefully, though a well-built extension is no guarantee of a light one. What is shipped inside it still counts.
Which kinds of apps tend to cost the most
| App type | Why it can be heavy | Lighter approach |
|---|---|---|
| Reviews and ratings | Widget scripts, stylesheets and images on every page | Load only on product pages and defer below the fold |
| Chat and support widgets | Large bundles that start immediately | Load on first interaction, or show a lightweight button that loads the real widget on click |
| Popups and email capture | Scripts that run on every page and inject content | Trigger later, limit to key pages, or use a simple embedded form |
| Upsell, bundles and cart tools | Heavy logic on product and cart pages | Use only what drives measurable revenue and check native features first |
| Loyalty and rewards | Floating widgets, extra scripts and API calls | Load after the main content, and only for logged-in visitors where possible |
| Currency and translation tools | Scripts that rewrite the page after it loads | Use Shopify's native markets and language features where possible |
| Page builders | Large frameworks and generated markup | Limit use to pages that need it, and keep core templates native |
| Tracking pixels and tag managers | Many third-party scripts, each with its own network calls | Consolidate, remove unused tags and use Shopify's sandboxed customer events where suitable |
| Visual effects and widgets | Animation libraries, sliders and counters | Remove if they do not demonstrably help conversion |
The table is a map of where to look, not a verdict on any individual product. A well-built reviews app can be lighter than a badly built one in a different category. The only reliable answer comes from measuring your own store.
Measure before you remove anything
The temptation is to uninstall apps at random and hope. A better approach is to build a baseline and test one change at a time.
Step 1: choose representative pages
Test at least the home page, a main collection page, a typical product page and the cart. Different apps run on different templates, so a single-page test misses most of them.
Step 2: record field data first
In Search Console's Core Web Vitals report and in PageSpeed Insights, note the field values for LCP, INP and CLS. They tell you whether you have a problem real visitors feel, as explained in our Core Web Vitals guide. If the field data is good, the urgency is lower, whatever the lab says.
Step 3: build a lab baseline
Run Lighthouse or PageSpeed Insights several times on each page and record the median TBT, LCP and total JavaScript size. Single runs vary. Using several runs, and the median, reduces noise. Use the same device and network settings every time.
Step 4: list every script
Open Chrome DevTools, go to the Network panel, filter by JavaScript and sort by size and by domain. Group the requests by the company that serves them. The Coverage panel shows how much of each script is unused, and the Performance panel shows which scripts create long tasks. This gives you an inventory of what each app really loads.
Step 5: test the effect of each suspect
Chrome DevTools can block individual requests. Block the domains that belong to one app, reload and re-run the test. The difference in TBT and JavaScript size is the app's approximate cost. WebPageTest offers a similar feature to block requests and compare results side by side. Repeat for each major app.
Step 6: put the cost beside the benefit
For every app, write down what it costs in blocking time and page weight, what it earns in revenue or saved effort, and who owns it. An app that costs 400 milliseconds of blocking time on every page and contributes a handful of orders a month is a different decision from one that costs 40 milliseconds and drives a fifth of your revenue.

Decide: keep, replace, defer or remove
With data in hand, each app falls into one of four groups.
- Remove. The app is no longer used, nobody can say what it does, or its measured benefit is below its cost. Uninstall it and clean up its code, which is covered below.
- Replace. A native feature of the platform or theme now does the job. Shopify has added many features that once required apps, such as product recommendations, certain discount types and market-specific pricing. Check before you pay for a script.
- Defer. The app is valuable but loads too early. Change when and where it loads, using the techniques below.
- Keep. The app earns its place and its cost is acceptable. Record the cost, so that it is revisited at the next review.
Be wary of the sunk-cost fallacy. An app that a team spent weeks configuring is still a cost if it no longer helps. Equally, be wary of the opposite error of removing an app that supports a revenue stream because it appears in a performance report. Test the business effect with data, not with instinct.
Ways to reduce the cost of the apps you keep
Load only where the app is needed
If an app appears only on product pages, its script should load only on product pages. Where an app's own settings do not allow this, the theme can often control it with a condition in Liquid that prints the script tag only for the relevant template. This single change removes the cost from every other page type. Test carefully, because a condition that is too narrow can break the feature.
Defer non-critical scripts
Adding the defer attribute lets the browser download a script without blocking page parsing and run it after the document is parsed. Async runs the script as soon as it downloads, which can still interrupt rendering. For scripts that do not affect the first view, such as reviews or loyalty widgets, deferring is usually safe. Scripts that must run early, such as those that change the layout, need more care.
Load on interaction or on visibility
Chat widgets are the classic case. Instead of loading a large bundle on every visit, show a lightweight placeholder button and load the real widget when the visitor clicks it, or after a short delay, or when they scroll. Many visitors never open chat, so most of them never pay the cost. The same pattern works for review carousels that sit far below the first screen and for embedded videos and maps.
Reduce the work the script does
Ask vendors whether lighter modes or settings exist, such as disabling animations, reducing the number of items loaded or turning off features you do not use. Some apps load code for all their modules even if you enabled one.
Consolidate tracking
Many stores carry a collection of marketing tags added over the years by different people. Audit the tag manager, remove tags for platforms you no longer use and deduplicate those that fire twice. Where supported, move pixels into Shopify's customer events framework, which runs them in a sandbox that keeps their cost off the main page, and fire them only after consent where required. Our own site loads its analytics only after a visitor accepts, which is both a privacy measure and a performance one.
Mind the order of loading
Scripts that must run early should be few and small. Everything else should be queued behind the content that visitors came to see. Preloading the main image and fonts, and not preloading app scripts, helps the first view appear quickly. See our Core Web Vitals guide for the LCP side of this.
Cleaning up after an app you removed
Removing an app from the admin is only the first step. A proper clean-up follows a short sequence.
- Duplicate the theme and work on the copy.
- Search the theme code for the vendor's name, domain and any snippet or section names the app created. Look in the layout file, in templates, in snippets and in the assets folder.
- Remove the references carefully, one at a time, previewing the theme after each change to make sure nothing breaks.
- Delete orphaned files in the assets and snippets folders that belong to the app.
- Check the rendered source of the home, collection, product and cart pages for leftover scripts and stylesheets, and check the Network panel for requests to the vendor's domain.
- Review metafields and settings the app may have created. They do no harm to speed, but cleaning them up avoids confusion later.
- Publish the clean theme after testing, keep the previous one as a rollback and re-measure.
Many stores see a noticeable improvement from this step alone, because abandoned code is pure cost with no benefit.
Reading a performance trace for long tasks
If you or your developer want to go beyond blocking requests, the Performance panel in Chrome DevTools shows exactly what the main thread is doing. Record a page load with CPU throttling switched on, which simulates the slower processors in many phones, and look at the main thread track. Long tasks appear with a red marker in the corner, and clicking one reveals which function was responsible and which script file it came from.
Three patterns show up again and again. The first is a single enormous task early in the load, usually a bundle that parses and runs a lot of code at once, as page builders and some marketing tools do. The second is a repeating rhythm of short tasks, typical of polling or animation scripts that keep running after the page has loaded. The third is a cluster of tasks that begins when the visitor interacts, which points to heavy event handlers and explains a poor INP.
Use the "Bottom-up" and "Call tree" views to group time by script origin, and you will usually find that a few third-party domains account for most of the blocking time. That ranked list is the evidence you give a stakeholder when you propose a change. It turns an opinion about an app into a number.
Do not test only on a fast computer. A modern laptop can run a script in a fraction of the time that a mid-range phone needs, so a page that feels fine on your desk can feel sluggish in a customer's hand. The throttling in DevTools and PageSpeed Insights exists for this reason, and it is worth testing on a real phone as well.
Tracking pixels, consent and the cost of marketing tags
Marketing tools are often the largest contributors to blocking time, and the hardest to remove, because each has a champion who relies on the data. A constructive approach is to treat tags as a budget. Agree how much blocking time the store can afford, and let teams decide together which tags are worth spending it on.
- Inventory the tags and their owners. Each tag should have a named person and a purpose. Tags with neither are candidates for deletion.
- Check for duplicates. It is common to find the same pixel installed by an app, by the theme and by the tag manager, firing three times and sending triple the data.
- Use platform integrations carefully. A native integration or server-side tracking can replace several browser scripts with one lighter path, though it needs proper setup and testing.
- Respect consent. In regions with consent requirements, tags that need consent should not run until it is given. That is a legal and privacy requirement, and it has the side benefit that visitors who decline never pay the performance cost.
- Test the effect on measurement. Before deleting a tag, check that no report or automated rule depends on it, and keep a record of what was removed and when.
When marketing and SEO teams share one view of speed and revenue, these conversations become easier. A tag that supports a profitable campaign deserves its place. A tag that nobody can explain does not.
Keeping the gains: budgets, monitoring and process
Many stores clean up their apps and see the same problem return within a year, because nothing in their process prevents it. Three simple habits keep the gains.
- Set a performance budget. Agree limits that matter to you, such as total JavaScript on product pages, the number of third-party domains or a maximum TBT in your standard test. Write them down and check each new app or feature against them before installation.
- Monitor continuously. Review the Core Web Vitals report in Search Console monthly, and run your lab tests after any theme or app change. A scheduled monthly test of the key templates takes little time and catches regressions early.
- Add a gate to the process. Require that any new app request includes the problem to solve, the measure of success, the owner and an estimate of its cost. A short form is enough. The point is to make adding an app a decision, not a click.
Document the findings from this exercise in a short internal page: what was removed, why and what each remaining app is for. New team members and agencies will then understand the reasoning, and the next review will be quicker.
The theme matters as much as the apps
It is easy to blame apps for everything. A heavy theme can be just as slow, particularly if it was built with a large page-builder framework or if years of customization have piled up. When comparing a store with a clean new theme, remember to subtract the effect of the theme from the effect of the apps. A practical test is to preview your products in a default Shopify theme with no apps and see what the baseline looks like. If that baseline is dramatically better than your live store, you know how much room there is.
Check also what the theme loads for its own features: sliders, animation libraries, mega menus and quick-view modals. Features that look impressive on a design mockup can cost hundreds of milliseconds on a mid-range phone. If a feature does not help shoppers buy, remove it.
A checklist for choosing and reviewing apps
Before you install an app, and at each review, ask these questions.
- What problem does it solve, and how will I measure that it worked?
- Does a native Shopify or theme feature already do this?
- Is it built with theme app extensions, and can it be removed cleanly?
- How much JavaScript does it load, on which pages, and can that be limited?
- Does it load asynchronously or deferred, or does it block rendering?
- Does it change the layout after load, and can the space be reserved?
- What does the vendor say about performance, and do their claims hold up in my test?
- Who owns it internally, and when will it be reviewed again?
- What happens to my data and my theme code if I leave?
Treat the installation of an app as a small project with an owner, a goal and an exit plan, not as a one-click addition. The most effective governance habit is a quarterly review of the installed list, at which every app has to justify its place.

What this means for rankings, and what it does not
It helps to keep expectations honest. Google has said that Core Web Vitals are one of many signals in its page experience assessment and that relevance and content quality usually matter more. Removing a heavy app will not turn an average page into a top result. What it can do is remove a handicap in close contests, make the page more pleasant to use and increase the share of visitors who stay long enough to buy.
The commercial argument for speed is therefore at least as strong as the ranking argument. A shopper who taps "add to cart" and sees nothing happen for half a second may tap again, give up or leave. That frustration is invisible in a ranking report and visible in a conversion report. When you present this work to the business, lead with what shoppers experience and with revenue, and treat any ranking effect as a bonus that is hard to isolate. Our guide to SEO timelines explains why you should compare results over months, not days.
A worked example: a fashion store with fourteen apps
A fictional fashion store has fourteen apps installed. Its mobile INP in Search Console sits in the needs-improvement range, and its lab TBT on product pages is high. The team follows the method above.
The inventory shows that six of the apps load scripts on every page, three belong to tools the team stopped using last year, and the tag manager contains eleven tags, four of them for advertising platforms no longer in use. Blocking each app's domain in turn shows that the chat widget and a loyalty widget are the two heaviest, together responsible for a large share of blocking time on product pages. The reviews app is moderate, and the popup tool is lighter than expected.
The decisions: remove the three unused apps and clean up their code, delete the four dead tags, change the chat widget to load when the visitor clicks its button, defer the loyalty widget until after the page has finished loading and restrict the reviews script to product pages. Total apps drop from fourteen to eleven, and the total JavaScript on a typical product page falls substantially.
After release, the lab TBT drops clearly, and over the next few weeks, the field INP in Search Console improves as the rolling window updates. Conversion rate on mobile product pages rises slightly, though the team is careful not to attribute all of it to speed, since other things changed during the period. No functionality is lost: the chat still works, reviews still show and the loyalty program continues. It simply costs less.
Common mistakes
- Judging by one test run. Lab results vary, so use several runs and the median.
- Chasing the score and ignoring real users. Field data decides whether visitors have a problem.
- Uninstalling without cleaning the theme. Leftover code keeps costing speed.
- Removing a valuable app on a hunch. Measure its business benefit before you cut it.
- Ignoring the theme. A heavy theme can outweigh all your apps.
- Loading every script on every page. Limit each app to the templates that need it.
- Letting tag managers grow without review. Old tags are free speed to reclaim.
- Testing only the home page. Product, collection and cart pages carry most of the revenue.
- Forgetting to re-measure. Without a baseline and a follow-up, you cannot show that the work helped.
- No owner for each app. Unowned apps never get removed.
How we help
At AH SEO Agency we treat app weight as a business decision, not a purely technical one. We inventory what your store loads, measure the cost and the benefit of each app, recommend what to remove, replace, defer or keep, and brief your developer with exact changes. We then re-test and watch the field data in Search Console. See our technical SEO service, the wider Shopify SEO page or request a free SEO audit. Next in this series, we look at how automated and manual collections affect internal competition and crawl depth, and previous articles covered how Liquid renders meta tags.
Summary
- Total Blocking Time is a lab measure of how long long tasks keep the main thread busy, and it tends to track the real-user INP metric.
- Apps add cost through scripts loaded everywhere, chained bundles, heavy start-up work, layout changes and code left behind after removal.
- Measure before you act: build a baseline, inventory every script and block each app's requests in turn to find its cost.
- For each app choose to remove, replace, defer or keep, weighing measured cost against measured benefit.
- Load scripts only where needed, defer non-critical ones, load widgets on interaction and consolidate tracking.
- Clean the theme after uninstalling, review apps quarterly and give every app an owner.
Related guides
Technical SEOCore Web Vitals guide: LCP, INP and CLS explained and fixed
What LCP, INP and CLS measure, how much they matter for SEO, how to read field and lab data, and the fixes that improve each score.
Read the guide
Ecommerce SEOHow Shopify Liquid renders meta tags: a technical guide for SEOs
How Shopify Liquid builds title, description, canonical, robots and social tags in the theme, the objects involved and the mistakes to audit for.
Read the guide
Ecommerce SEOAutomated vs manual collections: how to prevent internal competition in Shopify
How Shopify automated and manual collections differ, how overlap creates internal competition and how to plan, fix and govern a collection structure.
Read the guideFrequently asked questions
What is Total Blocking Time?
It is a lab metric that adds up the time beyond 50 milliseconds of every long task on the main thread between the first paint and the point the page becomes interactive. It shows how much the browser is too busy to respond, and it tends to move with the real-user INP metric.
Is TBT a Core Web Vital?
No. The Core Web Vitals are LCP, INP and CLS. TBT is a lab diagnostic that helps you find and fix the causes of poor responsiveness, while INP is the field metric Google uses.
How do I find which Shopify app is slowing my store?
Inventory the scripts in the Network panel, then block each app's domains in Chrome DevTools or WebPageTest and compare the TBT and JavaScript size before and after. Repeat the test several times and use the median.
Does uninstalling an app remove its code from my theme?
Not always. Apps that edited theme files directly can leave snippets and script tags behind. Search your theme for the vendor's name and domain, remove the references on a duplicate theme and test before publishing.
Can I keep an app but make it faster?
Often yes. Load its script only on the templates that need it, defer it, load it on interaction as with chat widgets, ask the vendor for lighter settings and remove features you do not use.
How often should I review my installed apps?
A quarterly review works well. Each app should have an owner, a measured benefit and a measured cost, and any app that cannot justify itself should be removed.
Not sure where your site stands?
Send us your website and we will tell you what we would fix first, including if SEO is not your best next step.