What’s New and Deprecation Timeline

This content was generated with the assistance of AI and should be verified against the official documentation of each platform before being relied on in production.

This section’s bibliography lists the reference material consulted while preparing these pages.

This page was written against the Admin, Storefront and Customer Account API version 2026-10 (the latest stable version, released on 2026-10-01, with 2027-01 in release-candidate state), Shopify CLI 5.0.0, Polaris web components 2.0 and Hydrogen 2026-10, and every date on it was checked on 2026-10-27. It is the one page of the Shopify subsection that is about time: which changes Shopify has announced, which of them already happened, which are still ahead, and what each one means for the Pocket Coffee shop and its companion app. Everything here applies to every Shopify plan unless a row says otherwise (the Information, Shipping and Payment checkout steps are Plus-only, for instance).

Shopify is a service rather than a download. A merchant never upgrades Shopify; Shopify changes underneath the merchant, and a developer learns about it from three places: the quarterly API versions, the developer changelog, and the twice-yearly Editions. The first two are contracts with dates. The third is a showcase. This page explains how to read each of them, then lists the Editions that matter to developers (Winter '26 and Spring '26), then follows six deprecations in detail with a Gantt chart, and finally compares the platform of 2026 with the platform described in the books that most newcomers still read first. The pages on the Admin GraphQL API, authentication and access scopes, checkout extensibility, Shopify Functions and theme app extensions and web pixels hold the how-to detail for each replacement; this page holds the dates and the reasoning.

Some of the commands below were run offline against public artifacts: the Admin GraphQL schemas for 2026-01, 2026-04, 2026-07, 2026-10 and the 2027-01 release candidate (downloaded anonymously and compared), Theme Check 3.31.0 through Shopify CLI 5.0.0, a theme app extension built with shopify app build against a placeholder app configuration, and two small Node.js scripts that do the date arithmetic. Anything that needs a shop, a login or an access token (an actual token exchange, an actual script tag call) was not executed, and the text says so where it matters.

How Shopify communicates change

API versions

The Admin GraphQL, Storefront, Customer Account, Functions, Webhooks and Partner APIs are versioned quarterly. A version is named YYYY-MM, is released at 17:00 UTC on the first day of its month and stays accessible for at least twelve months, which means that two consecutive versions overlap for at least nine months. Three kinds of version exist: a stable version, a release candidate (published on the same day as the previous stable release, so the 2027-01 candidate appeared on 2026-10-01) and the unstable version, which changes continuously. On the check date the status table is:

Version Status on 2026-10-27 Released Last accessible (15:00 UTC)

2025-10

Unsupported

2025-10-01

2026-10-16

2026-01

Stable

2026-01-01

2027-01-16

2026-04

Stable

2026-04-01

2027-04-16

2026-07

Stable

2026-07-01

2027-07-16

2026-10

Latest stable

2026-10-01

2027-10-16

2027-01

Release candidate

2027-01-01 (planned)

2028-01-16

A request to a version that is no longer accessible is not rejected: it falls forward to the oldest accessible stable version, and the response header X-Shopify-API-Version tells the caller which version actually answered. That is a convenience for old integrations and a trap for new ones, because a query written for 2025-10 can start failing validation without any deploy of your own. Pin the version in every URL (/admin/api/2026-10/graphql.json) and calendar the end date of the version you pin.

The pattern in the status table is regular enough to compute. The script below reproduces the table from the rule "released on the 1st at 17:00 UTC, accessible until the 16th of the same month a year later at 15:00 UTC" and prints the days left for each supported version, which is the number a team should put in its own calendar.

// versions.mjs -- Admin API version windows.
const checked = Date.parse('2026-10-27T12:00:00Z');
const day = 86400000;
for (const v of ['2025-10', '2026-01', '2026-04', '2026-07', '2026-10', '2027-01']) {
  const [y, m] = v.split('-').map(Number);
  const release = Date.UTC(y, m - 1, 1, 17);
  const end = Date.UTC(y + 1, m - 1, 16, 15);
  const state = checked < release ? 'release candidate' : checked >= end ? 'unsupported' : 'supported';
  const left = Math.max(0, Math.ceil((end - checked) / day));
  console.log(`${v}  released ${new Date(release).toISOString().slice(0, 10)}  last accessible ${new Date(end).toISOString().slice(0, 10)}  ${state.padEnd(17)} ${state === 'supported' ? left + ' days left' : ''}`);
}

Output, from running the script with Node.js 24:

2025-10  released 2025-10-01  last accessible 2026-10-16  unsupported
2026-01  released 2026-01-01  last accessible 2027-01-16  supported         82 days left
2026-04  released 2026-04-01  last accessible 2027-04-16  supported         172 days left
2026-07  released 2026-07-01  last accessible 2027-07-16  supported         263 days left
2026-10  released 2026-10-01  last accessible 2027-10-16  supported         355 days left
2027-01  released 2027-01-01  last accessible 2028-01-16  release candidate

The first four rows agree with the published table; the last row extends the pattern and is not itself a published date. Pocket Coffee’s companion app pins 2026-10, so its own deadline is 2027-10-16, and the shop’s older Partner reports that still call 2026-01 have until 2027-01-16.

Versions govern API schemas. A removal inside a version follows the schema’s own deprecation text: a field is marked deprecated with a reason, and the reason names the version in which it will disappear. The 2026-10 schema contains, for example, the automaticDiscounts query with the text "This will be removed in 2027-01", and currentBulkOperation, deprecated in favour of bulkOperations. Several surfaces are unversioned and may change at any time: the Ajax API, App Bridge APIs, the Catalog API, the Customer Privacy API, Liquid, OAuth endpoints, Shop Minis, Shop Pay Wallet, Storefront Web Components and the Web Pixels API. Libraries such as Hydrogen, Hydrogen React and the React Router app package are versioned by major release instead.

The Admin schema of each version can be downloaded anonymously, which makes the deprecation lifecycle measurable. The script below loads the five schemas that were available on the check date, counts deprecated fields in each and compares 2026-10 with the 2027-01 release candidate to see what disappears.

// schema-diff.mjs -- compare Admin GraphQL schemas of consecutive versions (graphql@16).
import fs from 'node:fs';
import {buildClientSchema} from 'graphql16';
const versions = ['2026-01', '2026-04', '2026-07', '2026-10', '2027-01'];
const load = v => buildClientSchema(JSON.parse(fs.readFileSync(`schemas/admin-${v}.json`, 'utf8')).data);
const fieldsOf = s => {
  const out = new Map();
  for (const [tn, t] of Object.entries(s.getTypeMap())) {
    if (tn.startsWith('__') || typeof t.getFields !== 'function') continue;
    for (const [fn, f] of Object.entries(t.getFields())) out.set(`${tn}.${fn}`, f.deprecationReason ?? null);
  }
  return out;
};
const maps = {};
for (const v of versions) {
  const s = load(v);
  maps[v] = fieldsOf(s);
  const dep = [...maps[v].values()].filter(Boolean).length;
  const q = s.getQueryType().getFields(), m = s.getMutationType().getFields();
  const st = n => (m[n] ? (m[n].deprecationReason ? 'deprecated' : 'present') : 'absent');
  console.log(v, 'fields', maps[v].size, 'deprecated', dep, '| scriptTagCreate', st('scriptTagCreate'),
    '| scriptTags query', q.scriptTags ? 'present' : 'absent');
}
const a = maps['2026-10'], b = maps['2027-01'];
const removed = [...a.keys()].filter(k => !b.has(k));
console.log('fields in 2026-10 missing from 2027-01:', removed.length,
  '(already deprecated in 2026-10:', removed.filter(k => a.get(k)).length + ')');

Output:

2026-01 fields 10359 deprecated 408 | scriptTagCreate present | scriptTags query present
2026-04 fields 11208 deprecated 406 | scriptTagCreate present | scriptTags query present
2026-07 fields 12181 deprecated 412 | scriptTagCreate present | scriptTags query present
2026-10 fields 12697 deprecated 409 | scriptTagCreate present | scriptTags query present
2027-01 fields 12814 deprecated 403 | scriptTagCreate present | scriptTags query present
fields in 2026-10 missing from 2027-01: 23 (already deprecated in 2026-10: 6)

Two lessons come out of the numbers. First, about four hundred schema fields are deprecated at any moment and only a handful leave in a given quarter, so a deprecated field is a signal to plan, not to panic. Second, scriptTagCreate is still in every schema, including 2027-01, even though calling it returns a user error from 2026-10-01: the runtime behaviour of a deprecation can change independently of the schema of a version, which is why the changelog entry, not the schema alone, is the source of truth for the script tag deadline below. This is also the reason a schema diff cannot replace reading the changelog.

Source: Shopify developer docs: GraphQL Admin API reference (schemas fetched through the introspection proxy at shopify.dev/admin-graphql-direct-proxy/<version>; the script ran offline on the saved files)

The developer changelog

Every announcement with a date lands in the developer changelog at https://shopify.dev/changelog, which is also published as a feed at https://shopify.dev/changelog/feed.xml. On 2026-10-27 the feed held 785 entries back to 2024-10-28. The entries that matter for deprecations share a structure: what is changing, why, who is affected, a dated timeline, the migration path and related docs. Three habits make the changelog useful.

  • Subscribe the team to the feed (or to the Dev MCP and AI Toolkit, which read the same sources) and filter on the words deprecat, sunset, removed and required.

  • Treat the date inside the entry as authoritative. The headline sometimes states a different, earlier milestone, and a single entry can contain two or three dates.

  • Read the who is affected paragraph first. The script tag entry, for instance, applies only to script tags with the display scope online_store; the order_status scope was covered by an earlier announcement.

At the HTTP level, since 2025-02-24 the response header X-Shopify-API-Deprecated-Reason carries the actual GraphQL deprecation text for a request that used a deprecated field, so logging that header in the companion app’s API client gives an early warning without any scheduled review. Theme Check gives the same kind of signal for theme code: its DeprecatedTag and DeprecatedFilter checks flag the include tag and the img_url filter, as the next example shows.

Deprecations that Theme Check reports

A theme’s own code can be audited offline. The snippet below is what a 2021-era Pocket Coffee theme might contain for the roast date badge: an include, a parser-blocking script tag in the markup, and the old img_url filter.

{%- comment -%} Legacy style: include and a hard-coded script tag {%- endcomment -%}
{% include 'price-tag' %}
<script src="{{ 'roast-badge.js' | asset_url }}"></script>
<img src="{{ product.featured_image | img_url: '200x' }}">
{{ product.metafields.custom.roast_date }}

Running Theme Check from Shopify CLI 5.0.0 (shopify theme check -o json, Skeleton as the base theme, 41 files) reports three errors and four warnings, of which these belong to deprecations:

warning DeprecatedTag    Use the 'render' tag instead of 'include'                  roast-badge.liquid:2
warning DeprecatedFilter Deprecated filter 'img_url', consider using 'image_url'.   roast-badge.liquid:4
error   ParserBlockingScript Avoid parser blocking scripts by adding `defer` or `async` on this tag   roast-badge.liquid:3
error   MissingAsset     'assets/roast-badge.js' does not exist                     roast-badge.liquid:3
error   ImgWidthAndHeight Missing width and height attributes on img tag           roast-badge.liquid:4

The modern version renders the price snippet with render, which gives the snippet its own scope, uses image_url with image_tag, and documents the snippet’s parameters with the doc tag:

{% render 'price-tag', product: product %}
{{ product.featured_image | image_url: width: 200 | image_tag: width: 200, height: 200, loading: 'lazy' }}
{{ product.metafields.custom.roast_date }}
{% doc %}
  @param {product} product - Product to price
{% enddoc %}
{{ product.price | money }}

Theme Check on the modern pair finds no errors and no deprecations. The only remaining findings are two OrphanedSnippet warnings, because the test theme has no template that renders roast-badge; in a real theme a section would render it.

Source: Shopify developer docs: Theme Check and Shopify Liquid reference: render (the checks listed come from shopify theme check --list, Theme Check 3.31.0)

Editions

Shopify Editions is the company’s release showcase. Two are published a year, "every six months", as a single page of more than 150 product updates grouped by area, and the developer changelog carries an announcement entry for each. The names on the Editions page on 2026-10-27, newest first, are:

Edition Name Date Source of the date

Spring '26

Everywhere

2026-06-17

Developer changelog entry "Shopify’s Spring '26 Edition: Everywhere" ("150+ updates to sell, shop, and build everywhere")

Winter '26

Renaissance

2025-12-10

Developer changelog entry "The Winter '26 Edition is here" ("150+ updates")

Summer '25

Horizons

2025-05-21

Developer changelog entry "The Summer '25 Edition is here"

Winter '25

Boring

2024-12-11

Developer changelog entry "The Winter '25 Edition is live"

Summer '24

Unified

Before the changelog feed

Editions page

Winter '24

Foundations

Before the changelog feed

Editions page

There is no "Summer '26" edition: the edition published on 2026-06-17 is called Spring '26, and a reader who searches for "Summer '26" will find nothing. The developer changelog feed starts in late 2024, so earlier editions have no dated entry there; the Editions page lists them back to Summer '22 "Connect to Consumer".

An edition is not an API version and not a deprecation notice. It announces features, many of them merchant-facing, often in developer preview or early access, and says little about removals. Treat it as a reading list: scan the Developer tab and the Checkout, Online and Agentic tabs, and then open the changelog entries those lines link to for the dated contract. The editions are also where Shopify announces the direction (agentic commerce, Sidekick, Dev Dashboard) that the deprecations in the next section make room for.

Winter '26 "Renaissance" (2025-12-10)

The Developer tab introduced the edition as "A completely new way to build for commerce with the power of AI". The developer-relevant announcements, in the order of the page, were:

  • Agentic commerce: building commerce agents with the Catalog API and Checkout MCP from the new Dev Dashboard, a Shopify Catalog available through MCP tools or REST, and Checkout Kit for web (a JavaScript library that renders a merchant’s checkout in a pop-up or new tab, also available for Swift, Android and React Native).

  • Sidekick: Sidekick recommending apps (Built for Shopify apps prioritized with badges) and Sidekick app extensions that let a merchant reach an app’s data and actions from Sidekick.

  • Apps and themes: better discovery for Built for Shopify apps, a 60-day grace period to fix automated criteria failures while keeping the badge, clearer App Store requirements, and regional admin web-vitals data for apps.

  • Platform and tools: full MCP support in the Shopify Dev MCP (validating API calls and Liquid), the Admin Intents API, faster bulk operations (all Admin API mutations, 100 MB files, up to five concurrent operations), faster metafields and metaobjects, binary testing in Shopify Functions for the move from JavaScript to Rust, nested cart lines, and the Dev MCP covering Hydrogen, the Storefront API and POS UI extensions.

  • Scripts: "Shopify Functions replace Scripts in 2026", the announcement whose dates are the Scripts entry in the Gantt chart below.

  • A new theme code editor with multi-file search, autocomplete and side-by-side diffs, and over 250 improvements to the Horizon theme.

Spring '26 "Everywhere" (2026-06-17)

The Developer tab grouped its announcements as Platform and Apps plus Extensions:

  • Agent tooling: commerce skills for agents ("Claude Code, Codex, Cursor, Hermes, and more"), the Shopify AI Toolkit, the open protocol for agentic commerce with Catalog, Cart and Checkout MCPs built on the Universal Commerce Protocol, and the Shop skill for personal AI agents.

  • Events and bulk: "More control over events" (triggers that fire a webhook only on specific field changes, and custom GraphQL queries so a subscription receives only the data it needs), GraphQL and bulk operations from the CLI, and parallel reads for bulk queries.

  • Dev Dashboard: all partner stores (dev, client transfer and collaborator) in the Dev Dashboard, a localized Dev Dashboard, an App Events API, role-based access for partners, improved webhook monitoring and app automation tokens for CI/CD.

  • CLI and deployments: automatic upgrades and semantic versioning in Shopify CLI (minor and patch releases upgrade automatically, major versions are opt-in) and safer app deployments that do not accidentally delete existing extensions.

  • Lightweight apps: an App Home built directly in the admin with no backend server, and discount configuration with admin UI extensions.

  • Functions and checkout: metaobject data and billing address and PO number in Functions, accelerated checkout support for add-ons, and the Shopify AI Toolkit upgrading checkout and customer account extensions to Polaris web components.

  • Billing and pricing: Shopify App Pricing, which lets the app submission configure usage, recurring or hybrid pricing with Shopify powering plan selection, charge approval and invoicing.

  • A refreshed API for branding checkout and accounts, a revamped Polaris documentation set, and metafields in ShopifyQL.

Pocket Coffee’s use of these editions is small and concrete. The Coffee Club discount that a Script would have implemented is a Discount Function. The "order placed" logger can use a webhook with a field-level trigger rather than polling. The companion app can be deployed with an app automation token and shopify app deploy --allow-updates, and the roast badge becomes an app embed block.

The deprecation timeline

Six deprecations affect almost every Shopify codebase written before 2025. The chart below places their dated milestones on one axis. A bar means a period in which behaviour is changing or blocked; a diamond is a single day. Items whose end date Shopify has not announced (the REST Admin API and legacy customer accounts) are drawn up to the check date only, and the label says so, because a bar that continued to the right would invent a deadline.

gantt title Shopify deprecations and sunsets, checked on 2026-10-27 dateFormat YYYY-MM-DD axisFormat %b %Y tickInterval 3month todayMarker off section REST Admin API Legacy API, no shutdown date :active, rest1, 2024-10-01, 2026-10-27 New public apps GraphQL only :milestone, rest2, 2025-04-01, 0d section checkout.liquid Thank you and Order status sunset :done, cl1, 2025-08-28, 2026-08-26 section Shopify Scripts Editing and publishing blocked :done, sc1, 2026-04-15, 2026-06-30 Scripts stop executing :milestone, sc2, 2026-06-30, 0d section Script tags Create and update blocked :active, st1, 2026-10-01, 2027-03-01 Storefront injection stops :milestone, st2, 2027-03-01, 0d section Legacy customer accounts Deprecated, no sunset date announced :active, lca1, 2026-02-26, 2026-10-27 section Offline access tokens Expiring tokens required :active, ot1, 2026-04-01, 2027-01-01 All public apps must comply :milestone, ot2, 2027-01-01, 0d section API versions 2025-10 becomes inaccessible :milestone, av1, 2026-10-16, 0d 2026-01 stops being accessible :milestone, av2, 2027-01-16, 0d

The same dates, as a table with the number of days between each date and the check date. The script that produced the day counts reads a small JSON file with one object per deprecation and prints each event relative to 2026-10-27:

// timeline.mjs -- print every dated event relative to the check date.
import fs from 'node:fs';
const data = JSON.parse(fs.readFileSync(new URL('./deprecations.json', import.meta.url)));
const day = 86400000;
const base = Date.parse(data.checkedOn + 'T00:00:00Z');
for (const item of data.items) {
  console.log(item.name);
  for (const e of item.events) {
    const delta = Math.round((Date.parse(e.date + 'T00:00:00Z') - base) / day);
    const status = delta < 0 ? `${-delta} days ago` : delta === 0 ? 'today' : `in ${delta} days`;
    console.log(`  ${e.date}  ${status.padEnd(14)} ${e.what}`);
  }
}
REST Admin API legacy
  2024-10-01  756 days ago   REST Admin API becomes a legacy API
  2025-04-01  574 days ago   New public apps must use GraphQL Admin API only
checkout.liquid on Thank you and Order status
  2025-08-28  425 days ago   checkout.liquid and additional scripts sunset (Plus)
  2026-08-26  62 days ago    Non-Plus deadline
Shopify Scripts
  2026-04-15  195 days ago   Editing and publishing blocked
  2026-06-30  119 days ago   All Scripts stop executing
Script tags
  2026-10-01  26 days ago    scriptTagCreate and scriptTagUpdate return a user error
  2027-03-01  in 125 days    Shopify stops injecting script tags into storefronts
Legacy customer accounts
  2026-02-26  243 days ago   Deprecated; final sunset date not announced
Non-expiring offline tokens
  2026-04-01  209 days ago   Expiring tokens required for new public apps
  2027-01-01  in 66 days     Required for all public apps

Source: Shopify developer changelog (each dated event is linked in the per-item sections that follow)

Summary table

Item What is deprecated Dates Replacement

REST Admin API

The REST Admin API is a legacy API; new features arrive in GraphQL first.

Legacy since 2024-10-01. Since 2025-04-01 new public apps must use GraphQL only. No shutdown date is published.

GraphQL Admin API, pinned to a version.

checkout.liquid

Customizing checkout by editing a Liquid layout, plus additional scripts and script tags on the Thank you and Order status pages.

Information, Shipping and Payment steps: unsupported (2024, no official day). Thank you and Order status: sunset 2025-08-28 for Plus and 2026-08-26 for non-Plus.

Checkout UI extensions, web pixels, checkout branding.

Shopify Scripts

Ruby scripts in the Script Editor for line items, shipping and payments.

Editing and publishing blocked 2026-04-15. Stopped executing 2026-06-30.

Shopify Functions.

Script tags

ScriptTag resource and the scriptTagCreate and scriptTagUpdate mutations that inject JavaScript into storefronts.

Create and update return an error from 2026-10-01 (all API versions). Storefront injection stops 2027-03-01.

App embed blocks in a theme app extension; web pixels for analytics.

Legacy customer accounts

The Liquid-based customer account pages that a theme ships in its customers templates.

Deprecated 2026-02-26. Final sunset date to be announced "later in 2026"; none announced on 2026-10-27.

New customer accounts, customer account UI extensions, the shopify-account component, the Customer Account API.

Non-expiring offline access tokens

Offline tokens that last until the app is uninstalled.

Required to be expiring for new public apps since 2026-04-01 and for all public apps from 2027-01-01.

Expiring offline tokens (one hour) with refresh tokens (90 days).

REST Admin API

The REST Admin API was Shopify’s first Admin API and the one that every book before 2022 teaches. Its page states that it is a legacy API as of 2024-10-01 and that "some newer features may only be available in GraphQL". From 2025-04-01 all new public apps submitted to the App Store must be built with the GraphQL Admin API only. The documentation publishes no shutdown date for REST, and this page does not invent one; the version-fall-forward rule still applies, so a REST URL with an expired version is answered by the oldest supported version rather than rejected.

Practical consequences for existing code:

  • REST resources are still versioned and removed field by field. A dated example in the changelog is the removal of pre_tax_price from the Order REST resource (2026-03-23), and the REST product image resource was deprecated on 2024-12-09 and now returns media image GIDs to ease the move to GraphQL (2024-12-12).

  • REST has no access to features that exist only in GraphQL, which Shopify’s own page warns about ("some newer features may only be available in GraphQL"). Bulk operations are one example, and rate limiting is another: GraphQL limits are cost-based, so a migration also changes how a client budgets its calls (see the page on the Admin GraphQL API). A REST client therefore ages faster than the endpoint count suggests.

  • The ScriptTag REST resource is a REST surface that has already stopped accepting writes (next section).

The migration template for a read is mechanical. The Pocket Coffee companion app used to list the beans product with GET /admin/api/2026-10/products.json?title=Single-origin beans and read variants[].sku, price and inventory_quantity from each. The GraphQL equivalent selects the same fields, paginates with a cursor, and was validated against the downloaded 2026-10 and 2027-01 schemas:

query PocketCoffeeBeans($first: Int!, $after: String) {
  products(first: $first, after: $after, query: "title:Single-origin*") {
    pageInfo { hasNextPage endCursor }
    nodes {
      id
      title
      variants(first: 50) {
        nodes { id sku price inventoryQuantity }
      }
    }
  }
}
== Admin 2026-10
wn/gql/rest-replacement.graphql VALID
== Admin 2027-01
wn/gql/rest-replacement.graphql VALID

The query was validated, not executed: running it needs an access token for a shop. To send it, POST it with the variable {"first": 10} to https://<shop>.myshopify.com/admin/api/2026-10/graphql.json with the header X-Shopify-Access-Token: ${SHOPIFY_ACCESS_TOKEN}.

checkout.liquid

Until Checkout Extensibility, a Shopify Plus merchant customized checkout by editing layout/checkout.liquid, and every merchant could add "additional scripts" and script tags to the Order status page. The official page on checkout.liquid states the state of play per step:

  • The Information, Shipping and Payment steps: checkout.liquid is "unsupported". Shopify’s documentation does not state a calendar day for this change (it happened in 2024), so none is given here.

  • The Thank you and Order status pages: checkout.liquid and additional scripts were sunset on 2025-08-28 for Plus stores. Script tags on those pages were sunset on 2025-08-28 for Plus and on 2026-08-26 for non-Plus stores. The Help Center confirms that 2026-08-26 "was the deadline" for non-Plus stores to upgrade, that stores on "Pause and Build" are upgraded automatically, and that the additional scripts section has been view-only since 2025-08-28.

The replacement is not a single feature: it is the set that Shopify calls Checkout Extensibility. Checkout UI extensions render a block at a named target (they are scaffolded with Preact and Polaris web components, with a compiled bundle limit of 64 KB, and 128 KB for full-page customer account extensions); Shopify Functions replace price, shipping and payment logic; the Checkout and Accounts Configuration API handles branding (2026-05-13); web pixels replace tracking scripts. Checkout UI extensions on the Information, Shipping and Payment steps are available on Plus only, while Thank you and Order status extensions are available on all plans. Later changes to the same surface: extensions default to non-blocking behaviour (2026-01-26), checkout metafields are deprecated in checkout and customer account UI extensions (2026-04-27), useBuyerJourneyIntercept was deprecated (2026-07-02) and owner_type becomes required for metafield declarations in 2027-01.

Pocket Coffee is not on Plus, so its only checkout surfaces are the Thank you and Order status pages. Its old "gift a roast date" note in the additional scripts box stopped working for good on 2026-08-26 and is rebuilt as a Thank you extension. The details of building one belong to the page on checkout extensibility.

Shopify Scripts

Shopify Scripts were small Ruby programs, edited in the Script Editor app, that changed line item prices, shipping rates and payment methods at checkout on Plus stores. The deprecation, announced in the developer changelog on 2026-04-09 and echoed in Winter '26 ("Shopify Functions replace Scripts in 2026"), has two dates:

  • 2026-04-15: editing and publishing new Scripts is no longer possible.

  • 2026-06-30: all Scripts cease to execute. The Help Center states that, as of that date, any Script that was still published was deactivated.

Because the second date is in the past on the check date, nothing remains to schedule: the logic that Scripts used to run is either rebuilt or silently gone. The replacement is Shopify Functions: Discount (the unified Discount API, since the Product, Order and Shipping Discount Function APIs were deprecated in 2025-04), Cart Transform, Delivery Customization, Payment Customization, Cart and Checkout Validation, Fulfillment Constraints and Order Routing. Functions compile to WebAssembly, Rust being the strongly recommended language and JavaScript supported through Javy. The fixed limits are a 256 kB binary and 10,000 kB of memory; the instruction count is a dynamic limit, 11 million for carts of up to 200 lines and scaling above that, and the input query is capped at 3000 bytes. Custom apps containing Functions require Plus, while public apps with Functions work on all plans. Shopify offers a Scripts customizations report to classify each existing Script as replaceable by a Function, by a public app, or neither.

For Pocket Coffee the Coffee Club rule ("10% off beans for the Coffee Club group, free shipping above 40 EUR") is the kind of rule that a Script implemented and that a Discount Function now implements. The full build, including a JavaScript Function compiled to Wasm and executed locally with shopify app function run, is on the page about Shopify Functions.

Script tags

A script tag is a record, created through the Admin API, that makes Shopify add a JavaScript URL to a storefront without any change to theme code. The changelog entry of 2026-08-24 sets two dates:

  • 2026-10-01: scriptTagCreate and scriptTagUpdate return a user error, and the ScriptTag REST resource rejects POST and PUT. This applies to all API versions, so pinning an older version does not defer it. Existing script tags continue to run.

  • 2027-03-01: Shopify stops injecting script tags into storefronts. Storefronts are the last place script tags still ran, because they already stopped on the Order status page (the order_status display scope, covered by the earlier checkout deprecation).

The scriptTags query and the scriptTagDelete mutation keep working, which is what makes a cleanup possible. Shopify’s reason is visibility: a script tag does not appear in the theme editor, so merchants cannot find or control it, whereas an app embed block does and a web pixel runs in a sandbox that respects customer privacy permissions. The migration is to ship an app embed block in a theme app extension (for UI or behaviour) or a web pixel (for analytics and conversion tracking only). Theme app extensions allow up to 30 app blocks (raised from 25 on 2026-02-03).

An audit-and-cleanup pair for the companion app lists every script tag it created, then deletes one by id. Both documents validate against the 2026-10 and 2027-01 schemas:

query AuditScriptTags {
  scriptTags(first: 50) {
    nodes { id src displayScope createdAt }
  }
}

mutation RemoveScriptTag($id: ID!) {
  scriptTagDelete(id: $id) {
    deletedScriptTagId
    userErrors { field message }
  }
}

The replacement for Pocket Coffee’s roast date badge (a script tag that wrote "Roasted on …​" into the product page) is an app embed block. This theme app extension is complete, and shopify app build built it offline from a placeholder app configuration (client id of 32 zeros, example.invalid URLs) with Theme Check passing on the extension:

# extensions/roast-badge/shopify.extension.toml
api_version = "2026-10"

[[extensions]]
name = "Roast badge"
handle = "roast-badge"
type = "theme"
<span data-roast-badge="{{ block.settings.roast_date | escape }}"></span>
<script src="{{ 'roast-badge.js' | asset_url }}" defer></script>

{% schema %}
{
  "name": "Roast badge",
  "target": "body",
  "settings": [
    { "type": "text", "id": "roast_date", "label": "Roast date" }
  ]
}
{% endschema %}
// extensions/roast-badge/assets/roast-badge.js
document.querySelectorAll('[data-roast-badge]').forEach((el) => {
  el.textContent = `Roasted ${el.dataset.roastBadge}`;
});
              roast-badge | Running theme check on your Theme app extension...
              roast-badge | Bundling theme extension roast-badge...

pocket-coffee-app built!

The block has "target": "body", which makes it an app embed block: the merchant switches it on in the theme editor under App embeds. A block with "target": "section" would be an app block placed inside a section instead. Deploying the extension and enabling it in a theme needs a real app registration and a store, so that part was not executed.

Legacy customer accounts

Shopify has two customer account systems. Legacy customer accounts are the Liquid-based pages (login with a password, the customers/* templates in the theme). New customer accounts are hosted by Shopify, passwordless by default, and extensible through customer account UI extensions. The changelog entry of 2026-02-26 deprecates the legacy system:

  • It is no longer available to new stores or to stores that were not using it.

  • Shopify stops providing feature updates and technical support for it.

  • "A final sunset date …​ will be announced later in 2026". No date had been announced on 2026-10-27, so the Gantt bar stops at the check date and carries no end.

  • Themes should no longer include the legacy customer account Liquid files. A store that is still on legacy accounts and upgrades to a theme without those files is automatically upgraded to new customer accounts. Dawn 16.0.0 removed them, and from 2026-07-30 the shopify-account component is a Theme Store requirement.

  • Apps that rely on legacy customer account Liquid pages will not work for merchants on new accounts; the replacement is customer account UI extensions, which enhance native pages such as order status, order list and profile and can add full-page experiences.

  • Custom storefronts should read customer-scoped data through the Customer Account API and move away from the Storefront API customer-scoped mutations (customerAccessTokenCreate is still in the 2026-10 schema, and storefrontCustomerAccessTokenCreate was deprecated on 2025-01-01).

For Pocket Coffee the practical test is whether the theme still ships a templates/customers folder. The Skeleton base theme does not have one (listing its templates folder confirms it), so the Coffee Club members (ada@example.test in the running example) sign in through new customer accounts. The details are on the pages on reference themes and the Storefront API and headless.

Offline access tokens

An offline access token lets an app call the Admin API without a merchant present (a webhook handler, a background job). Historically it never expired: it lasted until the app was uninstalled or the secret was revoked. The platform is moving to expiring offline access tokens: an access token that lasts one hour (expires_in 3600), paired with a refresh token that lasts 90 days (refresh_token_expires_in 7776000). Every refresh returns a new access token and a new refresh token. The dates are:

  • 2026-04-01: expiring offline tokens are required for new public apps.

  • 2027-01-01: expiring offline tokens are required for all public apps; non-expiring tokens then fail with authentication errors. Merchants need not reinstall; the app exchanges tokens in code. Custom apps and merchant-created apps are unaffected.

  • 2026-08-28: the refresh flow was made more resilient, and on 2026-09-29 token exchange when migrating tokens without a user session was made more reliable.

With 66 days to the 2027-01-01 date on the check day, this is the nearest hard deadline for an App Store app. The app template already opts in. This is the relevant part of app/shopify.server.ts in the public React Router template (commit 48b841a, 2026-10-09), which pins API version ApiVersion.October26, and the matching fields in its Prisma Session model:

const shopify = shopifyApp({
  apiKey: process.env.SHOPIFY_API_KEY,
  apiSecretKey: process.env.SHOPIFY_API_SECRET || "",
  apiVersion: ApiVersion.October26,
  scopes: process.env.SCOPES?.split(","),
  appUrl: process.env.SHOPIFY_APP_URL || "",
  authPathPrefix: "/auth",
  sessionStorage: new PrismaSessionStorage(prisma),
  distribution: AppDistribution.AppStore,
  future: {
    expiringOfflineAccessTokens: true,
  },
});
  refreshToken        String?
  refreshTokenExpires DateTime?

An app that stores tokens itself, rather than through the session storage of the library, needs equivalent columns and a refresh job. The request that asks for an expiring token during the token exchange is the same call that issues a non-expiring one plus expiring=1; it is documented on the page on authentication and access scopes. It needs a real ID token from an embedded app session and was not executed here.

Other dated items worth a calendar entry

The six items above are the large ones. These smaller, dated changes break code written for earlier years and are easy to miss. All dates come from the developer changelog or the Shopify documentation.

Change Date What to do

automaticDiscounts query removed from the Admin API

Deprecated in 2026-10, removed in 2027-01

Use automaticDiscountNodes. The old document is valid in 2026-10 and invalid in 2027-01 (validated, see below).

currentBulkOperation query

Deprecated (2026-01 and later)

Use bulkOperation(id:) or bulkOperations.

Product, Order and Shipping Discount Function APIs

Deprecated 2025-04; migrate before 2026-04

Use the unified Discount API.

useBuyerJourneyIntercept in checkout UI extensions

Deprecated 2026-07-02

Follow the changelog entry for the replacement APIs.

Checkout metafields in checkout and customer account UI extensions

Deprecated 2026-04-27

Use metafield declarations; owner_type required in 2027-01.

Merchant-owned delivery profile APIs

Deprecated 2026-07-01 for market-driven shipping

Read the market-driven shipping entry before changing delivery profiles through the API.

shopify_y and shopify_s cookies for Hydrogen

Deprecated 2026-01-17

Use the current tracking guidance of the Hydrogen release in use.

Theme CLI on password-protected storefronts

Older CLI versions stop working 2026-09-23

Use CLI 3.84.0 or later (Shopify CLI 5.0.0 satisfies this).

Shopify CLI 4.0 removals (2026-05-21)

--force flags, app generate extension --type, app generate schema, webhook trigger, theme serve

Use --allow-updates or --allow-deletes, --template, app function schema, app webhook trigger and theme dev.

Polaris React (@shopify/polaris)

Deprecated and unmaintained on npm

Move to Polaris web components; Built for Shopify apps have until 2027-05-01 to match the new admin style.

Global Catalog REST API

Stops serving traffic 2026-11-02

Move to the replacement documented in the changelog entry.

Storefront MCP cart tools

Deprecated 2026-06-24

Use the UCP Cart MCP.

Remix app template and Legacy Hydrogen

Legacy (Remix template; Hydrogen 2026-04 and earlier)

Use the React Router template (reactRouter in shopify app init --template) and Hydrogen 2026-10.

The automaticDiscounts row is one the schemas can prove. The following two documents select the Coffee Club’s automatic discounts with the old and new query. Validating both against the 2026-10 and the 2027-01 schemas with graphql@16 gives:

# old: valid in 2026-10, removed in 2027-01
query OldAutomaticDiscounts {
  automaticDiscounts(first: 10) {
    nodes {
      __typename
      ... on DiscountAutomaticBasic { title status }
    }
  }
}

# new
query CoffeeClubAutomaticDiscounts {
  automaticDiscountNodes(first: 10) {
    nodes {
      id
      automaticDiscount {
        __typename
        ... on DiscountAutomaticBasic { title status }
      }
    }
  }
}
== Admin 2026-10
automatic-discounts-new.graphql VALID
automatic-discounts-old.graphql VALID
== Admin 2027-01
automatic-discounts-new.graphql VALID
automatic-discounts-old.graphql INVALID
  - Cannot query field "automaticDiscounts" on type "QueryRoot". Did you mean "automaticDiscount", "automaticDiscountNode", "automaticDiscountNodes", or "locationsCount"?

This is the cheapest regression test a team can add: run the project’s saved GraphQL documents against the release candidate schema in CI, and the removals show up as validation errors three months before the version becomes the one that old requests fall forward to. The graphql package must be version 16 for Shopify schemas: version 17 rejects the introspection result because of an interface-field deprecation rule.

A working method for each release

A small routine keeps the shop and the companion app ahead of the dates above. Pocket Coffee’s maintainer runs it quarterly, when the next API version’s release candidate appears.

  1. Read the changelog entries since the last review and note every dated item that touches a surface the app or the theme uses.

  2. Download the release-candidate Admin schema and validate the saved GraphQL documents against it (the validation recipes above).

  3. Run shopify theme check on the theme and on every theme app extension, and read the Deprecated* checks.

  4. Move the pinned API version forward in shopify.app.toml ([webhooks] api_version) and in the library configuration (apiVersion in the template), run the tests, and deploy.

  5. Review the list of non-expiring tokens, script tags, Scripts-era logic and legacy account files still in use, and put the next deadline into the team calendar with the days left.

What changed since the books

Most people learn Shopify from a book and then meet the 2026 platform in a client’s store. Four widely used titles cover different eras, and the table below compares what each teaches with what is true on 2026-10-27. The comparison describes the books at the level of their subject matter and their publication year; it is not a review of their quality, and the fundamentals of retail, catalogue design and SEO that they teach are mostly unchanged.

Book and year Platform it describes What is different on 2026-10-27

Michael Larkin, Shopify Application Development (Packt, 2014)

REST API, a Rails 4 app, Heroku, private apps, a hand-written OAuth flow, REST billing

New public apps use GraphQL only (2025-04-01). Apps are scaffolded with shopify app init on the React Router template (the Remix template is legacy). Scopes are declared in shopify.app.toml and installed by Shopify (managed installation). Embedded apps authenticate with ID tokens (formerly called session tokens) through token exchange, and offline tokens must expire (2027-01-01). The UI is Polaris web components 2.0 (Polaris React is deprecated), delivered with App Bridge. Billing is Shopify App Pricing, and the Billing API is now "Manual Pricing (Legacy)". Private apps were deprecated in January 2022 and converted to custom apps on 2023-01-20. Webhooks have mandatory compliance topics, and Events with triggers and query filters are the successor to classic webhooks.

Ivan Djordjevic, Shopify Theme Customization with Liquid (Packt, 2021)

The launch of Online Store 2.0, the Debut theme, checkout.liquid, the include tag, Theme Kit-era tooling

Dawn 16.0.0 and Horizon 4.3.0 are the reference themes, and Skeleton is the only approved codebase for new Theme Store themes. Sections can be used everywhere with JSON templates, and sections can host theme blocks, which nest. App embed blocks and app blocks replace script tags. include is deprecated in favour of render. Theme Check is part of Shopify CLI 5.0.0, and the Theme Store requires a Lighthouse performance score of at least 60. checkout.liquid is gone from every checkout step, replaced by Checkout Extensibility. Legacy customer account templates are removed from the reference themes.

Paul Waddy, Shopify For Dummies (Wiley, 2021)

The 2021 admin: plan names and prices, Oberlo-era dropshipping, app recommendations

The plan ladder now includes Starter, Basic, Grow, Advanced, Plus, Pause and Build and an Agentic plan; a localized pricing page shows Basic at EUR 24 per month billed yearly in the euro view. Third-party gateway fees are 2%, 1%, 0.6% and 0.2% from Basic to Plus. Markets, Shopify Payments rates, Shop Pay, Sidekick and agentic channels are part of the admin. Apps named in the book must be re-checked in the App Store.

Jason R. Rich, Ultimate Guide to Shopify (Entrepreneur Press, 2022)

The 2022 storefront and admin, dropshipping apps, named apps

Prices and plan features changed as above; Markets handles international selling; customer accounts are the new passwordless accounts; Shopify Scripts no longer run, and checkout is customized through extensions and Functions.

Four themes explain most of the differences.

Apps moved from REST and a server to GraphQL and the CLI

In 2014 an app was a web application that a developer deployed to a host, registered in the Partners area and wired to a REST client. In 2026 an app is a project in a Shopify CLI workspace whose shopify.app.toml declares scopes, webhooks, extensions and the Polaris CDN; its configuration is deployed as an app version; many apps need no backend at all (an App Home built directly in the admin, a Function, a theme app extension). The Dev Dashboard replaced most of the Partner Dashboard for building: dev stores, client transfer stores and collaborator stores live there, a single organization can have up to 250 dev stores, and shopify store create dev makes one from the terminal. The page on apps and scaffolding describes the current scaffold, and the page on the development environment describes the workspace.

Themes moved from Debut and Liquid files to sections, blocks and Skeleton

The Liquid language itself has changed least: the filters and objects in a 2021 book mostly still work. What changed is the structure around it. JSON templates compose sections; sections host blocks; blocks can be written as reusable theme blocks in the /blocks folder; app blocks from theme app extensions can be placed anywhere the theme allows. A section either defines its own local blocks or accepts @theme and @app blocks, not both. Stricter Liquid parsing was enforced for all themes on 2026-01-13, and a developer preview of {% block %} and {% partial %} tags (2026-07-21) shows where the language is heading. The theme architecture and sections and theme blocks pages cover the current model.

Checkout moved from templates and Scripts to extensions and Functions

A book from before 2024 shows checkout customization as editing checkout.liquid and writing Ruby Scripts. Both are gone: the first from every step, the second since 2026-06-30. Checkout is now the platform’s most opinionated surface. You cannot change its markup; you can place Preact-and-web-components extensions at defined targets, change its logic with Functions, brand it through the configuration API, and track it with web pixels. The same pattern, "defined seams instead of free edits", also applies to customer accounts (UI extensions) and the storefront (app embed blocks).

Headless moved from a framework to a toolkit

Books from the Hydrogen v1 and Remix years describe a full-stack framework. Hydrogen 2026-10, generally available on 2026-10-14, is a framework-agnostic toolkit with entry points for the core, React and Vue bindings, customer account helpers and a Vite plugin, with a Next.js starter and a React Router starter for Oxygen. The earlier framework is documented as Legacy Hydrogen (2026-04 and earlier) with a migration guide. Customer sign-in for headless storefronts goes through the Customer Account API. Oxygen is still free on paid plans. Polaris and Hydrogen pages are covered in app UI and the Storefront API and headless.

Two areas did not exist at all when the books were written: AI tooling and agentic commerce. The Shopify AI Toolkit (skills and a plugin for coding agents), the Dev MCP server (@shopify/dev-mcp), the CLI commands shopify doc search, shopify doc fetch and shopify app security check, Sidekick app extensions, and the Catalog, Cart and Checkout MCPs are new in 2025-2026 and are covered in the page on the development environment. A reader who learned the platform from a book should treat the book’s concepts (products, variants, collections, orders, fulfilment, discounts) as current and its mechanics (how to authenticate, how to customize checkout, how to inject a script) as historical.

What was run and what was not

  • Run offline: the version-window script and the timeline script (Node.js 24); the Admin GraphQL schema comparison across 2026-01, 2026-04, 2026-07, 2026-10 and 2027-01 (graphql@16.14.2); validation of the REST replacement, script tag audit and automatic discount documents against the 2026-10 and 2027-01 schemas; Theme Check 3.31.0 through Shopify CLI 5.0.0 on a Skeleton copy with the legacy and modern snippets; shopify app build on a one-extension app with a placeholder configuration; validation of the Mermaid chart.

  • Not run (they need a shop, a login or a token): any call to the GraphQL or REST endpoint, a token exchange, deploying or releasing the theme app extension, enabling an app embed block, a Discount Function on a real checkout, and upgrading a store from legacy to new customer accounts. Where the page describes the effect of those steps, it is quoting the Shopify documentation and changelog entries named in the Source lines.

  • Not stated by Shopify on the check date: a REST Admin API shutdown date; a final sunset date for legacy customer accounts; the calendar day on which checkout.liquid stopped being supported on the Information, Shipping and Payment steps. Re-check the changelog before relying on any of these.