ElevenLabs to Cal.com, book calls during the chat
Your “quick call” turns into five emails, two missed replies, and a calendar link the lead never clicks. Meanwhile, you’re stuck playing human scheduler, and the best prospects quietly move on.
Sales managers feel this in the pipeline. Clinic admins feel it at the front desk. Consultants and coaches deal with it too, especially when the ElevenLabs Cal.com booking experience is supposed to be frictionless but isn’t.
This workflow lets callers book in real time, during the conversation. You’ll see how it checks Cal.com availability, books the slot, and responds instantly, so your team stops doing the scheduling dance.
How This Automation Works
See how this solves the problem:
n8n Workflow Template: ElevenLabs to Cal.com, book calls during the chat
flowchart LR
subgraph sg0["Flow 1"]
direction LR
n0["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/webhook.dark.svg' width='40' height='40' /></div><br/>Webhook"]
n1["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/webhook.dark.svg' width='40' height='40' /></div><br/>Respond to Webhook"]
n2["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Check available slot in Cal..."]
n3["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Book an Appointment"]
n4@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Check Is Request For Availab..", pos: "b", h: 48 }
n0 --> n4
n3 --> n1
n2 --> n1
n4 --> n2
n4 --> n3
end
%% Styling
classDef trigger fill:#e8f5e9,stroke:#388e3c,stroke-width:2px
classDef ai fill:#e3f2fd,stroke:#1976d2,stroke-width:2px
classDef aiModel fill:#e8eaf6,stroke:#3f51b5,stroke-width:2px
classDef decision fill:#fff8e1,stroke:#f9a825,stroke-width:2px
classDef database fill:#fce4ec,stroke:#c2185b,stroke-width:2px
classDef api fill:#fff3e0,stroke:#e65100,stroke-width:2px
classDef code fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
classDef disabled stroke-dasharray: 5 5,opacity: 0.5
class n4 decision
class n0,n1,n2,n3 api
classDef customIcon fill:none,stroke:none
class n0,n1,n2,n3 customIcon
The Challenge: Scheduling Friction During Live Conversations
Booking should be the easiest part of a great call. But in real life, the moment someone says “Can we meet next week?”, your process often falls apart. The caller is thinking in real time, but your scheduling is asynchronous: you send a link, they get distracted, the slot disappears, and now you’re back to negotiating times. It’s mentally draining because you have to keep context in your head (time zones, meeting length, buffers, who owns the calendar) while still trying to keep the conversation warm and confident.
It adds up fast. Here’s where it breaks down.
- Live calls end with “I’ll send a link,” which pushes commitment to later and lowers show-up rates.
- Teams double-book when someone confirms a time verbally, but nobody actually reserves it in the calendar.
- Time zone confusion sneaks in, especially when callers speak loosely (“around 3-ish tomorrow”).
- Every manual follow-up steals focus from higher-value work like closing deals or supporting patients.
The Fix: Voice-Driven Booking That Checks and Reserves Slots
This automation turns your scheduling into a real-time conversation, not a post-call chore. When an inbound voice agent (powered by ElevenLabs) needs to check times or book a meeting, it calls an n8n webhook behind the scenes. n8n inspects the request to decide what the caller is trying to do: check availability or confirm a booking. If it’s just a check, the workflow queries Cal.com availability and returns a clear answer that the voice agent can say out loud. If the caller confirms a time, n8n sends a booking request to Cal.com, locks the slot, and returns a confirmation message immediately. No tab-switching. No “hang on while I look.”
The workflow begins when ElevenLabs sends a tool request into n8n. n8n either checks Cal.com for open times or books the appointment, then responds to the webhook so the agent can confirm the result verbally.
What Changes: Before vs. After
| What This Eliminates | Impact You’ll See |
|---|---|
|
|
Real-World Impact
Say your team books 8 calls a day. Manually, a rep usually spends about 10 minutes per booking: checking Cal.com, confirming the time, sending the invite, and fixing mistakes when the slot is gone. That’s roughly 80 minutes daily. With this workflow, the caller proposes a time, n8n checks availability in seconds, and booking happens the moment they say “yes.” You’re left with near-zero admin time per call, plus fewer reschedule threads.
Requirements
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- ElevenLabs to run the voice agent and tools
- Cal.com for availability checks and bookings
- Cal.com API key (generate it in Cal.com settings)
Skill level: Intermediate. You’ll paste webhook URLs into ElevenLabs and connect Cal.com credentials in n8n.
Need help implementing this? Talk to an automation expert (free 15-minute consultation).
The Workflow Flow
A webhook receives the voice agent’s request. ElevenLabs calls your n8n webhook whenever it needs to check a slot or finalize a booking.
The request is classified as “check” or “book”. An if-condition reviews the incoming payload so n8n doesn’t guess what to do. It routes the call down the right path.
Cal.com is queried or updated via HTTP requests. For availability, the workflow hits the Cal.com API and pulls back open times. For booking, it posts the meeting details to reserve the slot.
A response is returned instantly to the caller experience. n8n responds to the webhook with a clean success or “try another time” message, which ElevenLabs reads out in a natural voice.
You can easily modify the meeting type, buffers, and fallback messages to match your scheduling rules. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Webhook Trigger
Set up the incoming webhook that receives appointment inquiries and kicks off the workflow.
- Add the Incoming Webhook Trigger node and set HTTP Method to
POST. - Set Path to
appointment-webhook. - Set Response Mode to
responseNodeso the response will be sent from Return Webhook Response.
Step 2: Add Slot Verification Logic
Route incoming requests based on whether the payload is asking to check availability or create a booking.
- Add the Verify Slot Inquiry node and connect it to Incoming Webhook Trigger.
- Configure the condition to compare Left Value to
{{ $json.body.tool }}and set Operator to equals. - Set Right Value to
checkAvailableSlot. - Understand the branching: Verify Slot Inquiry outputs to Check Calendar Availability on the “true” path, and to Create Booking Request on the “false” path.
$json.body.tool is missing or misspelled in the webhook payload, the flow will always follow the “false” path to Create Booking Request.Step 3: Connect Cal.com and Check Availability
Configure the availability lookup against Cal.com to validate slots before booking.
- Add the Check Calendar Availability node and connect it from the “true” output of Verify Slot Inquiry.
- Set URL to
https://api.cal.com/v1/slotsand enable Send Query. - Add query parameters:
- startTime =
{{ $json.body.startTime }} - endTime =
{{DateTime.fromISO($json.body.startTime, { zone: 'Asia/Kolkata' }) .set({ hour: 18, minute: 0, second: 0 }) .format("yyyy-MM-dd'T'HH:mm:ssZZ")}} - eventTypeId =
[YOUR_ID] - timeZone =
Asia/Kolkata
- startTime =
- Credential Required: Connect your
calApicredentials.
Step 4: Create Booking Requests
Configure booking creation in Cal.com for requests that aren’t availability checks.
- Add the Create Booking Request node and connect it from the “false” output of Verify Slot Inquiry.
- Set URL to
https://api.cal.com/v1/bookingsand Method toPOST. - Set Specify Body to
jsonand use the following JSON Body: { "eventTypeId": "[YOUR_ID]", "start": "{{ $json.body.startTime }}", "end": "{{ DateTime.fromISO($json.body.startTime).plus({ minutes: 30 }).format("yyyy-MM-dd'T'HH:mm:ssZZ") }}", "responses": { "name": "{{ $json.body.name }}", "email": "{{ $json.body.email }}" }, "timeZone": "Asia/Kolkata", "language": "en", "title": "Test", "metadata":{} }- Credential Required: Connect your
calApicredentials.
[YOUR_ID] with your real Cal.com event type ID in both Check Calendar Availability and Create Booking Request to avoid API errors.Step 5: Configure the Webhook Response
Return data back to the caller after availability checks or booking creation.
- Add the Return Webhook Response node.
- Connect both Check Calendar Availability and Create Booking Request to Return Webhook Response.
- Leave default settings unless you want to customize the response payload.
Step 6: Test and Activate Your Workflow
Run a full end-to-end test to ensure webhooks, routing, and Cal.com calls work as expected.
- Click Execute Workflow and send a sample POST request to the Incoming Webhook Trigger test URL.
- Verify that a payload with
{"tool":"checkAvailableSlot"}routes to Check Calendar Availability and returns availability through Return Webhook Response. - Verify that a payload without that tool value routes to Create Booking Request and returns the booking response through Return Webhook Response.
- Once successful, toggle the workflow to Active and use the production webhook URL.
Watch Out For
- Cal.com credentials can expire or lack the right scopes. If availability checks suddenly fail, look in your n8n Credentials and re-test the Cal.com connection first.
- If you add waits or the caller’s speech-to-intent is slow, processing times vary. Increase the timeouts so the webhook response doesn’t return before Cal.com replies.
- ElevenLabs prompts tend to be generic out of the box. Add your scheduling rules (time zone handling, buffers, required fields like name and email) early or you’ll be correcting bookings later.
Common Questions
Usually about an hour once your Cal.com API key is ready.
Yes, but you will need someone comfortable copying webhook URLs and testing a few calls. No coding, just careful setup and permissions.
Yes. n8n has a free self-hosted option and a free trial on n8n Cloud. Cloud plans start at $20/month for higher volume. You’ll also need to factor in ElevenLabs usage and any Cal.com plan costs tied to your account.
Two options: n8n Cloud (managed, easiest setup) or self-hosting on a VPS. For self-hosting, Hostinger VPS is affordable and handles n8n well. Self-hosting gives you unlimited executions but requires basic server management.
Start in ElevenLabs: tighten the system prompt so it always collects the fields you require (name, email, meeting reason). In n8n, you can adjust the “Verify Slot Inquiry” logic to recognize your own phrasing, then swap the Cal.com HTTP endpoints if your account uses different event types. Common tweaks include adding a confirmation email/SMS after booking, enforcing business-hour rules, and routing certain callers to a different calendar.
Most of the time it’s an invalid or expired Cal.com API key saved in n8n credentials. It can also be the wrong endpoint for your Cal.com setup, or missing permissions on the event type you’re trying to book. If failures happen only during busy periods, rate limits and timeouts are another common culprit.
If you self-host, capacity mostly depends on your server and Cal.com API limits, not n8n itself.
Often, yes. Voice-driven booking usually needs branching logic (“check” vs “book”), clean webhook responses, and retries when a slot is taken, and that’s frankly easier to control in n8n. You also get the self-hosting option, which matters once call volume grows and per-task pricing starts to sting. Zapier or Make can still work if you only need a simple “create event” action after a form submission, not a back-and-forth scheduling conversation. If you’re torn, Talk to an automation expert and we’ll map it to your exact flow.
Once this is live, scheduling stops being a follow-up task and becomes part of the call itself. Set it up, test it a few times, and let the workflow handle the repetitive part so your team can stay focused.
Need Help Setting This Up?
Our automation experts can build and customize this workflow for your specific needs. Free 15-minute consultation—no commitment required.