Executive summary
- What: Events adds four topics, Metaobject, MetafieldDefinition, MetaobjectDefinition, and InventoryTransfer, plus targeted metafield changes on transfers.
- Why: apps can subscribe to specific field changes instead of consuming broad payloads and diffing them in the handler.
- Who: integration teams running ERP, PIM, or OMS sync, and any app reacting to custom content or stock movement.
What changed
Events is Shopify's newer subscription mechanism, declared in shopify.app.toml rather than registered at runtime. You name a topic, the actions you care about, and triggers that are field paths on the resource. You supply a GraphQL Admin query that shapes the payload, and optionally a query filter that discards deliveries failing a condition. Filtering that used to live in your handler moves into configuration.
Four topics joined the list. Metaobject and MetaobjectDefinition cover custom content and its schema, MetafieldDefinition covers custom data definitions, and InventoryTransfer covers stock movement between locations, with triggers including status, destination, and line items, plus targeted metafield changes on the transfer. A Metaobject subscription can fire only when the title field of a books metaobject changes, then use the metaobjectId variable to fetch that field.
Two constraints matter. Events remains in developer preview on the unstable API version, and topic coverage is still partial, so you will run webhooks alongside Events in the same file for anything unsupported. InventoryTransfer also requires the read_inventory_transfers scope.
Why it matters
For Plus merchants the significant topic is InventoryTransfer. Movement between locations is exactly the data an ERP or OMS needs, and the established pattern has been to subscribe to a broad inventory webhook, receive everything, and diff in the handler. That costs compute and latency, and it is a familiar source of duplicate or missed syncs at peak. Field level triggers let the integration subscribe to transfer status alone, usually the only event the downstream system acts on.
The definition topics matter for a different reason. Merchants running structured content, size guides, store locators, ingredient data, have had no clean way to react when the schema itself moves. A MetaobjectDefinition subscription tells content and PIM sync that the shape of the data changed, the failure mode that otherwise surfaces as a silent mapping break weeks later. The caveat stays preview status: do not migrate a production ERP integration onto this yet. If you are scoping an ERP or PIM integration now, design the subscription layer so it can be swapped once Events reaches a stable version.
Role-specific impact
- Marketers: little direct change today. Once stable, metaobject driven content and structured product data propagate to connected systems faster and with fewer stale records.
- Developers: move filtering into the subscription. List only the field paths you need, shape the payload with a custom query so the handler avoids a follow up Admin API call, and deduplicate on the shopify-webhook-id header. Child entities have no topic of their own, so their changes fire on the parent.
- Store admins: expect integration partners to request the read_inventory_transfers scope. Confirm it maps to a named project rather than approving it as routine.
Use-case example
Real-world scenario
A Plus merchant with eleven retail locations and a NetSuite backend syncs inventory transfers so store staff can see incoming stock. The integration subscribes to a broad inventory webhook and receives roughly 40,000 deliveries a week, of which fewer than 900 concern transfer status. The handler diffs every payload, which at peak pushed processing lag past fifteen minutes and produced visible discrepancies on store tablets. A trial subscription on InventoryTransfer, with one trigger on inventoryTransfer.status and a query returning id, name, status, and tags, delivers only relevant events. That removes about 98 percent of the volume and the diffing behind it.
Implementation checklist
- Set api_version to unstable in the events block of shopify.app.toml and treat it as a preview pilot, not a migration.
- Identify the single field change your downstream system reacts to. For most inventory integrations that is transfer status.
- Declare the subscription with narrow triggers rather than subscribing to the bare parent topic.
- Write a custom query returning everything the handler needs, avoiding a follow up Admin API call.
- Request the read_inventory_transfers scope, plus any scopes the definition topics require.
- Deduplicate on the shopify-webhook-id header and expect repeat deliveries.
- Run it in parallel with the existing webhook in a development store and record the delivery volume delta before proposing a cutover.
FAQ
Q: Can we move production ERP sync onto Events now?
A: No. Events is in developer preview with partial topic coverage. Run it in parallel to build the business case, and keep webhooks for anything unsupported.
Q: Do we need separate subscriptions for child entities such as transfer line items?
A: No. Changes to child entities raise a delivery on the parent topic, so subscribe to InventoryTransfer and use triggers such as inventoryTransfer.lineItems.
Resources
Shopify Events developer documentation
Need guidance? Talk to Makro.