Event
Registers a Shopify Admin API webhook per topic at publish and starts one run per delivery. Emits {topic, shop_domain, webhook_id, id, payload}.
Start a run when a Shopify store event arrives (order, product, customer).
Connection
- Required
- Yes — the node will not save without one
- Auth type
- API key
- Providers
- Shopify
- Secret shape
- {"access_token", "api_secret_key"}
- Config it needs
- shop
- Resolved by
- config.connection_id, else node.connection_id
- Note
- Two credentials, and they are not interchangeable: the Admin API access token creates and deletes the subscriptions, and the app's API secret key is what signs every delivery. Publishing needs MANTLE_APP_PUBLIC_BASE_URL set — it is the address Shopify calls back on.
Configuration
2 fields, none required. A dotted path is a nested object and name[] an array of objects — the editor renders the same tree.
| Field | Type | Required | Default | Constraints | Example |
|---|---|---|---|---|---|
topics Which events to subscribe to. One Shopify webhook is registered per topic and deleted again when the workflow is unpublished or disabled. | array | No | ["orders/create"] | ≥ 1 characters; array of string | — |
api_version Admin API version to register against. Leave blank unless you need to pin one; Shopify serves a retired version from the oldest supported. | string | No | 2025-10 | matches ^(\d{4}-\d{2}|unstable)$ | — |
Example configuration
Every value below is the contract’s own example or default — nothing invented.
{
"api_version": "2025-10",
"topics": [
"orders/create"
]
}Output
One shape.
shopify event
A flat envelope taken from Shopify's headers, with the resource body under `payload`. `payload` keys are whatever the topic returns.
Extra keys beyond the ones listed can appear.
| Field | Type | Example |
|---|---|---|
topic The Shopify topic, e.g. orders/create. | string | orders/create |
shop_domain The store that sent it, e.g. your-store.myshopify.com. | string | your-store.myshopify.com |
webhook_id Shopify's delivery id. The idempotency key — a retry reuses it. | string | b54557e4-bdd9-4b37-8a5f-bf7d70bcd043 |
api_version Admin API version that produced the payload. | string | — |
triggered_at When Shopify raised the event (ISO 8601). | string | — |
id The resource id lifted out of the payload (order, product or customer), as a string so a 64-bit id survives. | string | 820982911946154508 |
payload Shopify's own resource body, verbatim — an Order for orders/*, a Product for products/*, a Customer for customers/*, the Shop for app/uninstalled. | object | — |
{
"api_version": "",
"id": "820982911946154508",
"payload": {},
"shop_domain": "your-store.myshopify.com",
"topic": "orders/create",
"triggered_at": "",
"webhook_id": "b54557e4-bdd9-4b37-8a5f-bf7d70bcd043"
}Notes
- One run per delivery, idempotent on X-Shopify-Webhook-Id — Shopify retries a failed delivery ~8 times over ~4 hours and a retry cannot start a second run.
- Deliveries are verified against the app's API secret key before any run starts; an unsigned or mis-signed POST is refused with 401.
- The subscriptions are deleted at Shopify when the workflow is unpublished, disabled or archived, so a store never keeps delivering to a dead workflow.
See Event run in a workflow.
In a technical demo we add the Shopify connection, drop the node on the canvas and let Workflow Health pre-flight it before the first real run.