GET A FREE STORE AUDITFREE AUDIT

SEP 18, 2026 · UPDATED OCT 5, 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.

Four rounded tiles on a white shelf showing a star, heart, lightning bolt and bell, a hand lifting the heart tile

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 recognizes. 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. It understates it when an app reads every customer record, injects three scripts and underpins a Flow nobody documented, because that risk has no price on it. It overstates it when the $39 app doing one job reliably, the best value on the store, gets canceled 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 recognize.

  • 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, .myshopify domains 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 app's blocks and embeds live in the app, not in your theme, so uninstalling genuinely removes them.
Mitesh Patel

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 skeptical of. A custom app is right when the thing it does is a business rule you own and nobody sells, such as your allocation logic, your trade pricing or 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 real 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.

General information, not legal, tax or financial advice. Rates, limits and deadlines come from the vendors and authorities named, and they change: check the linked source before relying on one.

PART OF OUR SERVICE

Wire Shopify into the systems your business already runs on

ERP, subscriptions, custom apps and configurators

EXPLORE INTEGRATE →

NEXT STEP

Free store audit

A senior Shopify engineer reviews your storefront, theme performance and checkout, then sends a prioritized list of fixes.

A hand gestures towards a small shop doorway tied with colorful ribbons, with a tablet on a workbench inside