Telefonen ringer mitt i lunchruschen, någon ber om ett bord ”runt 7”, och du klottrar ner det på det som råkar ligga närmast. Sen kan du inte tyda det. Eller så glömmer du att bekräfta. Så försvinner bokningar tyst och utan att någon märker det.
Den här typen av strul drabbar restaurangägare först, men front-of-house-chefer och marknadspersonen som kör ”Boka nu”-kampanjer känner av det också. Med VAPI booking automation blir samtal till bekräftade reservationer som lagras i PostgreSQL, så du slipper jaga ikapp hela kvällen.
Nedan ser du exakt vad arbetsflödet gör, vad du får ut av det och vad du behöver för att köra det stabilt.
Så här fungerar automatiseringen
Hela n8n-arbetsflödet, från trigger till slutlig output:
n8n Workflow Template: VAPI + PostgreSQL: omvandla samtal till bokningar
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/>Trigger: Voice Request (VAPI)"]
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/postgres.svg' width='40' height='40' /></div><br/>Update Data (Table Booking /.."]
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/webhook.dark.svg' width='40' height='40' /></div><br/>Respond: Booking/Order Confi.."]
n3@{ icon: "mdi:cog", form: "rounded", label: "Wait For Response", pos: "b", h: 48 }
n3 --> n1
n0 --> n3
n1 --> n2
end
subgraph sg1["Flow 2"]
direction LR
n4@{ icon: "mdi:cog", form: "rounded", label: "Wait For Response1", pos: "b", h: 48 }
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/>Trigger: Info Request (VAPI)"]
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/postgres.svg' width='40' height='40' /></div><br/> Get Restaurant Info (Postgr.."]
n7["<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: Restaurant Details .."]
n4 --> n7
n5 --> n6
n6 --> n4
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,n6 database
class n0,n2,n5,n7 api
classDef customIcon fill:none,stroke:none
class n0,n1,n2,n5,n6,n7 customIcon
Problemet: telefonsamtal skapar ”osynliga” bokningsförluster
Reservationssamtal är bedrägligt dyra. Inte för att varje samtal tar evigheter, utan för att de alltid kommer vid sämsta möjliga tillfälle: fullt i entrén, servisen ställer frågor, kön växer vid dörren. Du sätter någon i vänteläge, de lägger på. Eller så tar du detaljerna snabbt och får aldrig iväg en riktig bekräftelse. Sen kommer uppföljningshuvudvärken: leta i samtalsloggar, mata in detaljer i ett system i efterhand och försöka minnas vilken ”John” som ville sitta i en bås. Det är ärligt talat utmattande.
Friktionen byggs på. Ett missat samtal är irriterande. Några per vecka blir ett intäktsproblem.
- Samtal avbryter servicen, vilket gör att teamet måste dela upp fokus under peak-timmar.
- Handskrivna lappar och rutinen ”jag lägger in det sen” leder till dubbelbokningar och uteblivna gäster.
- Kunder förväntar sig omedelbar bekräftelse, och tystnad gör att de bokar någon annanstans.
- Även när du fångar bokningen blir uppgifterna ofta inkonsekventa, vilket gör att rapportering och bemanningsbeslut blir röriga.
Lösningen: VAPI svarar, bekräftar och skriver till PostgreSQL
Det här arbetsflödet förvandlar inkommande röstförfrågningar till felfria, strukturerade databasposter. När någon ringer för att boka bord tar arbetsflödet emot förfrågan via VAPI, väntar tills samtalet är klart och sparar sedan reservationen i din PostgreSQL-tabell bookings med de viktiga detaljerna (namn, telefonnummer, sällskapets storlek, datum, tid, specialönskemål och status). Därefter skickas en bekräftelse tillbaka till uppringaren i ett naturligt röst-svar, så kunden hör detaljerna och du får en korrekt post direkt.
Det hanterar också den andra typen av samtal som äter tid: ”Har ni öppet på söndagar?” eller ”Var kan jag parkera?” Sådana informationsfrågor går via ett andra intag, hämtar rätt svar från din PostgreSQL-tabell restaurant_info och svarar tillbaka via VAPI. Du uppdaterar informationen en gång i databasen och assistenten håller sig konsekvent, även när personalen roterar.
Arbetsflödet startar med två webhooks (en för bokningar, en för info). Sedan ger Wait-noder röstinteraktionen tid att bli klar och att data hinner laddas korrekt. Till sist uppdateras eller frågas PostgreSQL, och ett röst-svar returneras via webhook-svaret.
Vad du får: automatisering vs. resultat
| Vad det här arbetsflödet automatiserar | Resultat du får |
|---|---|
|
|
Exempel: så här ser det ut i praktiken
Säg att din restaurang får cirka 20 boknings- eller infosamtal en fredag. Manuellt tar även ett ”snabbt” samtal kanske 4 minuter mellan att svara, reda ut detaljer och bekräfta, vilket blir ungefär 80 minuter av avbrott. Med det här arbetsflödet lägger du nära 0 minuter på de flesta av de samtalen: webhooken triggas direkt, VAPI sköter dialogen och PostgreSQL uppdateras i bakgrunden. Du behöver oftast bara kliva in vid något enstaka specialfall, så du vinner tillbaka runt en timme de kvällar det verkligen spelar roll.
Det här behöver du
- n8n-instans (prova n8n Cloud gratis)
- Alternativ för egen drift om du föredrar det (Hostinger fungerar bra)
- VAPI för att ta emot och besvara röstsamtal
- PostgreSQL för tabellerna för bokningar, beställningar och restauranginfo
- VAPI API-uppgifter (hämtas i din VAPI-dashboard)
Kunskapsnivå: Medel. Du kopplar konton, sätter webhook-endpoints och skapar PostgreSQL-tabellerna från det angivna schemat.
Vill du inte sätta upp det själv? Prata med en automationsexpert (gratis 15-minuters konsultation).
Så fungerar det
En kund ringer och röstförfrågan når n8n. Arbetsflödet börjar med en webhook som tar emot VAPI:s payload för samtalet, inklusive vad uppringaren vill göra och de extraherade detaljerna från dialogen.
Arbetsflödet väntar tills samtalet har landat. En kort Wait används så att assistenten hinner samla in bokningsdetaljer (sällskapets storlek, önskat datum och tid samt specialönskemål) innan något sparas eller besvaras.
Bokningar sparas (eller uppdateras) i PostgreSQL. Arbetsflödet gör en upsert till din tabell bookings, så du får en felfri post per reservation, med status och tidsstämpel som du kan granska i efterhand.
Uppringaren får en bekräftelse eller ett infosvar. För bokningar returnerar webhook-svaret en uppläst bekräftelse med reservationsdetaljer. För informationsfrågor görs en fråga mot PostgreSQL-tabellen restaurant_info, och ett svar i naturligt språk skickas tillbaka till VAPI.
Du kan enkelt justera formuleringen i bekräftelsen så att den matchar er ton utifrån era behov. Se hela implementationsguiden nedan för anpassningsalternativ.
Steg-för-steg-guide för implementering
Steg 1: Konfigurera webhook-triggern
Sätt upp de två webhook-ingångarna som startar respektive flöde: bokningsförfrågningar och informationsförfrågningar.
- Lägg till en webhook-nod Voice Request Intake och ställ in HTTP Method på
POST. - Ställ in Path på
9f6b9125-0b75-41c2-87a9-1b6746c89e2eoch ställ in Response Mode påresponseNode. - Lägg till en webhook-nod Info Request Intake och ställ in HTTP Method på
POST. - Ställ in Path på
efe2c13f-1ba5-46e1-9996-57bdc6041973och ställ in Response Mode påresponseNode.
⚠️ Vanlig fallgrop: Båda webhook-noderna måste använda responseNode så att motsvarande noder Return Booking Confirmation och Return Restaurant Info kan skicka HTTP-svaret.
Steg 2: Anslut Postgres för dataoperationer
Konfigurera databasnoder för att upserta bokningar och hämta restaurangdetaljer.
- Lägg till Upsert Booking Records och ställ in Operation på
upsert, Schema påpublicoch Table påid. - Inloggningsuppgifter krävs: Anslut era postgres-inloggningsuppgifter i Upsert Booking Records.
- Lägg till Fetch Restaurant Details och ställ in Operation på
select, Schema påpublicoch Table påid. - Inloggningsuppgifter krävs: Anslut era postgres-inloggningsuppgifter i Fetch Restaurant Details.
⚠️ Vanlig fallgrop: Verifiera att tabellen id och kolumnerna finns i schemat public innan ni kör workflowet, annars kommer upsert/select att misslyckas.
Steg 3: Sätt upp väntnoder för asynkrona svar
Dessa väntnoder pausar körningen tills ett callback eller en extern åtgärd återupptar flödet.
- Lägg till Await Booking Reply och koppla Voice Request Intake → Await Booking Reply.
- Lägg till Await Info Reply och koppla Fetch Restaurant Details → Await Info Reply.
- Säkerställ att Await Booking Reply skickar output till Upsert Booking Records och att Await Info Reply skickar output till Return Restaurant Info så att det matchar körflödet.
Körordningen är linjär utan parallella grenar: Voice Request Intake → Await Booking Reply → Upsert Booking Records → Return Booking Confirmation, och Info Request Intake → Fetch Restaurant Details → Await Info Reply → Return Restaurant Info.
Steg 4: Konfigurera webhook-svar
Returnera JSON-svar till de ursprungliga webhook-anroparna med tool call-id:n och resultat.
- I Return Booking Confirmation ställer ni in Respond With på
jsonoch Response Body på={ "results": [ { "toolCallId": "{{ $('Voice Request Intake').item.json.body.message.toolCalls[0].id }}", "result": "{{ $json.status }}" } ] }. - I Return Restaurant Info ställer ni in Respond With på
jsonoch Response Body på={ "results": [ { "toolCallId": "{{ $('Info Request Intake').item.json.body.message.toolCalls[0].id }}", "result": "{{ $json.available }}" } ] }. - Koppla Upsert Booking Records → Return Booking Confirmation och Await Info Reply → Return Restaurant Info.
⚠️ Vanlig fallgrop: Uttrycken i svarstexten refererar till Voice Request Intake och Info Request Intake. Säkerställ att dessa noder körs i samma exekvering så att uttrycken kan lösas.
Steg 5: Testa och aktivera ert workflow
Validera båda webhook-sökvägarna och säkerställ att databasoperationer och svar fungerar hela vägen.
- Använd Execute Workflow och skicka en POST-begäran till webhook-URL:en för Voice Request Intake med exempeldata för bokningspayload.
- Bekräfta att Upsert Booking Records körs och att Return Booking Confirmation returnerar ett JSON-svar som innehåller
toolCallIdochstatus. - Skicka en POST-begäran till webhook-URL:en för Info Request Intake och verifiera att Fetch Restaurant Details körs, och att Return Restaurant Info därefter returnerar värdet
available. - När testerna är lyckade växlar ni workflowet till Active för att aktivera användning i produktion.
Vanliga fallgropar
- VAPI-uppgifter kan löpa ut eller kräva specifika behörigheter. Om det skapar fel, kontrollera först nycklarna i din VAPI-dashboard och webhook-inställningarna.
- Om du använder Wait-noder eller extern röstbearbetning varierar processtiderna. Öka väntetiden om efterföljande noder fallerar på tomma svar.
- PostgreSQL-inserts misslyckas tyst när tabellens schema inte matchar dina fält. Dubbelkolla kolumnnamn som booking_time, party_size och status innan du skyller på webhooken.
Vanliga frågor
Cirka 45 minuter om din PostgreSQL-databas är redo.
Nej. Du kopplar främst VAPI, klistrar in uppgifter och mappar fält till PostgreSQL. Du kan behöva lite copy-paste för tabellschemat.
Ja. n8n har ett gratisalternativ 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 VAPI:s röstkostnader per minut för live-samtal.
Två alternativ: n8n Cloud (hanterat, enklast att komma igång) eller egen drift på en VPS. För egen drift är Hostinger VPS prisvärd och klarar n8n bra. Egen drift ger obegränsade körningar men kräver grundläggande serverhantering.
Ja, men planera datamodellen först. De flesta team lägger till ett fält location_id i tabellen bookings och routar sedan samtal till rätt enhet baserat på det uppringda numret eller en snabb fråga i röstflödet. Du kan också dela upp intaget genom att använda separata webhooks per enhet i n8n och sedan skriva till samma PostgreSQL-databas med olika location-värden. Om du vill ha olika manus per enhet ändrar du bekräftelsetexten som returneras i svaret ”Return Booking Confirmation”.
Oftast är det en ogiltig eller roterad API-nyckel i VAPI, eller att webhook-URL:en i VAPI inte matchar din n8n-produktions-URL. Kontrollera också att ditt n8n-arbetsflöde är aktivt och nåbart från publika internet (egenhostade instanser blockeras ofta av brandväggsregler). Om felen bara sker under rusningstid kan du slå i rate limits eller timeouts, så att öka Wait-tiden kan hjälpa.
Det beror på din hosting, men den är byggd för att hantera flera samtidiga röstförfrågningar. På n8n Cloud begränsas du av dina månatliga körningar, medan egen drift främst begränsas av serverresurser och databasprestanda. För många mindre restauranger är det realistiskt att hantera dussintals samtal per timme om PostgreSQL är indexerat och din VAPI-plan stödjer volymen. Om du förväntar dig kraftiga toppar, testa med en simulering av en busy hour innan du går live.
För röstflöden som detta är n8n oftast ett bättre val eftersom du styr webhooks, väntetider och databasskrivningar utan att betala extra för grenad logik. Zapier och Make kan fungera, men det blir klumpigt när du behöver två separata intag (bokning vs info) och vill göra en tillförlitlig upsert till PostgreSQL. En annan praktisk punkt: egen drift av n8n kan göra körkostnaderna mer förutsägbara när samtalsvolymen ökar. Om ditt use case bara är ”skicka mig ett mejl när någon ringer” är Zapier helt okej. Om du vill ha bekräftade bokningar i en riktig databas är det här den typ av arbetsflöde där n8n verkligen levererar. Prata med en automationsexpert om du vill ha en snabb rekommendation.
När detta väl är igång kan telefonen ringa hur mycket den vill. Bokningarna hamnar ändå i PostgreSQL, bekräftelserna går iväg, och teamet kan fortsätta fokusera på gästerna framför sig.
Kontakta oss
Hör av dig, så diskuterar vi hur just din verksamhet kan dra nytta av alla fantastiska möjligheter som AI skapar.