Event
Registers a Webflow webhook on the site at publish and starts one run per delivery, verified against Webflow's x-webflow-signature.
Start a run when a Webflow site event arrives (form submission, CMS item, site publish, ecommerce order).
Connection
- Required
- Yes — the node will not save without one
- Auth type
- Bearer token
- Providers
- Webflow
- Secret shape
- the Webflow token, or {"access_token", "client_secret"}
- Config it needs
- site_id
- Resolved by
- config.connection_id, else node.connection_id
- Note
- The token needs the site's webhook scopes (a Site API token created in Site settings has them). A Site token's webhook carries its own signing key, which Webflow returns once at creation; an OAuth Data Client token does not, and the app's 'client_secret' must be stored on the connection or publishing is refused, because nothing else can verify a delivery. Publishing also needs MANTLE_APP_PUBLIC_BASE_URL set to an https URL Webflow can reach.
Configuration
3 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 |
|---|---|---|---|---|---|
trigger_type Which Webflow event to subscribe to. One webhook is registered for exactly this type — add a second trigger node for a second type. | string | No | form_submission | one of "form_submission", "site_publish", "page_created", "page_metadata_updated", "page_deleted", "ecomm_new_order", "ecomm_order_changed", "ecomm_inventory_changed", "collection_item_created", "collection_item_changed", "collection_item_deleted", "collection_item_published", "collection_item_unpublished", "comment_created" | — |
site_id The site to register on. Leave empty to use the connection's site_id. | string | No | — | — | — |
form_name Only fire for this form's submissions (Webflow's own filter). Applies to form_submission and is refused on any other trigger type. | string | No | — | — | — |
Example configuration
Every value below is the contract’s own example or default — nothing invented.
{
"trigger_type": "form_submission"
}Output
One shape.
webflow event
A flat envelope with Webflow's own payload underneath. The payload's keys depend on the trigger type, so the shape is open below the declared fields.
Extra keys beyond the ones listed can appear.
| Field | Type | Example |
|---|---|---|
trigger_type The Webflow trigger that fired, e.g. form_submission. One webhook is one trigger type, so this is the type this node registered. | string | form_submission |
site_id The Webflow site the event came from, lifted out of the payload. | string | 62749158efef318abc8d5a0f |
id The id inside the payload — the form submission for form_submission, the CMS item for collection_item_*, empty where the event has none. It is the *resource* id, not a delivery id: two edits of one CMS item carry the same value, which is why it is not the idempotency key. | string | 659d1f4a5a1c9e0d7f2b4c31 |
sent_at When Webflow sent the delivery (from x-webflow-timestamp), as an ISO-8601 UTC string. Empty when the header is absent or unreadable. | string | 2024-05-30T12:00:00Z |
payload Webflow's own payload object, verbatim. Its keys depend on trigger_type — form fields for a submission, fieldData for a CMS item, the order for an ecommerce event. | object | — |
{
"id": "659d1f4a5a1c9e0d7f2b4c31",
"payload": {
"data": {
"Email": "ada@example.com",
"Name": "Ada Lovelace"
},
"formId": "659d1f4a5a1c9e0d7f2b4c30",
"id": "659d1f4a5a1c9e0d7f2b4c31",
"name": "Contact Form",
"siteId": "62749158efef318abc8d5a0f",
"submittedAt": "2024-05-30T12:00:00.000Z"
},
"sent_at": "2024-05-30T12:00:00Z",
"site_id": "62749158efef318abc8d5a0f",
"trigger_type": "form_submission"
}Notes
- Publishing registers the webhook at Webflow; unpublishing, disabling or archiving deletes it. A workflow that is off is off at Webflow too.
- Each delivery is verified against the HMAC-SHA256 of '{x-webflow-timestamp}:{body}' and refused outside a 5-minute window.
- One webhook is one trigger type at Webflow, and each Site-token webhook has its own signing key, so this node subscribes to exactly one type.
- Webflow allows 75 webhooks per trigger type per site, so publishing the 76th workflow on one trigger type is refused with Webflow's own message.
- A webhook created in the Webflow dashboard sends no signature headers at all; this node never adopts one, it registers (and signs) its own.
See Event run in a workflow.
In a technical demo we add the Webflow connection, drop the node on the canvas and let Workflow Health pre-flight it before the first real run.