--- title: >- Next Generation Events now available in developer preview - Shopify developer changelog description: >- Shopify’s developer changelog documents all changes to Shopify’s platform. Find the latest news and learn about new platform opportunities. source_url: html: >- https://shopify.dev/changelog/next-generation-events-now-available-in-developer-preview md: >- https://shopify.dev/changelog/next-generation-events-now-available-in-developer-preview.md metadata: effectiveApiVersion: '' affectedApi: - displayName: Webhook handle: webhook primaryTag: displayName: API handle: api secondaryTag: displayName: New handle: new indicatesActionRequired: false createdAt: '2026-05-07T23:53:05-04:00' postedAt: '2026-05-19T10:00:00-04:00' updatedAt: '2026-05-19T08:25:15-04:00' effectiveAt: '2026-05-22T12:00:00-04:00' --- May 19, 2026 Tags: * Webhook # Next Generation Events now available in developer preview [Next Generation Events](https://shopify.dev/docs/api/events/latest) are now available in developer preview, with field-level control over when events fire, what data they carry, and what triggered each delivery. * **Subscribe to exactly what you care about.** Field-level `triggers` pre-qualify deliveries before they reach your endpoint. A subscription scoped to `product.variants.price` won't fire on title edits, tag updates, or status changes. Only when the price changes. * **Get the payload your app needs, not a fixed schema.** You define the delivery payload with a standard Admin GraphQL query. No over-fetching fields you'll discard. No extra API call to get the data you actually wanted after the webhook lands. * **Know what fired for each delivery.** Every delivery includes `fields_changed`: an explicit list of the fields that triggered the event, with full entity paths and IDs. That means you don't need to infer, or diff against prior state. * **Filter on current state.** `query_filter` narrows deliveries based on the current state of your query output. Use it to skip events that don't meet your conditions, like only delivering for active products. * **Configure in code.** Subscriptions live in `shopify.app.toml` alongside your other app configuration. Version-controlled, reviewable, and deployable. As a developer preview, Events are available in the `unstable` API version and APIs may change. `Product` and `Customer` topics are live today. ### Configuration and payload ``` [events] api_version = "unstable" [[events.subscription]] handle = "price_sync" topic = "Product" actions = ["update"] triggers = ["product.variants.price", "product.variants.compareAtPrice"] uri = "/api/events" query = """ query priceSync($productId: ID!, $variantsId: ID!) { productVariant(id: $variantsId) { id price compareAtPrice sku } product(id: $productId) { id title status } } """ query_filter = "product.status:'ACTIVE'" ``` Every delivery includes `fields_changed`, `data` from your query, and `query_variables` used to fetch it: ```json { "topic": "Product", "action": "update", "handle": "price_sync", "data": { "productVariant": { "id": "gid://shopify/ProductVariant/456", "price": "24.99", "compareAtPrice": "34.99", "sku": "SIGNAL-NOT-NOISE" }, "product": { "id": "gid://shopify/Product/123", "title": "Peace & Quiet Tee", "status": "ACTIVE" } }, "fields_changed": [ "product[id: 'gid://shopify/Product/123'].variants[id: 'gid://shopify/ProductVariant/456'].price" ], "query_variables": { "productId": "gid://shopify/Product/123", "variantsId": "gid://shopify/ProductVariant/456" } } ``` ### Learn more Learn more about how Events relate to Webhooks: Get started by [Creating an Events subscription](https://shopify.dev/docs/apps/build/events/get-started).