Skip to content

Shopify Dude Fix

Shopify Script Tags Stop Loading in March 2027: Move to App Embeds Without Breaking the Store

ScriptTag creation stopped October 1, 2026; existing storefront ScriptTags stop loading March 1, 2027. Audit, replace, activate, test, then remove them safely.

Type: Fix / Complete Guide · Stage: Optimize / Scale · Topic: Apps / Theme Development

On this page

Quick answer

Shopify stopped accepting new or updated storefront ScriptTags on October 1, 2026. Existing ScriptTags can keep loading until March 1, 2027, when Shopify stops injecting them into storefront pages. If an app uses ScriptTags to load JavaScript, migrate the feature to a theme app extension with an app embed block. If it only tracks analytics or conversions, a web pixel is usually the better replacement. Verify the replacement on the published theme before deleting the old ScriptTag.

This is not the Shopify Scripts sunset. Shopify Scripts were Ruby checkout customizations retired June 30, 2026. ScriptTags are app-managed JavaScript injections on storefront pages. The names sound alike; the migrations are completely different.

What actually broke on October 1

The Admin GraphQL mutations scriptTagCreate and scriptTagUpdate now return permission errors. REST ScriptTag POST and PUT requests also fail. This restriction applies across API versions, so pinning an old Admin API version will not buy more time. Read and delete operations remain available so developers can audit and clean up their existing tags.

The immediate failure mode is usually installation or update: an older app may appear fine on existing shops while newly installed shops never receive its JavaScript. The March 1, 2027 deadline is different: Shopify stops injecting the remaining tags, so the legacy feature disappears even on stores where it previously worked.

Old tutorials that tell developers to create a ScriptTag record on app installation are no longer safe implementation guides. The underlying need—loading a widget, chat interface, badge, or tracking script—is still valid, but the installation mechanism has changed.

Audit before you touch the theme

  1. Find which app owns the injection. A ScriptTag belongs to the app that created it. An app’s Admin API token can query that app’s tags, but a different app cannot necessarily enumerate or remove all other apps’ records.
  2. Identify the feature. Is it a visible widget, a DOM mutation, product-page behavior, a chat bubble, or analytics-only code? Look at the actual script source and network requests; do not assume every third-party JavaScript URL has the same replacement.
  3. Check the current theme. Inspect Online Store → Themes → Customize → App embeds and the published theme’s code. A merchant may already have a replacement app embed, and the old ScriptTag may be duplicating it.
  4. Check affected stores and themes. A working app embed in a preview theme says nothing about whether it is active on the published theme. Plan for future theme switches as well.
  5. Record before/after evidence. Capture the current script URL, pages where it runs, browser requests, and expected UI or events. Keep an installation checklist per store.

GraphQL: inspect your app’s existing ScriptTags

query AuditScriptTags($cursor: String) {
  scriptTags(first: 50, after: $cursor) {
    nodes {
      id
      src
      displayScope
    }
    pageInfo {
      hasNextPage
      endCursor
    }
  }
}

Run this server-side with the appropriate app credentials and scopes, and page through the result. Do not put Admin API tokens in theme JavaScript. This query is for auditing records owned by the authenticated app; it is not a universal store-wide script scanner.

Choose the replacement by behavior

App embed block: Best for JavaScript that runs across storefront pages, adds a floating interface, or changes the DOM. App embeds work with vintage and Online Store 2.0 themes, and Shopify inserts them in the document head or body according to the block schema. The merchant activates them per theme.

App block: Best when a merchant needs to position a visible component inside a product or other theme section. App blocks require theme support for JSON templates and app blocks; they are not a universal drop-in for every legacy storefront.

Web pixel: Best for analytics-only event collection. It uses Shopify’s pixel event model and consent/privacy controls. Do not move an interactive chat widget into a pixel sandbox, and do not paste legacy DOM-manipulating code into Customer events expecting it to work unchanged.

Minimal app embed entry point

Inside a theme app extension, an app embed block can load an asset through its schema. The extension’s assets/ directory contains the JavaScript file.

{% comment %}
  blocks/storefront-loader.liquid
  JavaScript is loaded from the extension's assets folder.
{% endcomment %}
{% schema %}
{
  "name": "Storefront Loader",
  "target": "body",
  "javascript": "storefront-loader.js",
  "settings": []
}
{% endschema %}

Keep the script small and idempotent. For example, a widget loader should check whether its root element already exists before mounting. Theme editor previews, section re-rendering, and app version updates can otherwise produce duplicate interfaces even without a ScriptTag.

Safe migration sequence

  1. Build and deploy the theme app extension or web pixel in a supported app created through Shopify CLI or the Dev Dashboard.
  2. Test the replacement on a development store and then on a representative installed store.
  3. Guide the merchant to activate the app embed on the published theme, using an activation deep link if appropriate.
  4. Confirm that the feature works with the ScriptTag temporarily disabled or removed in a controlled test, and that the replacement does not depend on legacy code.
  5. Remove the old ScriptTag with scriptTagDelete only after confirming the replacement is active.
  6. Repeat after a theme switch. App embed activation is per theme, not a global permanent installation.

Do not run both loaders indefinitely. Until March 2027, a ScriptTag plus its app embed replacement can load the same JavaScript twice, double-count analytics, mount duplicate UI, or attach two add-to-cart handlers.

Special case: admin-created custom apps

Shopify documents a hard exception: custom apps created directly in the Shopify admin cannot use app extensions or web pixels. A legacy integration built that way cannot simply add a theme app extension to the same app. If you maintain it, consider moving the necessary code into a custom Liquid block or theme code as a temporary, explicitly owned solution—or rebuilding the integration as an app that supports extensions. Theme-code injection is harder to maintain and may survive app removal, so document ownership and cleanup.

Common misunderstanding

“The script still loads, so the deadline does not apply.” Existing tags can still run until March 1, 2027. That says nothing about whether new installs work after October 1, 2026.

“The Liquid script_tag filter is being removed too.” No. The ScriptTag Admin API resource and the Liquid script_tag filter are different mechanisms. This sunset concerns Shopify’s injection of app-created ScriptTag records.

How to test this

  1. Record the baseline network request and the UI or analytics behavior on a shop with an existing ScriptTag.
  2. Activate the replacement app embed in a test theme; verify the asset request and expected behavior.
  3. Publish or preview the intended theme and confirm the embed is actually enabled for it.
  4. Check for two copies of the same request, two DOM roots, or duplicate event subscriptions.
  5. Remove the legacy tag only after the replacement passes; repeat the test in an incognito browser.
  6. Switch to another theme and verify the merchant onboarding catches a disabled embed.
  7. For analytics, verify consent behavior and downstream event counts, not only a successful network response.

Sources and further reading

Documentation reviewed October 13, 2026.