Event
Registers a webhook in the tenant's Brevo account on publish and starts one run per delivered event. Emits {event, email, message_id, date, ts_event, payload}.
Start a run when Brevo reports an email event (delivered, bounced, opened, unsubscribed…).
Connection
- Required
- Yes — the node will not save without one
- Auth type
- API key
- Providers
- Brevo
- Secret shape
- the Brevo v3 API key
- Resolved by
- config.connection_id, else node.connection_id
- Note
- The key needs webhook write access. Publishing also needs MANTLE_APP_PUBLIC_BASE_URL set to a URL Brevo can reach — it is the address the webhook is created against.
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 |
|---|---|---|---|---|---|
webhook_type Which stream to subscribe to: transactional covers messages sent through the API, marketing covers campaigns and contact-list changes. They are separate webhooks at Brevo and accept different event names. | string | No | transactional | one of "transactional", "marketing" | — |
events Which Brevo events start a run. Every chosen event lives on one webhook, which is deleted again when the workflow is unpublished or disabled. The names a transactional webhook accepts are not the same as a marketing one's. | array | No | ["delivered"] | 1–16 characters; array of string | — |
Example configuration
Every value below is the contract’s own example or default — nothing invented.
{
"events": [
"delivered"
],
"webhook_type": "transactional"
}Output
One shape.
brevo event
A flat envelope over Brevo's event body. Which extra keys `payload` carries depends on the event — a click has `link`, a bounce has `reason`, a marketing event has `camp_id`.
| Field | Type | Example |
|---|---|---|
event The Brevo event name, e.g. delivered, hardBounce, opened, listAddition. Branch on this when the trigger subscribes to more than one. | string | delivered |
email The contact the event is about. | string | buyer@example.com |
message_id Brevo's internal message id. The same value appears on every event for one message, so it joins a bounce back to the send that caused it — but it does not identify the event. | string | <201798300811.5787683@relay.domain.com> |
webhook_id Brevo's `id` field, which is the id of the webhook itself and is the same on every delivery to this URL. Present for support tickets, not for deduplication. | string | 12345 |
date When Brevo raised the event, in the account's CET/CEST wall clock, as Brevo formats it. Use ts_event when you need an unambiguous instant. | string | 2026-09-01 09:15:04 |
ts_event The same instant as a UTC epoch-seconds timestamp, or null when Brevo sent neither ts_event nor ts. | number | 1788253904 |
payload Brevo's event body exactly as it arrived, for the per-event keys the fields above do not lift out (subject, tags, link, reason, camp_id…). | object | — |
{
"date": "2026-09-01 09:15:04",
"email": "buyer@example.com",
"event": "delivered",
"message_id": "<201798300811.5787683@relay.domain.com>",
"payload": {
"date": "2026-09-01 09:15:04",
"email": "buyer@example.com",
"event": "delivered",
"id": 12345,
"message-id": "<201798300811.5787683@relay.domain.com>",
"subject": "Your receipt",
"tags": [
"receipts"
],
"ts_event": 1788253904
},
"ts_event": 1788253904,
"webhook_id": "12345"
}Notes
- Publishing creates the webhook in Brevo; unpublishing, disabling or archiving deletes it. A workflow that is off is off at Brevo too.
- Brevo does not sign its deliveries. This trigger registers a random token as a custom header on the webhook and refuses any delivery that does not carry it, so the callback URL alone is not enough to start a run.
- Because Brevo sends no event id, a redelivery is recognised by the event body itself; two events that differ only in when they happened are told apart by Brevo's own ts_event.
- An account may hold at most 40 marketing and transactional webhooks in total; this trigger uses one per published workflow.
See Event run in a workflow.
In a technical demo we add the Brevo connection, drop the node on the canvas and let Workflow Health pre-flight it before the first real run.