# Booking events

> booking.created, booking.rescheduled and booking.canceled.

Source: https://www.hey.support/docs/webhooks/events/booking

---

All three carry the same `booking` object. The two change events add one field describing what changed.

## The booking object

```json
{
  "booking": {
    "id": "5e9c…",
    "chatbot_id": 17,
    "conversation_id": 8214,
    "name": "Ada Lovelace",
    "email": "ada@example.com",
    "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:

```json
{
  "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:

```json
{
  "booking": { "…": "…" },
  "cancel_reason": "Something came up"
}
```

`cancel_reason` is `null` when the booking was cancelled without one. The booking object's `status` reads `canceled`.

<Callout>
  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.
</Callout>
