APPS · PERFORMANCE · OPS · 23 JULY 2026 · 7 MIN READ
The app audit: what every installed app costs you
The monthly fee is the cost everyone can see and the smallest one. An app also costs you data reach, theme surface area and a dependency nobody wrote down.
Build a ledger with four columns, not one. For every installed app record what it costs, what customer data it can read, what it has put into your theme, and who would notice if it disappeared. The fee is the easy column and the least interesting. The other three are where the surprises are: apps holding personal data you never approved, snippets left behind by apps uninstalled two years ago, and a Tuesday-morning export that turns out to be load-bearing. An afternoon produces the ledger; the decisions follow from it almost automatically.
IN SHORT
- Uninstalling an app does not delete your data from the vendor. Shopify sends the shop/redact webhook 48 hours after uninstall and the app is obliged to erase — but you have no way to verify it happened.
- Shopify classifies apps by data access level: level 0 touches no customer data, level 1 covers protected customer data excluding name, address, phone and email, and level 2 includes those fields.
- Public apps need review to reach levels 1 and 2. Shopify's documentation shows custom apps as always having that access, so a bespoke app on your store carries the same reach with no App Store review behind it.
- A customers/redact request is not immediate: Shopify sends the payload 10 days after the deletion request if the customer has not ordered in six months, and withholds it until six months have passed otherwise.
- Theme app extensions disappear when the app does. Anything a support agent pasted into your Liquid does not, which is why a theme accumulates code from apps you no longer pay for.
- Script tags only work with vintage themes, and since 1 April 2025 all new public apps must be built on the GraphQL Admin API — so a legacy integration is a signal about how the app is maintained.
- The column that decides most removals is not cost or performance. It is whether anyone can name what the app is for.
Why the fee column misleads
Most app audits begin and end in the billing screen. Somebody totals the monthly subscriptions, finds a number larger than expected, and cancels the three cheapest things nobody recognises. That is not an audit, it is a tidy-up, and it reliably leaves the expensive problems in place while removing something the warehouse was using.
The fee understates the cost in one direction and overstates it in another. Understates, because an app that reads every customer record, injects three scripts and underpins a Flow nobody documented is carrying risk that has no price on it. Overstates, because the £39 app doing one job reliably is the best value on the store and gets cancelled for being legible.
So record four things per app, and do it in a spreadsheet rather than in a meeting. Cost. Data. Surface. Dependency. The verdict column fills itself in once those four are honest.
Getting the inventory right, which takes longer than you think
The list in the admin is a starting point, not the inventory. Three other places hold apps that will not appear there in a form you recognise.
- The theme editor's app embeds section — app blocks enabled at theme level, which run on every page and are easy to leave switched on long after anyone used the feature.
- Your theme's code. Search for vendor names,
.myshopifydomains and script sources. Anything hardcoded was pasted in by a person, usually during a support ticket, and it will not remove itself. - The billing record against the actual app list. Charges without a matching installed app, and installed apps with no charge, are both worth ten minutes each.
The data column, which is the one nobody fills in
This is where an app audit stops being housekeeping. Shopify operates a tiered model for customer data access, and it is documented plainly enough to audit against. Level 0 is no customer data at all. Level 1 covers protected customer data excluding the directly identifying fields. Level 2 adds them: name, address, email and phone. Shopify's stated standard for approval is that the requested data is "the minimum amount required by your app" to function.
Two consequences worth sitting with.
The first is that public apps go through review to reach levels 1 and 2, and custom apps are shown in Shopify's own table as always having that access. If a developer built you something three years ago that reads orders, it has the reach of a level 2 app and none of the review. That is not an argument against custom apps — we build them — but it is an argument for knowing which ones exist and what they query.
The second is the uninstall question, and the answer is not comforting. Shopify's privacy compliance documentation states that "48 hours after a store owner uninstalls your app, Shopify sends a payload on the shop/redact topic", which asks the vendor to erase all data for that store. The obligation is real and apps must respond within 30 days. What you have is an obligation, not a confirmation. There is no receipt, and nothing in your admin tells you whether a vendor you sacked in March still holds your customer list.
The same documentation sets out the customer-level timing, and it surprises people: on a customers/redact request Shopify "sends the payload 10 days after the deletion request" where the customer has not ordered in six months, and otherwise withholds it until six months have passed. If your privacy policy promises deletion faster than that, the promise is not one your app estate can keep. That is worth knowing before somebody asks rather than during the asking.
The surface column: what it put in your theme
An app touches your storefront in one of three ways, and they behave completely differently at removal.
A theme app extension is the modern arrangement. The app's blocks and embeds live in the app, not in your theme, so uninstalling genuinely removes them. Nothing to clean up.
A script tag is the old arrangement. Shopify now states that "Script tags can only be used with vintage themes", and that an app integrating with a theme and intending to be listed "must use theme app extensions instead of Script tags". Combined with the REST Admin API being legacy as of 1 October 2024 and new public apps required to be GraphQL-only from 1 April 2025, an app still working this way is telling you something about its maintenance, and that is the useful finding — not the script tag itself.
Hardcoded Liquid is the one that costs you. Somebody pasted a snippet into theme.liquid to make an app work, the app left, and the snippet stayed. Every theme we audit has some. They are usually harmless and occasionally not: a fetch to a domain that no longer resolves, a stylesheet that still loads, a container div holding space for a widget that will never render.
The test for each is the same and takes a minute: disable the app embed or comment the snippet on a theme copy, and look at the page. If nothing changes, you have found dead weight. Keep a note of what you removed and when — the one time this bites is a seasonal feature that only renders in November.
The dependency column, and the question that settles it
The riskiest app on most stores is not the slowest or the most expensive. It is the one whose output somebody downstream depends on without either of them knowing.
Ask one question per app and write the answer down: who would raise a ticket the week after this was removed, and what would the ticket say? If nobody can answer, that is a removal candidate and the audit has paid for itself. If the answer is "the warehouse, because the picking list stops", you have just documented a production dependency that existed only in one person's head.
Three dependencies hide particularly well. A Shopify Flow that triggers on an app's event or calls its action. A webhook the app registered against a middleware endpoint someone built. And a human routine — the weekly export, the reconciliation someone does on a Tuesday — which is invisible to every technical check you can run.
Performance is the fourth column people expect here, and it deserves a row rather than a section: Shopify publishes the budget an app had to pass to be listed, so measure against that rather than inventing a threshold. We have written that up separately; the point for the audit is simply to record a figure per app so the ledger has a number in it.
Deciding, in four verdicts
With the ledger complete, each app lands in one of four places. Do this in one sitting — an audit that produces a document rather than decisions was a waste of the afternoon.
Remove. No owner, no dependency, no answer to the ticket question. Most stores find three to six of these, and they are pure margin.
Keep. It does a job, someone owns it, the cost is proportionate. Note the owner's name in the ledger so next year's audit is faster.
Replace. It works but costs too much for what it does, or it is the app pinning you to a legacy integration pattern. Replacement is a project, so give it a date rather than an intention.
Build. The rarest verdict and the one to be most sceptical of. A custom app is right when the thing it does is a business rule you own and nobody sells — your allocation logic, your trade pricing, your particular relationship with a warehouse system. It is wrong as a way to save a subscription fee. You will spend the saving on the build in the first year and then keep paying for maintenance forever, and unlike the vendor you have no other customers to spread it across. If the honest reason for building is that the invoice annoys you, go and negotiate the invoice.
Removal is not the same as uninstalling
Finish the job properly, because a half-removed app is worse than an installed one: it still carries the data exposure and none of the value.
Uninstall in the admin. Then check the theme for leftover snippets and remove them on a copy first. Then check for Flows and webhooks that referenced it, which will now be failing quietly. Then, if the app held customer data, write to the vendor and ask for confirmation of erasure — Shopify's redact webhook does the asking, but a reply from a human is the only thing you can put in a file. And record the removal date, so that when the November feature turns out to have mattered, the investigation is five minutes rather than a morning.
Then put the ledger in the calendar for a year's time. App estates grow the way they always do — one urgent requirement at a time, each one reasonable — and the only thing that reverses it is a routine somebody owns.
Questions this raises
How do I audit the apps on a Shopify store?
List every app from the admin, the theme editor's app embeds and a code search of the theme, then record four things for each: what it costs, what customer data it can access, what it has put into your storefront, and who would notice its removal. The fourth column decides more removals than the first.
Does uninstalling an app delete my data from the vendor?
It triggers the obligation, not a confirmation. Shopify sends the shop/redact webhook 48 hours after uninstall asking the app to erase all data for your store, and apps must respond within 30 days. Nothing in your admin verifies that it happened, so ask the vendor for written confirmation where the data mattered.
What customer data can a Shopify app see?
It depends on its approved level. Level 0 is no customer data, level 1 is protected customer data excluding name, address, email and phone, and level 2 includes those fields. Public apps are reviewed for levels 1 and 2; Shopify's documentation shows custom apps as always having that access, which is worth remembering about your own bespoke apps.
How many apps is too many on a Shopify store?
There is no number worth quoting. A store with twenty apps that each have an owner and a purpose is in better shape than one with six nobody can explain. Judge the estate by how many rows in your ledger have an empty dependency column, not by the row count.
Should we build a custom app to replace a paid one?
Only when the app encodes a business rule you own and nobody sells. Building to save a subscription fee usually loses: the first year spends the saving and every year after pays maintenance a vendor would have spread across thousands of merchants. If the objection is the price, negotiate the price.
What does an app leave behind in my theme?
Theme app extensions leave nothing — they live in the app and vanish with it. Script tags only work with vintage themes now. The residue that matters is Liquid pasted into the theme during a support ticket, which stays forever. Search the theme for vendor names and script sources, and test removal on a copy.
NEXT STEP
Free store audit
A senior Shopify engineer reviews your storefront, theme performance and checkout, then sends a prioritised list of fixes.
