Waarom een WhatsApp-chatbot voor je restaurant?
Restaurant De Gouden Lepel in Amsterdam krijgt elke dag tientallen berichten binnen via WhatsApp. Gasten vragen naar beschikbaarheid voor dinsdagavond, willen weten of er een veganistische optie is op de kaart, of vragen simpelweg hoe laat de keuken sluit. Eigenaar Yannick Berkhout heeft zes medewerkers, 35 couverts en geen receptionist die de hele dag achter zijn telefoon zit.
De oplossing: een geautomatiseerde chatbot via n8n die WhatsApp-berichten ontvangt, ze laat analyseren door Claude (claude-sonnet-4-6), en vervolgens automatisch een passend antwoord terugstuurt. Reserveringsverzoeken worden automatisch gelogd in Google Sheets, zodat het personeel ze kan verwerken zonder iets te missen.
In deze handleiding bouw je exact die flow. Geen magie, geen dure SaaS-tool. Alleen n8n, de WhatsApp Business API en Claude. Klaar in twee tot drie uur, werkend voor jaren.
Het scenario: De Gouden Lepel in detail
Voordat we beginnen met bouwen, schetsen we het volledige scenario. Dit helpt je om de logica van de workflow te begrijpen en later makkelijker aan te passen aan jouw situatie.
Restaurant De Gouden Lepel:
- Locatie: Herengracht 412, Amsterdam
- Openingstijden: dinsdag t/m zondag 17:00-22:30
- Capaciteit: 35 couverts (max. 8 personen per reservering)
- WhatsApp Business nummer: +31 20 123 4567
- Keuken: moderne Nederlandse bistrokeuken, seizoensgebonden menu
- Personeel: 6 medewerkers, geen fulltime receptionist
De workflow werkt als volgt: een gast stuurt een WhatsApp-bericht naar het zakelijke nummer. De WhatsApp Business API (via 360dialog of Meta Cloud API) stuurt dit bericht door naar een n8n-webhook. n8n verwerkt het bericht, stuurt de inhoud naar Claude, en Claude formuleert een antwoord op basis van de systeemprompt die alle info over het restaurant bevat. Als het een reserveringsverzoek is, wordt het ook gelogd in Google Sheets.
Wat heb je nodig?
Zorg dat je het volgende klaar hebt staan voordat je begint:
- n8n instance (zelfgehost of n8n Cloud) -- versie 1.30 of hoger
- WhatsApp Business API-toegang via 360dialog (aanbevolen) of Meta Cloud API
- Anthropic API-sleutel voor Claude (claude-sonnet-4-6)
- Google account met een Google Sheets-spreadsheet voor reserveringen
- Basiskennis van n8n: weten wat een node is en hoe je een workflow maakt
- Een publiek bereikbare URL voor je n8n webhook (of gebruik ngrok voor lokale ontwikkeling)
Lees de officiële n8n documentatie over de Webhook node voor meer achtergrond: n8n Webhook node docs. Voor de Google Sheets integratie: n8n Google Sheets node.
Stap 1: WhatsApp Business API instellen via 360dialog
360dialog is een officieel WhatsApp Business Solution Provider (BSP) en makkelijker op te zetten dan de Meta Cloud API rechtstreeks. Ga naar 360dialog.com en maak een account aan. Koppel je WhatsApp Business-nummer aan je account. Je ontvangt een API-sleutel die je straks in n8n gebruikt.
Stel in het 360dialog-dashboard een webhook-URL in. Dit is de URL van je n8n Webhook node (je configureert die in stap 3). Inkomende berichten worden dan direct naar jouw n8n gestuurd.
Verificeer het nummer en wacht op goedkeuring van Meta. Dit kan tot 24 uur duren bij een nieuw nummer. Voor ontwikkeling kun je alvast verder met een testnummer dat 360dialog aanbiedt.
Meer over de WhatsApp Cloud API setup: Meta WhatsApp Cloud API documentatie.
Stap 2: Anthropic API-sleutel en credentials instellen in n8n
Ga naar console.anthropic.com en genereer een nieuwe API-sleutel. Sla deze op als credential in n8n:
In n8n: ga naar Settings > Credentials > Add Credential > kies 'Anthropic'. Voer je API-sleutel in. Geef de credential een herkenbare naam zoals 'Anthropic - De Gouden Lepel'. Sla op.
Doe hetzelfde voor Google Sheets: ga naar Credentials > Add Credential > Google Sheets OAuth2. Volg de OAuth-flow om toegang te geven tot de spreadsheet waar je reserveringen wilt loggen.
Stap 3: De n8n workflow aanmaken en de Webhook node configureren
Maak een nieuwe workflow aan in n8n. Voeg als eerste node een Webhook node toe. Configureer de webhook als volgt:
{
"node": "Webhook",
"type": "n8n-nodes-base.webhook",
"parameters": {
"httpMethod": "POST",
"path": "whatsapp-gouden-lepel",
"responseMode": "onReceived",
"responseData": "firstEntryJson",
"options": {}
},
"position": [240, 300],
"name": "WhatsApp Inkomend Bericht"
}
Kopieer de webhook-URL die n8n genereert. Die ziet er zo uit: https://jouw-n8n.example.com/webhook/whatsapp-gouden-lepel. Plak deze URL in je 360dialog-dashboard als webhook endpoint. Activeer de webhook in n8n door op 'Execute Workflow' te klikken of de workflow te activeren.
Stap 4: Het inkomende WhatsApp-bericht parsen
360dialog stuurt een JSON-payload naar je webhook. Het formaat verschilt iets van de ruwe Meta API, maar de kern is hetzelfde. Voeg een Code node (JavaScript) toe na de Webhook node om het bericht te extraheren:
// Code node: WhatsApp Bericht Parsen
// 360dialog / Meta Cloud API payload extractie
const body = $input.first().json;
// Haal de berichtdata op uit de webhook payload
const entry = body.entry?.[0];
const change = entry?.changes?.[0];
const value = change?.value;
const message = value?.messages?.[0];
if (!message) {
// Geen bericht (bijv. status update), stop de workflow
return [];
}
const phoneNumber = message.from; // bijv. "31612345678"
const messageText = message.text?.body || "";
const messageId = message.id;
const timestamp = message.timestamp;
// Formatteer telefoonnummer naar leesbaar formaat
const formattedPhone = "+" + phoneNumber;
return [{
json: {
phoneNumber: formattedPhone,
rawPhone: phoneNumber,
messageText: messageText,
messageId: messageId,
timestamp: timestamp,
wabaId: value?.metadata?.phone_number_id
}
}];
Deze node haalt de essentie eruit: het telefoonnummer van de gast, de berichttekst, en de WhatsApp-metadata die je later nodig hebt om het antwoord terug te sturen.
Stap 5: Claude aanroepen met een restaurantspecifieke systeemprompt
Nu komt het slimme gedeelte. Voeg een HTTP Request node toe (of gebruik de Anthropic node als die beschikbaar is in jouw n8n versie) om Claude claude-sonnet-4-6 aan te roepen. De systeemprompt bevat alle informatie over het restaurant.
{
"node": "HTTP Request",
"name": "Claude - Analyseer en Beantwoord",
"type": "n8n-nodes-base.httpRequest",
"parameters": {
"method": "POST",
"url": "https://api.anthropic.com/v1/messages",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth",
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "x-api-key",
"value": "={{ $credentials.anthropicApi.apiKey }}"
},
{
"name": "anthropic-version",
"value": "2023-06-01"
},
{
"name": "content-type",
"value": "application/json"
}
]
},
"sendBody": true,
"bodyContentType": "json",
"jsonBody": "={{ JSON.stringify({ model: 'claude-sonnet-4-6', max_tokens: 500, system: $node['Systeemprompt'].json.prompt, messages: [{ role: 'user', content: $json.messageText }] }) }}"
}
}
Maak ook een Set node aan met de naam 'Systeemprompt' die de systeemprompt bevat. Zo kun je de restaurantinformatie makkelijk aanpassen zonder de webhook-logica te wijzigen:
{
"node": "Set",
"name": "Systeemprompt",
"type": "n8n-nodes-base.set",
"parameters": {
"values": {
"string": [
{
"name": "prompt",
"value": "Je bent de vriendelijke AI-assistent van Restaurant De Gouden Lepel in Amsterdam. Je helpt gasten via WhatsApp met vragen over het restaurant.\n\nRESTAURANT INFORMATIE:\n- Naam: Restaurant De Gouden Lepel\n- Adres: Herengracht 412, Amsterdam\n- Telefoonnummer: +31 20 123 4567\n- Openingstijden: dinsdag t/m zondag, 17:00 - 22:30 (maandag gesloten)\n- Keuken: moderne Nederlandse bistrokeuken, seizoensgebonden\n- Capaciteit: 35 couverts, maximaal 8 personen per reservering\n- Reserveringen: via WhatsApp of telefoon, aanbevolen is minimaal 2 dagen van tevoren\n\nACTUELE MENUKAART (voorjaar 2026):\nVOORGERECHTEN (12-16 euro):\n- Hollandse garnalencocktail met witlof en dragon\n- Gebakken geitenkaas met rode-bietensalade\n- Soep van de dag (vraag naar het dagmenu)\n\nHOOFDGERECHTEN (24-34 euro):\n- Gebraised kalfswang met aardappelpuree en seizoensgroenten\n- Gegrilde zeebaars met venkel en citroenboter\n- Vegetarische risotto met truffel en parmezaan\n- Biefstuk met bearnaisesaus en frietjes\n\nNAGERECHTEN (9-12 euro):\n- Dame blanche\n- Seizoensfruit met slagroom\n- Kaasbord\n\nALLERGIEEN EN DIEET: vermeld dit bij reservering, wij passen het menu waar mogelijk aan.\n\nWIJNKAART: uitgebreide selectie huiswijnen, vraag naar de wijnkaart bij reservering.\n\nINSTRUCTIES:\n- Beantwoord vragen vriendelijk en beknopt (max. 3-4 regels)\n- Schrijf altijd in het Nederlands\n- Als een gast wil reserveren, vraag dan: naam, datum, tijdstip, aantal personen\n- Geef altijd de openingstijden mee als een gast vraagt wanneer ze kunnen komen\n- Als je iets niet weet, verwijs dan naar het telefoonnummer\n- Eindig elk bericht met een vriendelijke afsluiting"
}
]
}
}
}
Stap 6: Reserveringsverzoeken detecteren met een IF-node
Niet elk bericht is een reservering. We willen reserveringsverzoeken herkennen en apart loggen. Voeg na de Claude-node een IF-node toe die kijkt of het antwoord van Claude aangeeft dat het een reservering betreft. Een betrouwbaardere aanpak is Claude te vragen een JSON-vlag mee te geven:
{
"node": "IF",
"name": "Is het een Reserveringsverzoek?",
"type": "n8n-nodes-base.if",
"parameters": {
"conditions": {
"string": [
{
"value1": "={{ $json.messageText.toLowerCase() }}",
"operation": "contains",
"value2": "reserv"
}
]
}
},
"combineOperation": "any"
}
// Alternatief: voeg een extra Claude-call toe die puur detecteert:
// Stuur de berichttekst naar Claude met de vraag:
// 'Is dit een reserveringsverzoek? Antwoord alleen met YES of NO.'
// Gebruik het antwoord in de IF-node als condition.
De IF-node heeft twee uitgangen: True (het IS een reservering) en False (gewone vraag). Op de True-tak koppel je de Google Sheets node. Op beide takken stuur je het Claude-antwoord terug via WhatsApp.
Stap 7: Reserveringen loggen in Google Sheets
Op de True-tak van de IF-node voeg je een Google Sheets node toe. Zorg dat je spreadsheet de volgende kolommen heeft: Datum/Tijd Ontvangen, Telefoon, Bericht, Status.
{
"node": "Google Sheets",
"name": "Log Reservering in Sheets",
"type": "n8n-nodes-base.googleSheets",
"parameters": {
"operation": "append",
"documentId": "1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgVE2upms",
"sheetName": "Reserveringen",
"dataMode": "autoMapInputData",
"columns": {
"mappingMode": "defineBelow",
"value": {
"Datum Ontvangen": "={{ new Date().toLocaleString('nl-NL', { timeZone: 'Europe/Amsterdam' }) }}",
"Telefoon": "={{ $node['WhatsApp Bericht Parsen'].json.phoneNumber }}",
"Bericht": "={{ $node['WhatsApp Bericht Parsen'].json.messageText }}",
"Claude Antwoord": "={{ $node['Claude - Analyseer en Beantwoord'].json.content[0].text }}",
"Status": "Nieuw - verwerken"
}
}
}
}
Stap 8: Het antwoord terugsturen via WhatsApp
Nu sturen we het antwoord van Claude terug naar de gast. Voeg een HTTP Request node toe na de Claude-node (op beide takken van de IF-node, of gebruik een Merge-node om ze samen te voegen):
{
"node": "HTTP Request",
"name": "Stuur WhatsApp Antwoord",
"type": "n8n-nodes-base.httpRequest",
"parameters": {
"method": "POST",
"url": "https://waba.360dialog.io/v1/messages",
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "D360-API-KEY",
"value": "jouw-360dialog-api-key-hier"
},
{
"name": "Content-Type",
"value": "application/json"
}
]
},
"sendBody": true,
"bodyContentType": "json",
"jsonBody": "={{ JSON.stringify({ recipient_type: 'individual', to: $node['WhatsApp Bericht Parsen'].json.rawPhone, type: 'text', text: { body: $node['Claude - Analyseer en Beantwoord'].json.content[0].text } }) }}"
}
}
// Voor Meta Cloud API (in plaats van 360dialog), gebruik deze URL:
// POST https://graph.facebook.com/v19.0/{PHONE_NUMBER_ID}/messages
// Met Bearer token authenticatie
Test de flow nu door zelf een WhatsApp-bericht te sturen naar het testnummer. Je zou binnen enkele seconden een antwoord moeten ontvangen van 'De Gouden Lepel'.
Stap 9: Foutafhandeling en fallback toevoegen
Een productie-chatbot heeft foutafhandeling nodig. Voeg een Error Trigger node toe als apart workflow-entry voor het geval iets misgaat. Stel ook een timeout in op de Claude HTTP Request node:
{
"node": "HTTP Request - Claude (met timeout)",
"parameters": {
"options": {
"timeout": 10000,
"retry": {
"enabled": true,
"maxTries": 2,
"waitBetweenTries": 2000
}
}
}
}
// Fallback bericht als Claude niet reageert:
// Voeg een IF-node toe die controleert of de Claude response leeg is
// En stuur bij lege response dit standaardbericht terug:
{
"fallbackMessage": "Bedankt voor uw bericht! Momenteel kunnen we niet direct reageren. Bel ons op +31 20 123 4567 of probeer het later opnieuw. Restaurant De Gouden Lepel"
}
Stel ook een Workflow Error Trigger in: ga naar de workflow-instellingen en koppel een tweede workflow die bij fouten een melding stuurt naar het interne communicatiekanaal van het restaurant (bijv. Slack of email).
Stap 10: Testen, activeren en monitoren
Voordat je de workflow live zet, doorloop je de volgende testscenario's:
1. Algemene vraag: 'Hoe laat zijn jullie open op woensdag?'
Verwacht: Claude antwoordt met de openingstijden van woensdag.
2. Menukaart: 'Hebben jullie vegetarische opties?'
Verwacht: Claude noemt de vegetarische risotto en biedt aan meer te vertellen.
3. Reserveringsverzoek: 'Ik wil graag reserveren voor vrijdag 18 april, 4 personen'
Verwacht: Claude vraagt om naam en tijdstip, de rij verschijnt in Google Sheets.
4. Allergievraag: 'Zijn er glutenvrije opties?'
Verwacht: Claude verwijst naar het vermelden bij reservering en noemt het telefoonnummer.
5. Onbekende vraag: 'Doen jullie ook catering?'
Verwacht: Claude geeft eerlijk aan het niet te weten en verwijst naar telefoon.
Als alle tests slagen: activeer de workflow via de toggle rechtsbovenin n8n. De workflow draait nu 24/7 in de achtergrond. Monitor via n8n's ingebouwde execution log (Settings > Executions) of je errors ziet.
Stap 11: Menu en informatie dynamisch bijhouden
De systeemprompt bevat nu statische menuinformatie. Voor een restaurant dat regelmatig van menu wisselt, is dit niet ideaal. De slimmere aanpak: sla de menukaart op in een Google Sheets-tabblad en laad deze dynamisch in de systeemprompt.
Voeg voor de Claude-node een Google Sheets Read node toe die het actuele menu ophaalt uit een apart tabblad 'Menu'. Gebruik een Set node om de gegevens samen te voegen tot een geformatteerde string, en injecteer die in de systeemprompt. Zo hoeft Yannick alleen zijn Google Sheet bij te werken als het menu verandert, niet de n8n workflow.
Wil je ook een webshop-chatbot bouwen met dezelfde aanpak? Lees dan: WhatsApp chatbot voor je webshop met n8n en Claude. Of bekijk onze analyse: Waarom AI-implementatie bij het MKB nog niet van de grond komt.
Problemen oplossen
1. Webhook ontvangt geen berichten van 360dialog
Controleer of de webhook-URL in je 360dialog-dashboard exact overeenkomt met de URL in n8n. Let op http vs https en op trailing slashes. Zorg dat je n8n-instance publiek bereikbaar is (niet localhost). Test met een POST-request via curl of Postman om te bevestigen dat de webhook actief is. Activeer de workflow in n8n; een niet-geactiveerde workflow accepteert geen webhooks.
2. Claude geeft lege of foutieve antwoorden
Controleer je Anthropic API-sleutel in de n8n credentials. Verifieer dat je voldoende credits hebt op console.anthropic.com. Kijk in de execution log welke JSON n8n naar Claude stuurt -- vaak zit de fout in hoe de berichttekst is geformatteerd. Zorg dat de system prompt niet langer is dan 10.000 tokens (tel je tokens op tokenizer.anthropic.com).
3. Google Sheets write geeft een 403-fout
Dit betekent dat je Google OAuth-credential geen schrijfrechten heeft op de spreadsheet. Verwijder de bestaande Google credential in n8n en maak een nieuwe aan via de OAuth-flow. Zorg dat je tijdens de autorisatie de checkbox aanvinkt voor bewerkingstoegang. Controleer ook of de spreadsheet-ID in de node overeenkomt met de werkelijke spreadsheet.
4. Antwoord komt te laat aan (meer dan 10 seconden)
WhatsApp verwacht een bevestiging op de webhook binnen 20 seconden, maar gasten verwachten een antwoord binnen enkele seconden. Als Claude te lang doet over een antwoord: verlaag max_tokens naar 300, gebruik een lichter model voor eenvoudige vragen (claude-haiku via een eerste filter), of zet de webhook responseMode op 'onReceived' zodat de 200 OK meteen teruggestuurd wordt terwijl de workflow asynchroon verder werkt.
5. Dubbele berichten worden verstuurd
360dialog en Meta sturen soms het zelfde bericht meerdere keren als de webhook niet snel genoeg reageert. Sla de message ID op in een n8n cache (via de Redis node of een externe cache) en check bij elke inkomende webhook of het message ID al verwerkt is. Als het al bekend is, stop de workflow dan direct met een Stop and Error node zonder antwoord te sturen.
Uitbreidingen en vervolgstappen
Koppeling met een reserveringssysteem
In de huidige setup log je reserveringsverzoeken in Google Sheets en verwerkt het personeel ze handmatig. De volgende stap is koppeling met een reserveringssysteem zoals Formitable, DISH, of Resy. Deze platforms hebben APIs waarmee je beschikbaarheid kunt opvragen en reserveringen rechtstreeks kunt aanmaken. n8n heeft voor sommige een kant-en-klare integratie; voor andere gebruik je de HTTP Request node met hun REST API.
TripAdvisor en Google Reviews verwerken
Bouw een tweede workflow die dagelijks nieuwe reviews ophaalt via de TripAdvisor API of Google My Business API. Laat Claude automatisch een vriendelijk antwoord genereren per review, stuur die ter goedkeuring naar Yannick via WhatsApp of Slack, en publiceer het antwoord na een akkoord via de API. Dit bespaart elke week uur aan administratie.
Meertalige ondersteuning
Amsterdam trekt veel internationale gasten. Voeg een detectiestap toe aan de workflow: laat Claude eerst de taal van het inkomende bericht detecteren, en pas de systeemprompt aan om in diezelfde taal te antwoorden. Voeg een vertaalde versie van de restaurantinformatie toe voor Engels, Duits en Frans. Geen extra kosten, alleen een slimmere prompt.
Proactieve berichten voor reserveringsherinneringen
Gebruik de WhatsApp Business API om proactief herinneringsberichten te sturen. Maak een aparte n8n workflow die elke ochtend de reserveringen van de volgende dag ophaalt uit Google Sheets en via WhatsApp een herinnering stuurt naar de gast: datum, tijdstip, aantal personen en een verzoek om te bevestigen of te annuleren. Dit verlaagt no-shows significant.
Zie ook: CBS onderzoek: AI-gebruik bij microbedrijven verdubbeld in 2026 -- waarom de horeca nu het juiste moment is om te automatiseren.
Resultaat: minder werk, betere gastervaring
Restaurant De Gouden Lepel heeft nu een chatbot die 24/7 beschikbaar is voor gasten. Yannick en zijn team besparen naar schatting 2 tot 3 uur per dag aan berichtenafhandeling. Gasten krijgen direct antwoord, ook op zaterdagavond om 23:00 als de keuken allang dicht is. Reserveringsverzoeken komen netjes binnen in Google Sheets en missen nooit meer een gast.
De totale kosten van deze setup: n8n Cloud (vanaf 20 euro per maand), 360dialog (vanaf 45 euro per maand voor WhatsApp Business API), en Claude API-kosten (typisch minder dan 10 euro per maand voor een restaurant van deze omvang). Totaal: circa 75 euro per maand voor een oplossing die je eigenlijk een parttime medewerker bespaart.
De workflow die je hier hebt gebouwd is een fundament. Voeg stap voor stap uitbreidingen toe, leer van de gesprekken die binnenkomen, en verbeter de systeemprompt op basis van echte vragen van gasten. Zo wordt de chatbot met de week slimmer.