booking.created, booking.rescheduled and booking.canceled.
All three carry the same booking object. The two change events add one field describing what changed.
The booking object
{
"booking": {
"id": "5e9c…",
"chatbot_id": 17,
"conversation_id": 8214,
"name": "Ada Lovelace",
"email": "[email protected]",
"event_label": "Intro call",
"provider": "native",
"external_uid": "abc123…",
"start_at": "2026-09-02T14:00:00.000Z",
"end_at": "2026-09-02T14:30:00.000Z",
"attendee_timezone": "Europe/Dublin",
"status": "confirmed",
"created_at": "2026-08-26T10:05:00.000Z",
"meet_url": "https://meet.google.com/…"
}
}| Field | Notes |
|---|---|
provider | native for our own scheduling on your Google Calendar, calcom for a Cal.com connection. |
external_uid | The Google event id, or the Cal.com booking uid. |
start_at / end_at | UTC. Use attendee_timezone to render the visitor's local time. |
meet_url | Present for native bookings with a Google Meet location; null otherwise. |
status | confirmed or canceled. |
booking.created
Fires when a meeting is booked, whether the visitor picked a slot from the booking card or asked the agent to book it in conversation.
booking.rescheduled
Adds the previous start so you can update an existing record rather than guess:
{
"booking": { "…": "…" },
"previous_start_at": "2026-09-01T09:00:00.000Z"
}The id does not change on a reschedule — it is the same booking at a new time.
booking.canceled
Adds the reason, when one was given:
{
"booking": { "…": "…" },
"cancel_reason": "Something came up"
}cancel_reason is null when the booking was cancelled without one. The booking object's status reads canceled.
For native bookings we already email the visitor a confirmation, a reschedule notice, a cancellation and 24-hour and 1-hour reminders. You do not need a webhook to cover that — use these events for your systems, not for the visitor's messages.