Developer / API 2026-10 / Generally Available (GA)

Next Gen Events is GA
"What changed" and "the data you need" arrive in a single delivery

The successor to Classic Webhooks. Your app specifies which changes to receive (triggers), what data to include in the payload (GraphQL query), and delivery conditions (query_filter). The change details, affected IDs, and query results all arrive together, so you no longer need extra API calls or diff calculations after receipt.

On this page
  1. What's actually changing (30-second overview)
  2. The 3 components of an Event
  3. Example: Receiving product additions to a collection
  4. How to read the payload
  5. Supported topics
  6. Classic Webhooks vs. Events
  7. Tips for designing subscriptions
  8. Getting started (3 paths by role)
  9. 5 key points for engineers
  10. 3 business use cases
  11. One-line summary for proposals

1What's actually changing

With Classic Webhooks, you receivedonly a notificationsaying "the collection changed," and your app had to figure out what changed.
Next Gen Events deliverswhat changed + the IDs of affected resources + the results of your specified GraphQL queryall together.

Before (Classic Webhooks)

Receive notification → fetch the collection's product list → compare against your saved list → update the app.All of this work was neededjust to identify a single change.

Next Gen Events

Declare "the changes you care about" and "the data you need" in your subscription. The delivered payload is all you need to finish processing — no extra API calls after receipt.

Classic Webhooks Receive notification Fetch product list via API Extra API call Compare with saved list Diff calculation Update the app Next Gen Events Receive changes + target IDs + query results The query runs on Shopify's side as part of the subscription Skip extra fetches and diff calculations Update the app 4 steps 2 steps

2The 3 elements of an event

Subscriptions are written directly in the app's shopify.app.toml . Each event is made up of the following three elements.

triggers

Which changes matter

Example: a product is added to or removed from a collection, or a variant's price changes.

{ } query

What data you need at that moment

Write a GraphQL Admin API query, and its result is included in the payload. You can also include related data and metafields.

query_filter

Which results you receive

Example: limit delivery to products with status ACTIVE only.

A change occurs in the store A field changes ① Trigger matches? Check whether it's a change you care about ② Run the query Can fetch other data too ③ query_filter Decide whether to deliver based on the result Trigger and query are independent: a change to one field can kick off fetching "other" data your processing needs
For details on how the three elements work together, see the official Events overview .query_filter : no concrete syntax example is provided in this article.

3Example: receiving product additions to a collection

Scenario: your app maintains a search index, andwhenever a product is added to or removed from a collection,you want to update it.collection.products is used as the trigger, and the collection ID and product ID are passed straight into the query variables.

shopify.app.toml
[events]
api_version = "2026-10"

[[events.subscription]]
handle = "collection-membership"
topic = "Collection"
actions = ["update"]
triggers = ["collection.products"]
uri = "/api/events/collections"
query = """
 query CollectionMembership($collectionId: ID!, $productsId: ID!) {
 collection(id: $collectionId) {
 id
 hasProduct(id: $productsId)
 }
 }
"""
Payload when product 456 is added to collection 123
{
 "topic": "Collection",
 "action": "update",
 "handle": "collection-membership",
 "data": {
 "collection": {
 "id": "gid://shopify/Collection/123",
 "hasProduct": true
 }
 },
 "fields_changed": {
 "added": [
 "collection[id: 'gid://shopify/Collection/123'].products[id: 'gid://shopify/Product/456']"
 ],
 "updated": [],
 "removed": []
 },
 "query_variables": {
 "collectionId": "gid://shopify/Collection/123",
 "productsId": "gid://shopify/Product/456"
 }
}

4How to read the payload

action

update

Adding a product changes the collection's membership, so the event is update .

data

hasProduct: true

The query has already run as part of the subscription. No follow-up API calls or fetching the full product list are needed.

fields_changed

added / updated / removed

shows "what changed." In this example, added has one entry.

query_variables

Both IDs

You get the collection ID and product ID directly.

Query results reflect the state as of when the query ran. To understand what changed, refer to fields_changed. The current context includes data as appropriate. More examples are in the official delivery structure guide .

5Supported topics

The developer preview started with Product and Customer, and GA expands coverage to the major Admin GraphQL types.

Merchandising

Product / Collection

Customers & companies

Customer / Company

Orders, fulfillment & returns

Order / FulfillmentOrder / Refund / Return

Inventory & locations

InventoryItem / InventoryShipment / InventoryTransfer / Location

Content

Article / Blog / Page

META

Custom data

MetafieldDefinition / Metaobject / MetaobjectDefinition

Each topic hasdifferent supported triggers, query variables, and access scopes. Check the Events API reference for each change you want to subscribe to.

6Classic Webhooks vs. Events

AspectClassic WebhooksNext Gen Events
Change granularity Per topic Specified via trigger e.g.: collection.products
Payload contents Fixed Freely defined in GraphQL Can include related data and metafields
Delivery filtering Not specified query_filter decides whether to deliver based on the result
What changed App fetches and compares data to identify it fields_changed Provided in
Where it's configured Not specified shopify.app.toml in [events]
Going forward Existing integrationscontinue to work GA in 2026-10. Both can be used in the same app

This article doesn't say when Classic Webhooks will be deprecated.

7Subscription design tips

Common pitfall

Port the existing payload wholesale to GraphQL + subscribe to every change

You get familiar data, but you also carry over the processing your app used to do. In the collection example, loading every product each time doesn't help you handle the change. It only adds load.

Recommended

Work backward from what you need to do when a change happens

In the collection example, you only need the affected memberships. Shape the trigger and query around that.

What the Events optimization guide covers

01
Choose specific triggers
02
Query only the affected resources
03
Split subscriptions
04
Check against query complexity limits
Shopify sets acomplexity limiton queries. Confirm your configuration stays within it before you release. This article doesn't state the limit values.
When migrating, measure ① the number of deliveries you receive ② the size of each payload ③ the number of follow-up API calls after receipt . This shows where it's paying off and where there's still room to improve.

8Getting started (3 paths, depending on where you are)

A

Migrating from Webhooks

First, identify workflows that receive high volumes and discard most of them, or that make an extra API call every time. Look at what each handler actually does and which changes and data it uses. That's your starting point for subscriptions. See the migration guide.

B

New to both

With Shopify CLI 4.83 or later, follow the getting started guide. Set the events API version to 2026-10 and pick the topics and triggers you need from the reference.

C
2026-10

Already using the developer preview

Update the events API version to unstable → 2026-10 (including any per-subscription overrides). Review the versioned topic reference, and test before deploying.

Existing Classic Webhooks integrations keep working as is.You can use both in the same app and migrate workflows one at a time. Keep using Classic Webhooks for topics and patterns Events doesn't support yet.

95 key points for developers

TOML

1. Declarative configuration in shopify.app.toml

[events] and [[events.subscription]] : define handle / topic / actions / triggers / uri / query in them. They're deployed as part of your app configuration.

2. Triggers and queries are independent

The fields that detect a change and the data you fetch don't have to be the same.query_filter looks at the queryresultsto decide whether to deliver.

3. data reflects the state at execution time

The fact of the change is in fields_changed, while the current state is in data. Design your handlers so they don't confuse the two.

4. Queries have a complexity limit

Querying "everything" can hit the limit. Before release, confirm your queries stay within it. Also note that triggers, variables, and scopes differ by topic.

5. Plan for coexistence and gradual migration

Classic Webhooks and Events can be used together in the same app.Measure (delivery volume, payload size, number of additional API calls) → migrate one workflow at a timeis the officially recommended approach. If you used the preview, watch out for per-subscription unstable overrides that you forgot to update.

103 practical use cases for your business

USE CASE 1

Incremental sync of search and recommendation indexes

Challenge
Every collection change notification triggers fetching all products and comparing them, so detecting a single addition or removal costs API calls and a full diff.
Approach
Collection topic, use collection.products as the trigger, and configure a query that returns onlyhasProduct . Update the index one item at a time usingfields_changed and query_variables .
Impact
No more additional API calls or full comparisons after receiving an event, so syncing gets lighter.
Technical notes
This is exactly the sample setup from the article.data reflects the state at execution time, so use fields_changed.added / removed to tell whether it was an addition or a removal.
Shopify ERP WMS
USE CASE 2

Streamline order, fulfillment, return, and inventory integrations with ERP and warehouse systems

Challenge
In ERP and WMS integrations, every order or inventory notification triggers an API call to fetch details, and many notifications end up discarded as irrelevant.
Approach
Order / FulfillmentOrder / Refund / Return / InventoryItem / Location and similar topics, put only the fields your integration uses in the query, and usequery_filter to exclude irrelevant events before delivery.
Impact
Fewer received events, smaller payloads, and fewer additional API calls reduce the processing load of your integration.
Technical notes
Supported triggers, query variables, and access scopes differ by topic, so check the Events API reference beforehand. Also watch the query complexity limit.
Additional API calls
USE CASE 3

Metrics-driven, gradual migration of existing Webhooks apps

Challenge
Rebuilding an app that runs on Classic Webhooks all at once is risky, and there's little to go on when deciding where to start.
Action plan
Measure delivery volume, payload size, and the number of follow-up API calls → move workflows that "receive a flood of events and discard most of them" or "call the API every time" to Events, one at a time. Keep topics that aren't supported yet on Webhooks.
Impact
You can migrate without stopping existing integrations, and the before-and-after numbers serve directly as evidence of the improvement.
Technical notes
Both can be used in the same app. With Shopify CLI 4.83 and later, events api_version = "2026-10". If you used the preview, also update any per-subscription overrides.

11One-line summary for proposals

"Next Gen Events is the successor to Webhooks that deliversonly the changes you want, with only the data you need.
It cuts down on follow-up API calls and diff calculations after delivery, and you can migrate one workflow at a time while still running your existing Webhooks."