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-Versionon 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_ADDEDandCUSTOMER_TAGS_REMOVEDCUSTOMERS_EMAIL_MARKETING_CONSENT_UPDATECUSTOMERS_MARKETING_CONSENT_UPDATECUSTOMERS_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
PrivateMetafieldusage with app-data metafields for app storage or app-reserved namespaces for per-resource data. - Replace removed
MetafieldStorefrontVisibilityqueries, mutations, andvisibleToStorefrontApifields with reads ofMetafieldDefinition.accessand writes throughmetafieldDefinitionUpdate. - Replace
MetafieldDefinitionInput.useAsCollectionConditionwithcapabilities.smartCollectionCondition. - Replace removed
metafieldDelete(gid)withmetafieldsDeleteentries containingownerId,namespace, andkey; 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.displayScopeaccepts onlyONLINE_STOREand 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.lastIncompleteCheckoutand Checkout types in2026-10. - Beginning in
2026-10, updating an order shipping address recalculates its taxes. - GraphQL Admin
2026-10removesDraftOrderDiscountNotAppliedWarning.priceRule. 2026-07removesDraftOrderLineItem.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.handleis checked for uniqueness when supplied.- One Storefront
productorproductByHandlequery 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. inventoryLevelsandinventoryLevelacceptincludeInactive, andInventoryLevel.isActivereports the result.inventoryActivatepreserves the level'savailablequantity when reactivating it.
Use the revised order and draft contracts
orderCreateacceptsorder.customer.toUpsertand can attach multiple tracking numbers to each fulfillment.DraftOrderLineItemInput.priceOverridereplaces catalog price, requires caller-managed currency conversion, and is stripped from bundles and components.CalculateExchangeLineItemInput.variantIdselects 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
appliesOnSubscriptiontotrue. - Multiple product discounts can apply to one cart line, and discounts can target specific markets.
deliveryPromiseSettings,deliveryPromiseParticipantsUpdate, anddelivery_promise_settings/updateform 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-headerheadersfield remains but is deprecated. - For JSON responses, use
JSON_bodywithoutbody. If both are present,bodywins; absentContent-Typeis filled asapplication/json. - Malformed metafield input-query variables raise
InvalidVariableValueErrorrather 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.
SubscriptionContractCalculationis early access.
Read the topic references before implementing these surfaces; they preserve the available fields, mutations, and migration details without adding unstated behavior.