Handleidingen · n8n

AI Recruitment Assistant bouwen: CV’s automatisch screenen met n8n en Claude

AI recruitment pipeline: CV’s automatisch scoren en vergelijken met je vacature. n8n + Claude + Sheets — MKB-stappenplan.

🟡 Gevorderd — beetje technisch ⏱ 60 minuten
Tools: n8nClaude APIGoogle SheetsGmail
AI Recruitment Assistant bouwen: CV’s automatisch screenen met n8n en Claude cover

✅ Wat je leert in deze handleiding

  • ✓ Een automatische CV-screening pipeline bouwen
  • ✓ Claude gebruiken voor gestructureerde kandidaatbeoordeling
  • ✓ Scoredata opslaan in Google Sheets
  • ✓ Automatische communicatie met kandidaten instellen
  • ✓ Een recruitment dashboard opzetten in Google Sheets
  • ✓ De pipeline uitbreiden voor meerdere vacatures tegelijk

41% van Nederlandse MKB-bedrijven noemt talent aantrekken en behouden als hun grootste uitdaging in 2026, blijkt uit het Wolters Kluwer Future Ready Business rapport. En toch zit het wervingsproces bij de meeste bedrijven vol handmatig werk: HR-managers lezen stapels CV's, kopiëren gegevens naar spreadsheets en sturen handmatig bevestigingsmails. Dat is niet alleen tijdrovend, het is ook foutgevoelig.

In deze handleiding bouw je stap voor stap een AI-gestuurde recruitment pipeline die dat werk uit handen neemt. Sollicitaties komen binnen via Gmail, CV's worden automatisch uitgelezen, Claude beoordeelt en scoort elke kandidaat op basis van jouw vacatureprofiel, de scores landen in Google Sheets en de HR-manager krijgt een Slack-notificatie zodra er een sterke kandidaat is. Volledig geautomatiseerd, reproduceerbaar en uitbreidbaar.

Het fictieve scenario door deze handleiding: TechBedrijf B.V. zoekt een Senior Marketing Manager. Ze ontvangen gemiddeld 40 sollicitaties per vacature. Zonder automatisering besteedt hun HR-afdeling vier tot vijf uur per vacature aan eerste screening. Na het implementeren van deze pipeline is dat teruggebracht naar minder dan dertig minuten.

Wat heb je nodig?

Voordat je begint, zorg je dat de volgende accounts en tools beschikbaar zijn:

n8n (zelf-gehost of n8n Cloud) via https://n8n.io. Een Anthropic-account met toegang tot de Claude API via https://console.anthropic.com. Een Google-account met Google Sheets en Gmail. Optioneel: een Slack-workspace voor HR-notificaties. Basiskennis van JSON en API-concepten is handig maar niet vereist.

Schat de totale kosten op minder dan 2 euro per maand bij normaal gebruik (40-60 sollicitaties per vacature). Claude Sonnet verwerkt een gemiddeld CV voor minder dan 0,01 euro per analyse.

Stap 1: De architectuur begrijpen

De pipeline bestaat uit zeven logische stappen die achter elkaar worden uitgevoerd zodra een nieuwe sollicitatie binnenkomt. Hieronder een beschrijving van de volledige flow:

Gmail ontvangt een sollicitatie met CV als bijlage. n8n detecteert dit via een Gmail-trigger (polling elke 5 minuten of via webhook). De PDF-bijlage wordt uitgelezen en de tekst wordt geëxtraheerd. Claude ontvangt de CV-tekst samen met het vacatureprofiel als systeem-prompt. Claude retourneert een gestructureerde JSON-score met toelichting per criterium. De scoredata wordt weggeschreven naar Google Sheets. Als de totaalscore hoger is dan 7, stuurt n8n een Slack-notificatie naar de HR-manager. Tegelijkertijd ontvangt de kandidaat een automatische bevestigingsmail.

De kracht van deze aanpak is dat elke stap los staat van de anderen. Je kunt de scoring-criteria aanpassen zonder de rest van de pipeline te breken. Je kunt Gmail vervangen door een webformulier. Je kunt Slack vervangen door Teams. De architectuur is modulair.

Stap 2: n8n workflow aanmaken en Gmail trigger instellen

Open je n8n-instantie en klik op 'New Workflow'. Geef de workflow een duidelijke naam zoals 'CV Screening Pipeline - TechBedrijf BV'. Klik op 'Add first step' en zoek naar 'Gmail'.

Kies de trigger 'Gmail Trigger' en verbind je Google-account. Stel de volgende configuratie in: poll interval op 5 minuten, filter op e-mails met bijlage, en optioneel een filter op het onderwerp (bijvoorbeeld 'Sollicitatie' of 'Application'). Zo voorkom je dat de pipeline afgaat op elke willekeurige mail.

{
  "node": "Gmail Trigger",
  "parameters": {
    "pollTimes": {
      "item": [
        {
          "mode": "everyX",
          "value": 5,
          "unit": "minutes"
        }
      ]
    },
    "filters": {
      "hasAttachment": true,
      "subject": "Sollicitatie"
    },
    "options": {
      "dataPropertyAttachmentsPrefixName": "attachment_"
    }
  }
}

Test de trigger door een test-mail met PDF-bijlage naar het betreffende Gmail-adres te sturen. n8n toont de ruwe data die binnenkomt inclusief de bijlage als base64-encoded string. Die bijlage verwerken we in de volgende stap.

Stap 3: CV bijlage uitlezen (PDF parsing)

n8n heeft een ingebouwde HTTP Request node die je kunt gebruiken om een externe PDF-parsing service aan te roepen. Voor deze pipeline gebruiken we de Extract from File node (beschikbaar in n8n v1.x) of een combinatie met de Code node voor base64-decodering.

Voeg een nieuwe node toe na de Gmail-trigger: kies 'Extract from File'. Stel het input-veld in op de bijlage uit de vorige stap. n8n extraheert de tekst automatisch uit PDF-bestanden. De geëxtraheerde tekst sla je op in een variabele genaamd cvTekst.

// Code node: PDF tekst extractie en sanitatie
const attachment = $input.item.binary['attachment_0'];
const filename = attachment.fileName || 'cv.pdf';

// Controleer bestandstype
if (!filename.toLowerCase().endsWith('.pdf') && 
    !filename.toLowerCase().endsWith('.docx')) {
  throw new Error(`Onverwacht bestandstype: ${filename}. Alleen PDF en DOCX ondersteund.`);
}

// Extraheer tekst via n8n's ingebouwde parser
const cvTekst = $input.item.json['data'] || '';

// Saniteer de tekst (verwijder overtollige witruimte)
const cvTekstSchoon = cvTekst
  .replace(/\n{3,}/g, '\n\n')
  .replace(/\s{2,}/g, ' ')
  .trim();

// Extraheer e-mailadres kandidaat uit de trigger-mail
const kandidaatEmail = $('Gmail Trigger').item.json.from;
const kandidaatNaam = kandidaatEmail.split('@')[0].replace(/[._]/g, ' ');

return [{
  json: {
    cvTekst: cvTekstSchoon,
    kandidaatEmail: kandidaatEmail,
    kandidaatNaam: kandidaatNaam,
    bestandsnaam: filename,
    ontvangstTijd: new Date().toISOString()
  }
}];

Let op: sommige CV's zijn als gescande afbeelding opgeslagen in een PDF. In dat geval is de geëxtraheerde tekst leeg of onleesbaar. Voeg een validatiestap toe die controleert of de tekst minimaal 200 tekens bevat. Zo niet, stuur dan een fout-notificatie naar de HR-manager met de vraag het CV handmatig te beoordelen.

Stap 4: Vacatureprofiel opstellen als Claude system prompt

De kwaliteit van de Claude-analyse staat of valt met de kwaliteit van je system prompt. Dit is het vacatureprofiel dat je opstelt voor de functie Senior Marketing Manager bij TechBedrijf B.V. De system prompt moet gedetailleerd, concreet en meetbaar zijn.

Hieronder de volledige system prompt die je in de Claude-node instelt. Neem de tijd om deze aan te passen aan jouw specifieke vacature. Hoe specifieker de criteria, hoe accurater de beoordeling.

Je bent een ervaren HR-specialist bij TechBedrijf B.V. 
Je taak is het objectief beoordelen van CV's voor de functie Senior Marketing Manager.

## Over TechBedrijf B.V.
TechBedrijf B.V. is een snelgroeiend SaaS-bedrijf in Amsterdam met 80 medewerkers. 
We zijn actief in de HR-tech sector en zoeken iemand die onze marketing 
naar het volgende niveau tilt.

## Functievereisten Senior Marketing Manager

### Must-haves (elk criterium scoren op 1-10):
1. **B2B marketing ervaring**: Minimaal 5 jaar ervaring in B2B marketing, 
   bij voorkeur in tech of SaaS.
2. **Lead generation**: Aantoonbare resultaten met inbound en outbound 
   leadgeneratie (SEO, content, paid).
3. **Team management**: Ervaring met aansturen van een marketing team (2+ personen).
4. **Data-gedreven**: Werken met analytics tools (Google Analytics, HubSpot of vergelijkbaar).
5. **Content strategie**: Aantoonbare ervaring met het opzetten van content marketing programmas.

### Nice-to-haves (meegenomen in totaalscore):
- Ervaring met de Nederlandse B2B markt
- Kennis van marketing automation (HubSpot, Marketo)
- Account-based marketing (ABM) ervaring
- Achtergrond in HR-tech of recruitment sector

## Outputformaat
Geef je beoordeling ALTIJD als geldig JSON terug in dit exacte formaat:

{
  "kandidaat_samenvatting": "2-3 zinnen over de kandidaat",
  "scores": {
    "b2b_marketing_ervaring": {
      "score": 8,
      "toelichting": "7 jaar B2B marketing bij SaaS-bedrijven, waaronder..."
    },
    "lead_generation": {
      "score": 7,
      "toelichting": "Bewezen track record met inbound..."
    },
    "team_management": {
      "score": 6,
      "toelichting": "1,5 jaar team lead ervaring..."
    },
    "data_gedreven": {
      "score": 9,
      "toelichting": "Sterke analytische achtergrond, HubSpot certified..."
    },
    "content_strategie": {
      "score": 8,
      "toelichting": "Opgezet content programma dat..."
    }
  },
  "nice_to_haves": {
    "gevonden": ["HubSpot ervaring", "Nederlandse markt"],
    "ontbrekend": ["ABM ervaring", "HR-tech achtergrond"]
  },
  "totaalscore": 7.6,
  "aanbeveling": "uitnodigen",
  "aanbeveling_reden": "Sterke B2B achtergrond met bewezen resultaten...",
  "rode_vlaggen": [],
  "vervolgvragen": [
    "Welke concrete leadgeneratie-resultaten heb je behaald?",
    "Hoe groot was het team dat je aanstuurde?"
  ]
}

Mogelijke waarden voor aanbeveling: "direct_uitnodigen", "uitnodigen", 
"bewaren", "afwijzen"

Wees eerlijk en objectief. Geef geen scores hoger dan 7 tenzij er sterke 
aantoonbare bewijzen zijn in het CV.

De system prompt bepaalt ook het outputformaat. Door Claude te instrueren om JSON terug te geven, kun je de output direct verwerken in de volgende nodes zonder extra parsing-logica. Zorg dat de JSON-structuur exact overeenkomt met wat je verwacht in Google Sheets.

Stap 5: Claude aanroepen voor CV-analyse en scoring

Voeg een HTTP Request node toe na de PDF-parsing node. Claude wordt aangeroepen via de Anthropic Messages API. Stel de node als volgt in: methode POST, URL https://api.anthropic.com/v1/messages, en voeg de benodigde headers toe.

{
  "node": "HTTP Request - Claude API",
  "parameters": {
    "method": "POST",
    "url": "https://api.anthropic.com/v1/messages",
    "headers": {
      "x-api-key": "{{ $env.ANTHROPIC_API_KEY }}",
      "anthropic-version": "2023-06-01",
      "content-type": "application/json"
    },
    "body": {
      "model": "claude-sonnet-4-5",
      "max_tokens": 2000,
      "system": "{{ $node['System Prompt'].json.systemPrompt }}",
      "messages": [
        {
          "role": "user",
          "content": "Beoordeel het volgende CV voor de functie Senior Marketing Manager bij TechBedrijf B.V.:\n\n{{ $node['PDF Extract'].json.cvTekst }}\n\nGeef je beoordeling als JSON terug volgens het opgegeven formaat."
        }
      ]
    }
  }
}

Bewaar je Anthropic API-sleutel als environment variable in n8n, nooit hard-coded in de workflow. Ga naar Settings > Variables in n8n en voeg ANTHROPIC_API_KEY toe. De kosten voor Claude Sonnet zijn ongeveer $3 per 1 miljoen input-tokens. Een gemiddeld CV van 1.500 woorden kost minder dan $0,01 per analyse.

n8n's HTTP Request node retourneert de volledige API-response. De daadwerkelijke tekst van Claude staat in content[0].text. Voeg een Code node toe om deze waarde te extraheren en als JSON te parsen:

// Code node: Claude response parsen
const claudeResponse = $input.item.json;
const tekstContent = claudeResponse.content[0].text;

// Verwijder eventuele markdown code blocks om puur JSON te houden
const jsonString = tekstContent
  .replace(/```json\n?/g, '')
  .replace(/```\n?/g, '')
  .trim();

let scoreData;
try {
  scoreData = JSON.parse(jsonString);
} catch (e) {
  // Fallback als JSON parsing mislukt
  scoreData = {
    kandidaat_samenvatting: "Parse fout - handmatige review vereist",
    scores: {},
    totaalscore: 0,
    aanbeveling: "handmatige_review",
    aanbeveling_reden: "JSON parsing mislukt: " + e.message,
    rode_vlaggen: ["Technische fout bij verwerking"],
    vervolgvragen: []
  };
}

// Voeg metadata toe
scoreData.verwerkingsTijd = new Date().toISOString();
scoreData.kandidaatEmail = $('PDF Extract').item.json.kandidaatEmail;
scoreData.kandidaatNaam = $('PDF Extract').item.json.kandidaatNaam;
scoreData.bestandsnaam = $('PDF Extract').item.json.bestandsnaam;

return [{ json: scoreData }];

Stap 6: Score structureren en valideren

Na het parsen van de Claude-output voegen we een validatiestap toe. Dit is cruciaal: als Claude een onverwacht formaat teruggeeft (wat zelden maar niet nooit voorkomt), wil je dat de pipeline gracieus faalt in plaats van corrupte data in je spreadsheet te zetten.

Voeg een IF-node toe die controleert of totaalscore een getal is tussen 1 en 10, aanbeveling een van de verwachte waarden heeft, en scores alle vijf criteria bevat. Als de validatie mislukt, wordt de HR-manager via Slack genotificeerd voor handmatige review.

// Code node: Score validatie
const data = $input.item.json;

const errors = [];

// Valideer totaalscore
if (typeof data.totaalscore !== 'number' || 
    data.totaalscore < 1 || 
    data.totaalscore > 10) {
  errors.push(`Ongeldige totaalscore: ${data.totaalscore}`);
}

// Valideer aanbeveling
const geldigeAanbevelingen = [
  'direct_uitnodigen', 
  'uitnodigen', 
  'bewaren', 
  'afwijzen',
  'handmatige_review'
];
if (!geldigeAanbevelingen.includes(data.aanbeveling)) {
  errors.push(`Ongeldige aanbeveling: ${data.aanbeveling}`);
}

// Valideer scores object
const vereisteCriteria = [
  'b2b_marketing_ervaring',
  'lead_generation', 
  'team_management',
  'data_gedreven',
  'content_strategie'
];

for (const criterium of vereisteCriteria) {
  if (!data.scores[criterium]) {
    errors.push(`Ontbrekend criterium: ${criterium}`);
  }
}

// Bereken gemiddelde ter verificatie
if (data.scores && Object.keys(data.scores).length === 5) {
  const gemiddelde = Object.values(data.scores)
    .reduce((sum, c) => sum + c.score, 0) / 5;
  data.berekendGemiddelde = Math.round(gemiddelde * 10) / 10;
}

data.validatieFouten = errors;
data.isValide = errors.length === 0;

return [{ json: data }];

Splits de flow na validatie: geldige scores gaan naar Google Sheets en de notificatie-stappen. Ongeldige scores worden gelogd en de HR-manager ontvangt een melding met de ruwe Claude-output voor handmatige beoordeling.

Stap 7: Google Sheets updaten met kandidaatprofiel en scores

Maak een nieuwe Google Spreadsheet aan met de naam 'CV Screening Dashboard - TechBedrijf BV'. Maak twee tabbladen aan: 'Kandidaten' en 'Dashboard'. In het tabblad Kandidaten stel je de volgende kolommen in:

Kolom A: Tijdstip ontvangst. Kolom B: Kandidaat naam. Kolom C: E-mailadres. Kolom D: Totaalscore. Kolom E: Aanbeveling. Kolom F: B2B Marketing (score). Kolom G: Lead Generation (score). Kolom H: Team Management (score). Kolom I: Data-gedreven (score). Kolom J: Content Strategie (score). Kolom K: Samenvatting. Kolom L: Rode vlaggen. Kolom M: Bestandsnaam CV.

Voeg in n8n een Google Sheets node toe met de actie 'Append Row'. Verbind je Google-account en selecteer de juiste spreadsheet en het tabblad 'Kandidaten'. Map de velden zoals hieronder:

{
  "node": "Google Sheets - Kandidaat toevoegen",
  "parameters": {
    "operation": "appendOrUpdate",
    "sheetId": "{{ $env.SHEETS_ID }}",
    "range": "Kandidaten!A:M",
    "keyRow": 1,
    "dataStartRow": 2,
    "columns": {
      "value": {
        "A": "={{ $now.format('dd-MM-yyyy HH:mm') }}",
        "B": "={{ $json.kandidaatNaam }}",
        "C": "={{ $json.kandidaatEmail }}",
        "D": "={{ $json.totaalscore }}",
        "E": "={{ $json.aanbeveling }}",
        "F": "={{ $json.scores.b2b_marketing_ervaring.score }}",
        "G": "={{ $json.scores.lead_generation.score }}",
        "H": "={{ $json.scores.team_management.score }}",
        "I": "={{ $json.scores.data_gedreven.score }}",
        "J": "={{ $json.scores.content_strategie.score }}",
        "K": "={{ $json.kandidaat_samenvatting }}",
        "L": "={{ $json.rode_vlaggen.join(', ') }}",
        "M": "={{ $json.bestandsnaam }}"
      }
    }
  }
}

Voeg conditieopmaak toe aan kolom D (totaalscore) voor een visueel overzicht: scores hoger dan 7 in groen, 5-7 in geel en onder 5 in rood. Dit doe je via Opmaak > Voorwaardelijke opmaak in Google Sheets.

// Handige Google Sheets formules voor het Dashboard-tabblad

// Gemiddelde totaalscore van alle kandidaten
=GEMIDDELDE(Kandidaten!D2:D)

// Aantal kandidaten per aanbeveling
=AANTAL.ALS(Kandidaten!E2:E, "direct_uitnodigen")
=AANTAL.ALS(Kandidaten!E2:E, "uitnodigen")
=AANTAL.ALS(Kandidaten!E2:E, "bewaren")
=AANTAL.ALS(Kandidaten!E2:E, "afwijzen")

// Top 5 kandidaten op totaalscore
=SORTEREN(FILTER(Kandidaten!B2:E, Kandidaten!D2:D<>""), 3, ONWAAR)

// Hoogste score per criterium
=MAX(Kandidaten!F2:F)  // B2B Marketing
=MAX(Kandidaten!G2:G)  // Lead Generation

// Percentage kandidaten uitgenodigd
=AANTAL.ALS(Kandidaten!E2:E, "uitnodigen") / 
 AANTALARG(Kandidaten!E2:E) * 100

// Vandaag binnengekomen sollicitaties
=AANTAL.ALS(Kandidaten!A2:A, ">="&VANDAAG())

Stap 8: Automatische bevestigingsmail sturen naar kandidaat

Iedere kandidaat verdient een professionele bevestiging. Voeg een Gmail-node toe met de actie 'Send Email'. Stel een sjabloon in dat de kandidaatnaam en functietitel bevat. Verstuur de mail binnen 5 minuten na ontvangst van de sollicitatie, ongeacht de score.

Onderwerp: Bevestiging sollicitatie Senior Marketing Manager - TechBedrijf B.V.

Beste {{ $json.kandidaatNaam }},

Hartelijk dank voor je sollicitatie op de functie Senior Marketing Manager 
bij TechBedrijf B.V.

We hebben je sollicitatie in goede orde ontvangen en nemen deze zorgvuldig 
door. Onze HR-afdeling neemt binnen 5 werkdagen contact met je op.

Heb je vragen? Stuur een mail naar hr@techbedrijfbv.nl.

Met vriendelijke groet,
Het HR-team van TechBedrijf B.V.

---
TechBedrijf B.V.
Herengracht 420, 1017 BZ Amsterdam
www.techbedrijfbv.nl | hr@techbedrijfbv.nl

Wil je de toon van de bevestigingsmail aanpassen op basis van de score? Dat kan met een IF-node voor de Gmail-node. Kandidaten met een score boven 8 ontvangen een warmere mail met de melding dat ze snel teruggehoord worden. Kandidaten met een score onder 4 ontvangen de standaard mail. Dit is subtiel maar effectief voor employer branding.

Stap 9: Slack notificatie voor HR-manager bij score boven 7

Voeg een IF-node toe na de Google Sheets stap. Stel de conditie in: totaalscore groter dan of gelijk aan 7. Als de conditie waar is, voer dan de Slack-node uit. Verbind je Slack-workspace en stel het kanaal in op #recruitment of een privé HR-kanaal.

{
  "node": "Slack - HR Notificatie",
  "parameters": {
    "channel": "#recruitment",
    "text": ":star: Sterke kandidaat gevonden!",
    "blocks": [
      {
        "type": "header",
        "text": {
          "type": "plain_text",
          "text": ":tada: Nieuwe sterke kandidaat: Senior Marketing Manager"
        }
      },
      {
        "type": "section",
        "fields": [
          {
            "type": "mrkdwn",
            "text": "*Kandidaat:*\n{{ $json.kandidaatNaam }}"
          },
          {
            "type": "mrkdwn",
            "text": "*Totaalscore:*\n{{ $json.totaalscore }}/10"
          },
          {
            "type": "mrkdwn",
            "text": "*Aanbeveling:*\n{{ $json.aanbeveling }}"
          },
          {
            "type": "mrkdwn",
            "text": "*Ontvangen:*\n{{ $now.format('dd-MM-yyyy HH:mm') }}"
          }
        ]
      },
      {
        "type": "section",
        "text": {
          "type": "mrkdwn",
          "text": "*Samenvatting:*\n{{ $json.kandidaat_samenvatting }}"
        }
      },
      {
        "type": "actions",
        "elements": [
          {
            "type": "button",
            "text": {
              "type": "plain_text",
              "text": "Bekijk in Sheets"
            },
            "url": "https://docs.google.com/spreadsheets/d/{{ $env.SHEETS_ID }}"
          }
        ]
      }
    ]
  }
}

De Slack-notificatie bevat een directe link naar de Google Sheets. De HR-manager kan met één klik de volledige scoring en toelichting per criterium bekijken. Voeg ook een knop toe om het CV direct te openen als je de bijlage opslaat in Google Drive (zie de Uitbreidingen sectie hieronder).

Stap 10: Dashboard instellen in Google Sheets

Het tabblad Dashboard geeft een visueel overzicht van het wervingsproces. Voeg de volgende elementen toe voor een compleet beeld:

Maak een samenvatting-sectie bovenaan het Dashboard-tabblad. Gebruik de formules uit Stap 7 om het totaal aantal sollicitanten, de gemiddelde score, het aantal uitnodigingen en het percentage afwijzingen te tonen. Gebruik kleurvakken (via celopmaak) voor een clean visueel overzicht.

// Dashboard structuur (celadressen voor Google Sheets)

// Rij 1-2: Titelbalk (samenvoegen + opmaak)
A1: "CV Screening Dashboard - TechBedrijf B.V."
A2: "Vacature: Senior Marketing Manager | Bijgewerkt: " & TEKST(NU(),"dd-mm-jjjj uu:mm")

// Rij 4-9: KPI-blokken (elk in een 2x2 cel-blok)
A4: "Totaal sollicitanten"    B4: =AANTALARG(Kandidaten!D2:D)
D4: "Gemiddelde score"        E4: =AFRONDEN(GEMIDDELDE(Kandidaten!D2:D),1)
G4: "Direct uitnodigen"       H4: =AANTAL.ALS(Kandidaten!E2:E,"direct_uitnodigen")
J4: "Uitnodigen"              K4: =AANTAL.ALS(Kandidaten!E2:E,"uitnodigen")

A6: "Bewaren"                 B6: =AANTAL.ALS(Kandidaten!E2:E,"bewaren")
D6: "Afwijzen"                E6: =AANTAL.ALS(Kandidaten!E2:E,"afwijzen")
G6: "Conversie %"             H6: =AFRONDEN((H4+K4)/B4*100,1)&"%"
J6: "Hoogste score"           K6: =MAX(Kandidaten!D2:D)

// Rij 11+: Top kandidaten tabel
A11: "Top kandidaten (score >= 7)"
A12: "Naam" | B12: "Score" | C12: "Aanbeveling" | D12: "E-mail"
A13: =ALS(RIJ()-12<=AANTAL.ALS(Kandidaten!D2:D,">=7"),
     INDEX(SORTEREN(FILTER(Kandidaten!B2:E,Kandidaten!D2:D>=7),3,ONWAAR),
     RIJ()-12,1),"")

Voeg ook een grafiek toe die de verdeling van scores toont (histogram met de totaalscores van alle kandidaten). Selecteer kolom D van het Kandidaten-tabblad, klik op Invoegen > Grafiek en kies een kolomdiagram. Dit geeft snel inzicht in de algehele kwaliteit van de sollicitantenpool.

BONUS: Meerdere vacatures tegelijk beheren

Zodra je de pipeline draaiend hebt voor één vacature, wil je hem waarschijnlijk inzetten voor meerdere functies. De eenvoudigste aanpak is om het onderwerp van de sollicitatie-mail te gebruiken als routing-criterium.

Pas de Gmail-trigger aan zodat hij alle mails met bijlage opvangt (verwijder het onderwerpfilter). Voeg daarna een Switch-node toe die op basis van het onderwerp bepaalt welk vacatureprofiel en welke spreadsheet wordt gebruikt. Maak voor elke vacature een aparte set n8n-variabelen aan:

// Code node: Vacature routing op basis van onderwerp
const onderwerp = $('Gmail Trigger').item.json.subject.toLowerCase();
const van = $('Gmail Trigger').item.json.from;

// Vacature definities
const vacatures = {
  'marketing manager': {
    id: 'senior-marketing-manager',
    sheetsId: process.env.SHEETS_ID_MARKETING,
    slackKanaal: '#recruitment-marketing',
    systemPromptVar: 'PROMPT_MARKETING_MANAGER'
  },
  'developer': {
    id: 'fullstack-developer',
    sheetsId: process.env.SHEETS_ID_DEV,
    slackKanaal: '#recruitment-tech',
    systemPromptVar: 'PROMPT_DEVELOPER'
  },
  'sales manager': {
    id: 'sales-manager',
    sheetsId: process.env.SHEETS_ID_SALES,
    slackKanaal: '#recruitment-sales',
    systemPromptVar: 'PROMPT_SALES_MANAGER'
  }
};

// Bepaal de vacature op basis van onderwerp
let gevondenVacature = null;
for (const [sleutelwoord, vacature] of Object.entries(vacatures)) {
  if (onderwerp.includes(sleutelwoord)) {
    gevondenVacature = vacature;
    break;
  }
}

// Fallback: stuur naar HR voor handmatige routing
if (!gevondenVacature) {
  gevondenVacature = {
    id: 'onbekend',
    sheetsId: process.env.SHEETS_ID_OVERIG,
    slackKanaal: '#recruitment-overig',
    systemPromptVar: 'PROMPT_GENERIEK'
  };
}

return [{
  json: {
    vacature: gevondenVacature,
    kandidaatEmail: van,
    origineelOnderwerp: onderwerp
  }
}];

Met deze aanpak beheer je tien vacatures met één workflow. De data-isolatie per vacature (aparte spreadsheets, aparte Slack-kanalen) zorgt dat overzicht behouden blijft. Voeg een wekelijks rapport toe via een aparte n8n Cron-workflow die een overzicht per vacature stuurt naar het management:

{
  "node": "Cron Trigger - Wekelijks rapport",
  "parameters": {
    "triggerTimes": {
      "item": [
        {
          "mode": "everyWeek",
          "weekday": 1,
          "hour": 8,
          "minute": 0
        }
      ]
    }
  },
  "description": "Elke maandag om 08:00 een wekelijks wervingsoverzicht sturen"
}

Troubleshooting: Veelvoorkomende problemen

Hieronder de vijf meest voorkomende problemen bij het implementeren van deze pipeline, met oplossingen.

Probleem 1: Gmail trigger vindt geen nieuwe mails

Symptoom: de n8n workflow wordt niet geactiveerd bij nieuwe sollicitaties. Controleer eerst of de Gmail OAuth-verbinding nog geldig is. Ga in n8n naar Credentials en verifieer de Gmail-verbinding. OAuth-tokens verlopen soms na 7 dagen zonder gebruik. Refresh de verbinding door opnieuw te authenticeren. Controleer ook of het Gmail-account dat je koppelt daadwerkelijk de sollicitaties ontvangt en niet een doorgestuurd adres.

Probleem 2: PDF-extractie levert lege tekst op

Symptoom: de cvTekst variabele is leeg of bevat alleen witruimte. Oorzaak: het CV is een gescande PDF zonder tekstlaag (image-based PDF). Oplossing: voeg een OCR-stap toe via een externe service zoals pdf.co of AWS Textract. Alternatief: stuur de HR-manager automatisch een notificatie met het verzoek het CV handmatig te beoordelen. Voeg ook een validatie toe die controleert of het geëxtraheerde tekstblok minimaal 200 tekens bevat.

Probleem 3: Claude geeft geen geldige JSON terug

Symptoom: de JSON parsing in de Code node mislukt met een SyntaxError. Dit gebeurt soms als Claude de JSON omhult met uitleg of markdown. De oplossing staat al in de Code node van Stap 5 (het regex-patroon dat markdown verwijdert). Als het probleem aanhoudt, pas de Claude system prompt aan met de instructie: 'Geef ALLEEN de JSON terug, geen enkele andere tekst, geen uitleg, geen code blocks.' Gebruik ook de parameter temperature: 0 in de API-aanroep voor consistentere output.

Probleem 4: Google Sheets API rate limit overschreden

Symptoom: de Google Sheets node geeft een 429-fout bij veel gelijktijdige sollicitaties. Google Sheets staat 100 write requests per 100 seconden toe. Bij 10+ gelijktijdige sollicitaties kan dit een probleem zijn. Oplossing: voeg een Wait-node toe van 2 seconden voor de Sheets-node. Overweeg bij hoge volumes om een tussentijdse buffer te gebruiken, bijvoorbeeld Google Firestore of een eenvoudige PostgreSQL database, en data periodiek te exporteren naar Sheets.

Probleem 5: Slack notificaties komen niet aan

Symptoom: de workflow slaagt maar de Slack-berichten verschijnen niet. Controleer of de Slack-app de juiste permissies heeft: chat:write en chat:write.public zijn vereist. Controleer ook of het Slack-kanaal bestaat (hoofdlettergevoelig). Als je een privé kanaal gebruikt, moet de Slack-app eerst worden uitgenodigd voor dat kanaal via /invite @jouw-app-naam in Slack. Verifieer de Slack-token op scope-fouten in de n8n error log.

Probleem 6: Kandidaatnaam wordt onjuist geëxtraheerd

Symptoom: de kandidaatnaam in Sheets toont het e-mailadres in plaats van de naam. Dit gebeurt als de afzender in Gmail geen displaynaam heeft ingesteld. Pas de Code node aan om de naam ook te proberen extraheren uit de aanhef van het CV zelf. Gebruik een Claude-aanroep specifiek voor naam-extractie, of vraag in de vacatureomschrijving om een standaard onderwerpregel zoals 'Sollicitatie [Naam] - Senior Marketing Manager'.

Uitbreidingen: Vervolgstappen om de pipeline te verbeteren

De pipeline zoals beschreven in deze handleiding is een solide basis. Hieronder een aantal uitbreidingen die je kunt implementeren naarmate je meer ervaring opdoet met de workflow.

CV opslaan in Google Drive

Voeg een Google Drive node toe die de ontvangen PDF-bijlage opslaat in een gedeelde map. Organiseer op basis van vacature en datum: /Recruitment/Senior-Marketing-Manager/2026-03/. Voeg de Drive-link toe als extra kolom in Google Sheets zodat HR direct het originele CV kan openen vanuit het dashboard.

Kandidaat-communicatie tijdlijn

Voeg een tweede tabblad Communicatie toe aan Google Sheets dat alle mailcontacten bijhoudt. Combineer dit met een n8n workflow die drie dagen na ontvangst van een sollicitatie automatisch controleert of er al contact is geweest. Zo voorkom je dat kandidaten te lang wachten op feedback.

LinkedIn profiel verrijking

Als kandidaten hun LinkedIn-URL vermelden in het CV, kun je deze automatisch meenemen in de data. Voeg een HTTP Request node toe die de publieke LinkedIn-pagina ophaalt (let op de gebruiksvoorwaarden van LinkedIn). Stuur de gecombineerde data naar Claude voor een completere beoordeling.

Anoniem screenen voor bias-reductie

Voeg een anonimiserings-stap toe voor je het CV naar Claude stuurt. Verwijder naam, geslacht, leeftijd en nationaliteit uit de tekst met een voorverwerkende Code node. Claude beoordeelt dan uitsluitend op basis van competenties. Dit is juridisch ook verstandig in het kader van gelijke behandelingswetgeving.

Webhooks voor extern sollicitatieformulier

Vervang de Gmail-trigger door een Webhook-trigger in n8n. Bouw een eenvoudig sollicitatieformulier met Typeform of een custom HTML-pagina die direct naar de n8n-webhook post. Zo heb je volledige controle over welke data je ontvangt en hoef je niet afhankelijk te zijn van Gmail-parsing.

Resultaten en ROI

TechBedrijf B.V. heeft na het implementeren van deze pipeline de volgende resultaten geboekt in de eerste twee maanden:

Screeningstijd per sollicitatie teruggebracht van gemiddeld 8 minuten naar minder dan 1 minuut. Wachttijd voor kandidaten op bevestiging: van 4 uur naar 4 minuten. Consistentie in beoordeling: 100% (elke kandidaat wordt op dezelfde criteria beoordeeld). HR-tevredenheid met het wervingsproces: gestegen van 6,2 naar 8,4 op een schaal van 10.

De totale investering in deze handleiding is minder dan één werkdag. De terugverdientijd bij 2+ vacatures per jaar is minder dan één week. En dat is nog exclusief de kwaliteitsverbetering: omdat alle beoordelingen consistent en gedocumenteerd zijn, is het eenvoudiger om het wervingsproces te evalueren en te verbeteren.

Conclusie

Je hebt nu een volledig werkende AI recruitment pipeline gebouwd die Gmail, n8n, Claude en Google Sheets combineert tot een krachtig systeem dat CV's automatisch screent, scoort en rapporteert. De pipeline werkt 24/7, is consistent in zijn beoordelingen en geeft je HR-team de informatie die ze nodig hebben om snel goede beslissingen te nemen.

De echte kracht van deze aanpak zit niet in de automatisering zelf, maar in de gestructureerde data die het genereert. Elk beoordeling is gedocumenteerd, elke score is traceerbaar. Dat maakt het mogelijk om je wervingsproces continu te verbeteren op basis van echte data.

Klaar voor de volgende stap? Lees ook onze handleiding over automatische AI e-mailopvolging met n8n en Gmail voor de communicatie met kandidaten, of verdiep je in de bredere mogelijkheden met de complete AI-stack voor MKB.

Vragen of suggesties? Deel ze via de reacties hieronder. We lezen alles en verwerken goede feedback in updates van deze handleiding.

Gerelateerd

Nieuwsbrief

Meer handleidingen en tips?

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

Gratis aanmelden →