Booking payloads
Trigger list responses contain these objects inside data. Webhook deliveries send a single booking object directly as the JSON body, without a data wrapper or event envelope.
Shared fields
These fields are present in all three booking payload shapes.
| Field | Type | Description |
|---|---|---|
booking_id | string | Booking ID. The same ID is used across creation, cancellation, and rescheduling. |
booking_page_id | string | ID of the page where the booking was made. |
booking_page_name | string or null | Page name. |
booking_page_slug | string or null | Page slug. |
assigned_user_id | string or null | Assigned host's user ID. |
assigned_user_name | string or null | Assigned host's profile name. |
assigned_user_email | string or null | Assigned host's account email. |
guest_fullname | string | Guest's full name. |
guest_email | string or null | Guest's email. |
language | string | Booking language, for example en or fr. |
start_datetime | string or null | Appointment start, normalized to ISO 8601 UTC. Null if the stored start cannot be parsed. |
end_datetime | string or null | Start plus duration minutes, normalized to ISO 8601 UTC. Null if the start cannot be parsed. |
duration | number | Appointment duration in minutes. |
status | string | Booking status. Trigger lists filter to booked, cancelled, or rescheduled. |
created_at | string | Record creation timestamp. |
updated_at | string or null | Record's last update timestamp. |
answer_<question_id> | string | Dynamic answer field, when an answer snapshot exists. See custom answers. |
New booking & rescheduling fields
These fields appear in new booking and rescheduling payloads. Cancellation payloads omit them.
| Field | Type | Description |
|---|---|---|
approval_status | string or null | Stored approval state, for example approved, or null when unset. |
meeting_option_type | string or null | Meeting type, such as video, in_person, custom, or phone. |
meeting_option_provider | string or null | Video provider when the type is video; otherwise null. |
meeting_option_url | string or null | Video meeting URL when the type is video; otherwise null. |
meeting_option_location | string or null | Location when the type is in_person; otherwise null. |
meeting_option_instructions | string or null | Instructions when the type is custom; otherwise null. |
meeting_option_phone | string or null | Phone value when the type is phone; otherwise null. |
The date field is a UTC date string in YYYY-MM-DD format (or null for an invalid start). It appears only in new booking payloads. Rescheduling and cancellation payloads omit it. Convert start_datetime to the desired time zone when displaying an appointment's local date.
Cancellation fields
These fields appear only in cancellation payloads.
| Field | Type | Description |
|---|---|---|
cancelled_at | string or null | Cancellation timestamp, when recorded. |
cancellation_reason | string or null | Cancellation reason, when supplied. |
cancelled_by | string or null | Recorded cancellation actor, for example guest. |
Compare event shapes
| Field group | Created | Rescheduled | Cancelled |
|---|---|---|---|
| Shared booking fields | Included | Included | Included |
date | Included | Omitted | Omitted |
| Approval & meeting fields | Included | Included | Omitted |
| Cancellation fields | Omitted | Omitted | Included |
| Custom answer fields | When stored | When stored | When stored |
The rescheduling object contains current values. It does not contain previous start times, previous durations, or a list of changed fields.
Custom answers
Answers are flattened into top-level keys using the question's ID:
{
"answer_44444444-4444-4444-8444-444444444444": "A new project",
"answer_77777777-7777-4777-8777-777777777777": "Design, Development"
}- A string answer is returned unchanged.
- A list answer is flattened into a comma-and-space separated string; only string elements are included.
- A stored answer snapshot with an unsupported or empty answer value produces an empty string.
- If there is no answer snapshot for a question, its field is omitted. Do not assume every configured question has an answer field.
Use the questions array from booking pages to map a key to its question label. Treat the question ID as the stable identifier; the label can change. Load question labels for the pages your integration uses.
See booking triggers for complete JSON examples of all three shapes.