---
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: <https://shopify.dev/docs/apps/build/events-webhooks> Get started by [Creating an Events subscription](https://shopify.dev/docs/apps/build/events/get-started).
