Handleidingen · n8n

Bouw een eigen AI klantenservice-agent in n8n met Claude (zonder maandelijkse licentiekosten)

Bouw een eigen AI-klantenservice-agent in n8n met Claude: tickets, antwoorden en escalatie — zonder dure maandlicentie.

🟡 Gevorderd — beetje technisch ⏱ 90 minuten
Tools: n8nClaude API (Anthropic)WebhookE-mail of WhatsApp channelGoogle Sheets of Notion (optioneel)
Bouw een eigen AI klantenservice-agent in n8n met Claude (zonder maandelijkse li cover

✅ Wat je leert in deze handleiding

  • ✓ Een n8n workflow bouwen die klantvragen verwerkt via webhook
  • ✓ Claude inzetten als AI-brein met systeem-prompt voor jouw bedrijf
  • ✓ Automatische ticket-aanmaak en e-mailnotificaties instellen
  • ✓ Escalatie naar menselijke medewerker wanneer de AI het niet weet
  • ✓ Kosten berekenen en vergelijken met SaaS-alternatieven
  • ✓ De agent koppelen aan WhatsApp, e-mail of een webwidget

Waarom zelf bouwen in plaats van een SaaS-tool gebruiken?

Tools als Intercom of Zendesk AI kosten al snel €50 tot €150 per agent per maand. Voor een team van 3 is dat €450 tot €1.800 per jaar, exclusief API-kosten. Met n8n (self-hosted: gratis, of cloud: €20/maand) en de Anthropic API betaal je alleen voor daadwerkelijk gebruik.

Rekenvoorbeeld: 500 klantvragen per maand, gemiddeld 200 input-tokens + 300 output-tokens per vraag. Met Claude Sonnet 4.6 ($3/$15 per miljoen tokens): 500 x (200 x $0.000003 + 300 x $0.000015) = $0.30 + $2.25 = $2.55 per maand. Vergeleken met €119/maand voor Tidio AI is dat een besparing van 98%.

Scenario in deze handleiding: een webshop met 3 medewerkers wil 70% van de klantvragen automatisch afhandelen (leveringstijd, retouren, productvragen). Complexe klachten gaan door naar een medewerker via e-mail.

Architectuur: hoe de agent werkt

De agent bestaat uit vier blokken: (1) Ingang: webhook die berichten ontvangt van website-chat, e-mail of WhatsApp. (2) Classificatie: Claude bepaalt het type vraag en of hij het zelf kan beantwoorden. (3) Afhandeling: Claude genereert een antwoord op basis van jouw kennisbank. (4) Uitgang: antwoord terug naar klant, of ticket-aanmaak en escalatie.

Stap 1: n8n installeren en Anthropic API configureren

# n8n installeren via Docker (aanbevolen voor productie)
docker run -it --rm \
  --name n8n \
  -p 5678:5678 \
  -v ~/.n8n:/home/node/.n8n \
  -e N8N_BASIC_AUTH_ACTIVE=true \
  -e N8N_BASIC_AUTH_USER=admin \
  -e N8N_BASIC_AUTH_PASSWORD=jouwwachtwoord \
  docker.n8n.io/n8nio/n8n

# Of via npm (voor lokaal testen)
npm install n8n -g
n8n start

# n8n is nu beschikbaar op: http://localhost:5678

Haal jouw Anthropic API-key op via console.anthropic.com. Voeg hem toe in n8n via: Instellingen > Credentials > Nieuw > Anthropic API. Vul de key in en sla op.

# Test de Anthropic API direct via curl
curl https://api.anthropic.com/v1/messages \
  -H 'x-api-key: jouw-api-key-hier' \
  -H 'anthropic-version: 2023-06-01' \
  -H 'content-type: application/json' \
  -d '{
    "model": "claude-sonnet-4-6-20250514",
    "max_tokens": 100,
    "messages": [{"role": "user", "content": "Zeg hallo"}]
  }'
# Verwacht: {"content": [{"text": "Hallo! ..."}

Stap 2: Webhook-trigger aanmaken

Maak een nieuwe workflow aan in n8n. Voeg als eerste node een Webhook-node toe. Stel in: HTTP Method = POST, Path = /klantenservice. Kopieer de webhook-URL (zoiets als https://joun8n.example.com/webhook/klantenservice). Dit is het adres waarnaar je chatwidget of e-mailsysteem berichten stuurt.

// Voorbeeld: verwacht binnenkomend bericht via webhook
{
  "klant_naam": "Maria de Jong",
  "klant_email": "maria@example.nl",
  "bericht": "Wanneer wordt mijn bestelling #12345 bezorgd?",
  "kanaal": "website_chat",
  "timestamp": "2026-04-02T19:00:00+02:00"
}

Stap 3: De kennisbank als systeem-prompt opbouwen

Voeg een Code-node toe na de webhook. Hierin definieer je de systeem-prompt voor Claude. Dit is de 'instructiegids' voor de agent: wie hij is, wat hij weet, en hoe hij moet reageren.

// Code node: systeem-prompt opbouwen
const systeemPrompt = `
Jij bent de klantenservice-assistent van Stijlvol Wonen, een Nederlandse webshop
voor woonaccessoires. Je helpt klanten vriendelijk en direct.

Wat je weet:
- Leveringstijd: 2-4 werkdagen voor Nederland, 4-7 werkdagen voor België
- Retour: gratis retourneren binnen 30 dagen, via PostNL-label op aanvraag
- Betaling: iDeal, creditcard, Klarna achteraf betalen
- Openingstijden klantenservice: ma-vr 09:00-17:00
- Bestelling volgen: via track-and-trace link in bevestigingsmail

Regels:
1. Antwoord altijd in het Nederlands
2. Wees kort en vriendelijk, max 3 zinnen tenzij meer nodig
3. Als je het antwoord NIET weet: zeg dan eerlijk dat je doorverwijst
4. Sluit nooit af met 'Hoe kan ik je verder helpen?' - te generiek
5. Gebruik de naam van de klant als je die weet

Escaleer naar medewerker als:
- Klant is duidelijk boos of gefrustreerd
- Vraag gaat over schade, klacht of juridisch
- Je het antwoord niet met zekerheid weet

Retourneer je antwoord als JSON:
{
  "antwoord": "jouw antwoord hier",
  "escaleer": true of false,
  "reden_escalatie": "korte reden (alleen als escaleer=true)"
}
`;

return [{ json: { systeemPrompt, bericht: $input.first().json.bericht, klantNaam: $input.first().json.klant_naam, klantEmail: $input.first().json.klant_email } }];

Stap 4: Claude-node toevoegen en antwoord genereren

Voeg een Anthropic-node toe. Stel in: Model = claude-sonnet-4-6-20250514, Max tokens = 500. Koppel de credential die je eerder hebt aangemaakt.

// n8n Anthropic node configuratie
{
  "model": "claude-sonnet-4-6-20250514",
  "maxTokens": 500,
  "messages": [
    {
      "role": "user",
      "content": "={{ $json.bericht }}"
    }
  ],
  "systemMessage": "={{ $json.systeemPrompt }}",
  "temperature": 0.3
}

// Lage temperature (0.3) = consistentere, zakelijkere antwoorden
// Hogere temperature (0.7) = creatiever maar minder voorspelbaar

Voeg na de Anthropic-node een Code-node toe die de JSON-response van Claude parst:

// JSON response van Claude parsen
const claudeOutput = $input.first().json.content[0].text;

let parsed;
try {
  parsed = JSON.parse(claudeOutput);
} catch (e) {
  // Als Claude geen geldige JSON geeft, veilig opvangen
  parsed = {
    antwoord: claudeOutput,
    escaleer: false,
    reden_escalatie: null
  };
}

return [{ json: {
  antwoord: parsed.antwoord,
  escaleer: parsed.escaleer,
  reden_escalatie: parsed.reden_escalatie,
  klantEmail: $('Code').first().json.klantEmail,
  klantNaam: $('Code').first().json.klantNaam,
  origineelBericht: $('Code').first().json.bericht
}}];

Stap 5: If-node voor escalatie of directe beantwoording

Voeg een IF-node toe met de conditie: escaleer is gelijk aan true. De 'true'-tak stuurt een ticket-notificatie naar jouw team. De 'false'-tak stuurt het antwoord direct naar de klant.

// IF-node conditie
{
  "conditions": [
    {
      "leftValue": "={{ $json.escaleer }}",
      "operation": "equal",
      "rightValue": true
    }
  ]
}

Stap 6: E-mailbeantwoording en ticket-aanmaak

Voeg op de 'false'-tak (geen escalatie) een Gmail- of SMTP-node toe om het antwoord te sturen naar de klant.

// E-mail node configuratie (antwoord naar klant)
{
  "operation": "send",
  "toEmail": "={{ $json.klantEmail }}",
  "subject": "Re: Jouw vraag aan Stijlvol Wonen",
  "emailType": "html",
  "message": "<p>Hoi {{ $json.klantNaam }},</p><p>{{ $json.antwoord }}</p><p>Met vriendelijke groet,<br>Klantenservice Stijlvol Wonen</p>",
  "fromEmail": "klantenservice@stijlvolwonen.nl"
}

// Op de 'true'-tak (escalatie): stuur intern ticket
{
  "operation": "send",
  "toEmail": "team@stijlvolwonen.nl",
  "subject": "[ESCALATIE] Klantvraag van {{ $json.klantNaam }}",
  "message": "Klant: {{ $json.klantNaam }} ({{ $json.klantEmail }})\nVraag: {{ $json.origineelBericht }}\nReden escalatie: {{ $json.reden_escalatie }}\n\nReageer direct op de klant!"
}

Stap 7: Loggen in Google Sheets (optioneel maar sterk aanbevolen)

Voeg op beide takken een Google Sheets-node toe om elk gesprek te loggen. Zo kun je bijhouden hoeveel vragen de AI afhandelt, welke vragen escaleren, en wat de meest voorkomende onderwerpen zijn.

// Google Sheets log node
{
  "operation": "appendOrUpdate",
  "spreadsheetId": "jouw-spreadsheet-id",
  "sheetName": "KlantenserviceLog",
  "columns": {
    "mappingMode": "defineBelow",
    "values": [
      { "column": "Datum", "value": "={{ new Date().toISOString() }}" },
      { "column": "Klant", "value": "={{ $json.klantNaam }}" },
      { "column": "Email", "value": "={{ $json.klantEmail }}" },
      { "column": "Vraag", "value": "={{ $json.origineelBericht }}" },
      { "column": "Antwoord", "value": "={{ $json.antwoord }}" },
      { "column": "Geescaleerd", "value": "={{ $json.escaleer ? 'Ja' : 'Nee' }}" },
      { "column": "Reden", "value": "={{ $json.reden_escalatie || '' }}" }
    ]
  }
}

Stap 8: Koppelen aan een webwidget (Tawk.to integratie)

Tawk.to is een gratis livechat-widget die je op je website plaatst. Via de Tawk.to API kun je inkomende chatberichten doorsturen naar jouw n8n webhook, en het AI-antwoord terugsturen als agent-reactie.

// Tawk.to webhook naar n8n sturen (via Tawk.to > Instellingen > API)
// Stel in: Chat Events > New Message > Webhook URL = jouw n8n webhook

// Antwoord terugsturen via Tawk.to REST API:
const tawkResponse = await fetch(
  `https://api.tawk.to/v1/chat/${chatId}/messages`,
  {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'Authorization': 'Bearer jouw-tawkto-api-key'
    },
    body: JSON.stringify({
      body: antwoord,
      type: 'msg'
    })
  }
);

Troubleshooting

Probleem 1: Claude geeft geen geldige JSON terug

Oplossing: voeg aan de systeem-prompt toe: 'BELANGRIJK: retourneer ALTIJD geldig JSON. Geen extra tekst voor of na het JSON-object.' Bij hardnekkige gevallen: gebruik Claude Opus 4.6 (beter in instructieopvolging) of voeg een try-catch toe in de parse-stap.

Probleem 2: Agent escaleert te veel of te weinig

Oplossing: pas de escalatieregels in de systeem-prompt aan. Begin ruim (escaleert te veel) en maak het criterium strenger zodra je vertrouwen hebt in de antwoordkwaliteit. Log alle escalaties en analyseer wekelijks.

Probleem 3: Webhook reageert te langzaam

Oplossing: Claude Sonnet reageert in 1 tot 3 seconden, wat acceptabel is voor e-mail maar te traag voor live chat. Gebruik voor live chat Claude Haiku (snelste, goedkoopste) of Gemini 2.5 Flash-Lite (496 tokens/sec). Wissel het model in de Anthropic-node.

Kosten overzicht en schaalberekening

// Maandelijkse kosten bij verschillende volumes
// Model: Claude Sonnet 4.6 ($3/$15 per M tokens)
// Gemiddeld per vraag: 400 input + 300 output tokens

{
  "500_vragen_per_maand": {
    "input_kosten": "$0.60",
    "output_kosten": "$2.25",
    "totaal": "$2.85 (~€2.60)",
    "n8n_cloud": "€20",
    "totaal_incl_n8n": "~€23/maand"
  },
  "2000_vragen_per_maand": {
    "input_kosten": "$2.40",
    "output_kosten": "$9.00",
    "totaal": "$11.40 (~€10.50)",
    "n8n_cloud": "€20",
    "totaal_incl_n8n": "~€31/maand"
  },
  "5000_vragen_per_maand": {
    "totaal": "~€46/maand",
    "vs_tidio_ai": "€119/maand",
    "besparing": "61%"
  }
}

Conclusie: wanneer zelf bouwen, wanneer SaaS?

Kies n8n + Claude als: je technisch onderlegd bent (of iemand hebt die dat is), je meer dan 200 vragen per maand verwerkt, je maatwerk nodig hebt, of je wil integreren met eigen systemen.

Kies een SaaS-tool (Tidio, Intercom) als: je zo snel mogelijk live wil, je geen technische kennis in huis hebt, of je minder dan 200 vragen per maand verwerkt — dan is het prijsverschil nihil.

De workflow die je in deze handleiding bouwt is een startpunt. Voeg stap voor stap uit: productdatabase koppelen voor echte voorraadinfo, order-tracking API integreren, of een tweede agent-laag met Opus 4.6 voor escalaties die toch geautomatiseerd afgehandeld kunnen worden.

Gerelateerd

Nieuwsbrief

Meer handleidingen en tips?

Elke week de beste agentic AI inzichten en nieuwe handleidingen in je inbox.

Gratis aanmelden →