Send an instant WhatsApp confirmation to every new Calendly booking, alert your team the moment a slot is taken, and handle cancellations automatically. Calendly has native webhook support, so no third-party tools or code are required.
Unlike Google Calendar and Google Sheets, Calendly fires webhooks natively. When someone books, Calendly POSTs the booking details to a URL you specify. No third-party connector, no Apps Script, no API key in WA.Expert. Just register your WA.Expert webhook URL in Calendly's Integrations panel.
Calendly's API v1 and its webhooks were shut down in May 2025. This guide uses API v2 only. If you have any v1 webhook integrations, they have stopped working and need to be rebuilt using v2.
Calendly's Free plan does not include webhook support. You need the Standard plan or higher to register webhook subscriptions. If you are on Free, you can use a Zapier step as an alternative connector.
Calendly does not collect phone numbers by default. Add a custom question so the invitee's WhatsApp number appears in the webhook payload.
The question label you use here appears in the webhook payload. If you label it 'WhatsApp Number', the payload will have "question": "WhatsApp Number". Note this exactly; you will use it to extract the phone number in WA.Expert.
In WA.Expert, create a new automation and set the trigger to Inbound Webhook. Copy the unique webhook URL from the trigger settings. This is the URL Calendly will POST to.
If you want to automate the registration, use the API. First get your organisation URI, then register the webhook.
GET https://api.calendly.com/users/me
Authorization: Bearer YOUR_PERSONAL_ACCESS_TOKEN
Response:
{{
"resource": {{
"uri": "https://api.calendly.com/users/AAAA",
"current_organization": "https://api.calendly.com/organizations/BBBB"
}}
}}
Copy: resource.current_organization -> use as the organization value below.POST https://api.calendly.com/webhook_subscriptions
Authorization: Bearer YOUR_PERSONAL_ACCESS_TOKEN
Content-Type: application/json
Body:
{{
"url": "YOUR_WA_EXPERT_WEBHOOK_URL",
"events": ["invitee.created", "invitee.canceled"],
"organization": "https://api.calendly.com/organizations/BBBB",
"scope": "organization"
}}
Response (HTTP 201):
{{
"resource": {{
"uri": "https://api.calendly.com/webhook_subscriptions/CCCC",
"callback_url": "YOUR_WA_EXPERT_WEBHOOK_URL",
"state": "active"
}}
}}
Personal access token from: Calendly → Integrations → API & Webhooks → Generate TokenWhen someone books, Calendly sends a JSON payload like this to your WA.Expert webhook URL:
{{
"event": "invitee.created",
"payload": {{
"event_type": {{"name": "30 Minute Consultation"}},
"name": "Priya Sharma",
"email": "priya@example.com",
"status": "active",
"rescheduled": false,
"calendar_event": {{
"start_time": "2026-06-25T10:00:00Z",
"end_time": "2026-06-25T10:30:00Z"
}},
"questions_and_answers": [
{{
"question": "WhatsApp Number",
"answer": "+919820000001"
}}
],
"cancel_url": "https://calendly.com/cancellations/...",
"reschedule_url": "https://calendly.com/reschedulings/..."
}}
}}
Map these to WA.Expert variables:
payload.name -> customer_name
payload.email -> customer_email
payload.questions_and_answers[0].answer -> customer_phone
payload.calendar_event.start_time -> appointment_start
payload.event_type.name -> event_type
payload.cancel_url -> cancel_url
payload.reschedule_url -> reschedule_url
payload.rescheduled -> is_rescheduledKey fields at a glance:
| WA.Expert variable | Payload path | Example value |
|---|---|---|
| customer_name | payload.name | Priya Sharma |
| customer_phone | payload.questions_and_answers[0].answer | +919820000001 |
| customer_email | payload.email | priya@example.com |
| appointment_start | payload.calendar_event.start_time | 2026-06-25T10:00:00Z |
| event_type | payload.event_type.name | 30 Minute Consultation |
| cancel_url | payload.cancel_url | https://calendly.com/cancellations/... |
| reschedule_url | payload.reschedule_url | https://calendly.com/reschedulings/... |
| is_rescheduled | payload.rescheduled | false (true on a rescheduled booking) |
The questions_and_answers array index depends on the order of questions in your event type. If WhatsApp Number is the first question, use index [0]. If it is the second, use [1]. Check the payload in WA.Expert's test mode to confirm.
1. Priya books a 30-minute consultation on your Calendly page.
She enters her WhatsApp number: +919820000001.
2. Calendly fires the invitee.created webhook to WA.Expert.
3. WA.Expert receives the payload and maps variables:
customer_name = Priya Sharma
customer_phone = +919820000001
appointment_start = 2026-06-25T10:00:00Z
event_type = 30 Minute Consultation
4. WA.Expert sends Priya a confirmation:
'Hi Priya, your 30 Minute Consultation is confirmed for
25 June at 10:00 AM IST.
Need to reschedule? Tap here: {{reschedule_url}}'
5. WA.Expert sends your team an alert:
'New booking: Priya Sharma (+919820000001)
30 Minute Consultation — 25 June at 10:00 AM
Email: priya@example.com'Subscribe to invitee.canceled to handle
cancellations. A reschedule fires both an
invitee.canceled (for the old slot) and an
invitee.created (for the new slot). The new booking
has rescheduled: true in the payload.
| Calendly event | payload.rescheduled | WA.Expert action |
|---|---|---|
| invitee.created | false | Send a booking confirmation to the invitee. |
| invitee.created | true | Send a reschedule confirmation: 'Your appointment has been moved to...'. |
| invitee.canceled | n/a | Send a cancellation message and optionally re-engage: 'Your slot has been cancelled. Book again here: [link]'. |
| Symptom | Likely cause | Fix |
|---|---|---|
| No webhook firing | Using old API v1 webhook | Rebuild the webhook in Calendly Integrations using v2. API v1 was discontinued May 2025. |
| Webhook not available in Integrations | Free Calendly plan | Webhooks need Standard plan or above. Upgrade or use Zapier as a bridge. |
| Phone number missing from payload | WhatsApp Number question not added | Edit the event type and add a WhatsApp Number question (Required). Test with a new booking after saving. |
| Wrong phone at questions_and_answers index | Multiple custom questions | The index depends on question order. Check the full payload in WA.Expert test mode to find the correct index for your WhatsApp Number question. |
| Reschedule sending duplicate confirmations | Not checking rescheduled field | Add a conditions step: if is_rescheduled = true, send a reschedule message; if false, send a new booking confirmation. |
| Webhook shows active but no messages | WA.Expert automation not published | Ensure the WA.Expert automation is published (not in draft). The webhook URL only receives calls when the automation is live. |
Create Google Calendar events from WhatsApp bookings using Apps Script.
Read guide →Typeform native webhooks: send WhatsApp messages when a form is submitted.
Read guide →Free trial, no credit card. If you get stuck, we answer live on WhatsApp.