# Booking events

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

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

---

All three events 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. The `id` does not change on a reschedule.

```json
{
  "booking": { "…": "…" },
  "previous_start_at": "2026-09-01T09:00:00.000Z"
}
```

## `booking.canceled`

Adds the reason, when one was given. `cancel_reason` is `null` when the booking was cancelled without one, and the booking object's `status` reads `canceled`.

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

<Callout>
  For native bookings we already email the visitor a confirmation, a reschedule notice, a cancellation and 24-hour and 1-hour reminders. Use these events for your systems, not for the visitor's messages.
</Callout>

<NextSteps>
  <IconCard icon="webhook" title="Webhooks overview" href="/docs/developer-guide/webhooks" description="The envelope, the headers and every event." />

  <IconCard icon="key-round" title="Verifying signatures" href="/docs/developer-guide/webhooks/signature" description="Check the HMAC before you act on a delivery." />
</NextSteps>
