Booking Event

trigger.cal_booking
TriggerBusiness appsconnection requiredruns in-engine

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.

FieldTypeRequiredDefaultConstraintsExample
triggers
Cal.com trigger names to subscribe to. The booking events are listed first; any name Cal.com accepts may be used.
arrayNo["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.

FieldTypeExample
trigger_event
Which Cal.com event arrived, e.g. BOOKING_CREATED. Branch on this when the trigger subscribes to more than one.
stringBOOKING_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.
string2026-08-13T08:59:12.000Z
booking_uid
The booking's uid — what every other node in this family takes as booking_uid.
string2NtaeaVcKfpmSZ4CthFdfk
booking_id
The booking's numeric id. Cal.com's REST paths use the uid, not this.
number100
title
The booking title Cal.com generated.
string—
status
The booking's status at the moment of the event, e.g. ACCEPTED or CANCELLED.
stringACCEPTED
start_time
When the booking starts, ISO-8601.
string2026-08-13T09:00:00Z
end_time
When the booking ends, ISO-8601.
string—
event_type_id
Numeric id of the event type booked.
number100
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.
stringjohn.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.