From cbcd769f882a004d43c2dd312ae09fea27ba5c65 Mon Sep 17 00:00:00 2001 From: Udit Takkar <53316345+Udit-takkar@users.noreply.github.com> Date: Wed, 3 Dec 2025 12:05:54 +0530 Subject: [PATCH] docs: add automatic no show updated docs (#25507) --- .../developing/guides/automation/webhooks.mdx | 154 +++++++++++++++++- 1 file changed, 153 insertions(+), 1 deletion(-) diff --git a/docs/developing/guides/automation/webhooks.mdx b/docs/developing/guides/automation/webhooks.mdx index f53b6b0aca..8cd6c6876f 100644 --- a/docs/developing/guides/automation/webhooks.mdx +++ b/docs/developing/guides/automation/webhooks.mdx @@ -34,6 +34,9 @@ To create a new webhook subscription, visit `/settings/developer/webhooks` and p - `Form Submitted` - `Meeting Ended` - `Instant Meeting Created` + - `Booking No-show Updated` + - `After Hosts Didn't Join Cal Video` + - `After Guests Didn't Join Cal Video` You can provide a secret key with this webhook to [verify it](/docs/core-features/webhooks#verifying-the-authenticity-of-the-received-payload) on the subscriber URL when receiving a payload. This helps confirm whether the payload is authentic or has been tampered with. You can leave it blank if you don't wish to secure the webhook with a secret key. @@ -144,6 +147,155 @@ To create a new webhook subscription, visit `/settings/developer/webhooks` and p ``` +### Booking No-show Updated webhook payload + +This webhook is triggered when an attendee is manually marked or unmarked as no-show on the `/bookings/past` page. + +**Example payload when marking an attendee as no-show:** + +```json +{ + "triggerEvent": "BOOKING_NO_SHOW_UPDATED", + "createdAt": "2025-12-01T12:34:34.774Z", + "payload": { + "message": "test@example.com marked as no-show", + "attendees": [ + { + "email": "test@example.com", + "noShow": true + } + ], + "bookingUid": "5vQFqxDFMjdgKGMijqtqRw", + "bookingId": 31 + } +} +``` + +**Example payload when unmarking an attendee as no-show:** + +```json +{ + "triggerEvent": "BOOKING_NO_SHOW_UPDATED", + "createdAt": "2025-12-01T12:38:31.663Z", + "payload": { + "message": "test@example.com unmarked as no-show", + "attendees": [ + { + "email": "test@example.com", + "noShow": false + } + ], + "bookingUid": "5vQFqxDFMjdgKGMijqtqRw", + "bookingId": 31 + } +} +``` + +### Cal Video No-Show Detection webhooks + +These webhooks are triggered **automatically** when hosts or guests don't join a Cal Video meeting within the configured time after the booking starts. Unlike `BOOKING_NO_SHOW_UPDATED` which requires manual action, these are detected automatically by checking Cal Video participant data. + + +These webhooks only work for bookings that use Cal Video as the meeting location. + + +**Example payload when host didn't join (`AFTER_HOSTS_CAL_VIDEO_NO_SHOW`):** + +```json +{ + "triggerEvent": "AFTER_HOSTS_CAL_VIDEO_NO_SHOW", + "createdAt": "2025-12-01T15:23:30.320Z", + "payload": { + "title": "30min between Owner 1 and test", + "bookingId": 32, + "bookingUid": "qVyXscm1ryg2QoQ4K8uHLW", + "startTime": "2025-12-02T04:00:00.000Z", + "attendees": [ + { + "id": 32, + "email": "test@example.com", + "name": "test", + "timeZone": "Asia/Kolkata", + "phoneNumber": null, + "locale": "en", + "bookingId": 32, + "noShow": false + } + ], + "endTime": "2025-12-02T04:30:00.000Z", + "participants": [], + "hostEmail": "owner1-dunder@example.com", + "eventType": { + "id": 50, + "teamId": null, + "parentId": null, + "calVideoSettings": null + }, + "webhook": { + "id": "2bdfc20b-aa4a-4863-a499-932cb1d4e69a", + "subscriberUrl": "https://webhook.site/example", + "appId": null, + "time": 5, + "timeUnit": "MINUTE", + "eventTriggers": [ + "AFTER_HOSTS_CAL_VIDEO_NO_SHOW", + "AFTER_GUESTS_CAL_VIDEO_NO_SHOW" + ], + "payloadTemplate": null + }, + "message": "Host with email owner1-dunder@example.com didn't join the call or didn't join before 2025-12-02 04:05:00 +00:00" + } +} +``` + +**Example payload when guest didn't join (`AFTER_GUESTS_CAL_VIDEO_NO_SHOW`):** + +```json +{ + "triggerEvent": "AFTER_GUESTS_CAL_VIDEO_NO_SHOW", + "createdAt": "2025-12-01T15:23:30.323Z", + "payload": { + "title": "30min between Owner 1 and test", + "bookingId": 32, + "bookingUid": "qVyXscm1ryg2QoQ4K8uHLW", + "startTime": "2025-12-02T04:00:00.000Z", + "attendees": [ + { + "id": 32, + "email": "test@example.com", + "name": "test", + "timeZone": "Asia/Kolkata", + "phoneNumber": null, + "locale": "en", + "bookingId": 32, + "noShow": false + } + ], + "endTime": "2025-12-02T04:30:00.000Z", + "participants": [], + "eventType": { + "id": 50, + "teamId": null, + "parentId": null, + "calVideoSettings": null + }, + "webhook": { + "id": "2bdfc20b-aa4a-4863-a499-932cb1d4e69a", + "subscriberUrl": "https://webhook.site/example", + "appId": null, + "time": 5, + "timeUnit": "MINUTE", + "eventTriggers": [ + "AFTER_HOSTS_CAL_VIDEO_NO_SHOW", + "AFTER_GUESTS_CAL_VIDEO_NO_SHOW" + ], + "payloadTemplate": null + }, + "message": "Guest didn't join the call or didn't join before 2025-12-02 04:05:00 +00:00" + } +} +``` + ### Verifying the authenticity of the received payload @@ -182,7 +334,7 @@ where `{{type}}` represents the event type slug and `{{title}}` represents the t | Variable | Type | Description | |--------------------|--------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------| -| triggerEvent | String | The name of the trigger event [BOOKING_CREATED, BOOKING_RESCHEDULED, BOOKING_CANCELLED, MEETING_ENDED, BOOKING_REJECTED, BOOKING_REQUESTED, BOOKING_PAYMENT_INITIATED, BOOKING_PAID, MEETING_STARTED, RECORDING_READY, FORM_SUBMITTED] | +| triggerEvent | String | The name of the trigger event [BOOKING_CREATED, BOOKING_RESCHEDULED, BOOKING_CANCELLED, MEETING_ENDED, BOOKING_REJECTED, BOOKING_REQUESTED, BOOKING_PAYMENT_INITIATED, BOOKING_PAID, MEETING_STARTED, RECORDING_READY, FORM_SUBMITTED, BOOKING_NO_SHOW_UPDATED, AFTER_HOSTS_CAL_VIDEO_NO_SHOW, AFTER_GUESTS_CAL_VIDEO_NO_SHOW] | | createdAt | Datetime | The time of the webhook | | type | String | The event type slug | | title | String | The event type name |