Event
Registers a webhook in the tenant's ActiveCampaign account on publish and starts one run per delivery, verified against an HMAC-SHA256 signing header.
Start a run when ActiveCampaign raises an event (contact subscribed, tag added, deal updated…).
Connection
- Required
- Yes — the node will not save without one
- Auth type
- API key
- Providers
- ActiveCampaign
- Secret shape
- the ActiveCampaign API key (Api-Token)
- Config it needs
- account
- Resolved by
- config.connection_id, else node.connection_id
- Note
- The API key needs access to the webhooks endpoints; a key that can read contacts can still fail to publish. Publishing also needs MANTLE_APP_PUBLIC_BASE_URL set to an https URL on port 443 — ActiveCampaign only delivers to 443 on https.
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 |
|---|---|---|---|---|---|
events Which ActiveCampaign events to subscribe to. One webhook carries all of them, so adding an event does not create a second subscription — but every one of them starts a run, so branch on `type` downstream. | array | No | ["subscribe"] | 1–25 characters; array of string | — |
sources Who has to have caused the action for the webhook to fire: public (a contact), admin (one of your users), api (an API call) or system (an automation). All four by default — narrowing this is how a webhook quietly stops seeing half its events. | array | No | ["public","admin","api","system"] | 1–4 characters; array of string | — |
list_id Restrict the webhook to one contact list, by its numeric id. Leave empty for the whole account; deal and account events ignore it. | number | No | — | ≥ 1 | — |
Example configuration
Every value below is the contract’s own example or default — nothing invented.
{
"events": [
"subscribe"
],
"sources": [
"public",
"admin",
"api",
"system"
]
}Output
One shape.
activecampaign event
The flattened event. `payload` mirrors ActiveCampaign's own form parameters, whose keys depend on the event type, so the shape is open below the declared fields.
Extra keys beyond the ones listed can appear.
| Field | Type | Example |
|---|---|---|
type The ActiveCampaign event name, e.g. subscribe or deal_update. Branch on this when the trigger subscribes to more than one event. | string | subscribe |
date_time When ActiveCampaign ran the webhook, in the account's own format. Part of the idempotency key, so a duplicate delivery of one event reuses it. | string | 2026-09-10 09:14:22 |
initiated_from Who caused the action: system, public or admin. This is the 'source' the subscription filters on, echoed back on the event. | string | public |
initiated_by The part of ActiveCampaign that raised it — a form, an automation, an API call. Free text from the vendor, useful for logging, not for branching. | string | subscription form |
list_id The list the event belongs to, as a string. '0' on events that are not about a list at all (every deal and account event). | string | 3 |
contact_id The contact this event is about, lifted out of contact[id]. Empty on deal, account and list events. | string | 1842 |
contact_email That contact's email address, lifted out of contact[email]. Empty when the event carries no contact. | string | buyer@example.com |
deal_id The deal this event is about, lifted out of deal[id]. Empty on every event that is not a deal_* event. | string | — |
account_id The CRM account this event is about, lifted out of account[id]. Empty on every event that is not an account_* event. | string | — |
payload The whole delivery, decoded from ActiveCampaign's form-encoded POST parameters into a nested object — contact[fields][7] reads as payload.contact.fields.7. Every value is a string, because that is what was on the wire. | object | — |
{
"account_id": "",
"contact_email": "buyer@example.com",
"contact_id": "1842",
"date_time": "2026-09-10 09:14:22",
"deal_id": "",
"initiated_by": "subscription form",
"initiated_from": "public",
"list_id": "3",
"payload": {
"contact": {
"email": "buyer@example.com",
"first_name": "Ada",
"id": "1842",
"last_name": "Lovelace",
"tags": "vip, newsletter"
},
"date_time": "2026-09-10 09:14:22",
"initiated_by": "subscription form",
"initiated_from": "public",
"list": "3",
"type": "subscribe"
},
"type": "subscribe"
}Notes
- Publishing creates the webhook in ActiveCampaign; unpublishing, disabling or archiving deletes it, so a workflow that is off is off at the vendor too.
- Every delivery is verified against an HMAC-SHA256 signature ActiveCampaign computes from a secret Mantle mints at registration and sends in the X-Mantle-Signature header; an unsigned or mis-signed POST is refused with 401.
- ActiveCampaign never retries a delivery, and deactivates a webhook whose endpoint answers HTTP 410. It also guarantees only 'at least once' delivery, so a duplicate is possible — one run per event is enforced on the payload.
- Deliveries arrive as form parameters, not JSON: payload.contact.fields.7 is how ActiveCampaign's contact[fields][7] reads once decoded, and every value is a string.
Related ActiveCampaign nodes
See Event run in a workflow.
In a technical demo we add the ActiveCampaign connection, drop the node on the canvas and let Workflow Health pre-flight it before the first real run.