Events

Reservation events

reservation.requested, reservation.created, reservation.updated and reservation.canceled.

Reservations are tables, appointments and booking requests your agent takes for a venue — a separate module from meeting bookings, which live on a Google Calendar. All four events carry the same reservation object; reservation.updated adds a change field saying what happened.

The reservation object

{
  "reservation": {
    "id": "0f4d2c2e-8a1b-4c3d-9e5f-6a7b8c9d0e1f",
    "chatbot_id": 17,
    "conversation_id": 8214,
    "customer_id": 42,
    "status": "confirmed",
    "service_id": 3,
    "service_name": "Dinner",
    "resource_id": 5,
    "resource_name": "Dining room",
    "start_at": "2026-10-02T18:00:00.000Z",
    "end_at": "2026-10-02T20:00:00.000Z",
    "party_size": 4,
    "name": "Ada Lovelace",
    "email": "[email protected]",
    "phone": null,
    "answers": { "occasion": "Birthday" },
    "notes": "Window table if possible",
    "source": "card",
    "channel": null,
    "language": "en",
    "attendee_timezone": "Europe/Dublin",
    "cancel_reason": null,
    "cancelled_by": null,
    "decline_reason": null,
    "reschedule_count": 0,
    "created_at": "2026-09-26T10:05:00.000Z",
    "updated_at": "2026-09-26T10:05:00.000Z"
  }
}
FieldNotes
idA UUID, stable for the life of the reservation — a move or a status change never mints a new one.
statusrequested, confirmed, arrived, completed, no_show, cancelled or declined.
start_at / end_atUTC. Use attendee_timezone to render the guest's local time; the venue's own zone is in its settings.
party_sizePeople, for tables. 1 for an appointment.
answersThe service's custom questions, keyed by question id.
sourceagent (booked in conversation), card (the widget's card), manual (the calendar), manage (the guest's manage link), api, channel (Telegram and the like).
cancelled_bycustomer, staff or system on a cancelled reservation.

reservation.requested

Fires when a reservation lands as a request — the service needs manual approval, or the party is over the online limit. The time is held on the calendar until the team answers; nothing is confirmed yet.

reservation.created

Fires when a reservation is confirmed on the spot.

reservation.updated

One event for every change to a live reservation. change says which, and the previous value rides beside it so you can update a record rather than guess:

{
  "reservation": { "…": "…" },
  "change": "rescheduled",
  "previous_start_at": "2026-10-01T18:00:00.000Z"
}
changeExtra fieldMeaning
approvedprevious_status: "requested"The team approved a request; status is now confirmed.
declinedprevious_status: "requested"The team declined a request; reservation.decline_reason may say why.
rescheduledprevious_start_atThe reservation moved. reschedule_count is bumped.
statusprevious_statusA desk action: the guest arrived, the visit completed, or a no-show was marked.

reservation.canceled

Adds the reason, when one was given. reservation.cancelled_by says whether the guest, the team or the system cancelled:

{
  "reservation": { "…": "…" },
  "cancel_reason": "Change of plans."
}