Shopify stops adding script tags to storefronts on 1 March 2027. They fail silently — absent from the page, no console error — so the first symptom is a report that looks wrong rather than a site that looks broken. The three obvious ways to check a store all return false negatives, so we read the raw HTML instead.
95% confidence interval 76.7–80.2. We attempted 2,359 stores; 2% were unreachable.
| Basis | Stores | With script tags | 95% CI |
|---|---|---|---|
| Main set, all vendors | 2,123 | 78.5% | 76.7–80.2 |
| Main set, excluding trustedshops.com | 2,123 | 74.6% | 72.7–76.4 |
| Main set, excluding Trusted Shops and Shopify's own apps | 2,123 | 73.5% | 71.6–75.4 |
| Random control, all vendors | 173 | 82.1% | 76.4–87.8 |
| Random control, excluding the same two | 173 | 80.3% | — |
The main set's frame was partly harvested from Trusted Shops directories, so trustedshops.com is a pure sampling artifact — it is entirely absent from the independent control sample. Strip it, and strip Shopify's own apps too, and the floor is 73.5%.
The control is the unbiased sample, and it came out higher than the directory-based one. Directory members skew more professional than the median merchant, which means the known bias made the headline conservative rather than inflated. The two confidence intervals overlap.
Method. One homepage request per store. Script tags identified by the ?shop= parameter Shopify appends to every script tag source. Frame: Tranco list GQNVK plus public merchant directories. Full method and limitations at the foot of this page.
Script tags are the legacy mechanism apps use to inject JavaScript into a storefront. Shopify's guide states the end of it in one sentence:
“You can't create or update script tags after October 1, 2026, and Shopify will stop adding them to storefronts on March 1, 2027.”
Shopify, shopify.dev/docs/apps/build/online-store/script-tag-legacy
Two of the four dates have already passed. Script tags stopped running on the Order status page on 28 August 2025 for Shopify Plus stores, and on 26 August 2026 for everyone else.
| Change | Date | Status |
|---|---|---|
| Script tags stop running on the Order status page, Shopify Plus | 28 Aug 2025 | In effect |
| Script tags stop running on the Order status page, all other plans | 26 Aug 2026 | In effect |
| Script tags can no longer be created or updated | 1 Oct 2026 | Scheduled |
| Shopify stops adding script tags to storefronts | 1 Mar 2027 | Scheduled |
The REST and GraphQL API reference pages call script tags “legacy” but carry none of these dates. The timeline exists only on that one guide page, which is not where a developer checking an endpoint's status will land.
Nothing errors. The script is simply absent from the page — no console message, no failed request, no visual defect. Analytics, attribution, chat and returns widgets stop executing, and the storefront keeps rendering exactly as it did the day before.
So the first symptom is not a broken site. It is reporting that looks wrong: a channel that stops converting, a segment that stops populating, a support queue that goes quiet. That is a hard thing to trace back to a platform date, and a harder thing to trace back six weeks later.
Three methods a competent developer would try first. All three return false negatives.
The scriptTags query comes back empty on stores that definitely have script tags. Shopify's REST documentation explains why: “Script tags are scoped to the app that created them.” Any single access token therefore sees only its own app's tags. No token can enumerate a shop's script tags, and there is no merchant-facing list anywhere in the Shopify admin.
Scanning the served markup for <script src=...> finds nothing, because Shopify does not emit script tags as src attributes in the first place.
Network-level inspection labels them “injected by other JavaScript”, which makes them appear to fall outside the sunset entirely. Shopify emits an inline IIFE that waits for the window load event, then loops a hardcoded var urls = [...] array calling document.createElement('script'). Every one of those URLs is a script tag, and every one of them stops being emitted on 1 March 2027.
The reliable signature. Shopify appends ?shop=<store>.myshopify.com to every script tag source. That parameter survives in the raw HTML, and it is what this study detected on.
| Population | Stores | With tags | Redundant | Median tags |
|---|---|---|---|---|
| EU mid-market, public merchant directories | 1,463 | 74.6% | 5.2% | 2 |
| EU top-list stores | 295 | 87.1% | 15.9% | 3 |
| Large stores, 1,000+ products | 365 | 87.1% | 37.0% | 5 |
Large stores carry a mean of 5.8 script tags, and 37.0% of them are double-loading a vendor right now. Counting only the large stores that are affected at all, 42.5% have a redundant tag.
Inside the EU mid-market set, catalogue-size buckets are flat: 75–85% incidence and 5–9% redundancy across the range. Product count is not what drives this. App-stack maturity is.
The confound is worth stating plainly: size, geography and list construction cannot be separated with this data. The three rows differ on all three axes at once.
“Redundant” here means the same vendor is loaded both via a script tag and via a server-side script — an app embed block. The script tag is duplicative, so it can be deleted today with no vendor dependency and no migration work. That is the cheapest possible remediation, and it is available on 37.0% of large stores before anyone writes a line of code.
Precision caveat: the double-loading is verified from the markup. Whether the second load is an app embed block or a theme hardcode is inferred, not confirmed. Either way the script tag is duplicative.
The vendors most often found loading twice, counted across the main set and the independent control:
| Vendor | Main set | Control |
|---|---|---|
| Klaviyo | 95 | 11 |
| Yotpo | 70 | 3 |
| Rebuy | 47 | 6 |
| Gorgias | 40 | 3 |
| Attentive | 38 | 6 |
| Recharge | 16 | 2 |
Klaviyo ranks first in both samples independently, which is the kind of agreement that makes a finding worth acting on rather than worth re-measuring.
| Vendor or host | Share of 2,123 stores | Caveat |
|---|---|---|
| trustedshops.com | 15.2% | sampling artifact |
| cloudfront.net | 14.2% | CDN host, unattributed |
| Shopify's own apps | 11.7% | |
| amazonaws.com | 9.5% | CDN host, unattributed |
| nfcube.com (Instafeed) | 9.5% | |
| trustpilot.com | 8.6% | |
| loox.io | 7.5% | |
| Klaviyo | 6.7% | |
| Gorgias | 5.2% | |
| Recharge | 4.4% | |
| Hextom | 4.3% | |
| Rebuy | 4.2% | |
| Yotpo | 3.8% | |
| Attentive | 2.7% |
cloudfront.net and amazonaws.com cannot be attributed to a vendor from the hostname alone, so those two rows are host counts, not vendor counts. The real share of some named vendors above is therefore higher than the table shows.
Shopify's own apps are the third most common source, on 11.7% of stores. The platform ships the mechanism it is deprecating.
| Country | With script tags |
|---|---|
| Portugal | 90.5% |
| Denmark | 87.0% |
| Romania | 83.3% |
| Italy | 81.7% |
| Spain | 81.2% |
| France | 80.7% |
| Germany | 74.5% |
Germany has the lowest incidence in the main set and is 58% of the sample, so it sets the headline more than any other country does. A set weighted differently would read higher, not lower.
The independent control was a random draw from Tranco list GQNVK, ranks 50,000–500,000, global. It yielded 173 Shopify stores, of which 82.1% carried script tags (95% CI 76.4–87.8), or 80.3% once the same two artifacts are removed. 23% of sampled domains were unreachable, and the Shopify yield was 3.5%.
One sampling result is worth publishing on its own. A random draw from Tranco's top 20,000 yielded only 1.0% Shopify stores. That rank band is infrastructure, search and media, not merchants. Shopify clusters in the long tail, which is why the control had to be drawn from ranks 50,000–500,000, where merchants actually are.
Collection. One homepage request per store. Script tags identified by the ?shop=<store>.myshopify.com parameter Shopify appends to every script tag source. Sampling frame. Tranco list GQNVK, generated 2026-09-13 from a 30-day window combining CrUX, Farsight, Majestic and Radar via the Dowdall method, PLD-filtered — plus public merchant directories. Measured 14 September 2026.
Limitations. Homepage only; a script tag present on other templates and absent from the homepage is not counted. Tags scoped to ORDER_STATUS never render on the storefront and are structurally invisible to this method — those already stopped running, on the two dates above. A headless storefront emits no Liquid loader, so it reads as zero: correct as a statement of exposure, misleading as a platform label. 24% of randomly-sampled domains were unreachable or blocked automated requests.
Per-store results are not published. This page reports aggregates only — no individual storefront is named here, and no per-store list is available.
Send a store URL and you get back the vendors loading through script tags on that storefront, which of them stop on 1 March 2027, and which are already double-loaded and can be deleted today with no vendor dependency.
It arrives as a written finding, not a call.