Shopify Overview

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 subsection documents how to build on Shopify, the hosted e-commerce platform. It was written against the Admin, Storefront, Customer Account and Functions API version 2026-10, Shopify CLI 5.0.0 (published 2026-10-27, requires Node.js 22.12 or later), Hydrogen 2026-10 (@shopify/hydrogen 2026.10.2), the React Router app template package @shopify/shopify-app-react-router 4.0.0, Polaris web components 2.0 (stable since 2026-10-22), Dawn 16.0.0, Horizon 4.3.0 and Theme Check 3.31.0. Every fact was checked on 2026-10-27. Shopify is a service, not a download: pages describe the platform as it behaves on that date, and the What’s New and Deprecation Timeline page tracks what changes afterwards. This page applies to every plan; where a capability is limited to Shopify Plus or to a feature preview it says so.

The page explains what Shopify is, how its API versions and plans work, the four surfaces a developer builds on, how the pages of this subsection fit together as a learning path, and then lists every page. It is the entry point of the Shopify subsection of the E-commerce section.

What Shopify is

Shopify is a multi-tenant software-as-a-service commerce platform. A merchant opens a shop (a store, reachable at <shop>.myshopify.com and at any custom domains attached to it), and Shopify runs everything underneath it: the database, the web servers, the CDN, the checkout, payment processing, fraud analysis, tax calculation, inventory, order management, backups and upgrades. There is no server to provision, no PHP or Node.js version to maintain, no database schema to migrate and no security patch to apply on the merchant side. All shops run the same code, and changes reach them through versioned APIs and dated releases.

That model has three consequences that shape everything else in this subsection.

  • Extension happens at defined seams. You cannot modify Shopify core code, install a module into it or override a class. Instead Shopify publishes surfaces (theme files, GraphQL APIs, webhooks, extension points, Functions) and you build on those. A capability that Shopify has not exposed as a seam is not available, which is why the Shopify Functions and Checkout Extensibility pages are central: they are the supported seams for checkout behaviour.

  • Deprecations arrive on a published schedule. Because the platform is shared, an old way of doing things is retired on a date for everyone. During 2024 to 2027 that has happened to checkout.liquid, Shopify Scripts, the REST Admin API as a place for new apps, script tags and non-expiring offline access tokens (see Retirements that matter).

  • Commercial terms are part of the design. Which plan a shop is on decides some technical capabilities (checkout customisation on the Information, Shipping and Payment steps, Functions inside custom apps, number of locations, B2B catalogs), and Shopify Payments or a third-party gateway decides transaction fees. The Plans and Shopify Plus page covers this in detail.

Shopify publishes much of its tooling as open source (Liquid, Shopify CLI, Hydrogen, the Theme Check linter, the Dawn, Horizon and Skeleton reference themes, the app templates), but the platform itself is closed. For market context, W3Techs reports Shopify at 32.4% of the sites whose e-commerce system it can detect and at 5.3% of all sites (checked 2026-10-27).

Shop, channels and the Admin

The Shopify admin is where merchants manage products, orders, customers, discounts, inventory, markets, apps and settings. It is itself an app platform: an embedded app is a page inside the admin. Products are published to sales channels: the Online Store channel (the theme-rendered storefront), Point of Sale for physical retail, the Headless channel for custom storefronts, Shop, social and marketplace channels, and AI channels. Developers mostly meet two of them: Online Store (themes) and Headless (the Storefront API).

Editions and the release rhythm

Shopify announces its product changes twice a year in an Edition, and developers announce theirs continuously in the developer changelog at shopify.dev/changelog. The two recent editions are Winter '26 "Renaissance" (2025-12-10) and Spring '26 "Everywhere" (2026-06-17). There is no Summer '26 edition. For build work the changelog and the API version table below are the authoritative sources; editions are marketing summaries.

API versions

Shopify’s APIs are versioned by quarter. A version is named YYYY-MM, released at 17:00 UTC on the first day of the quarter, and supported for at least 12 months, which gives at least 9 months of overlap with its successor. The status on 2026-10-27 was:

Version Status Accessible until

2025-04, 2025-07, 2025-10

Unsupported

Already inaccessible (2026-04-16, 2026-07-16 and 2026-10-16, each at 15:00 UTC)

2026-01

Stable

2027-01-16

2026-04

Stable

2027-04-16

2026-07

Stable

2027-07-16

2026-10

Latest stable (released 2026-10-01)

2027-10-16

2027-01

Release candidate (releases 2027-01-01)

2028-01-16

There are three kinds of version: stable, release candidate (published on the date the previous quarter’s version goes stable, so integrations can test early) and unstable (updated continuously). A request for 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 shows which version actually served it. Deprecated fields are removed in a later release; the 2026-10 schema marks automaticDiscounts as removed in 2027-01 and currentBulkOperation as superseded by bulkOperations. The versioned APIs are the GraphQL Admin API, Storefront API, Customer Account API, the Function APIs, Webhooks, Events and the Partner API. Some surfaces are not versioned and can change at any time: Liquid, the Ajax API, the App Bridge APIs, the Web Pixels API, OAuth endpoints, Customer Privacy API and Storefront Web Components. Libraries follow their own major versions (Hydrogen, Hydrogen React, the app libraries).

The four build surfaces

Everything a developer builds for Shopify belongs to one of four surfaces, and most real projects combine several.

The four Shopify build surfaces, themes, apps, extensions and headless, all connected to the hosted Shopify platform
Surface What you write Where it runs Main pages

Themes

Liquid templates, sections, blocks, snippets, CSS, JavaScript and JSON settings

On Shopify, rendered for the Online Store channel. Merchants edit sections and blocks in the theme editor.

Theme Architecture, Liquid Language, Sections and Theme Blocks

Apps

A web application (the template uses React Router and Node.js) configured by shopify.app.toml, calling the Admin GraphQL API

On your own hosting. An embedded app is shown inside the admin. A public app is listed in the Shopify App Store, a custom app serves one merchant.

Apps Overview and Scaffolding, Admin GraphQL API

Extensions

Small packages declared in an app and deployed with it: checkout and customer account UI, admin UI, POS UI, theme app extensions, web pixels, Flow triggers and actions, and Shopify Functions

On Shopify infrastructure (sandboxed JavaScript or WebAssembly), not on your server

Checkout Extensibility, Shopify Functions, Theme App Extensions and Web Pixels

Headless

Your own storefront using the Storefront API (and the Customer Account API), optionally built with the Hydrogen toolkit

On your hosting, or on Oxygen, Shopify’s hosting for storefronts. Checkout remains Shopify-hosted.

Storefront API and Headless with Hydrogen

Themes

A theme controls how the Online Store looks and behaves. Since Online Store 2.0 (2021) a theme is a folder with a fixed layout: layout/ (page shells such as theme.liquid), templates/ (mostly JSON files that list which sections a page contains), sections/, blocks/, snippets/, assets/, config/ (settings_schema.json and settings_data.json) and locales/. Pages are composed from sections that merchants add, remove and reorder in the theme editor; sections contain blocks; theme blocks are reusable and can nest. Logic is written in Liquid, an open source template language created at Shopify and maintained as a Ruby gem (5.14.0 on 2026-10-27), extended by Shopify with tags such as schema, render, content_for and section, and with 155 filters, 33 tags and 142 objects in the reference snapshot used for this subsection. Liquid itself is not versioned: it evolves continuously.

Three reference themes exist. Skeleton is the minimal starting point installed by shopify theme init. Dawn (16.0.0) is the long-standing Online Store 2.0 reference. Horizon (4.3.0) is the newer reference built around theme blocks. The Shopify Theme Store accepts only themes built on Skeleton, and requires a minimum average Lighthouse performance score of 60. The Reference Themes page compares them.

Themes cannot run server-side code of their own. Anything that needs a database or a secret is done by an app, reached either through the storefront (an app block or an app proxy) or by writing data into Shopify objects the theme reads (metafields and metaobjects, see Metafields and Metaobjects).

Apps

An app is a web application that integrates with Shopify through APIs. It authenticates to a shop, receives events as webhooks, calls the Admin GraphQL API and, if embedded, renders its interface inside the Shopify admin with App Bridge and the Polaris web components. Two kinds exist.

  • A public app is distributed through the Shopify App Store to many merchants. It must pass App Store requirements (GraphQL-only for new apps since 2025-04-01, the three mandatory privacy compliance webhooks, expiring offline access tokens, Shopify-based billing) and is created and managed in the Dev Dashboard.

  • A custom app is built for a single merchant (or one organisation) and installed directly. It has the same APIs but a smaller review burden. A custom app that contains a Shopify Function requires a Shopify Plus shop.

The Shopify CLI scaffolds an app with shopify app init (the --template option accepts reactRouter or none; the older Remix template is legacy), links it to the Dev Dashboard and runs a development tunnel with shopify app dev. The REST Admin API is legacy since 2024-10-01 and new public apps must use GraphQL; no REST shutdown date has been published, so existing REST integrations keep running while new work targets GraphQL. The Admin GraphQL API page covers cost-based rate limits, pagination and the migration from REST.

Extensions

An extension is a unit of code that lives in an app project, is described by a shopify.extension.toml file, and is deployed with shopify app deploy so that Shopify runs it. The CLI’s template catalogue (shopify app generate extension --template <id>) lists 81 templates on 2026-10-27, which group into these families:

  • Checkout and customer account UI extensions (checkout_ui, customer_account_ui, post_purchase_ui): written in Preact against Polaris web components with a 64 KB compiled bundle limit. UI extensions on the Information, Shipping and Payment checkout steps are Shopify Plus only; Thank you and Order status extensions work on all plans.

  • Admin UI extensions (admin_action, admin_block, admin_print and others) and POS UI extensions (pos_action, pos_block, pos_smart_grid), covered by Flow, POS and Admin Extensions.

  • Theme app extensions (theme_app_extension): app blocks and app embed blocks that merchants place in a theme without the app editing theme files. They replace script tags, which can no longer be created since 2026-10-01 and stop running on 2027-03-01.

  • Web pixels (web_pixel): sandboxed analytics code subscribed to customer events with consent handling.

  • Shopify Functions: Wasm modules that customise discounts, cart transforms, delivery options, payment methods, validation, fulfilment constraints and order routing. They replaced Shopify Scripts, which stopped executing on 2026-06-30. Functions are written in Rust (strongly recommended) or JavaScript, with limits of 256 kB for the binary, 11 million instructions for a cart of up to 200 lines and an input query of at most 3000 bytes.

  • Flow triggers and actions, payments extensions, tax calculation and others.

Headless

A headless storefront replaces the theme with your own front end, which reads catalogue data and manages carts through the Storefront API and signs customers in through the Customer Account API. The Storefront API accepts a public access token for browser and mobile use, a private token for server-side use, and (since recent API versions) tokenless access for a subset of data. The @inContext directive selects country and language, and in 2026-10 also a channel.

Hydrogen changed shape with the 2026-10 release (generally available 2026-10-14): it is now a framework-agnostic toolkit with a core entry point and React and Vue bindings, with a React Router starter for Oxygen and a Next.js starter, rather than the full-stack Remix and React Router framework that earlier releases (2026-04 and before) were. That earlier framework is documented as Legacy Hydrogen. Oxygen is Shopify’s hosting for storefronts and is included at no extra charge on the paid plans. Checkout is always Shopify-hosted, so headless projects still customise it through checkout extensions. The Storefront API documentation does not declare any maintenance mode; what is deprecated is the old Liquid-theme customer account system (legacy customer accounts, deprecated 2026-02-26) in favour of the Customer Account API.

Choosing a surface

If you need to …​ Start with

Change how pages look, add sections merchants can arrange

A theme (the reference theme you copy, then sections and blocks)

Read or change products, orders, customers or inventory from outside Shopify, react to events, charge merchants

An app with the Admin GraphQL API and webhooks

Change discounts, shipping options, payment options or cart validation rules

A Shopify Function inside an app

Add fields, messages or upsells in checkout or on the Thank you page

A checkout UI extension

Add storefront behaviour from an app without editing the theme

A theme app extension (app block or app embed)

Build a custom storefront in your own stack

Headless, with the Storefront API and optionally Hydrogen

The tools

The Shopify CLI is the single command line for all four surfaces. Install it with npm install -g @shopify/cli@latest (or Homebrew on macOS: brew tap shopify/shopify && brew install shopify-cli). It needs Node.js 22.12 or later, a package manager (npm, Yarn 1.x or pnpm) and Git; the documentation says Git 2.28.0 and CLI 5.0.0 raised the requirement to 2.38.0 for Git operations. Its topics on 2026-10-27 are app, auth, config, doc, hydrogen, organization, store, theme and upgrade, plus the root commands search, version, commands and help.

Since CLI 4.0.0 (2026-05-21) it follows semantic versioning and updates itself (not in CI, not for project-local installs and not across major versions; disable with shopify config autoupgrade off). CLI 5.0.0 (2026-10-27) is the "typed JSON output" major release: commands accept --json, --json-schema and --no-input, which makes them scriptable. Set SHOPIFY_CLI_NO_ANALYTICS=1 to opt out of usage analytics.

npm install --global @shopify/cli@latest
shopify version
shopify commands | head -20

The commands above were run with CLI 5.0.0 on 2026-10-27; shopify version printed 5.0.0.

Other tools you will meet:

  • The Dev Dashboard manages apps, app versions, dev stores and app automation tokens. The Development Environment page covers creating a dev store (a password-protected, non-transferable test shop, up to 250 per organisation, created from the dashboard or with shopify store create dev) and testing with the Test payment gateway.

  • GraphiQL for the Admin API (shopify app graphiql, shopify store graphiql) and the public schema explorer on shopify.dev.

  • Theme Check, the Liquid linter, bundled in the CLI as shopify theme check and available in editors through the Liquid language server.

  • The Shopify AI Toolkit and the Dev MCP server (@shopify/dev-mcp), which give coding agents access to the documentation, API schemas and code validation.

Pocket Coffee across the subsection

All pages share one invented shop, Pocket Coffee, a small specialty-coffee seller. It has a "Single-origin beans" product with three options (origin, grind and size) giving 18 variants and SKUs such as PC-ETH-WHL-250, a "Starter kit" product, a Coffee Club discount of 10% on beans, free shipping above 40 EUR in Spain, a flat 9.90 EUR rate for the rest of the European Union, and Spanish and English storefronts. On Shopify it is built with the pieces below, and each page builds its own part.

Pocket Coffee need Built with

Products, variants, collections, customers, discounts

Admin setup, see Store Setup and Admin Basics

Spain and EU shipping zones

Delivery profiles, see Shipping, Taxes, Payments and Checkout Settings

Spanish and English, EUR and USD

Markets, see Markets and Internationalization

Roast date badge on the product page

A snippet in the theme reading a metafield, see the example below

Coffee Club discount

A Discount Function, see Shopify Functions

"Order placed" log

A webhook subscription, see Webhooks and Events

Reading products and creating an order

The Admin GraphQL API, see Admin GraphQL API

A first look at each surface

The four short examples below show one file or query from each surface. They are intentionally small; the pages in the map below develop each of them.

A theme snippet

The roast date badge is a Liquid snippet that reads a product metafield (namespace custom, key roast_date) and renders nothing when it is empty. The leading doc tag documents the snippet’s parameters, which Theme Check uses to validate calls.

{%- doc -%}
  Shows the roast date of a product.

  @param {product} product - The product to describe.
{%- enddoc -%}

{%- assign roast_date = product.metafields.custom.roast_date.value -%}
{%- if roast_date != blank -%}
  <p class="roast-date-badge">
    {{ 'products.product.roast_date' | t }}: {{ roast_date | date: '%d/%m/%Y' }}
  </p>
{%- endif -%}

It is saved as snippets/roast-date-badge.liquid, called from the product section with {% render 'roast-date-badge', product: product %}, and the translation key is added to locales/en.default.json:

{
  "products": {
    "product": {
      "roast_date": "Roasted on"
    }
  }
}

This example was run: it was added to a copy of the Skeleton theme and shopify theme check reported "40 files inspected with no offenses found". Without the translation key the same check reported a TranslationKeyExists error, and without the render call an OrphanedSnippet warning. The first run of Theme Check downloads the Liquid reference data and needs network access; later runs use a local cache. Rendering the snippet on a real storefront needs a shop and was not done.

An Admin GraphQL query

An app reads the active Pocket Coffee products and their variants with the Admin GraphQL API. It is sent to https://<shop>.myshopify.com/admin/api/2026-10/graphql.json with the header X-Shopify-Access-Token. The query is paginated with first and after; the pageInfo fields tell the client whether to request another page.

query PocketCoffeeProducts($first: Int!, $after: String) {
  products(first: $first, after: $after, query: "status:active") {
    pageInfo { hasNextPage endCursor }
    nodes {
      id
      title
      handle
      status
      variants(first: 10) { nodes { id sku price inventoryQuantity } }
    }
  }
}

The query was validated against the public Admin 2026-10 schema (downloaded anonymously from shopify.dev) with the graphql library and reported valid. It was not sent to a shop because that needs an access token.

A Storefront API query

A headless storefront reads one product in the Spanish market. @inContext selects the country and language, and the metafield alias exposes the roast date. A public Storefront token (or tokenless access for the data that allows it) is sent in the header X-Shopify-Storefront-Access-Token.

query PocketCoffeeBeans($handle: String!, $country: CountryCode, $language: LanguageCode) @inContext(country: $country, language: $language) {
  product(handle: $handle) {
    id
    title
    roastDate: metafield(namespace: "custom", key: "roast_date") { value }
    variants(first: 18) {
      nodes { id sku title price { amount currencyCode } availableForSale }
    }
  }
}

This query validated against the Storefront 2026-10 schema (421 types) and was not sent to a shop.

An app configuration file

Every CLI-built app has a shopify.app.toml at its root. This minimal one declares the app, its scopes, its redirect URL and the webhooks: one ordinary subscription and the three compliance topics that every App Store app must answer. The client_id is a placeholder; the real value comes from the Dev Dashboard. The domain example.invalid is reserved and never resolves.

client_id = "00000000000000000000000000000000"
name = "pocket-coffee-app"
application_url = "https://example.invalid"
embedded = true

[access_scopes]
scopes = "read_products,write_products"

[auth]
redirect_urls = ["https://example.invalid/api/auth"]

[webhooks]
api_version = "2026-10"

  [[webhooks.subscriptions]]
  uri = "/webhooks/app/uninstalled"
  topics = ["app/uninstalled"]

  [[webhooks.subscriptions]]
  uri = "/webhooks/customers/data_request"
  compliance_topics = ["customers/data_request"]

  [[webhooks.subscriptions]]
  uri = "/webhooks/customers/redact"
  compliance_topics = ["customers/redact"]

  [[webhooks.subscriptions]]
  uri = "/webhooks/shop/redact"
  compliance_topics = ["shop/redact"]

Run offline, shopify app build --no-input accepted this file and printed "pocket-coffee-app built!". Changing embedded = true to the string "yes" made it fail with "[embedded]: Value must be Boolean", and removing [auth] produced "[auth]: Required". Creating the app from the template (shopify app init), linking it and deploying all require a logged-in Shopify account and were not executed.

Retirements that matter

Because Shopify is shared infrastructure, old mechanisms are retired for everyone on set dates. Books and older blog posts routinely describe mechanisms in this table, so check dates before following them.

What When What replaces it

REST Admin API as a base for new public apps

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

Admin GraphQL API

checkout.liquid on the Information, Shipping and Payment steps

Unsupported (2024; the official documentation gives no exact day)

Checkout UI extensions, Functions, checkout branding

checkout.liquid and additional scripts on Thank you and Order status pages

2025-08-28 for Plus, 2026-08-26 for other plans

Thank you and Order status UI extensions

Shopify Scripts

New scripts impossible from 2026-04-15, all scripts stopped executing 2026-06-30

Shopify Functions

Script tags

Creating or updating blocked from 2026-10-01 (all API versions), stop running on online stores 2027-03-01

Theme app extensions (app embeds) and web pixels

Non-expiring offline access tokens

Required expiring tokens for new public apps from 2026-04-01 and for all public apps from 2027-01-01

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

Legacy customer accounts

Deprecated 2026-02-26; final sunset date to be announced

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

Polaris React (@shopify/polaris)

Deprecated and unmaintained

Polaris web components (s-* elements)

Product, Order and Shipping Discount Function APIs

Deprecated since 2025-04

The unified Discount Function API

Remix-based and "Legacy" Hydrogen

Legacy line ends at 2026-04 releases (maintenance release 2026.4.8, 2026-10-21)

Hydrogen 2026-10 toolkit

Learning path

The pages are ordered so that each depends only on earlier ones. Pick the track that matches the job, but read the foundation first.

Stage Goal Pages

1. Foundation

Understand the commercial model and set up a working shop and toolchain

Plans and Shopify Plus, Store Setup and Admin Basics, Development Environment

2. Themes

Build and customise the Online Store

Theme Architecture, Liquid Language, Sections and Theme Blocks, Reference Themes, Theme Design, SEO and Performance, Theme Tooling and Workflow

3. Apps and APIs

Build an app that talks to the Admin API securely

Apps Overview and Scaffolding, App UI, Authentication and Access Scopes, Webhooks and Events, Admin GraphQL API, Bulk Operations, Metafields and Metaobjects

4. Extensions

Change checkout, discounts and storefront behaviour from an app

Checkout Extensibility, Shopify Functions, Theme App Extensions and Web Pixels, Flow, POS and Admin Extensions

5. Headless and global

Sell outside the theme and across countries

Markets and Internationalization, Storefront API and Headless with Hydrogen, B2B

6. Shipping it

Charge merchants, pass review and deploy repeatably

Billing, App Store and Deployment, What’s New and Deprecation Timeline

Typical routes: a theme developer reads stages 1 and 2, then the Theme App Extensions page; an app developer reads stages 1, 3 and 4 and then stage 6; a storefront engineer reads stages 1 and 3 (authentication and the Admin API), then Storefront API and Hydrogen and the checkout page; a merchant’s technical lead starts with the plans, store setup and Markets pages and uses the cheat sheet as a reference. Some knowledge outside this subsection helps: GraphQL for the APIs, OAuth for the authentication flows, React for the app template and Rust or JavaScript for Functions.

Subsection map

Business and setup

Themes

Apps and APIs

Extensions

  • Checkout Extensibility: checkout and Thank you UI extensions, targets, Plus limits and the checkout.liquid sunset.

  • Shopify Functions: Discount, Cart Transform, Delivery and Payment Customization and Validation Functions, Rust and JavaScript to Wasm, limits and migrating from Scripts.

  • Theme App Extensions and Web Pixels: app blocks and embeds replacing script tags, web pixels and consent.

  • Flow, POS and Admin Extensions: Flow triggers and actions, POS UI extensions and admin UI extensions.

  • B2B: companies, locations, catalogs and payment terms.

Operations and reference

What this subsection could not run

Shopify is hosted, and everything that needs a shop, an organisation login or an access token sits behind an account. No account was created and no credential was used while writing these pages. Anything that runs offline was executed with the tooling above: Liquid snippets and whole themes through Theme Check, TOML configuration through shopify app build, GraphQL queries through schema validation against the public 2026-10 schemas, and JavaScript Functions built to Wasm and run with the local function runner. The following are documented from the official sources and were not executed: shopify app init, shopify app dev, shopify app deploy, shopify theme push, dev store creation, real API calls, webhook delivery, Rust Function compilation (no Rust toolchain was installed), building a Hydrogen starter and billing flows. Prices were read from the public pricing page as shown to a visitor in Spain in euros; Shopify localises the page, so check it for your region.