Mastering Shopify Event Updates: New Payload Structure, Triggers, and Headers

Shopify’s latest event update reshapes payloads, refines trigger syntax, and removes two delivery headers. Learn what changed, who’s affected, and how to migrate your webhook subscriptions with clear code examples.

Mastering Shopify Event Updates: New Payload Structure, Triggers, and Headers
6 sections

Shopify developers, listen up! Starting today the Events API has a major facelift. The payload format, trigger definitions, and delivery headers have all been tweaked to give you clearer insight into what’s actually changing in your store’s data. In this post we break down each change, explain who needs to act, and give you ready‑to‑copy snippets so your apps keep humming without interruption.

What Changed in Event Payloads

The biggest headline is the new structure for the "fields_changed" property. Previously it was a flat array of strings, forcing you to parse each path to decide if something was added, updated, or removed. Now the payload groups those paths into three explicit arrays: "added", "updated", and "removed". This makes it trivial to react only to the exact change you care about.

Before:

{\n "topic": "Product",\n "action": "update",\n "fields_changed": [\n "product[id: 'gid://shopify/Product/123'].variants[id: 'gid://shopify/ProductVariant/456']"\n ]\n}

After:

{\n "topic": "Product",\n "action": "update",\n "fields_changed": {\n "added": [\n "product[id: 'gid://shopify/Product/123'].variants[id: 'gid://shopify/ProductVariant/456']"\n ],\n "updated": [],\n "removed": []\n }\n}

With this new shape you can safely read "fields_changed.added" to handle newly created variants, "fields_changed.updated" for price changes, and "fields_changed.removed" for deletions—no extra API calls needed.

Parent Triggers Use an Explicit Wildcard

The trigger syntax that tells Shopify which parts of a resource you want to listen to also got a tweak. When you want to capture *any* change under a parent path, you now must append a terminal ".*". Leaf‑level triggers (e.g., "product.variants.price") stay the same.

Old syntax:

triggers = [\n "product.variants",\n "product.options.optionValues.swatch"\n]

New syntax (required on your next deployment of shopify.app.toml):

triggers = [\n "product.variants.*",\n "product.options.optionValues.swatch.*"\n]

The change is purely syntactic—the matching behavior and event volume remain identical. However, if you keep the old form, the subscription will be ignored the next time Shopify validates your app’s config.

Delivery Header Cleanup

Two headers that were automatically sent with every webhook delivery—"shopify-event-id" and "shopify-resource-id"—have been retired. Most modern Shopify API libraries already ignore them, but if you have custom validation that checks these values you’ll need to drop that logic.

Action step: Upgrade to the latest version of your Shopify SDK (e.g., @shopify/shopify-api for Node, shopify_api for Ruby). The updated packages no longer expect those headers, and they will keep your webhook verification code working out of the box.

Triggers Are Now Mandatory for Update Actions

If you subscribe to an event with the "update" action, you must provide at least one trigger. Existing subscriptions that already include triggers continue to function, but any new "update" subscription without a trigger will be rejected during app registration.

Typical fix: add a wildcard trigger for the resource you care about, e.g. "orders.*" if you only need to know that an order changed, then inspect "fields_changed" to see the exact fields.

Actionable Migration Steps

  • Review your current webhook definitions – locate every "shopify.app.toml" (or equivalent) file and note the existing "triggers" arrays.
  • Update parent triggers – replace any entry that ends with a resource name (e.g., "product.variants") with the explicit wildcard version ("product.variants.*").
  • Adjust payload handling code – switch from reading a flat "fields_changed" array to the three‑bucket object. For example, in JavaScript:
  • const {added, updated, removed} = payload.fields_changed;\nif (added.length) { /* handle creations */ }\nif (updated.length) { /* handle updates */ }\nif (removed.length) { /* handle deletions */ }

  • Remove header dependencies – delete any code that reads "shopify-event-id" or "shopify-resource-id" from the request headers.
  • Upgrade SDKs – run the latest package manager command (e.g., npm install @shopify/shopify-api@latest) to get built‑in support for the new delivery format.
  • Test in a dev store – fire a test webhook from the Shopify admin, confirm the new payload shape, and verify your trigger logic reacts as expected.
  • Conclusion & Call to Action

    These changes may look like small syntax tweaks, but they unlock clearer event data and reduce the need for extra API calls. By updating your trigger definitions, payload parsing, and SDK versions today, you’ll keep your integrations stable and future‑proof. Got questions? Drop them in the Shopify Community post linked in the official changelog, or reach out in the #shopify‑dev Slack channel. Happy coding!

    Tags
    Sources

    Related Articles

    CurrentEntryChange Now Returns the Previous Page – What Developers Need to Know

    CurrentEntryChange Now Returns the Previous Page – What Developers Need to Know

    Starting with API version 2027-01, the Navigation API’s currententrychange event now reports the page a customer left instead of the page they navigated to. Learn how this breaking change impacts full‑page account extensions and how to update your code before the upgrade.

    October 31, 20263 min
    UI Extensions Can Now Host Unlimited Locale Files—No More 256 KB Ceiling

    UI Extensions Can Now Host Unlimited Locale Files—No More 256 KB Ceiling

    Shopify has removed the 256 KB combined size limit for UI extension locale files, letting developers add more languages without trimming translations. Learn what changed, who it affects, and how to expand your extensions instantly.

    October 30, 20264 min
    Trusted Vault Origin Signal Empowers Credit Card Payments in Shopify Payments Apps

    Trusted Vault Origin Signal Empowers Credit Card Payments in Shopify Payments Apps

    Shopify’s new trusted_vault_origin flag gives payment app developers a reliable way to handle missing CVV for vaulted cards. Learn what changed, who’s affected, and how to update your integration today.

    October 30, 20265 min
    Gift Card line_item_id Becomes Read‑Only in API 2027‑01 – What Developers Need to Know

    Gift Card line_item_id Becomes Read‑Only in API 2027‑01 – What Developers Need to Know

    Shopify’s REST Admin API 2027‑01 makes the Gift Card line_item_id field read‑only. Learn who is impacted, why it matters, and the exact steps to update your app before the upgrade.

    October 30, 20263 min