Behöver ert företag hjälp med att implementera AI? Kontakta oss och få prisoffert här →
AI Skolan
januari 22, 2026

Vapi + Cal.com: samtal blir bokade möten

Rickard Andersson Partner, Nodenordic.se

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

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

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.

  1. Lägg till noden Incoming Webhook Trigger och ställ in HTTP MethodPOST.
  2. Ställ in Path308f0eec-8459-4e6c-bf25-5cd9b2c31ad6.
  3. Ställ in Response ModeresponseNode så att svar skickas av svars-noderna.

⚠️ Vanlig fallgrop: Incoming Webhook Trigger är inaktiverad i arbetsflödet. Aktivera den innan test eller driftsättning.

Steg 2: initiera bokningsinställningar och bygg payloaden

Definiera bokningskonstanter och sätt ihop request body från webhook-payloaden.

  1. I Initialize Booking Settings, ställ in följande tilldelningar: username till nabin-bhandari11, eventTypeSlug till 30 min och eventTypeId till 2964463.
  2. I Assemble Request Payload, lägg till en tilldelning med name body och value ={{ $('Incoming Webhook Trigger').item.json.body }}.
  3. Koppla Incoming Webhook TriggerInitialize Booking SettingsAssemble 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.

  1. 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 Value check-availability.
  2. Ställ in regeln Book Appointment med Left Value ={{ $('Incoming Webhook Trigger').item.json.body.message.toolWithToolCallList[0].function.name }} och Right Value book-appointment.
  3. 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') }}.
  4. Koppla Assemble Request PayloadRoute Intent LogicDerive Time Window för grenen för tillgänglighet.

Tips: Säkerställ att er webhook-payload innehåller fälten 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.

  1. I Availability API Request, ställ in URL till https://api.cal.com/v2/slots och aktivera Send Query och Send Headers.
  2. Ställ in query-parametrar: start till ={{ $json[' start'] }}, end till ={{ $json[' end'] }} och eventTypeId till ={{ $('Initialize Booking Settings').item.json.eventTypeId }}.
  3. Lägg till headern cal-api-version med värdet 2024-09-04.
  4. Inloggningsuppgifter krävs: Anslut era httpHeaderAuth-uppgifter i Availability API Request.
  5. I Availability Response, ställ in Response Body till ={ "results": [ { "toolCallId": "{{ $('Incoming Webhook Trigger').item.json.body.message.toolCallList[0].id }}", "result": "{{ $json.data }}" } ] }.
  6. Koppla Derive Time WindowAvailability API RequestAvailability Response.

Steg 5: konfigurera tidsbokning och bekräftelse

Boka mötet och returnera ett framgångsmeddelande till anroparen.

  1. I Appointment Booking Request, ställ in URL till https://api.cal.com/v2/bookings och Method till POST.
  2. 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 }} }.
  3. Lägg till headern cal-api-version med värdet 2024-08-13.
  4. Inloggningsuppgifter krävs: Anslut era httpHeaderAuth-uppgifter i Appointment Booking Request.
  5. 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" } ] }.
  6. Koppla utgången Book Appointment från Route Intent Logic till Appointment Booking RequestBooking Confirmation Reply.

⚠️ Vanlig fallgrop: Boknings-payloaden refererar till fälten 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.

  1. Klicka på Execute Workflow och skicka en POST-begäran till Incoming Webhook Trigger-test-URL:en med en exempel-payload som innehåller toolCalls och intent.
  2. För tillgänglighetskontroller, bekräfta att Availability Response returnerar en JSON-lista i result.
  3. För bokningar, bekräfta att Booking Confirmation Reply returnerar Booking Successful och att bokningen visas i Cal.com.
  4. Aktivera arbetsflödet med Active-reglaget för att börja hantera produktionsanrop.
🔒

Lås upp fullständig steg-för-steg-guide

Få den kompletta implementeringsguiden + nedladdningsbar mall

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

Hur lång tid tar det att sätta upp den här Vapi Cal.com-bokningsautomatiseringen?

Cirka 30 minuter om dina Vapi- och Cal.com-konton är redo.

Behöver jag kunna koda för att automatisera Vapi Cal.com-bokning?

Nej. Du kopplar konton, klistrar in en API-token och testar de två intentionsvägarna.

Är n8n gratis att använda för det här Vapi Cal.com-bokningsarbetsflödet?

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.

Var kan jag hosta n8n för att köra den här automatiseringen?

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.

Kan jag anpassa det här Vapi Cal.com-bokningsarbetsflödet för Calendly i stället för Cal.com?

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.

Varför fallerar min Cal.com-anslutning i det här arbetsflödet?

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.

Hur många samtal kan den här Vapi Cal.com-bokningsautomatiseringen hantera?

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.

Är den här Vapi Cal.com-bokningsautomatiseringen bättre än att använda Zapier eller Make?

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.

×

Använd mall

Få direkt tillgång till denna n8n-arbetsflödes JSON-fil

Få prisoffert redan idag!
Få prisoffert redan idag!

Berätta vad ni behöver hjälp med så hör vi av oss inom en arbetsdag!

Få prisoffert redan idag!
Få prisoffert redan idag!

Berätta vad ni behöver hjälp med så hör vi av oss inom en arbetsdag!

Launch login modal Launch register modal