> ## Documentation Index
> Fetch the complete documentation index at: https://developer.zeeg.me/llms.txt
> Use this file to discover all available pages before exploring further.

# Event Webhook Payload

> Schema reference for the webhook payload Zeeg sends to your callback URL when an invitee schedules, reschedules, or cancels an event.

This payload is delivered to your webhook callback URL when an `invitee.scheduled` or `invitee.cancelled` event occurs. Both event types share the same structure -- cancellation and rescheduling fields are only populated when relevant.

<Tip>
  Store `inviteeUuid` (and `eventUuid`) on your side. Invitee-related UUIDs are the best identifiers for correlating bookings, cancellations, and reschedules across webhook deliveries, and they ensure future compatibility -- especially for Group events.
</Tip>

## Event Info

<ResponseField name="event" type="string" required>
  Event type that triggered this webhook. Either `invitee.scheduled` or `invitee.cancelled`.
</ResponseField>

<ResponseField name="eventUri" type="string" required>
  Full API URI for the scheduled event. Example: `https://api.zeeg.me/v2/scheduled-events/zg-O69bac566950c6`.
</ResponseField>

<ResponseField name="eventUuid" type="string" required>
  Zeeg event ID in `zg-XXX` format (e.g., `zg-O69bac566950c6`). Use this to uniquely identify the event.
</ResponseField>

<ResponseField name="title" type="string" required>
  Title of the scheduling page / event type (e.g., "30-Minute Discovery Call").
</ResponseField>

<ResponseField name="type" type="string" required>
  Event type category. One of `ONE_ON_ONE`, `GROUP`, `COLLECTIVE`, `ROUND_ROBIN`, or `FLEXI`.
</ResponseField>

<ResponseField name="duration" type="integer" required>
  Event duration in minutes.
</ResponseField>

<ResponseField name="durationPretty" type="string" required>
  Human-readable duration (e.g., `"30 mins"`, `"1 hr 30 mins"`).
</ResponseField>

## Invitee Info

<ResponseField name="inviteeSalutation" type="string | null">
  Invitee's salutation (e.g., `"Ms."`, `"Mr."`). `null` if not provided.
</ResponseField>

<ResponseField name="inviteeFirstName" type="string | null">
  Invitee's first name. `null` if not provided.
</ResponseField>

<ResponseField name="inviteeLastName" type="string | null">
  Invitee's last name. `null` if not provided.
</ResponseField>

<ResponseField name="inviteeName" type="string" required>
  Invitee's full display name.
</ResponseField>

<ResponseField name="inviteeEmail" type="string" required>
  Invitee's email address.
</ResponseField>

<ResponseField name="inviteePhoneNumber" type="string | null">
  Invitee's phone number. `null` if not collected.
</ResponseField>

<ResponseField name="inviteeTimezone" type="string" required>
  Invitee's IANA timezone (e.g., `"Europe/Paris"`).
</ResponseField>

<ResponseField name="inviteeNumberOfSeats" type="integer" required>
  Number of seats booked. `1` for standard bookings, higher for Group events.
</ResponseField>

<ResponseField name="inviteeUuid" type="string" required>
  Zeeg invitee ID in `zg-XXX` format. Use this to track a specific booking across schedule, cancel, and reschedule events. **Recommended for storage and correlation.**
</ResponseField>

## Timing

<ResponseField name="startAt" type="string" required>
  Event start time in UTC (ISO 8601).
</ResponseField>

<ResponseField name="endAt" type="string" required>
  Event end time in UTC (ISO 8601).
</ResponseField>

<ResponseField name="inviteeStartAt" type="string" required>
  Event start time in the invitee's local timezone (ISO 8601 with offset).
</ResponseField>

<ResponseField name="inviteeEndAt" type="string" required>
  Event end time in the invitee's local timezone (ISO 8601 with offset).
</ResponseField>

<ResponseField name="inviteeStartAtPretty" type="string" required>
  Human-readable start time in the invitee's timezone. Format: `HH:mm - Day, Month DD, YYYY` (e.g., `"11:00 - Wednesday, April 15, 2026"`).
</ResponseField>

<ResponseField name="inviteeEndAtPretty" type="string" required>
  Human-readable end time in the invitee's timezone. Same format as `inviteeStartAtPretty`.
</ResponseField>

## Host Info

<ResponseField name="hosts" type="object" required>
  Map of 1-based host positions to host full names (e.g., `{"1": "Lena Meier"}`).
</ResponseField>

<ResponseField name="hostsDetails" type="array" required>
  Array of host detail objects.

  <Expandable title="Host detail object">
    <ResponseField name="slug" type="string">
      The host's URL slug.
    </ResponseField>

    <ResponseField name="firstName" type="string">
      The host's first name.
    </ResponseField>

    <ResponseField name="lastName" type="string">
      The host's last name.
    </ResponseField>

    <ResponseField name="email" type="string">
      The host's email address.
    </ResponseField>

    <ResponseField name="fullName" type="string">
      The host's full name.
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="teamName" type="string | null">
  Team name if the event belongs to a team, otherwise `null`.
</ResponseField>

## Location

<ResponseField name="location" type="string | null">
  Location type or name (e.g., `"Google Meet"`, `"Zoom"`, a physical address). `null` if no location is set.
</ResponseField>

<ResponseField name="locationLink" type="string | null">
  Join URL for virtual meetings. `null` for non-virtual locations or if not applicable.
</ResponseField>

## Questions

<ResponseField name="questions" type="array" required>
  Array of question/answer objects from the invitee's booking form.

  <Expandable title="Question object">
    <ResponseField name="question" type="string">
      The question text.
    </ResponseField>

    <ResponseField name="answer" type="string">
      The invitee's answer.
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="questionsAndAnswers" type="object" required>
  Flat key-value map of questions to answers (question text as key). Convenient for quick lookups.
</ResponseField>

## Scheduling Page

<ResponseField name="eventTypeUri" type="string" required>
  API URI for the event type. Example: `https://api.zeeg.me/v2/event-types/80f46bf5-eb01-4c07-960e-a9a3e18aae5e`.
</ResponseField>

<ResponseField name="singleUseLink" type="string | null">
  Single-use scheduling link used for this booking. `null` if a standard scheduling page was used.
</ResponseField>

## Guests

<ResponseField name="guests" type="array" required>
  Array of additional guest email addresses added by the invitee. Empty array if no guests were added.
</ResponseField>

## Payment

<ResponseField name="price" type="number | null">
  Total price charged for the booking. `null` if the event is free.
</ResponseField>

<ResponseField name="pricePerSeat" type="number | null">
  Price per seat. Equal to `price` for single-seat bookings. For multi-seat bookings, this is `price / inviteeNumberOfSeats`. `null` if the event is free.
</ResponseField>

<ResponseField name="currency" type="string | null">
  Currency code (e.g., `"EUR"`, `"USD"`). `null` if the event is free.
</ResponseField>

<ResponseField name="paymentGateway" type="string | null">
  Payment provider used (e.g., `"stripe"`, `"paypal"`). `null` if the event is free.
</ResponseField>

<ResponseField name="transactionId" type="string | null">
  Payment provider's transaction ID. `null` if the event is free.
</ResponseField>

## Links

<ResponseField name="cancelUrl" type="string | null">
  URL the invitee can use to cancel the event. `null` if the event is already cancelled.
</ResponseField>

<ResponseField name="rescheduleUrl" type="string | null">
  URL the invitee can use to reschedule the event. `null` if the event is already cancelled.
</ResponseField>

## Cancellation

These fields are populated when the event is `invitee.cancelled`.

<ResponseField name="cancelled" type="boolean" required>
  `true` if the event has been cancelled, `false` otherwise.
</ResponseField>

<ResponseField name="cancelledAt" type="string | null">
  Cancellation timestamp in UTC (ISO 8601). `null` if not cancelled.
</ResponseField>

<ResponseField name="cancelledBy" type="string | null">
  Name of the person who cancelled the event. `null` if not cancelled.
</ResponseField>

<ResponseField name="cancellationReason" type="string | null">
  Reason provided for the cancellation. `null` if not cancelled or no reason was given.
</ResponseField>

## Rescheduling

These fields are populated when a booking has been rescheduled. On a reschedule, the old event receives `invitee.cancelled` and the new event receives `invitee.scheduled`, both with rescheduling context.

The `old*` fields appear on the **new** event's payload (referencing the event it replaced). The `new*` fields appear on the **old** event's payload (referencing the event that replaced it).

<ResponseField name="rescheduled" type="boolean" required>
  `true` if this event was rescheduled (i.e., a newer event replaced it), `false` otherwise.
</ResponseField>

<ResponseField name="rescheduledAt" type="string | null">
  Rescheduling timestamp in UTC (ISO 8601).
</ResponseField>

<ResponseField name="rescheduledBy" type="string | null">
  Name of the person who initiated the reschedule.
</ResponseField>

<ResponseField name="rescheduleReason" type="string | null">
  Reason provided for rescheduling.
</ResponseField>

<ResponseField name="oldEventUri" type="string | null">
  API URI of the previous (old) event before rescheduling.
</ResponseField>

<ResponseField name="oldEventUuid" type="string | null">
  UUID of the previous (old) event.
</ResponseField>

<ResponseField name="oldInviteeUuid" type="string | null">
  Invitee UUID from the previous (old) event.
</ResponseField>

<ResponseField name="oldStartAt" type="string | null">
  Start time (UTC, ISO 8601) of the previous event.
</ResponseField>

<ResponseField name="oldInviteeStartAt" type="string | null">
  Start time of the previous event in the invitee's timezone (human-readable format).
</ResponseField>

<ResponseField name="newEventUri" type="string | null">
  API URI of the replacement (new) event after rescheduling.
</ResponseField>

<ResponseField name="newEventUuid" type="string | null">
  UUID of the replacement (new) event.
</ResponseField>

<ResponseField name="newInviteeUuid" type="string | null">
  Invitee UUID for the replacement (new) event.
</ResponseField>

<ResponseField name="newStartAt" type="string | null">
  Start time (UTC, ISO 8601) of the replacement event.
</ResponseField>

<ResponseField name="newInviteeStartAt" type="string | null">
  Start time of the replacement event in the invitee's timezone (human-readable format).
</ResponseField>

## UTM Parameters

These fields capture UTM tracking parameters if they were present on the scheduling page URL when the invitee booked.

<ResponseField name="utmCampaign" type="string | null">
  The `utm_campaign` value.
</ResponseField>

<ResponseField name="utmSource" type="string | null">
  The `utm_source` value.
</ResponseField>

<ResponseField name="utmMedium" type="string | null">
  The `utm_medium` value.
</ResponseField>

<ResponseField name="utmTerm" type="string | null">
  The `utm_term` value.
</ResponseField>

<ResponseField name="utmContent" type="string | null">
  The `utm_content` value.
</ResponseField>

<ResponseField name="adAttribution" type="object | null">
  Ad click identifiers captured at booking, or `null` when none were present. Keys: `gclid`, `gbraid`, `wbraid`, `fbclid`, `fbp`, `fbc`, `landingUrl` (all `string`, only the captured keys are present).
</ResponseField>

## Metadata

<ResponseField name="createdAt" type="string" required>
  Timestamp (UTC, ISO 8601) of when the booking was created.
</ResponseField>

## Full Payload Example

```json theme={null}
{
  "event": "invitee.scheduled",
  "eventUri": "https://api.zeeg.me/v2/scheduled-events/zg-O69bac566950c6",
  "inviteeSalutation": "Ms.",
  "inviteeFirstName": "Sophie",
  "inviteeLastName": "Laurent",
  "inviteeName": "Sophie Laurent",
  "inviteeEmail": "sophie.laurent@northwind.io",
  "inviteePhoneNumber": "+49 170 9876543",
  "inviteeTimezone": "Europe/Paris",
  "inviteeNumberOfSeats": 1,
  "teamName": null,
  "hosts": {
    "1": "Lena Meier"
  },
  "hostsDetails": [
    {
      "slug": "lena-meier",
      "firstName": "Lena",
      "lastName": "Meier",
      "email": "lena.meier@horizondigital.de",
      "fullName": "Lena Meier"
    }
  ],
  "title": "30-Minute Discovery Call",
  "duration": 30,
  "durationPretty": "30 mins",
  "type": "ONE_ON_ONE",
  "eventTypeUri": "https://api.zeeg.me/v2/event-types/80f46bf5-eb01-4c07-960e-a9a3e18aae5e",
  "singleUseLink": null,
  "startAt": "2026-04-15T09:00:00+00:00",
  "inviteeStartAt": "2026-04-15T11:00:00+02:00",
  "inviteeStartAtPretty": "11:00 - Wednesday, April 15, 2026",
  "endAt": "2026-04-15T09:30:00+00:00",
  "inviteeEndAt": "2026-04-15T11:30:00+02:00",
  "inviteeEndAtPretty": "11:30 - Wednesday, April 15, 2026",
  "location": "Google Meet",
  "locationLink": "https://meet.google.com/abc-defg-hij",
  "questions": [
    {
      "question": "What would you like to discuss?",
      "answer": "Product demo and pricing options"
    }
  ],
  "questionsAndAnswers": {
    "What would you like to discuss?": "Product demo and pricing options"
  },
  "price": null,
  "pricePerSeat": null,
  "currency": null,
  "paymentGateway": null,
  "transactionId": null,
  "guests": ["alex.chen@northwind.io"],
  "eventUuid": "zg-O69bac566950c6",
  "inviteeUuid": "zg-O69bad4047abf0",
  "cancelUrl": "https://zeeg.me/cancel/zg-O69bad4047abf0",
  "rescheduleUrl": "https://zeeg.me/rescheduling/zg-O69bad4047abf0",
  "cancelled": false,
  "cancelledAt": null,
  "cancelledBy": null,
  "cancellationReason": null,
  "rescheduled": false,
  "rescheduledAt": null,
  "rescheduledBy": null,
  "rescheduleReason": null,
  "oldEventUri": null,
  "oldEventUuid": null,
  "oldInviteeUuid": null,
  "oldStartAt": null,
  "oldInviteeStartAt": null,
  "newEventUri": null,
  "newEventUuid": null,
  "newInviteeUuid": null,
  "newStartAt": null,
  "newInviteeStartAt": null,
  "utmCampaign": "spring_launch",
  "utmSource": "linkedin",
  "utmMedium": "social",
  "utmTerm": null,
  "utmContent": null,
  "adAttribution": {
    "gclid": "Cj0KCQjw_ndBhCrARIsAAy",
    "fbclid": "IwAR2xq9Zt",
    "landingUrl": "https://zeeg.me/lena-meier/30min?gclid=Cj0KCQjw_ndBhCrARIsAAy"
  },
  "createdAt": "2026-04-10T08:30:00+00:00"
}
```
