Telefonen ringer, någon frågar om tillgänglighet och sedan… tystnad. Du är upptagen, de har bråttom, och “jag ringer tillbaka” blir aldrig en bokning.
Här betalar sig automatisering för Vapi Cal.com booking. Tjänsteleverantörer tappar tider på missade samtal, driftsansvariga dras in i schema-städning, och byråer som bygger AI-receptionister slutar med att tejpa ihop intentsignalering med en kalender.
Det här arbetsflödet gör om ett naturligt röstsamtal till riktiga bokningsåtgärder i Cal.com. Du får se vad det automatiserar, vad det förändrar i vardagen och vad du behöver för att köra det stabilt.
Så fungerar automatiseringen
Hela n8n-arbetsflödet, från trigger till slutresultat:
n8n Workflow Template: Vapi + Cal.com: samtal blir bokade möten
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@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Switch", pos: "b", h: 48 }
n2@{ icon: "mdi:swap-vertical", form: "rounded", label: "Set Variables", pos: "b", h: 48 }
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/>Check Availability"]
n4["<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 Appointment"]
n5["<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/>Booking SuccessFul"]
n6["<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/>Check Availability successful"]
n7@{ icon: "mdi:swap-vertical", form: "rounded", label: "Prepare Payload Fields", pos: "b", h: 48 }
n8@{ icon: "mdi:swap-vertical", form: "rounded", label: "Extract Start & End Time", pos: "b", h: 48 }
n1 --> n8
n1 --> n4
n0 --> n2
n2 --> n7
n4 --> n5
n3 --> n6
n7 --> n1
n8 --> 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 n1 decision
class n0,n3,n4,n5,n6 api
class n0 disabled
classDef customIcon fill:none,stroke:none
class n0,n3,n4,n5,n6 customIcon
Problemet: samtal blir inte till bekräftade bokningar
Bokning via telefon låter enkelt tills du är den som ska jonglera allt. Uppringare frågar “när har ni nästa lediga tid?” och du sätter dem i kö, ber dem sms:a eller lovar att ringa upp. Under tiden hinner kalendern ändras, uppringaren tappar tålamodet och tiden försvinner. Även när du bokar blir det ofta att du skriver in namn, tider och anteckningar från minnet. Ett litet misstag blir en dubbelbokning, ett uteblivet besök eller en kund som dyker upp vid fel tid. Ärligt talat är det den typen av friktion som i tysthet sätter ett tak för hur mycket du kan växa.
Inget av detta är problemet i sig. Tillsammans är det det.
- Missade samtal under rusningstid innebär tappade bokningar som aldrig kommer tillbaka.
- Manuellt “kolla tillgänglighet” fram och tillbaka tar cirka 10 minuter per förfrågan.
- Att föra över detaljer från ett samtal till ett bokningsformulär bjuder in till stavfel och fel tidszoner.
- Utan konsekventa bekräftelser dyker kunder upp osäkra, eller inte alls.
Lösningen: röstintention → schemaläggning i realtid i Cal.com
Det här arbetsflödet kopplar din Vapi-röstagent till Cal.com så att uppringaren antingen kan kontrollera tillgänglighet eller boka en tid genom en naturlig dialog. Det startar när Vapi skickar samtalsdata till n8n via en webhook. Därefter förbereder n8n bokningsinställningar, bygger en korrekt formaterad request-payload och routar dialogen baserat på intention (till exempel “kolla tillgänglighet” kontra “boka nu”). Om uppringaren vill se tider räknar arbetsflödet fram ett tidsfönster och hämtar live-tillgänglighet från Cal.com via ett API-anrop. Om de vill boka skapar det bokningen i Cal.com och skickar omedelbart ett bekräftelsesvar tillbaka till Vapi, så att röstagenten kan läsa upp det.
Arbetsflödet börjar med ett webhook-meddelande från Vapi. Sedan routar n8n intentionen och anropar rätt Cal.com-endpoint för antingen tillgänglighet eller bokning. Till sist svarar det på webhooken med ett konversationsanpassat svar som Vapi kan läsa upp för uppringaren.
Det du får: automatisering vs resultat
| Det här arbetsflödet automatiserar | Resultat du får |
|---|---|
|
|
Exempel: så här kan det se ut
Säg att ditt företag får cirka 20 bokningsrelaterade samtal i veckan, och ungefär hälften av dem är bara “har ni något på fredag?”. Om varje samtal tar runt 10 minuter för att kontrollera, föreslå tider och bekräfta detaljer, är det cirka 2 timmar rent schemaläggningsarbete. Med det här arbetsflödet frågar uppringaren en gång, Vapi skickar intentionen och Cal.com returnerar live-alternativ. Bokning följer samma flöde. Du lägger kanske en minut på att granska specialfall i stället för att leva i kalendern.
Det här behöver du
- n8n-instans (testa n8n Cloud gratis)
- Alternativ för egen drift om du föredrar det (Hostinger fungerar bra)
- Vapi för att fånga samtalsljud och intention
- Cal.com för att kontrollera tillgänglighet och skapa bokningar
- Cal.com API-token (hämta den i dina Cal.com API-inställningar)
Svårighetsgrad: Medel. Du kopplar en webhook, lägger in en API-token och testar ett par intentionsvägar.
Vill du inte sätta upp detta själv? Prata med en automatiseringsexpert (gratis 15-minuters konsultation).
Så fungerar det
Vapi skickar dialogen till n8n. När uppringaren säger vad de vill, vidarebefordrar Vapi den strukturerade förfrågan till en n8n-webhook så att arbetsflödet kan svara i realtid.
Arbetsflödet förbereder förfrågan och identifierar intention. n8n initierar bokningsinställningar, sätter ihop en korrekt formaterad payload och routar sedan förfrågan genom intentionslogik så att rätt Cal.com-åtgärd sker utan gissningar.
Cal.com frågas eller uppdateras. Om uppringaren kontrollerar tider tar n8n fram ett tidsfönster och hämtar tillgänglighet. Om de bokar skickar det en bokningsförfrågan till Cal.coms API med din token.
Ett uppläst svar går tillbaka till uppringaren. n8n returnerar en bekräftelse (eller tillgängliga alternativ) via “Respond to Webhook”, som Vapi omvandlar till ett naturligt röstsvar.
Du kan enkelt ändra tidsfönstret och intentionsreglerna så att de matchar hur din verksamhet faktiskt schemalägger. Se hela implementationsguiden nedan för anpassningsalternativ.
Steg-för-steg-guide för implementering
Steg 1: konfigurera webhook-triggern
Det här arbetsflödet startar när en POST-begäran träffar er webhook-endpoint.
- Lägg till noden Incoming Webhook Trigger och ställ in HTTP Method på
POST. - Ställ in Path på
308f0eec-8459-4e6c-bf25-5cd9b2c31ad6. - Ställ in Response Mode på
responseNodeså att svar skickas av svars-noderna.
Steg 2: initiera bokningsinställningar och bygg payloaden
Definiera bokningskonstanter och sätt ihop request body från webhook-payloaden.
- I Initialize Booking Settings, ställ in följande tilldelningar: username till
nabin-bhandari11, eventTypeSlug till30 minoch eventTypeId till2964463. - I Assemble Request Payload, lägg till en tilldelning med name
bodyoch value={{ $('Incoming Webhook Trigger').item.json.body }}. - Koppla Incoming Webhook Trigger → Initialize Booking Settings → Assemble Request Payload.
Steg 3: routa intent och härled tillgänglighetsfönstret
Routa förfrågningar baserat på intent och beräkna ett tidsfönster för tillgänglighetskontroller.
- I Route Intent Logic, ställ in regeln Check Availability med Left Value
={{ $('Incoming Webhook Trigger').item.json.body.message.toolCalls[0].function.name }}och Right Valuecheck-availability. - Ställ in regeln Book Appointment med Left Value
={{ $('Incoming Webhook Trigger').item.json.body.message.toolWithToolCallList[0].function.name }}och Right Valuebook-appointment. - I Derive Time Window, ställ in start till
={{ $('Incoming Webhook Trigger').item.json.body.message.toolCalls[0].function.arguments.requestedappointment }}och end till={{ $('Incoming Webhook Trigger').item.json.body.message.toolCalls[0].function.arguments.requestedappointment.toDateTime().plus(1, 'days') }}. - Koppla Assemble Request Payload → Route Intent Logic → Derive Time Window för grenen för tillgänglighet.
toolCalls och toolWithToolCallList, annars kommer switch-villkoren inte att matcha.Steg 4: konfigurera tillgänglighetsuppslag och svar
Anropa tillgänglighets-endpointen och returnera tider till anroparen.
- I Availability API Request, ställ in URL till
https://api.cal.com/v2/slotsoch aktivera Send Query och Send Headers. - Ställ in query-parametrar: start till
={{ $json[' start'] }}, end till={{ $json[' end'] }}och eventTypeId till={{ $('Initialize Booking Settings').item.json.eventTypeId }}. - Lägg till headern cal-api-version med värdet
2024-09-04. - Inloggningsuppgifter krävs: Anslut era httpHeaderAuth-uppgifter i Availability API Request.
- I Availability Response, ställ in Response Body till
={ "results": [ { "toolCallId": "{{ $('Incoming Webhook Trigger').item.json.body.message.toolCallList[0].id }}", "result": "{{ $json.data }}" } ] }. - Koppla Derive Time Window → Availability API Request → Availability Response.
Steg 5: konfigurera tidsbokning och bekräftelse
Boka mötet och returnera ett framgångsmeddelande till anroparen.
- I Appointment Booking Request, ställ in URL till
https://api.cal.com/v2/bookingsoch Method tillPOST. - Ställ in JSON Body till
={ "attendee": { "language": "en", "name": "{{ $json.body.message.toolCalls[0].function.arguments.Name }}", "timeZone": "{{ $json.body.message.toolCalls[0].function.arguments.callerTimeZone }}", "email": "{{ $json.body.message.toolCalls[0].function.arguments.Email }}" }, "start": "{{ $json.body.message.toolCallList[0].function.arguments.requestedappointmentdate }}", "eventTypeId": {{ $('Initialize Booking Settings').item.json.eventTypeId }} }. - Lägg till headern cal-api-version med värdet
2024-08-13. - Inloggningsuppgifter krävs: Anslut era httpHeaderAuth-uppgifter i Appointment Booking Request.
- I Booking Confirmation Reply, ställ in Response Body till
={ "results": [ { "toolCallId": "{{ $('Incoming Webhook Trigger').item.json.body.message.toolCallList[0].id }}", "result": "Booking Successful" } ] }. - Koppla utgången Book Appointment från Route Intent Logic till Appointment Booking Request → Booking Confirmation Reply.
toolCallList och toolCalls—verifiera att er indata-JSON matchar dessa sökvägar för att undvika tomma fält.Steg 6: testa och aktivera ert arbetsflöde
Validera hela request-/response-flödet innan ni går live.
- Klicka på Execute Workflow och skicka en POST-begäran till Incoming Webhook Trigger-test-URL:en med en exempel-payload som innehåller
toolCallsoch intent. - För tillgänglighetskontroller, bekräfta att Availability Response returnerar en JSON-lista i
result. - För bokningar, bekräfta att Booking Confirmation Reply returnerar
Booking Successfuloch att bokningen visas i Cal.com. - Aktivera arbetsflödet med Active-reglaget för att börja hantera produktionsanrop.
Vanliga fallgropar
- Cal.com-inloggning kan löpa ut eller kräva specifika behörigheter. Om det skapar fel, kontrollera först din Cal.com API-token och din header auth-konfiguration i n8n-credentials.
- Om du använder Wait-noder eller extern rendering varierar processtiderna. Öka väntetiden om nedströms noder fallerar på tomma svar.
- Standardprompter i AI-noder är generiska. Lägg in er tonalitet tidigt, annars kommer du att redigera output för alltid.
Vanliga frågor
Cirka 30 minuter om dina Vapi- och Cal.com-konton är redo.
Nej. Du kopplar konton, klistrar in en API-token och testar de två intentionsvägarna.
Ja. n8n har ett gratis alternativ för egen drift och en gratis provperiod på n8n Cloud. Cloud-planer börjar på 20 USD/månad för högre volym. Du behöver också räkna med kostnader för Vapi och Cal.com-användning, plus eventuell OpenAI API-användning om du aktiverar AI-bearbetning.
Två alternativ: n8n Cloud (hanterat, enklast att sätta upp) eller egen drift på en VPS. För egen drift är Hostinger VPS prisvärd och hanterar n8n bra. Egen drift ger dig obegränsade körningar, men kräver grundläggande serveradministration.
Ja, men då byter du ut de två Cal.com HTTP Request-anropen mot Calendly-endpoints och justerar request-payloaden som byggs i “Assemble Request Payload”. Vanliga anpassningar är att ändra tidsfönsterlogiken i “Derive Time Window”, lägga till ett loggsteg till Google Sheets eller Supabase, och skärpa intentionsroutingen i Switch-noden så att “omboka” eller “avboka” får en egen väg.
Oftast är det ett API-tokenproblem. Skapa en ny Cal.com API-token, bekräfta att den skickas via HTTP Header Auth och testa sedan noderna Availability API Request och Appointment Booking Request igen. Om det bara fallerar vid hög belastning kan du slå i rate limits eller skicka ett ogiltigt tidsfönster, så kontrollera outputen från “Derive Time Window” och den råa response body:n från Cal.com.
Många, så länge din n8n-plan och server hänger med. I n8n Cloud beror kapaciteten på dina månatliga exekveringar; i egen drift av n8n finns ingen fast exekveringsgräns, men dina VPS-resurser blir taket. I praktiken är arbetsflödet lättviktigt eftersom det är några webhook- och HTTP-anrop. Om du börjar köra hundratals samtal per dag vill du hålla koll på concurrency och lägga till retries för tillfälliga Cal.com API-problem.
Ofta, ja. Röstbaserade bokningsflöden behöver ofta förgreningar (“tillgänglighet” vs “boka”), formning av request och rena webhook-svar, och n8n hanterar det utan att kännas trångt. Egen drift är också viktigt, eftersom hög samtalsvolym kan göra prissättning per körning till en oväntad faktura. Zapier eller Make kan fortfarande vara helt okej för en enkel automation i stil med “ny bokning → skicka ett meddelande”. Vill du ha en second opinion, prata med en automatiseringsexpert.
När detta är live slutar samtal vara avbrott och blir i stället bekräftade bokningar. Sätt upp det en gång och låt sedan arbetsflödet göra det repetitiva, medan du fokuserar på jobbet som folk faktiskt betalar för.
Kontakta oss
Hör av dig, så diskuterar vi hur just din verksamhet kan dra nytta av alla fantastiska möjligheter som AI skapar.