Deploy Event

trigger.netlify_event
TriggerBusiness appsconnection requiredruns in-engine

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.

FieldTypeRequiredDefaultConstraintsExample
site_id
The Site ID to watch — from the site's Configuration → General panel in Netlify, not the site's URL.
stringYes—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.
arrayNo["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.

FieldTypeExample
event
The Netlify event that fired (X-Netlify-Event), e.g. deploy_created. Branch on this when the trigger subscribes to more than one.
stringdeploy_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.
string5b78192ac9659217dbf7c9aa
site_id
The site the deploy belongs to.
string573f11b2-f5f3-481f-a1f8-85feb457ff49
site_name
The site's Netlify name (its subdomain), which is what the dashboard shows.
stringobjective-jepsen-35fbb2
state
The deploy's own state: building, ready, error, enqueued… `ready` is a finished deploy, whatever event delivered it.
stringready
context
production, deploy-preview or branch-deploy. Check it before treating a deploy as live — a preview fires the same events.
stringproduction
branch
The branch that was built.
stringmain
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).
stringhttps://5b78192ac9659217dbf7c9aa--objective-jepsen-35fbb2.netlify.app
site_url
The site's own URL, which points at whatever deploy is published.
stringhttps://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.
string2024-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.

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.