Events & Payloads
Every webhook delivery contains an event field and a payload with the event data. This page documents all available event types and their payloads.
Available Events
| Event | Description |
|---|---|
booking.created | A new booking was created |
booking.cancelled | A booking was cancelled by the host or guest |
booking.rescheduled | A booking was rescheduled to a new time |
booking.approved | A pending booking was approved by the host |
booking.declined | A pending booking was declined by the host |
booking.noShow | A booking was marked as no-show |
booking.completed | A booking was marked as completed |
Common Payload Structure
All booking events share the same payload structure — a full representation of the booking:
{
"event": "booking.created",
"createdAt": "2026-03-16T14:05:00Z",
"payload": {
"id": "bkg_xyz789",
"eventTypeId": "evt_abc123",
"eventTypeName": "30 Minute Call",
"eventTypeSlug": "30min-call",
"status": "Confirmed",
"startTime": "2026-03-16T14:00:00Z",
"endTime": "2026-03-16T14:30:00Z",
"hostUserId": "usr_host123",
"hostName": "Jane Doe",
"hostEmail": "jane@example.com",
"invitee": {
"name": "Alex Johnson",
"email": "alex@example.com",
"phone": "+1-555-0123",
"timezone": "America/New_York",
"locale": "en",
"notes": "I'd like to discuss the enterprise plan."
},
"location": {
"type": "GoogleMeet",
"value": "https://meet.google.com/abc-defg-hij"
},
"customFields": {
"company": "Acme Inc.",
"role": "Engineering Manager"
},
"source": "BookingPage",
"createdAt": "2026-03-16T14:05:00Z",
"cancelledAt": null,
"cancellationReason": null,
"rescheduledFrom": null
}
}Payload Fields
| Field | Type | Description |
|---|---|---|
id | string | Unique booking identifier |
eventTypeId | string | Event type identifier |
eventTypeName | string | Event type display name |
eventTypeSlug | string | Event type URL slug |
status | string | Current booking status |
startTime | string | Meeting start time (ISO 8601 UTC) |
endTime | string | Meeting end time (ISO 8601 UTC) |
hostUserId | string | Host’s user identifier |
hostName | string | Host’s display name |
hostEmail | string | Host’s email address |
invitee | object | Guest information |
location | object | Meeting location details |
customFields | object | null | Custom field responses |
source | string | Booking source: BookingPage, EmbedWidget, API |
createdAt | string | When the booking was created |
cancelledAt | string | null | When the booking was cancelled |
cancellationReason | string | null | Reason provided for cancellation |
rescheduledFrom | string | null | Original booking ID if this is a rescheduled booking |
Event-Specific Details
booking.created
Fired when a new booking is confirmed or enters pending approval state.
statuswill beConfirmedorPendingApprovalcancelledAt,cancellationReason, andrescheduledFromwill benull
booking.cancelled
Fired when a booking is cancelled by either the host or the guest.
statuswill beCancelledcancelledAtwill contain the cancellation timestampcancellationReasonmay contain a reason if one was provided
booking.rescheduled
Fired when a booking is moved to a new time. This creates a new booking and cancels the old one.
rescheduledFromwill contain the original booking’s ID- The original booking will receive a
booking.cancelledevent
booking.approved
Fired when a host approves a booking that was in PendingApproval status.
statuswill change toConfirmed
booking.declined
Fired when a host declines a pending booking.
statuswill change toDeclined
booking.noShow
Fired when a host marks a guest as a no-show after the meeting time has passed.
statuswill change toNoShow
booking.completed
Fired when a booking is marked as successfully completed.
statuswill change toCompleted
Example: Handling Events
app.post('/webhooks/proximity', (req, res) => {
const { event, payload } = req.body;
switch (event) {
case 'booking.created':
console.log(`New booking from ${payload.invitee.email}`);
// Add to CRM, send internal notification, etc.
break;
case 'booking.cancelled':
console.log(`Booking ${payload.id} cancelled`);
// Update CRM, free up resources, etc.
break;
case 'booking.rescheduled':
console.log(`Booking rescheduled from ${payload.rescheduledFrom}`);
// Update calendar, notify team, etc.
break;
default:
console.log(`Unhandled event: ${event}`);
}
res.status(200).send('OK');
});Last updated on