Shopify Knowledge Patch
Use this skill for Shopify API integrations, upgrades, app migrations, storefront work,
Functions, extensions, inventory, fulfillment, payments, subscriptions, and developer
tooling. Read the topic reference that matches the work before changing an integration.
Reference index
| Reference |
Topics |
| api-versioning-and-access.md |
API lifecycle, access deadlines, versioned surfaces, enforcement, tokens, and mTLS |
| custom-data-and-events.md |
Customer webhooks, metafields, custom IDs, capabilities, Events, and consent |
| catalog-inventory-and-fulfillment.md |
Products, collections, inventory, fulfillment, bundles, and REST image IDs |
| orders-customers-and-subscriptions.md |
Orders, drafts, exchanges, companies, customers, subscriptions, and tax behavior |
| payments-discounts-and-delivery.md |
Vaulting, gift cards, discounts, delivery promises, profiles, labels, and pickup |
| storefront-checkout-and-markets.md |
Storefront carts, checkout, markets, Hydrogen, UCP, branding, and script tags |
| functions-extensions-and-tooling.md |
Functions, POS, UI extensions, Liquid, analytics, App Home, and Partner API tooling |
Breaking changes and migrations
Confirm the effective API version
- Stable versions release quarterly at 17:00 UTC and remain supported for at least
12 months, with at least nine months of overlap between consecutive versions.
- An inaccessible requested version falls forward to the oldest accessible stable
version.
- Read
X-Shopify-API-Version on responses and versioned webhooks to learn the
version Shopify actually used.
- A deprecation explicitly applied to every supported stable version is not deferred
by pinning an older version.
Track published version deadlines
| Version |
Access ends |
2025-07 |
2026-07-16 15:00 UTC |
2025-10 |
2026-10-16 15:00 UTC |
2026-01 |
2027-01-16 15:00 UTC |
2026-04 |
2027-04-16 15:00 UTC |
2026-07 |
2027-07-16 15:00 UTC |
2026-10 |
2027-10-16 15:00 UTC |
2027-01 |
2028-01-16 15:00 UTC |
Continued use of an unsupported resource after its deadline can delist an app and
block installs for at least seven days. Admin warnings remain until seven days after
the last detected use.
Migrate customer webhooks
In 2025-01, embedded customer payloads omit tags,
email_marketing_consent, sms_marketing_consent, last_order_id,
last_order_name, total_spent, and orders_count.
Consume the corresponding topics instead:
CUSTOMER_TAGS_ADDED and CUSTOMER_TAGS_REMOVED
CUSTOMERS_EMAIL_MARKETING_CONSENT_UPDATE
CUSTOMERS_MARKETING_CONSENT_UPDATE
CUSTOMERS_PURCHASING_SUMMARY
Replace removed customer payment-method creation
customerPaymentMethodRemoteCreditCardCreate is hidden in 2025-01, requires
stripePaymentMethodId, and was scheduled for removal after January 2026. Use
customerPaymentMethodRemoteCreate; an invalid customer ID produces a user error.
Replace removed metafield contracts
- Replace public
PrivateMetafield usage with app-data metafields for app storage or
app-reserved namespaces for per-resource data.
- Replace removed
MetafieldStorefrontVisibility queries, mutations, and
visibleToStorefrontApi fields with reads of MetafieldDefinition.access and
writes through metafieldDefinitionUpdate.
- Replace
MetafieldDefinitionInput.useAsCollectionCondition with
capabilities.smartCollectionCondition.
- Replace removed
metafieldDelete(gid) with metafieldsDelete entries containing
ownerId, namespace, and key; the mutation does not accept a metafield GID.
Update fulfillment-hold authorization and fields
node and nodes return null for holds outside the app's fulfillment-order scope.
The required scopes are read_merchant_managed_fulfillment_orders,
read_assigned_fulfillment_orders, read_third_party_fulfillment_orders, and
read_marketplace_fulfillment_orders for the corresponding hold owners.
Replace FulfillmentHold.heldBy with heldByApp, or with heldByApp.title when the
former string value is needed.
Move company-location tax data
Move company-location tax exemptions and registration IDs to
CompanyLocationTaxSettings. Replace the four assign/create/revoke mutations with
companyLocationTaxSettingsUpdate; see the orders reference for the exact removed
mutation names.
Prepare for script-tag shutdown
ScriptTagInput.displayScope accepts only ONLINE_STORE and defaults to it.
- Thank you and Order status page script tags were deprecated for August 28, 2025.
- Move checkout UI changes to Checkout Extensions and analytics or conversion
tracking to Web Pixels.
- Online Store script tags stop running on March 1, 2027.
Meet access and transport deadlines
- All public apps must use expiring offline access tokens starting January 1, 2027.
- The card-deposit endpoint requires an mTLS certificate.
Handle scheduled schema behavior
- Customer Account API removes
Customer.lastIncompleteCheckout and Checkout types
in 2026-10.
- Beginning in
2026-10, updating an order shipping address recalculates its taxes.
- GraphQL Admin
2026-10 removes DraftOrderDiscountNotAppliedWarning.priceRule.
2026-07 removes DraftOrderLineItem.grams.
- In POS
2026-07, bundle components expose discount allocations and fixed-amount
line-item discounts are per unit.
High-value current contracts
Use custom IDs with their present limits
Custom IDs, formerly external keys, are metafield-backed identifiers for any
metafield-capable resource. Lookup by custom ID is limited to products and customers.
productSet and unstable customerSet support matching-key upserts, but a custom ID
cannot yet serve as the matching key.
Account for product and inventory behavior
ProductInput.handle is checked for uniqueness when supplied.
- One Storefront
product or productByHandle query can request up to 2,000
variants; that limit does not apply across multiple product queries in one request
or when variants are reached through another path.
inventoryLevels and inventoryLevel accept includeInactive, and
InventoryLevel.isActive reports the result.
inventoryActivate preserves the level's available quantity when reactivating it.
Use the revised order and draft contracts
orderCreate accepts order.customer.toUpsert and can attach multiple tracking
numbers to each fulfillment.
DraftOrderLineItemInput.priceOverride replaces catalog price, requires
caller-managed currency conversion, and is stripped from bundles and components.
CalculateExchangeLineItemInput.variantId selects the exchange variant.
Apply discount and delivery semantics precisely
- App-discount inputs and objects distinguish one-time and subscription applicability,
support
recurringCycleLimit, and reject both purchase modes set to false.
- App-discount inputs now default
appliesOnSubscription to true.
- Multiple product discounts can apply to one cart line, and discounts can target
specific markets.
deliveryPromiseSettings, deliveryPromiseParticipantsUpdate, and
delivery_promise_settings/update form the read, write, and webhook contract for
delivery-promise configuration.
Follow Function response rules
- Use
HttpResponse.header(name: ...) for case-insensitive lookup of one header;
the all-header headers field remains but is deprecated.
- For JSON responses, use
JSON_body without body. If both are present, body
wins; absent Content-Type is filled as application/json.
- Malformed metafield input-query variables raise
InvalidVariableValueError rather
than behaving as empty input.
Preview and early-access checks
Treat these items according to their stated availability:
- Physical inventory is a feature preview.
- Next Generation Events is a developer preview.
- Liquid block and partial tags are a developer preview.
- Market-driven shipping and its Admin API are a feature preview.
- Mixed shipping and pickup within one order is a feature preview.
SubscriptionContractCalculation is early access.
Read the topic references before implementing these surfaces; they preserve the
available fields, mutations, and migration details without adding unstated behavior.
1---2name: shopify-knowledge-patch3description: Shopify4license: MIT5---678# Shopify Knowledge Patch910Use this skill for Shopify API integrations, upgrades, app migrations, storefront work,11Functions, extensions, inventory, fulfillment, payments, subscriptions, and developer12tooling. Read the topic reference that matches the work before changing an integration.1314## Reference index1516| Reference | Topics |17| --- | --- |18| [api-versioning-and-access.md](references/api-versioning-and-access.md) | API lifecycle, access deadlines, versioned surfaces, enforcement, tokens, and mTLS |19| [custom-data-and-events.md](references/custom-data-and-events.md) | Customer webhooks, metafields, custom IDs, capabilities, Events, and consent |20| [catalog-inventory-and-fulfillment.md](references/catalog-inventory-and-fulfillment.md) | Products, collections, inventory, fulfillment, bundles, and REST image IDs |21| [orders-customers-and-subscriptions.md](references/orders-customers-and-subscriptions.md) | Orders, drafts, exchanges, companies, customers, subscriptions, and tax behavior |22| [payments-discounts-and-delivery.md](references/payments-discounts-and-delivery.md) | Vaulting, gift cards, discounts, delivery promises, profiles, labels, and pickup |23| [storefront-checkout-and-markets.md](references/storefront-checkout-and-markets.md) | Storefront carts, checkout, markets, Hydrogen, UCP, branding, and script tags |24| [functions-extensions-and-tooling.md](references/functions-extensions-and-tooling.md) | Functions, POS, UI extensions, Liquid, analytics, App Home, and Partner API tooling |2526## Breaking changes and migrations2728### Confirm the effective API version2930- Stable versions release quarterly at 17:00 UTC and remain supported for at least31 12 months, with at least nine months of overlap between consecutive versions.32- An inaccessible requested version falls forward to the oldest accessible stable33 version.34- Read `X-Shopify-API-Version` on responses and versioned webhooks to learn the35 version Shopify actually used.36- A deprecation explicitly applied to every supported stable version is not deferred37 by pinning an older version.3839### Track published version deadlines4041| Version | Access ends |42| --- | --- |43| `2025-07` | `2026-07-16 15:00 UTC` |44| `2025-10` | `2026-10-16 15:00 UTC` |45| `2026-01` | `2027-01-16 15:00 UTC` |46| `2026-04` | `2027-04-16 15:00 UTC` |47| `2026-07` | `2027-07-16 15:00 UTC` |48| `2026-10` | `2027-10-16 15:00 UTC` |49| `2027-01` | `2028-01-16 15:00 UTC` |5051Continued use of an unsupported resource after its deadline can delist an app and52block installs for at least seven days. Admin warnings remain until seven days after53the last detected use.5455### Migrate customer webhooks5657In `2025-01`, embedded customer payloads omit `tags`,58`email_marketing_consent`, `sms_marketing_consent`, `last_order_id`,59`last_order_name`, `total_spent`, and `orders_count`.6061Consume the corresponding topics instead:6263- `CUSTOMER_TAGS_ADDED` and `CUSTOMER_TAGS_REMOVED`64- `CUSTOMERS_EMAIL_MARKETING_CONSENT_UPDATE`65- `CUSTOMERS_MARKETING_CONSENT_UPDATE`66- `CUSTOMERS_PURCHASING_SUMMARY`6768### Replace removed customer payment-method creation6970`customerPaymentMethodRemoteCreditCardCreate` is hidden in `2025-01`, requires71`stripePaymentMethodId`, and was scheduled for removal after January 2026. Use72`customerPaymentMethodRemoteCreate`; an invalid customer ID produces a user error.7374### Replace removed metafield contracts7576- Replace public `PrivateMetafield` usage with app-data metafields for app storage or77 app-reserved namespaces for per-resource data.78- Replace removed `MetafieldStorefrontVisibility` queries, mutations, and79 `visibleToStorefrontApi` fields with reads of `MetafieldDefinition.access` and80 writes through `metafieldDefinitionUpdate`.81- Replace `MetafieldDefinitionInput.useAsCollectionCondition` with82 `capabilities.smartCollectionCondition`.83- Replace removed `metafieldDelete(gid)` with `metafieldsDelete` entries containing84 `ownerId`, `namespace`, and `key`; the mutation does not accept a metafield GID.8586### Update fulfillment-hold authorization and fields8788`node` and `nodes` return `null` for holds outside the app's fulfillment-order scope.89The required scopes are `read_merchant_managed_fulfillment_orders`,90`read_assigned_fulfillment_orders`, `read_third_party_fulfillment_orders`, and91`read_marketplace_fulfillment_orders` for the corresponding hold owners.9293Replace `FulfillmentHold.heldBy` with `heldByApp`, or with `heldByApp.title` when the94former string value is needed.9596### Move company-location tax data9798Move company-location tax exemptions and registration IDs to99`CompanyLocationTaxSettings`. Replace the four assign/create/revoke mutations with100`companyLocationTaxSettingsUpdate`; see the orders reference for the exact removed101mutation names.102103### Prepare for script-tag shutdown104105- `ScriptTagInput.displayScope` accepts only `ONLINE_STORE` and defaults to it.106- Thank you and Order status page script tags were deprecated for August 28, 2025.107- Move checkout UI changes to Checkout Extensions and analytics or conversion108 tracking to Web Pixels.109- Online Store script tags stop running on March 1, 2027.110111### Meet access and transport deadlines112113- All public apps must use expiring offline access tokens starting January 1, 2027.114- The card-deposit endpoint requires an mTLS certificate.115116### Handle scheduled schema behavior117118- Customer Account API removes `Customer.lastIncompleteCheckout` and Checkout types119 in `2026-10`.120- Beginning in `2026-10`, updating an order shipping address recalculates its taxes.121- GraphQL Admin `2026-10` removes `DraftOrderDiscountNotAppliedWarning.priceRule`.122- `2026-07` removes `DraftOrderLineItem.grams`.123- In POS `2026-07`, bundle components expose discount allocations and fixed-amount124 line-item discounts are per unit.125126## High-value current contracts127128### Use custom IDs with their present limits129130Custom IDs, formerly external keys, are metafield-backed identifiers for any131metafield-capable resource. Lookup by custom ID is limited to products and customers.132`productSet` and unstable `customerSet` support matching-key upserts, but a custom ID133cannot yet serve as the matching key.134135### Account for product and inventory behavior136137- `ProductInput.handle` is checked for uniqueness when supplied.138- One Storefront `product` or `productByHandle` query can request up to 2,000139 variants; that limit does not apply across multiple product queries in one request140 or when variants are reached through another path.141- `inventoryLevels` and `inventoryLevel` accept `includeInactive`, and142 `InventoryLevel.isActive` reports the result.143- `inventoryActivate` preserves the level's `available` quantity when reactivating it.144145### Use the revised order and draft contracts146147- `orderCreate` accepts `order.customer.toUpsert` and can attach multiple tracking148 numbers to each fulfillment.149- `DraftOrderLineItemInput.priceOverride` replaces catalog price, requires150 caller-managed currency conversion, and is stripped from bundles and components.151- `CalculateExchangeLineItemInput.variantId` selects the exchange variant.152153### Apply discount and delivery semantics precisely154155- App-discount inputs and objects distinguish one-time and subscription applicability,156 support `recurringCycleLimit`, and reject both purchase modes set to false.157- App-discount inputs now default `appliesOnSubscription` to `true`.158- Multiple product discounts can apply to one cart line, and discounts can target159 specific markets.160- `deliveryPromiseSettings`, `deliveryPromiseParticipantsUpdate`, and161 `delivery_promise_settings/update` form the read, write, and webhook contract for162 delivery-promise configuration.163164### Follow Function response rules165166- Use `HttpResponse.header(name: ...)` for case-insensitive lookup of one header;167 the all-header `headers` field remains but is deprecated.168- For JSON responses, use `JSON_body` without `body`. If both are present, `body`169 wins; absent `Content-Type` is filled as `application/json`.170- Malformed metafield input-query variables raise `InvalidVariableValueError` rather171 than behaving as empty input.172173## Preview and early-access checks174175Treat these items according to their stated availability:176177- Physical inventory is a feature preview.178- Next Generation Events is a developer preview.179- Liquid block and partial tags are a developer preview.180- Market-driven shipping and its Admin API are a feature preview.181- Mixed shipping and pickup within one order is a feature preview.182- `SubscriptionContractCalculation` is early access.183184Read the topic references before implementing these surfaces; they preserve the185available fields, mutations, and migration details without adding unstated behavior.