Events and payloads
The nine active workspace events, their public JSON envelope and the fields to use in your integration.
Available events
| Event | Meaning |
|---|---|
lead.captured | A lead with contact details was saved. It may not have a booking. |
lead.abandoned | An eligible captured form inquiry timed out without booking. |
lead.converted | A previously abandoned lead later booked. |
booking.created | A booking was created; it can still require guest confirmation. |
booking.rescheduled | A booking was moved. |
booking.cancelled | A booking was cancelled. |
booking.confirmed_by_invitee | The guest explicitly confirmed a booking requiring confirmation. |
booking.expired | An unconfirmed booking expired. |
booking.completed | The scheduled appointment ended. This does not establish attendance or an outcome. |
lead.disqualified and booking.no_show are reserved and cannot currently be selected.
Abandoned-form capture applies only to eligible Form and calendar links with capture enabled. Calendar-first and headless leads do not produce lead.abandoned. A lead saved because the Free booking limit blocked a booking is not an abandoned-form event. If contact capture happens with a booking, lead.captured is created before booking.created.
Public envelope
The public webhook is an immutable event snapshot, not an internal database event. Its outer field names use snake case; nested lead and booking fields use the names shown below. Do not change their casing when mapping them.
| Field | Meaning |
|---|---|
event_id | Stable identity of this event; deduplicate on this signed body field. |
type | One of the nine active event names. |
created_at | UTC timestamp of the event, not the current delivery attempt. |
data.actor | invitee, host or system. |
data.schema_version | Public event schema version, currently 1. |
data.workspace_id | Workspace that owns the event. |
data.form_version | Version of the form represented by the snapshot. |
data.consent | Boolean follow-up consent at event time. It is not tracking or reminder consent. |
data.lead | Lead identifiers and available contact/status fields. |
data.booking | Booking snapshot when present; required for booking events. |
data.answers | Form answers keyed by question identifier. |
data.attribution | Captured campaign and source fields. |
data.test | true on a synthetic test event; normally absent. |
Example booking event
The following is an illustrative payload with invented identifiers and contact details. The ID strings are examples, not values to use in API calls.
{
"event_id": "ev_example",
"type": "booking.created",
"created_at": "2026-11-04T10:00:00.000Z",
"data": {
"actor": "invitee",
"schema_version": 1,
"workspace_id": "ws_example",
"form_version": 1,
"consent": false,
"lead": {
"id": "lead_example",
"workspaceId": "ws_example",
"funnelId": "funnel_example",
"name": "Alex Example",
"email": "alex@example.com",
"phone": null,
"status": "booked",
"createdAt": "2026-11-04T10:00:00.000Z"
},
"booking": {
"id": "booking_example",
"workspaceId": "ws_example",
"funnelId": "funnel_example",
"hostId": "host_example",
"leadId": "lead_example",
"start": "2026-11-10T09:00:00.000Z",
"end": "2026-11-10T09:30:00.000Z",
"timeZone": "Europe/Vienna",
"inviteeTimeZone": "Europe/London",
"status": "confirmed"
},
"answers": { "topic": "First consultation" },
"attribution": { "utm_source": "newsletter", "utm_campaign": "november" }
}
}For a lead-only event, data.booking may be absent. Contact fields and timestamps can be omitted when unavailable; phone and team references can be null. Use the WebhookEvent schema for the full contract. Do not interpret absent fields as instructions to erase CRM data.
Important boundaries
Payloads do not contain booking action tokens, reschedule/cancellation links or Google Meet links. Retrieve current booking details through the API with the appropriate scopes if needed.
A snapshot's consent must not be replaced with a guess from its status or from today's contact row. Do not automatically message an abandoned lead with data.consent=false.
Test events must not create real contacts, deals or outbound messages. Retry/replay preserves the event ID and body; follow delivery and ordering rules before treating multiple events as a strict timeline.