Technical

Theme app extensions vs script tags

Why the way a Shopify widget installs matters more than its feature list — and how to tell which model an app uses before you install it.

Updated 22 August 2026 · 6 min read

There are two ways a Shopify app can put a widget on your storefront, and the difference determines how the app performs, how much control you have over it, and — most importantly — what happens when you uninstall it.

Merchants compare feature lists. The install model is the more predictive question.

The old way: script tags and theme edits

Before Online Store 2.0, an app that wanted to render something on your storefront had two options: register a script_tag that Shopify injects into every page, or ask for permission to edit theme.liquid directly during onboarding.

Both work. Both have the same three problems.

They load everywhere. A script tag fires on every page — the homepage, the blog, the policy pages — whether the widget appears there or not. A countdown timer meant for product pages is downloaded and executed on your privacy policy.

They render after the page. The script loads, runs, finds its mount point and inserts content. That insertion happens after first paint, which pushes existing content down. That is Cumulative Layout Shift, and it is scored on every page load forever.

They leave residue. When you uninstall, Shopify removes script tags the app registered through the API — but not code the app wrote into your theme files during onboarding, and not code that was copied into a theme you have since duplicated. This is why stores accumulate orphaned snippets pointing at services that no longer answer.

The current way: theme app extensions

A theme app extension ships the widget as an app block or app embed that you place in the theme editor. The difference is structural:

  • You control placement. Drag the block where you want it in the theme editor and see the result before publishing.
  • It renders with the page. The block is part of the Liquid render, so the layout is correct on first paint. No shift.
  • It is scoped. A block placed on the product template loads on product templates. It does not follow shoppers to your refund policy.
  • It uninstalls cleanly. The extension is sandboxed and versioned by Shopify. Removing the app removes the block. No orphaned snippets, no residue.
  • It cannot break your theme. Extensions run in a defined boundary rather than writing into your theme files, so a bad app update cannot take your product page down with it.

How to tell which model an app uses

Before installing, check in this order:

  1. The App Store listing. Look for "Works with: Online Store 2.0" or an explicit mention of theme app blocks or app embeds. Most modern apps advertise it because it is a selling point.
  2. The onboarding flow. If the first step asks you to "enable app embed in theme settings", it is an extension — good. If it asks permission to "add code to your theme" or tells you to paste a snippet into theme.liquid, it is the old model.
  3. The theme editor. After installing, open the theme editor and look for the app under Add block or App embeds in theme settings. If it is there, you are on the extension model.

What to do about apps you already have

You do not need to rip out a working app because it uses script tags. Some excellent, well-maintained apps still do, particularly older ones with large install bases. The practical steps:

Audit what is loading. Open a product page in DevTools, Network tab, and sort by domain. Every third-party domain is an app. Anything you do not recognise is worth investigating.

Check for orphans after every uninstall. Search theme.liquid for the app's name or domain, and look through snippets/ for files named after apps you no longer run. This takes two minutes and catches a real, common problem.

Prefer the extension when replacing. When you are already choosing between two apps that do the same job, install model is a legitimate tiebreaker — and the one most likely to still matter in two years.

Why this is worth knowing

The install model is a proxy for how recently the app was built and how much the vendor invests in keeping up with the platform. An app that migrated to theme app extensions is an app whose developer is paying attention. An app still asking you to paste code into theme.liquid in 2026 is telling you something about its roadmap.

That signal is more useful than any feature comparison table, including the ones on this site.

More like this, monthly

Widget teardowns with real page-weight measurements. No sponsorships.