Booking Event
Creates a webhook in the tenant's own Cal.com account on publish and starts one run per delivery, verified against Cal.com's HMAC signature.
Start a run when Cal.com raises a booking event — created, rescheduled, cancelled, confirmed, or a meeting starting or ending.
Connection
- Required
- Yes — the node will not save without one
- Auth type
- API key
- Providers
- Cal.com
- Secret shape
- the Cal.com API key (cal_live_… / cal_test_…)
- Config it needs
- base_url
- Resolved by
- config.connection_id, else node.connection_id
- Note
- Publishing needs MANTLE_APP_PUBLIC_BASE_URL set to a URL Cal.com can reach. Cal.com's cloud accepts https only and refuses private or loopback addresses; a self-hosted instance also accepts http.
Configuration
1 field, 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 |
|---|---|---|---|---|---|
triggers Cal.com trigger names to subscribe to. The booking events are listed first; any name Cal.com accepts may be used. | array | No | ["BOOKING_CREATED"] | 1–28 characters; array of string | — |
Example configuration
Every value below is the contract’s own example or default — nothing invented.
{
"triggers": [
"BOOKING_CREATED"
]
}Output
One shape.
cal.com booking event
The flattened Cal.com delivery. The payload object's own keys vary by trigger_event, so the shape is open below the declared fields.
Extra keys beyond the ones listed can appear.
| Field | Type | Example |
|---|---|---|
trigger_event Which Cal.com event arrived, e.g. BOOKING_CREATED. Branch on this when the trigger subscribes to more than one. | string | BOOKING_CREATED |
created_at When Cal.com raised the event, ISO-8601 UTC. Part of the idempotency key, so a redelivery joins the run it already started. | string | 2026-08-13T08:59:12.000Z |
booking_uid The booking's uid — what every other node in this family takes as booking_uid. | string | 2NtaeaVcKfpmSZ4CthFdfk |
booking_id The booking's numeric id. Cal.com's REST paths use the uid, not this. | number | 100 |
title The booking title Cal.com generated. | string | — |
status The booking's status at the moment of the event, e.g. ACCEPTED or CANCELLED. | string | ACCEPTED |
start_time When the booking starts, ISO-8601. | string | 2026-08-13T09:00:00Z |
end_time When the booking ends, ISO-8601. | string | — |
event_type_id Numeric id of the event type booked. | number | 100 |
event_type_slug Slug of the event type booked. | string | — |
organizer_name Name of the host the booking is with. | string | — |
organizer_email Email address of that host. | string | — |
attendee_name Name of the first attendee — the booker, on a normal booking. | string | — |
attendee_email Email address of that first attendee. | string | john.doe@example.com |
attendees Every attendee on the payload. For a seated event type this is only the seat that raised the event, not the whole booking. | array | — |
meeting_url The video-call URL, when Cal.com generated one; empty otherwise. | string | — |
cancellation_reason Why the booking was cancelled, on BOOKING_CANCELLED. Empty elsewhere. | string | — |
reschedule_uid The uid to reschedule against, when Cal.com supplied one. | string | — |
payload Cal.com's payload object verbatim, for anything the fields above do not lift out. | object | — |
{
"attendee_email": "john.doe@example.com",
"attendee_name": "John Doe",
"attendees": [
{
"email": "john.doe@example.com",
"name": "John Doe",
"timeZone": "UTC"
}
],
"booking_id": 100,
"booking_uid": "2NtaeaVcKfpmSZ4CthFdfk",
"cancellation_reason": "",
"created_at": "2026-08-13T08:59:12.000Z",
"end_time": "2026-08-13T09:15:00Z",
"event_type_id": 100,
"event_type_slug": "intro-call",
"meeting_url": "https://app.cal.com/video/2NtaeaVcKfpmSZ4CthFdfk",
"organizer_email": "alice@example.com",
"organizer_name": "Alice",
"payload": {
"bookingId": 100,
"uid": "2NtaeaVcKfpmSZ4CthFdfk"
},
"reschedule_uid": "",
"start_time": "2026-08-13T09:00:00Z",
"status": "ACCEPTED",
"title": "Intro call between Alice and John Doe",
"trigger_event": "BOOKING_CREATED"
}Notes
- Publishing creates the webhook in Cal.com; unpublishing, disabling or archiving deletes it. A workflow that is off is off at Cal.com too.
- Cal.com does not mint a signing secret, so Mantle generates one at registration and verifies every delivery's x-cal-signature-256 against it.
- The idempotency key is trigger event + booking uid + Cal.com's createdAt, so a redelivery joins the run it already started.
See Booking Event run in a workflow.
In a technical demo we add the Cal.com connection, drop the node on the canvas and let Workflow Health pre-flight it before the first real run.