Skip to main content
This page documents the payload structure for each webhook event type.

booking_created

Triggered when a new appointment is booked.

Payload

{
  "event": "booking_created",
  "data": {
    "id": "appt-uuid-12345",
    "secret": "secret-token-xyz",
    "start": "2024-01-15T09:00:00+01:00",
    "end": "2024-01-15T09:30:00+01:00",
    "location": null,
    "isCancelled": false,
    "rescheduledAt": null,
    "meetingInfo": {
      "channel": "zoom",
      "meetingLink": "https://zoom.us/j/123456789"
    },
    "attendees": [
      {
        "id": "att-uuid-789",
        "email": "[email protected]",
        "firstname": "Jane",
        "lastname": "Doe",
        "fullname": "Jane Doe",
        "phone": "+1-555-123-4567",
        "timezone": "America/New_York",
        "language": "en"
      }
    ],
    "hosts": [
      {
        "id": "host-uuid-123",
        "email": "[email protected]",
        "givenName": "John",
        "familyName": "Smith",
        "fullName": "John Smith",
        "slug": "john-smith",
        "picture": "https://example.com/photo.jpg"
      }
    ],
    "hostIds": ["host-uuid-123"],
    "meetingType": {
      "id": "mt-uuid-456",
      "slug": "discovery-call",
      "meetingInfo": {
        "name": "Discovery Call",
        "duration": 30
      }
    },
    "meetingTypeId": "mt-uuid-456",
    "companyId": "company-uuid-789",
    "createdAt": "2024-01-14T15:30:00Z",
    "updatedAt": "2024-01-14T15:30:00Z"
  }
}

Key Fields

FieldTypeDescription
idstringUnique appointment identifier
secretstringToken for cancel/reschedule operations
startstringStart time (ISO 8601)
endstringEnd time (ISO 8601)
attendeesarrayList of attendee objects
hostsarrayList of host objects
meetingTypeobjectMeeting type details
meetingInfo.channelstringVideo platform used
meetingInfo.meetingLinkstringVideo meeting URL

booking_cancelled

Triggered when an appointment is cancelled by the host or attendee.

Payload

{
  "event": "booking_cancelled",
  "data": {
    "id": "appt-uuid-12345",
    "secret": "secret-token-xyz",
    "start": "2024-01-15T09:00:00+01:00",
    "end": "2024-01-15T09:30:00+01:00",
    "location": null,
    "isCancelled": true,
    "cancel": {
      "cancelledAt": "2024-01-14T18:00:00Z",
      "cancelledBy": "attendee",
      "reason": "Schedule conflict"
    },
    "attendees": [
      {
        "id": "att-uuid-789",
        "email": "[email protected]",
        "firstname": "Jane",
        "lastname": "Doe",
        "fullname": "Jane Doe"
      }
    ],
    "hosts": [
      {
        "id": "host-uuid-123",
        "email": "[email protected]",
        "givenName": "John",
        "familyName": "Smith",
        "fullName": "John Smith"
      }
    ],
    "hostIds": ["host-uuid-123"],
    "meetingType": {
      "id": "mt-uuid-456",
      "slug": "discovery-call"
    },
    "meetingTypeId": "mt-uuid-456",
    "companyId": "company-uuid-789",
    "createdAt": "2024-01-14T15:30:00Z",
    "updatedAt": "2024-01-14T18:00:00Z"
  }
}

Key Fields

FieldTypeDescription
isCancelledbooleanAlways true for this event
cancel.cancelledAtstringWhen the cancellation occurred
cancel.cancelledBystringWho cancelled: attendee or host
cancel.reasonstringOptional cancellation reason

booking_rescheduled

Triggered when an appointment is moved to a new time.

Payload

{
  "event": "booking_rescheduled",
  "data": {
    "oldStartDate": "2024-01-15T09:00:00+01:00",
    "rescheduledAppointment": {
      "id": "appt-uuid-12345",
      "secret": "secret-token-xyz",
      "start": "2024-01-16T10:00:00+01:00",
      "end": "2024-01-16T10:30:00+01:00",
      "location": null,
      "isCancelled": false,
      "rescheduledAt": "2024-01-14T18:30:00Z",
      "attendees": [
        {
          "id": "att-uuid-789",
          "email": "[email protected]",
          "firstname": "Jane",
          "lastname": "Doe",
          "fullname": "Jane Doe"
        }
      ],
      "hosts": [
        {
          "id": "host-uuid-123",
          "email": "[email protected]",
          "givenName": "John",
          "familyName": "Smith",
          "fullName": "John Smith"
        }
      ],
      "hostIds": ["host-uuid-123"],
      "meetingType": {
        "id": "mt-uuid-456",
        "slug": "discovery-call"
      },
      "meetingTypeId": "mt-uuid-456",
      "companyId": "company-uuid-789",
      "createdAt": "2024-01-14T15:30:00Z",
      "updatedAt": "2024-01-14T18:30:00Z"
    }
  }
}

Key Fields

FieldTypeDescription
oldStartDatestringOriginal start time
rescheduledAppointmentobjectUpdated appointment details
rescheduledAppointment.startstringNew start time
rescheduledAppointment.rescheduledAtstringWhen the reschedule occurred

new_employee

Triggered when a new user is added to your company.

Payload

{
  "event": "new_employee",
  "data": {
    "id": "user-uuid-456",
    "email": "[email protected]",
    "givenName": "Sarah",
    "familyName": "Johnson",
    "fullName": "Sarah Johnson",
    "companyId": "company-uuid-789",
    "userType": "REGULAR",
    "createdAt": "2024-01-14T10:00:00Z"
  }
}

Key Fields

FieldTypeDescription
idstringUser’s unique identifier
emailstringUser’s email address
givenNamestringFirst name
familyNamestringLast name
userTypestringREGULAR or API_PLATFORM

Common Attendee Fields

All booking events include attendee information:
FieldTypeDescription
idstringAttendee record ID
emailstringEmail address
firstnamestringFirst name
lastnamestringLast name
fullnamestringCombined full name
phonestringPhone number (if provided)
timezonestringAttendee’s timezone
languagestringPreferred language code
notesstringNotes from booking form
attendeeEnrichmentobjectEnriched data from integrations

Common Host Fields

All booking events include host information:
FieldTypeDescription
idstringHost user ID
emailstringEmail address
givenNamestringFirst name
familyNamestringLast name
fullNamestringCombined full name
slugstringURL-friendly identifier
picturestringProfile photo URL

Handling Events

Example: Sync to CRM

async function handleBookingCreated(data) {
  const attendee = data.attendees[0];

  // Create or update contact in your CRM
  await crm.contacts.upsert({
    email: attendee.email,
    firstName: attendee.firstname,
    lastName: attendee.lastname,
    phone: attendee.phone,
    lastMeetingDate: data.start,
    meetingType: data.meetingType.meetingInfo.name
  });

  // Log the activity
  await crm.activities.create({
    type: 'meeting_scheduled',
    contactEmail: attendee.email,
    subject: `${data.meetingType.meetingInfo.name} scheduled`,
    scheduledAt: data.start,
    hostEmail: data.hosts[0].email
  });
}

Example: Send Slack Notification

async function handleBookingCreated(data) {
  const attendee = data.attendees[0];
  const host = data.hosts[0];

  await slack.chat.postMessage({
    channel: '#bookings',
    text: `New booking!`,
    blocks: [
      {
        type: 'section',
        text: {
          type: 'mrkdwn',
          text: `*New ${data.meetingType.meetingInfo.name}*\n` +
                `Attendee: ${attendee.fullname} (${attendee.email})\n` +
                `Host: ${host.fullName}\n` +
                `Time: ${new Date(data.start).toLocaleString()}`
        }
      }
    ]
  });
}