De gemiddelde professional ontvangt 120 e-mails per dag. Een AI-gestuurde e-mail classifier categoriseert ze automatisch, markeert urgente berichten en schrijft conceptantwoorden voor routinevragen. In deze handleiding bouw je dat systeem in n8n met Claude als classificatie-motor.
Video tutorial: N8N + Google Sheets Step-by-Step Setup (bevat ook Gmail integratie): https://www.youtube.com/watch?v=NhoTdQg_YTc | Meer over n8n Gmail node: https://docs.n8n.io/integrations/builtin/trigger-nodes/n8n-nodes-base.gmailtrigger/
Stap 1: Categorieën definiëren
Bepaal voor je begint welke categorieën je wilt. Goed werkende categorieën voor een B2B-bedrijf: URGENT (actie vereist binnen 24 uur), KLANT (van bestaande klant, reactie nodig), LEAD (potentiele nieuwe klant), PARTNER (leverancier, samenwerking), ADMINISTRATIEF (facturen, contracten), NIEUWSBRIEF (no-action nodig), SPAM (ongewenste reclame). Houd het bij 5-8 categorieën: meer maakt de classificatie minder accuraat.
Stap 2: Gmail OAuth koppelen in n8n
Ga in n8n naar Settings > Credentials > New Credential > Gmail OAuth2 API. Klik op Connect my account. Autoriseer toegang. Let op: je hebt lees- en schrijftoegang nodig (voor het toevoegen van labels). Als je een Google Workspace-account hebt, vraag je admin om de n8n OAuth app te autoriseren via de Google Admin Console.
Stap 3: Gmail Trigger node instellen
Voeg een Gmail Trigger node toe als eerste node van je workflow. Selecteer je Gmail credential. Stel Poll Times in op elke 5 minuten (voldoende voor de meeste use cases, lager = meer API-calls). Filter: kies alleen nieuwe, ongelezen e-mails (isUnread: true) om al geclassificeerde e-mails niet opnieuw te verwerken. De trigger geeft per e-mail een object terug met subject, from, body (plaintext), date en threadId.
[Screenshot: Gmail Trigger node met Poll Times ingesteld op 5 minuten en filter isUnread: true. De rechterkolom toont een voorbeeld-output met subject, from en body velden.]
Stap 4: Claude API aanroepen voor classificatie
Voeg een HTTP Request node toe. POST naar https://api.anthropic.com/v1/messages. Headers: x-api-key (jouw Claude API key), anthropic-version: 2023-06-01, content-type: application/json. Gebruik claude-haiku-4-5 als model: snel, goedkoop, en voor classificatie meer dan krachtig genoeg (kosten: minder dan 0.01 cent per e-mail).
// HTTP Request body (n8n expressions):
{
"model": "claude-haiku-4-5",
"max_tokens": 150,
"messages": [{
"role": "user",
"content": "Classificeer deze e-mail in EEN van de volgende categorieën: URGENT, KLANT, LEAD, PARTNER, ADMINISTRATIEF, NIEUWSBRIEF, SPAM.\n\nRegels:\n- URGENT: actie vereist binnen 24 uur\n- KLANT: van bestaande klant\n- LEAD: potentiele nieuwe klant\n- PARTNER: leverancier of samenwerkingspartner\n- ADMINISTRATIEF: factuur, contract, juridisch\n- NIEUWSBRIEF: marketing of updates\n- SPAM: ongewenste berichten\n\nVan: {{$json.from}}\nOnderwerp: {{$json.subject}}\nBericht (eerste 500 tekens): {{$json.body.substring(0, 500)}}\n\nAntwoord ALLEEN met een JSON-object:\n{\"categorie\": \"CATEGORIE\", \"reden\": \"korte toelichting\", \"urgentie\": 1-10}"
}]
}
Stap 5: Claude response parsen
Voeg een Code node toe na de HTTP Request. Claude geeft de classificatie terug als JSON in content[0].text. Parse dit met onderstaande code. De try-catch zorgt dat de workflow niet crasht als Claude onverwacht iets anders teruggeeft.
// Code node: Claude response parsen
const claudeText = $input.first().json.content[0].text;
try {
// Verwijder eventuele markdown code-blocks
const cleaned = claudeText.replace(/```json\n?/g, '').replace(/```/g, '').trim();
const parsed = JSON.parse(cleaned);
return [{
json: {
...$input.first().json,
classificatie: parsed.categorie || 'ONBEKEND',
reden: parsed.reden || '',
urgentie: parsed.urgentie || 5
}
}];
} catch (e) {
// Fallback bij parse-fout
return [{
json: {
...$input.first().json,
classificatie: 'ONBEKEND',
reden: 'Parse fout: ' + claudeText.substring(0, 100),
urgentie: 5
}
}];
}
Stap 6: Gmail-label toepassen
Maak in Gmail eerst de labels aan die je wilt gebruiken (Settings > Labels > Create new label). Voeg een Gmail node toe met operatie Modify a Message. Selecteer het bericht via Message ID ({{$json.id}}). Voeg het label toe dat overeenkomt met de classificatie. Tip: gebruik een Switch node voor de routing naar het juiste label, of gebruik een Code node om de label-ID dynamisch op te halen.
// Label ID mapping (vind via Gmail API of n8n credential test):
const labelMap = {
'URGENT': 'Label_123456',
'KLANT': 'Label_234567',
'LEAD': 'Label_345678',
'PARTNER': 'Label_456789',
'ADMINISTRATIEF': 'Label_567890',
'NIEUWSBRIEF': 'Label_678901',
'SPAM': 'Label_789012'
};
const labelId = labelMap[$json.classificatie] || labelMap['ONBEKEND'];
return [{ json: { ...$json, labelId } }];
Stap 7: Slack-notificatie voor urgente e-mails
Voeg een IF node toe. Conditie: classificatie is gelijk aan URGENT OF urgentie groter dan of gelijk aan 8. Voeg bij TRUE een Slack node toe. Bericht: ':rotating_light: Urgente e-mail van {{$json.from}}\nOnderwerp: {{$json.subject}}\nReden: {{$json.reden}}\nOpen in Gmail: https://mail.google.com/mail/u/0/#inbox/{{$json.id}}'. Zo heb je altijd een directe melding bij e-mails die snel actie vereisen.
Stap 8: Conceptantwoord genereren (optioneel)
Voor categorieën KLANT en LEAD kun je Claude ook een conceptantwoord laten schrijven. Voeg een tweede HTTP Request node toe, alleen op de TRUE-tak van een IF (categorie is KLANT of LEAD). Geef Claude de e-mail mee plus instructies over jouw bedrijf en schrijfstijl. Sla het concept op als Gmail-draft via de Gmail node met operatie Create Draft.
// Prompt voor conceptantwoord:
"Je bent een professionele assistent voor [BEDRIJFSNAAM].
Schrijf een professioneel e-mailantwoord in het Nederlands op de volgende e-mail.
Houd het kort (max 3 alineas), vriendelijk en to-the-point.
Sluit af met een concrete volgende stap of vraag.
Antwoord op e-mail van: {{$json.from}}
Onderwerp: {{$json.subject}}
Originele bericht: {{$json.body.substring(0, 800)}}
Begint met: Beste [naam],"
Veelvoorkomende problemen
Probleem: Gmail Trigger verwerkt dezelfde e-mails meerdere keren. Oplossing: Markeer e-mails als gelezen direct na verwerking via een Gmail node (Modify > Mark as Read). Of gebruik een Google Sheets log: sla verwerkte message IDs op en filter aan het begin van de workflow.
Probleem: Claude classificeert veel e-mails als ONBEKEND. Oplossing: Voeg meer voorbeelden toe aan je prompt ('Voorbeelden: een e-mail van een klant over een factuur is KLANT, een cold outreach is LEAD'). Of verlaag max_tokens en vraag om uitsluitend het JSON-object zonder toelichting.
Probleem: Workflow draait traag (meer dan 30 seconden per e-mail). Oplossing: Gebruik claude-haiku-4-5 in plaats van Sonnet voor classificatie (5x sneller, voldoende voor deze taak). Verwijder onnodige nodes. Controleer of je n8n-instance voldoende resources heeft.
Kosten overzicht
Claude Haiku voor classificatie: circa 200 input-tokens + 50 output-tokens per e-mail = 0.25 cent per e-mail. Bij 100 e-mails per dag: EUR 0.25/dag = EUR 7.50/maand. n8n cloud: gratis tot 5.000 executions/maand, daarna USD 20/maand. Totaal voor een inbox van 100 e-mails/dag: minder dan EUR 30/maand, met een tijdsbesparing van 1-2 uur per dag.
Handige links
n8n Gmail Trigger docs: https://docs.n8n.io/integrations/builtin/trigger-nodes/n8n-nodes-base.gmailtrigger/ | Gmail API referentie: https://developers.google.com/gmail/api | Anthropic API docs: https://docs.anthropic.com | Claude Haiku pricing: https://www.anthropic.com/pricing | n8n cloud: https://app.n8n.io