Platform
Shopify script tags are being switched off: the two dates that matter
From October 1, 2026 you cannot create or update a script tag. From March 1, 2027 existing ones stop running. Pinning an old API version does not help. Here's how to work out what you need to migrate, and to what.
Bas Lefeber
Founder, learnshopify.dev · August 29, 2026 · 5 min read
Shopify has put an end date on script tags. This one is worth acting on early, for a reason that is easy to miss in the announcement: the first deadline does not break anything visible. It breaks your ability to fix things. By the time the second deadline arrives and stores start losing functionality, the tool you would have used to repair it has been gone for five months.
The two dates
October 1, 2026: scriptTagCreate and scriptTagUpdate start returning user errors, and the REST ScriptTag resource rejects POST and PUT. Existing script tags keep running. March 1, 2027: Shopify stops injecting script tags into storefronts at all. And the part people miss: this applies to all API versions, including older ones, so pinning will not defer it.
Why the October date is the one to plan around
Read the two dates again and the sequencing is unusual. Normally a deprecation removes the feature and you notice immediately. Here, write access dies first and the feature keeps working, which means nothing in your monitoring will tell you anything is wrong until March.
Concretely, after October 1 an app cannot install a script tag on a newly installed store. If your app's install flow creates a script tag, every merchant who installs from October onwards gets an app that silently does nothing on their storefront. Your existing merchants are fine, your new ones are broken, and the failure is invisible unless you happen to test a fresh install.
What still works after October 1
The scriptTags query and the scriptTagDelete mutation both remain available. That is deliberate: you can still audit what is out there and clean up after yourself once you have migrated. Read and delete stay, create and update go.
Step 1: find out whether this affects you
Do not assume. Plenty of apps created a script tag years ago in an install hook that nobody has read since. Query it:
query AuditScriptTags { scriptTags(first: 50) { nodes { id src displayScope createdAt } }}Run it against a store the app is installed on. If it returns nodes, you have work to do. Also grep your own codebase for scriptTagCreate, ScriptTag, and script_tags, because the call is often buried in an app/uninstalled or post-install handler rather than anywhere obvious.
Merchants and agencies: this is on you too
Script tags are not only created by apps you can see in the admin. Agencies routinely added them during builds, and an app you uninstalled may have left one behind. If you manage stores for clients, run the audit query on each one now. An orphaned script tag is free to delete today and impossible to reason about in March.
Step 2: pick the replacement
There are two, and the choice is genuinely determined by what your script does rather than being a preference.
| If your script... | Migrate to | Merchant action needed? |
|---|---|---|
| Renders or changes anything on the storefront | App embed block in a theme app extension | Yes: they activate it in the theme editor |
| Only collects analytics or conversion data | Web pixel | No |
The second row is the happier path and it is worth checking honestly whether you qualify. A web pixel runs in a sandbox, is designed for exactly this job, and requires nothing from the merchant. If your script is a tracking beacon, this migration is close to painless.
The first row has a consequence people underestimate: app embeds require the merchant to switch them on. A script tag installed itself silently; an app embed does not. So the migration is not only an engineering task, it is a communication task. Every existing merchant needs to be told to open the theme editor and enable the embed, and some percentage of them will not. Plan the emails now, not in February.
{% comment %} An app embed block with "target": "head" in its schema loads on every storefront page, which is what your script tag used to do. The difference is that the merchant activates it in the theme editor.{% endcomment %} <script src="{{ 'your-script.js' | asset_url }}" data-shop="{{ shop.permanent_domain }}" defer></script>That is the whole shape of it. The script itself usually needs little change; what changes is how it gets onto the page and who decides. If you have never built one, the theme layer explainer covers where an app embed sits in the request and what it can and cannot reach from there.
The exception worth knowing about
Script tags with a display_scope of order_status are on a separate and earlier timeline. If your audit query returns anything with that scope, treat it as more urgent than the dates in this post and check the order status page deprecation notices directly. Checkout and post-purchase surfaces have been moving to checkout UI extensions for a while, and this is the tail end of that.
Learn this properly · free lesson
App vs theme vs Function: which tool for which job
Script tag, app embed, web pixel, Function: the same underlying question about where code should live on Shopify. Work through it on a real build. Free lesson, no signup.
Try this lesson — freeThe bigger pattern
This is not an isolated cleanup. Script tags were the last widely used way for an app to inject arbitrary JavaScript into a storefront without the merchant knowing, and Shopify has spent years replacing that model with declared, scoped, merchant-visible surfaces: theme app extensions for storefront UI, web pixels for tracking, checkout UI extensions for checkout, Functions for backend logic.
The through-line is that the platform keeps trading implicit power for explicit contracts. You lose the ability to silently run anything anywhere; you gain a storefront where a merchant can see what is on their store and Shopify can reason about performance. The same instinct produced Events replacing webhook topic subscriptions and the Liquid block and partial tags, where composition moved back into files you can read.
Practically, it also means "does this app use script tags?" is now a reasonable question to ask before installing anything. An app built on a theme app extension is on the right side of this deprecation and needs nothing from you in March. Cordon, for instance, loads through an app embed rather than a script tag, which is the pattern to look for when you audit the apps on a store you maintain.
What to do this week
- Run the
scriptTagsquery on every store you own or maintain. Delete anything orphaned while deleting is still easy. - Grep your app for
scriptTagCreateandScriptTag. Check install hooks specifically, since that is where it usually hides. - Classify each remaining script: storefront behaviour goes to an app embed, analytics goes to a web pixel.
- If any have
display_scope: order_status, handle those first. They are on an earlier clock. - Write the merchant communication plan. App embeds need activating, and that is the part of this migration that does not happen in code.
October 1 is the date to work backwards from. Not because anything breaks that day, but because after it the cheap fix is gone.
Frequently asked questions
When do Shopify script tags stop working?
March 1, 2027, when Shopify stops injecting script tags into storefronts entirely. Before that, on October 1, 2026, the scriptTagCreate and scriptTagUpdate mutations begin returning user errors and the REST ScriptTag resource rejects POST and PUT requests. Existing script tags keep running between those two dates.
Can I pin an older API version to keep using script tags?
No. Shopify states the deprecation applies to all API versions, including older ones, so pinning will not defer it. This is different from most Shopify deprecations, where staying on an older version buys time.
What replaces Shopify script tags?
Two things, depending on what the script does. If it renders or changes anything on the storefront, replace it with an app embed block shipped in a theme app extension, which the merchant activates in the theme editor. If it only collects analytics or conversion data, use a web pixel instead, which requires no action from the merchant.
How do I find out if my Shopify store uses script tags?
Run the scriptTags query on the GraphQL Admin API against the store, requesting id, src, displayScope and createdAt. Anything returned needs migrating or deleting. Also grep your app's codebase for scriptTagCreate, ScriptTag and script_tags, since the call is often in an install hook rather than anywhere obvious.
Will the scriptTags query still work after October 1, 2026?
Yes. The scriptTags query and the scriptTagDelete mutation both remain available, so you can audit what exists and clean up after migrating. Only creation and updating are blocked from October 1.
Do merchants need to do anything when an app migrates from script tags?
Usually yes. A script tag installed itself silently, but an app embed block has to be activated by the merchant in the theme editor. That makes the migration a communication task as well as an engineering one: every existing merchant needs telling, and some will not act. The exception is a migration to a web pixel, which requires no merchant action.
Start free
Ready to become a Shopify developer?
You just read how it works. Now write it yourself: real tickets from a live store, in an editor where the storefront updates as you type. Module 1 is free, no card.
Free · No credit card · Your first win in minutes
About the author
Bas Lefeber, Founder, learnshopify.dev
Bas builds learnshopify.dev, where developers learn production-grade Shopify theme development against a live storefront. He writes about Liquid, theme architecture, and the parts of the job that still matter now that AI writes the code.
Keep going in the curriculum
