Shopify will block apps from creating or updating storefront ScriptTags on October 1, 2026. Existing tags can keep running temporarily, but Shopify will stop injecting them into storefronts on March 1, 2027. Pinning an app to an older API version will not avoid either cutoff.[1][3]
If you maintain a Shopify app or custom storefront integration, use the checklist below now. Replace storefront features with a theme app extension and app embed block; replace analytics-only code with a web pixel.[1][2]
Important: Shopify ScriptTags are client-side JavaScript loaded on storefront pages. They are not the same feature as Shopify Scripts, the former Ruby-based checkout customization system.
The two deadlines
| Date | What changes | What still works |
|---|---|---|
| October 1, 2026 | GraphQL scriptTagCreate and scriptTagUpdate return permission errors; REST POST and PUT requests for ScriptTag fail across every API version. |
Existing storefront tags keep running. Read and delete operations remain available. |
| March 1, 2027 | Shopify stops injecting ScriptTags into storefront pages. Any feature still dependent on them stops loading. | Leftover records have no storefront effect. |
These dates apply to storefront ScriptTags. Order-status ScriptTags follow a separate, earlier deprecation schedule.[2][3]
Five-minute impact check
Use this triage before changing code:
- Search your app code for
scriptTagCreate,scriptTagUpdate,/script_tags.json,write_script_tags, orread_script_tags. - Identify the purpose of each remote script: storefront UI, page modification, analytics/conversion tracking, or a mixture.
- Check
displayScope. Tags usingONLINE_STOREaffect storefront pages. A scope that includes order status also needs review against Shopify’s order-status migration guidance.[1][3] - Check install and reinstall flows. A tag that already exists may run until March, but an install, reinstall or settings update that tries to create or update one will fail after October 1.[1][3]
- Assign the replacement using the decision table below.
Developer audit query
Run this from your app with the read_script_tags scope:
query AuditLegacyScriptTags($first: Int!) {
scriptTags(first: $first) {
nodes {
id
legacyResourceId
src
displayScope
createdAt
updatedAt
cache
}
pageInfo {
hasNextPage
endCursor
}
}
}
Example variables:
{
"first": 100
}
The query returns ScriptTags created by the authenticated app, not a universal inventory of every other app’s tags. Repeat with pagination if hasNextPage is true, and save the inventory before deleting anything.[3]
Quick repository scan
From the application root, search for the legacy API names:
rg -n --hidden \
-e 'scriptTag(Create|Update|Delete)' \
-e 'script_tags\.json' \
-e 'write_script_tags|read_script_tags' \
-e 'display_scope|displayScope' .
Also search deployment scripts, background jobs, webhook handlers and installation callbacks. Do not assume the code lives only in the storefront module.
Choose the correct replacement
| Current ScriptTag job | Recommended replacement |
|---|---|
| Loads JavaScript on most or all storefront pages | App embed block inside a theme app extension |
| Adds a visible component that merchants should place in a section | App block where the theme supports JSON templates |
| Collects analytics, conversions or customer-behavior events | Web pixel |
| Customizes the Order status page | Customer account UI extension; follow the separate order-status guide |
| Comes from an admin-created custom app that cannot ship extensions | Move the code into the theme only as a last resort, or rebuild/distribute the integration as an app that supports extensions |
Shopify says app embed blocks work with vintage themes and Online Store 2.0 themes, but they are enabled per theme. A merchant must activate the block on the theme that is actually published.[3] Theme app extensions expose app integrations in the theme editor and avoid directly editing Liquid theme files.[4]
Safe migration sequence
1. Inventory behavior, not just URLs
For every tag, record:
- ScriptTag ID and
srcURL - owning app and maintainer
- pages where it runs
- UI or DOM changes it makes
- events and network requests it sends
- cookies or browser storage it uses
- consent requirements
- business owner for the feature
- rollback method
This prevents a technically successful migration that silently drops a conversion event or storefront feature.
2. Build the replacement
For storefront JavaScript, create a theme app extension and an app embed block. Theme app extensions can package Liquid blocks, JavaScript, CSS and reusable snippets, with assets served through Shopify’s extension framework.[4]
For analytics-only code, create a web pixel extension. Shopify’s web pixel guide requires an app created with Shopify CLI, authenticated GraphQL Admin API access, and the write_pixels and read_customer_events scopes. It also requires explicit privacy-purpose configuration for analytics, marketing, preferences and data-sale handling.[5]
A starter web pixel can be generated with:
shopify app generate extension --template web_pixel --name legacy-tracking-migration
Do not copy a legacy browser script unchanged into a pixel. Map it to Shopify customer events, confirm consent behavior and test the outgoing payloads.
3. Run old and new implementations carefully
Do not delete the old ScriptTag before the replacement is confirmed on the published theme. However, do not leave both versions firing indefinitely: Shopify warns that simultaneous execution can render UI twice or double-count analytics events.[3]
A controlled rollout should be:
- Deploy the extension without removing the old tag.
- Activate the app embed on a test theme or connect the web pixel in a development store.
- Compare storefront behavior and event payloads.
- Activate the replacement on the published theme.
- Confirm production behavior once.
- Delete the old tag with
scriptTagDelete. - Monitor errors, event volume and key conversion steps.
4. Verify theme activation
An app embed block is inactive until a merchant turns it on. Shopify recommends sending the merchant to the theme editor with the app embed activated through a deep link, confirming it is active on the published theme, and only then deleting the ScriptTag.[3]
Repeat the activation check whenever a store publishes a different theme because app embed activation is theme-specific.[3]
Merchant checklist if you do not maintain the app code
Store owners usually cannot repair a vendor’s app themselves. They can still reduce risk:
- List apps that add chat, reviews, pop-ups, personalization, tracking, affiliate, accessibility or other storefront JavaScript.
- Ask each vendor in writing whether the app uses Shopify ScriptTags with storefront scope.
- Ask whether its replacement is an app embed block or web pixel and when migration will be complete.
- Review Online Store → Themes → Customize → App embeds on the published theme.
- Review Settings → Customer events for connected pixels.
- Test important storefront behavior in a duplicate theme before publishing it.
- After migration, test product pages, cart actions, forms, chat, consent behavior and analytics events.
- Keep screenshots and event-debugger evidence from before and after the change.
Do not uninstall and reinstall a questionable app merely to test it after October 1. If its installation flow still depends on creating a ScriptTag, the replacement could fail.[1][3]
Pre-deployment test pack
Use at least these checks:
Storefront behavior
- Home, collection, product and cart pages load without JavaScript errors.
- UI appears once, in the correct position.
- Theme preview and published theme behave consistently.
- Mobile and desktop layouts remain usable.
- Feature behavior survives a page refresh and client-side navigation where relevant.
Analytics and privacy
- Each expected event fires once.
- Event names, IDs, values and currency are correct.
- Consent choices are respected before marketing or analytics code runs.
- Opt-out behavior matches the pixel’s declared privacy settings.
- No payment, password or other sensitive data is added to payloads.
Lifecycle
- Fresh install works without ScriptTag creation.
- Reinstall works.
- App settings can change without a ScriptTag update.
- Publishing a different theme triggers an activation check.
- Uninstall removes or disables the replacement cleanly.
Common mistakes
Waiting until March because existing tags still run
March is the final storefront cutoff, but October 1 is the deployment cutoff for creating and updating tags. Release the replacement before October so new installs and configuration changes no longer depend on the legacy resource.[3]
Pinning an older API version
Shopify explicitly says the October restriction applies to every API version. Version pinning will not defer it.[1]
Deleting the old tag before activation
App embed blocks are not automatically active on every theme. Confirm the replacement on the published theme first.[3]
Running both implementations without duplicate protection
A ScriptTag and its replacement can both execute during migration. This may duplicate rendered UI or analytics events.[3]
Using an app embed for analytics-only work
Shopify recommends web pixels for analytics, conversion and customer-behavior tracking. Web pixels do not require the merchant to activate an app embed.[1][3]
Frequently asked questions
When will Shopify ScriptTags stop working?
Apps cannot create or update storefront ScriptTags after October 1, 2026. Existing tags stop being injected into storefronts on March 1, 2027.[1]
Will existing ScriptTags stop on October 1?
No. Shopify says existing storefront tags can continue running until March 1, 2027, but create and update operations fail from October 1.[3]
Can I avoid the cutoff with an older Shopify API version?
No. Shopify states that the deprecation applies across API versions.[1]
What replaces a ScriptTag that loads storefront JavaScript?
Use an app embed block shipped in a theme app extension. Confirm that the embed is active on the published theme before removing the old tag.[3]
What replaces an analytics or conversion ScriptTag?
Use a web pixel. Shopify’s pixel framework supports subscriptions to customer events and includes explicit customer-privacy settings.[5]
Can an admin-created custom app use theme app extensions?
Shopify says apps created directly in the Shopify admin cannot use app extensions. The maintainer must move the script into the theme as a last resort or rebuild the integration using an app distribution method that supports extensions.[3]
Bottom line
Treat October 1, 2026 as the practical migration deadline. Inventory every ScriptTag, choose an app embed block or web pixel based on its real job, validate the replacement on a development store and published theme, then remove the legacy tag only after production verification.
Sources
[1] https://shopify.dev/changelog/online-store-script-tags-deprecation — Script tags are deprecated and will stop running on March 1, 2027
[2] https://shopify.dev/docs/apps/build/online-store/script-tag-deprecation — Shopify script tag deprecation
[3] https://shopify.dev/docs/apps/build/online-store/script-tag-deprecation/storefront — Storefront script tags
[4] https://shopify.dev/docs/apps/build/online-store/theme-app-extensions — About theme app extensions
[5] https://shopify.dev/docs/apps/build/marketing-analytics/build-web-pixels — Build web pixels