Deploy Event
Creates one outgoing webhook per event on the Netlify site at publish and starts one run per delivery, verified against Netlify's JWS signature.
Start a run when a Netlify site starts, finishes or fails a deploy — or on any other event Netlify's outgoing webhooks publish.
Connection
- Required
- Yes — the node will not save without one
- Auth type
- Bearer token
- Providers
- Netlify
- Secret shape
- the Netlify personal access token
- Resolved by
- config.connection_id, else node.connection_id
- Note
- The token must be able to administer the site's notification hooks — a token for an account that only collaborates on the site can read deploys and still fail to publish. Publishing also needs MANTLE_APP_PUBLIC_BASE_URL set to an https URL Netlify can reach.
Configuration
2 fields, 1 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 |
|---|---|---|---|---|---|
site_id The Site ID to watch — from the site's Configuration → General panel in Netlify, not the site's URL. | string | Yes | — | matches ^[A-Za-z0-9][A-Za-z0-9._-]{2,}$ | 0d3a9d2f-ef94-4380-93df-27ee400e2048 |
events Netlify events to subscribe to; one webhook is created per event. Any event name Netlify accepts works, not only the ones listed — and each event that fires starts a run. | array | No | ["deploy_created"] | 1–16 characters; array of string | — |
Example configuration
Every value below is the contract’s own example or default — nothing invented.
{
"events": [
"deploy_created"
],
"site_id": "0d3a9d2f-ef94-4380-93df-27ee400e2048"
}Output
One shape.
netlify event
The flattened notification. `payload` is Netlify's own body, whose keys differ between a deploy and a form submission, so the shape is open below the declared fields.
Extra keys beyond the ones listed can appear.
| Field | Type | Example |
|---|---|---|
event The Netlify event that fired (X-Netlify-Event), e.g. deploy_created. Branch on this when the trigger subscribes to more than one. | string | deploy_created |
deploy_id Netlify's id for the deploy. Half of the idempotency key — one deploy raises building, created and failed under the same id, so the event name is the other half. Empty for a non-deploy event. | string | 5b78192ac9659217dbf7c9aa |
site_id The site the deploy belongs to. | string | 573f11b2-f5f3-481f-a1f8-85feb457ff49 |
site_name The site's Netlify name (its subdomain), which is what the dashboard shows. | string | objective-jepsen-35fbb2 |
state The deploy's own state: building, ready, error, enqueued… `ready` is a finished deploy, whatever event delivered it. | string | ready |
context production, deploy-preview or branch-deploy. Check it before treating a deploy as live — a preview fires the same events. | string | production |
branch The branch that was built. | string | main |
commit_ref The commit SHA the deploy was built from, where there is one. | string | — |
title The deploy's title (the commit subject), when Netlify sent one. | string | — |
error_message Why the deploy failed. Empty on every event but a failure. | string | — |
deploy_url The permalink to this specific deploy (its https URL where there is one). | string | https://5b78192ac9659217dbf7c9aa--objective-jepsen-35fbb2.netlify.app |
site_url The site's own URL, which points at whatever deploy is published. | string | https://objective-jepsen-35fbb2.netlify.app |
admin_url The site's page in the Netlify dashboard. | string | — |
created_at When the deploy was created, as Netlify's ISO-8601 UTC string. | string | 2024-05-30T12:00:00.315Z |
published_at When it went live, where it has. Empty for a deploy that never published. | string | — |
payload Netlify's body exactly as it arrived — the whole deploy object, or the form submission for submission_created. | object | — |
{
"admin_url": "https://app.netlify.com/sites/objective-jepsen-35fbb2",
"branch": "main",
"commit_ref": "9f1c0e5b2d3a4c6e8f0a1b2c3d4e5f60718293a4",
"context": "production",
"created_at": "2024-05-30T12:00:00.315Z",
"deploy_id": "5b78192ac9659217dbf7c9aa",
"deploy_url": "https://5b78192ac9659217dbf7c9aa--objective-jepsen-35fbb2.netlify.app",
"error_message": "",
"event": "deploy_created",
"payload": {
"build_id": "5b78192ac9659217dbf7c9ab",
"deploy_time": 3,
"id": "5b78192ac9659217dbf7c9aa",
"site_id": "573f11b2-f5f3-481f-a1f8-85feb457ff49",
"state": "ready"
},
"published_at": "2024-05-30T12:00:04.462Z",
"site_id": "573f11b2-f5f3-481f-a1f8-85feb457ff49",
"site_name": "objective-jepsen-35fbb2",
"site_url": "https://objective-jepsen-35fbb2.netlify.app",
"state": "ready",
"title": ""
}Notes
- Publishing creates one webhook per event on the site; unpublishing, disabling or archiving deletes them. A workflow that is off is off at Netlify too.
- Each delivery is verified against Netlify's JWS (X-Webhook-Signature): the HS256 signature first, then the token's sha256 claim against the raw body.
- Deploy previews and branch deploys raise the same events as production — check `context` before treating a deploy as live.
- One deploy fires several events (building, then created or failed) with one deploy id, so the run is deduped on event + deploy id, not the id alone.
- Netlify deletes a webhook that answers 410 Gone. Mantle's ingress answers 404 for a retired row, so a hook left behind by a failed unpublish keeps delivering into nothing until it is removed by hand.
Related Netlify nodes
See Deploy Event run in a workflow.
In a technical demo we add the Netlify connection, drop the node on the canvas and let Workflow Health pre-flight it before the first real run.