Webhook in Cal ID
Webhooks are a great way to automate flows with other apps when invitees schedule, cancel, or reschedule events. A webhook subscription lets you listen for specific trigger events — like a booking being created — by pointing Cal ID at a subscriber URL. You can build your own listener, or trigger automations without code using the Zapier integration. Webhooks can be attached to your account or to individual event types, including team event types.
Visit /settings/webhooks and enter:
- Subscriber URL: the listener URL that receives the payload when a trigger fires.
- Event triggers: choose which triggers to listen to. Available triggers:
Booking CreatedBooking RequestedBooking RescheduledBooking CancelledBooking RejectedBooking Payment InitiatedBooking PaidBooking No-show UpdatedForm SubmittedOut-of-office Created
- Secret: provide a secret key to verify payloads on your subscriber URL (confirms a payload is authentic and untampered). Leave blank to skip.
- Custom Payload: optionally customize the payload you receive.

{
"triggerEvent": "BOOKING_CREATED",
"createdAt": "2023-05-24T09:30:00.538Z",
"payload": {
"type": "60min",
"title": "60min between Pro Example and John Doe",
"description": "",
"additionalNotes": "",
"customInputs": {},
"startTime": "2023-05-25T09:30:00Z",
"endTime": "2023-05-25T10:30:00Z",
"organizer": {
"id": 5,
"name": "Pro Example",
"email": "[email protected]",
"username": "pro",
"timeZone": "Asia/Kolkata",
"language": { "locale": "en" },
"timeFormat": "h:mma"
},
"attendees": [
{
"email": "[email protected]",
"name": "John Doe",
"timeZone": "Asia/Kolkata",
"language": { "locale": "en" }
}
],
"location": "Cal ID HQ",
"eventTypeId": 7,
"uid": "bFJeNb2uX8ANpT3JL5EfXw",
"eventTitle": "60min",
"length": 60,
"bookingId": 91,
"status": "ACCEPTED"
}
}
- Add a secret key to your webhook and save.
- Wait for the webhook to fire (a booking is created, cancelled, rescheduled, and so on).
- Use the secret key to create an
hmac, then combine it with the received payload to produce a SHA256 signature. - Compare your hash with the one in the webhook's
X-Cal-Signature-256header. If they don't match, the payload was altered and can't be trusted.
Custom payloads reduce development effort and often remove the need to build a separate integration service. Example template:
{
"content": "A new event has been scheduled",
"type": "{{type}}",
"name": "{{title}}",
"organizer": "{{organizer.name}}",
"booker": "{{attendees.0.name}}"
}
Here {{type}} is the event type slug and {{title}} is the event type name. Wrap variables in double curly braces as shown. The supported variables:
Variable | Type | Description |
|---|---|---|
triggerEvent | String | The trigger event: BOOKING_CREATED, BOOKING_REQUESTED, BOOKING_RESCHEDULED, BOOKING_CANCELLED, BOOKING_REJECTED, BOOKING_PAYMENT_INITIATED, BOOKING_PAID, BOOKING_NO_SHOW_UPDATED, FORM_SUBMITTED, OOO_CREATED |
createdAt | Datetime | The time of the webhook |
type | String | The event type slug |
title | String | The event type name |
startTime | Datetime | The event's start time |
endTime | Datetime | The event's end time |
description | String | The event's description from the event type settings |
location | String | Location of the event |
organizer | Person | The organizer of the event |
attendees | Person | The event booker and any guests |
uid | String | The UID of the booking |
rescheduleUid | String | The UID of the rescheduling |
cancellationReason | String | Reason for cancellation |
rejectionReason | String | Reason for rejection |
String | Name of the team booked | |
team.members | String | Members of the team booked |
metadata | JSON | Booking metadata, including the meeting URL (videoCallUrl) for Google Meet |
Person structure
Variable | Type | Description |
|---|---|---|
name | String | Name of the individual |
Email of the individual | ||
timezone | String | Timezone of the individual (e.g., "America/New_York", "Asia/Kolkata") |
language?.locale | String | Locale of the individual (e.g., "en", "fr") |
Razorpay Payment Details in Webhook Payloads
For users integrating Cal ID with invoicing or other external systems, Razorpay payment details are now available directly in the webhook payload.
These parameters are included under:body → metadata
Available Parameters
Parameter | Description |
|---|---|
| Payment link ID or payment intent ID, depending on how the payment was initiated by the payment provider. |
| The actual Razorpay payment ID. |
| The Cal ID payment account ID associated with the transaction. |
| The Razorpay payment link associated with the transaction. |
Example Webhook Payload
{
"metadata": {
"paymentExternalId": "<payment_link_id_or_intent_id>",
"transactionId": "<actual_payment_id>",
"accountId": "<account_id>",
"paymentLink": "<payment_link>"
}
}
How to Use These Fields
If you are using Cal ID webhooks with tools such as Pabbly Connect, Zapier, Make, Zoho Invoice, or other external systems, you can now use these fields to automate payment and invoicing workflows.
For example:
- A customer opens the Cal ID booking link.
- The customer makes a booking and initiates a Razorpay payment.
- Cal ID sends the relevant webhook event.
- The webhook payload includes the payment information under
body → metadata. - Use
transactionIdto capture the actual Razorpay Payment ID. - Use
paymentLinkif you need the Razorpay payment link for reference or reconciliation. - Pass these values to your invoicing or accounting system.
Important: paymentExternalId and transactionId serve different purposes. paymentExternalId contains the external payment link/intent identifier, while transactionId contains the actual payment transaction ID generated by Razorpay.
Updated on: 02/09/2026
Thank you!