Uninstalling a Shopify app revokes its access and stops future billing, but it does not always remove the code the app wrote into your theme. Modern theme app extensions clean up after themselves; older apps that injected snippets and scripts do not. Here is how to find leftovers, remove them safely, and confirm the charges stopped.
Why Uninstalling Doesn't Remove Everything
The confusion comes from the fact that Shopify apps have historically integrated with storefronts in two different ways, and only one of them cleans up after itself.
The modern way is theme app extensions. The app's blocks and embeds live in Shopify-managed storage outside your theme files, you toggle them on in the theme editor, and when you uninstall the app, everything deactivates automatically. ScriptTags, a store-level mechanism apps use to load a script on your storefront, are also removed automatically by Shopify at uninstall. If every app you have ever installed used these mechanisms, this article would be three sentences long.
The legacy way is direct theme injection. For years, apps modified theme files on install: dropping a snippet into your snippets folder, adding CSS and JavaScript to assets, and inserting render calls or script references into theme.liquid or section files. Here is the catch. The moment you uninstall, the app loses API access to your store, so it cannot remove what it wrote even if the developer built cleanup logic. The code just sits there. Shopify has pushed developers toward theme app extensions for years and restricted direct theme editing for new public apps, but any store that has been around a while carries residue from the legacy era, and some custom integrations still do it today.
Leftover code causes three kinds of trouble. Scripts that still load and execute cost you page speed for zero benefit. References to assets that no longer resolve produce failed requests and visible "Liquid error: Could not find asset" messages on your storefront. And dead code makes every future theme edit riskier, because nobody remembers what is safe to touch.
The Three Kinds of Leftovers
| Leftover type | Where it lives | After uninstall |
|---|---|---|
| Theme app extension / app embed | Shopify-managed, outside your theme | Deactivates automatically; nothing to clean |
| ScriptTag | Store-level script injection | Removed automatically by Shopify |
| Injected snippet | snippets/ folder, plus render or include calls | Stays until you delete it |
| Injected assets | assets/ folder (app CSS and JS files) | Stays; may keep loading or start failing |
| Inline theme edits | theme.liquid, layout and section files | Stays; the usual source of Liquid errors |
| Metafields and tags | Products, orders, customers | Stays; mostly harmless clutter |
The first two rows are why you should not panic-clean after every uninstall. The bottom four rows are why a periodic cleanup pass is worth doing anyway.
How to Find Leftover App Code
Search your theme code
In your Shopify admin, go to Online Store, Themes, then Edit code, and use the search box in the file browser. Search for the app's name, its brand abbreviation, and any word from its widget (for example "wishlist" or "countdown"). Check three places:
- snippets/: files named after the app, like
app-name-widget.liquid - assets/: CSS and JavaScript files carrying the app's name
- layout/theme.liquid and sections/: lines that render those snippets or load those assets
Most injected blocks are wrapped in comments like <!-- Begin AppName -->, which developers added precisely so this search would work. Build a list of every file and every reference before deleting anything; the references matter more than the files, as we will get to.
Not sure what an unfamiliar snippet belongs to? Search its filename on the web. App snippet names are consistent across stores, and someone has usually asked about the same file in the Shopify community forums.
Run the duplicate theme test
Theme code search finds what is written in your files. It does not tell you where a script you see loading in the browser actually comes from, and that distinction decides whether you have cleanup work at all.
Duplicate your live theme (or install a fresh, unmodified copy of the same theme) and open the duplicate's preview. On both the preview and your live store, open your browser's developer tools, load the network tab, and compare the third-party scripts. Two outcomes:
- A script loads on the clean copy too. It is injected at the store level by an app that is currently installed, via a ScriptTag or app embed. Uninstalling that app will remove it automatically. No manual cleanup needed.
- A script loads only on your live theme. It is baked into your theme files. If the app behind it is already gone, this is exactly the residue you are hunting.
This test is the fastest way to triage a slow store, because it splits your script weight into "goes away by uninstalling" and "requires code removal" in about ten minutes.
Let the errors point at themselves
Leftover render calls to deleted snippets print errors directly on your storefront: "Liquid error: Could not find asset snippets/some-app.liquid." Click through your homepage, a product page, collection page, cart, and blog while logged out, and note every error you see. Each one names the exact file reference you need to remove. Failed requests in the network tab (404s for assets that no longer exist) serve the same purpose for scripts and styles.
The Safe Removal Workflow
Removing code from a live theme deserves the same care as any production change. The workflow that avoids disasters:
- Back up first. Duplicate your live theme and name the copy with the date, for example "Backup 2026-07-21 pre-cleanup." This is your undo button. Do not skip it because the edit looks trivial; trivial edits cause a surprising share of broken storefronts.
- Work on a second duplicate, not the live theme. Make another copy for editing. You will preview changes here and publish only when everything checks out.
- Remove references before files. Delete the
{% render %}and{% include %}lines and script or stylesheet references in theme.liquid and section files first. Then delete the snippet and asset files they pointed to. Doing it in the other order creates Liquid errors on any page that renders between the two steps. - One app at a time. Batch-deleting residue from five apps at once means that when something breaks, you get to bisect your own work. Remove one app's leftovers, preview, then move on.
- Preview thoroughly. In the theme preview, check the homepage, a product page, a collection, cart, and search, on mobile width as well as desktop. Add to cart and start a checkout. You are looking for layout shifts, missing sections, and console errors.
- Publish and keep the backup. Publish the cleaned theme and keep the dated backup for at least 30 days. If a subtle problem surfaces next week, you can diff or roll back instead of reconstructing from memory.
What Speed Wins to Expect
Be honest with yourself here, because cleanup enthusiasm often outruns the measurable result. The realistic range:
- Dead scripts that still executed: removing these is the real win. Several leftover widgets can add up to hundreds of milliseconds of mobile main-thread time, and cutting them shows up in Lighthouse and sometimes in Shopify's speed score.
- Broken references and 404s: fixing these cleans up your waterfall and removes visible errors, but rarely moves load timings much. The browser was failing fast anyway.
- Unused CSS files: small wins, occasionally meaningful on themes carrying years of residue.
Measure before and after with the same tool and the same pages, and expect the improvement to be real but modest in most cases. If storefront speed is the actual goal, leftover-code cleanup is one item on a longer list; why page speed drops over time covers the full diagnostic, and image optimization is usually the larger single lever on stores with heavy media.
One more benefit that never shows up in Lighthouse: predictability. A theme with no mystery code is one a developer can quote accurately, a redesign can build on safely, and a future you can edit without archaeology. Stores that skip cleanup for years eventually pay for it all at once, usually during a theme migration on a deadline.
Preventing Leftovers Before They Happen
The cheapest cleanup is the one you never have to do, and a few habits at install time prevent most future residue.
Prefer apps built on theme app extensions. Modern app listings and support docs will say so, and the theme editor gives it away: if the app's storefront features appear as app blocks and app embeds you toggle in the customizer, it cleans up after itself. If an app's install instructions ask you to paste code into theme.liquid, you now know exactly what its uninstall will look like.
Ask the uninstall question up front. One message to app support before installing: "What does uninstalling leave in my theme, and do you have a removal guide?" Good vendors answer instantly and often maintain cleanup documentation. Evasive answers are data.
Follow the vendor's removal steps in order. Some apps instruct you to disable their app embeds or run an in-app cleanup before uninstalling. Doing it backward, uninstall first, is how removable code becomes orphaned code.
Keep an install log. A running note of what was installed when, and whether it touched the theme, turns every future cleanup from a forensic exercise into a checklist. Your quarterly app audit is the natural place to maintain it.
When to Hire Help
Do it yourself when the residue comes from one or two apps with clearly commented code blocks and your theme is otherwise close to stock. The workflow above is genuinely within reach of a careful non-developer.
Bring in a developer when any of these apply: the leftovers are tangled into a heavily customized theme, the code touches cart or checkout behavior, you are cleaning up after five or more apps at once, or your search turns up files you cannot identify. A Shopify-experienced freelancer typically handles a full cleanup in a few billable hours, and the Shopify Experts marketplace exists for exactly this class of job. Compared to the cost of a broken cart discovered on a Saturday, it is cheap insurance. It is also a reasonable moment to have them note anything else lurking in the theme, since the archaeology is already paid for.
Billing, Data, and GDPR After Uninstall
Uninstalling ends the app subscription, but confirm rather than assume. App charges flow through your invoice from Shopify on 30-day app billing cycles, and uninstalling mid-cycle does not automatically refund the remainder; some developers refund on request. Usage-based fees already incurred can trail onto a later invoice. Check your next billing statement, and the one after, for the app's line item. Recurring app fees are a routine place merchants leak money, which is why they feature in both our hidden Shopify costs guide and our breakdown of what a store really costs in year one.
On data: 48 hours after uninstall, Shopify sends the developer a mandatory erasure webhook, and privacy law obligates them to delete your store's personal data within a defined window, typically 30 days. Compliance is good among established vendors and uneven at the margins, so for apps that held sensitive customer data, send a short email requesting written confirmation of deletion.
The flip side matters more in practice: deletion includes data you might want. Reviews, survey responses, loyalty points, subscription contracts, and support history live inside the apps that collected them. Export everything exportable before you hit uninstall, because "we reinstalled and the reviews were gone" is a support ticket with no happy ending.
Start with the ten-minute version this week: duplicate your theme, run the network-tab comparison, and search your theme code for the last two apps you remember uninstalling. If the search comes back clean, close the tab and move on. If it does not, you now have a precise, low-risk cleanup list and a workflow to run it with.