Stap 1: HubSpot API koppelen aan n8n
Ga naar je HubSpot-account en navigeer naar Instellingen > Integraties > Privé apps. Maak een nieuwe privé app aan met de naam 'n8n Lead Scoring'. Geef de app leestoegang tot Contacts en schrijftoegang tot Contact Properties.
Kopieer de gegenereerde API-token (begint met pat-eu1-...). Bewaar deze veilig — je hebt hem straks nodig in n8n.
Open n8n en ga naar Credentials > New Credential > HubSpot API. Plak de token in het veld 'API Key'. Test de verbinding — je zou een groene checkmark moeten zien.
{
"credentialType": "hubspotApi",
"name": "HubSpot Lead Scoring",
"data": {
"apiKey": "pat-eu1-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
}
Stap 2: Nieuwe contacten triggeren via webhook
In n8n maak je een nieuw workflow aan. Voeg als eerste node een 'HubSpot Trigger' toe. Selecteer het event 'Contact Created' — zo triggert de workflow automatisch zodra er een nieuw contact in HubSpot wordt aangemaakt.
Alternatief: gebruik een periodieke trigger (cron: elke uur) die nieuwe contacten van de afgelopen 60 minuten ophaalt via een HubSpot Search node. Dit is handiger als je bulk-imports verwerkt.
// Cron-trigger voor elk uur
{
"triggerType": "interval",
"interval": 60,
"unit": "minutes"
}
Stap 3: Contactdata ophalen
Voeg een 'HubSpot: Get Contact' node toe. Haal de volgende properties op: bedrijfsgrootte (numberofemployees), functietitel (jobtitle), aantal pageviews (hs_analytics_num_page_views), email opens (hs_email_open), en branche (industry).
Gebruik een 'Set' node om de data te normaliseren. Converteer bedrijfsgrootte naar een categorie: minder dan 10 is micro, 10-50 is klein, 50-250 is middel, 250+ is groot.
const employees = parseInt($json.numberofemployees) || 0;
let companySize = "onbekend";
if (employees >= 250) companySize = "groot";
else if (employees >= 50) companySize = "middel";
else if (employees >= 10) companySize = "klein";
else if (employees > 0) companySize = "micro";
return { companySize, jobtitle: $json.jobtitle, industry: $json.industry };
Stap 4: Claude scoringsmodel bouwen
Voeg een 'HTTP Request' node toe die Claude's API aanroept. Gebruik het claude-3-5-sonnet model. De prompt is het hart van je lead scoring systeem — hier zit de intelligentie.
const prompt = `Je bent een B2B lead scoring expert voor een SaaS-bedrijf gericht op MKB in Nederland.
Analyseer dit contact en geef een score van 0-100:
Contact info:
- Functie: ${jobtitle}
- Bedrijfsgrootte: ${companySize}
- Branche: ${industry}
- Pageviews laatste 30 dagen: ${pageviews}
- Email opens: ${emailOpens}
Scoringscriteria:
1. Functie (0-30 punten): CEO/Directeur/Owner = 30, Manager = 20, Medewerker = 10
2. Bedrijfsgrootte (0-25 punten): middel/groot = 25, klein = 15, micro = 5
3. Betrokkenheid (0-25 punten): >10 pageviews = 25, 5-10 = 15, 1-5 = 5
4. Branche-fit (0-20 punten): Tech/Marketing/Finance = 20, Overig = 10
Geef je antwoord UITSLUITEND als JSON:
{
"score": <getal 0-100>,
"categorie": "<hot|warm|cold>",
"redenering": "<max 2 zinnen>",
"prioriteit": "<hoog|middel|laag>"
}`;
De output sla je op met een 'JSON Parse' node. De structuur bevat altijd: score (0-100), categorie (hot/warm/cold), redenering en prioriteit.
Stap 5: Score berekenen en categoriseren
Na Claude's analyse voeg je een 'Function' node toe die de score valideert en de categorie definitief bepaalt. Dit is een fallback voor het geval Claude een onverwachte output geeft.
const claudeResponse = JSON.parse($json.choices[0].message.content);
const score = Math.min(100, Math.max(0, parseInt(claudeResponse.score)));
let categorie;
if (score >= 70) categorie = "hot";
else if (score >= 40) categorie = "warm";
else categorie = "cold";
return {
leadScore: score,
leadCategorie: categorie,
leadRedenering: claudeResponse.redenering,
scoredAt: new Date().toISOString()
};
Stap 6: Score terugschrijven naar HubSpot
Maak eerst een custom contact property aan in HubSpot: Instellingen > Properties > Contact Properties > Create Property. Naam: 'AI Lead Score', Type: Number. En een tweede: 'AI Lead Categorie', Type: Single-line text.
Voeg een 'HubSpot: Update Contact' node toe. Map de velden: ai_lead_score naar leadScore, ai_lead_categorie naar leadCategorie, en ai_score_redenering naar leadRedenering.
// HubSpot Update Contact payload
{
"contactId": "{{ $json.contactId }}",
"properties": {
"ai_lead_score": "{{ $json.leadScore }}",
"ai_lead_categorie": "{{ $json.leadCategorie }}",
"ai_score_redenering": "{{ $json.leadRedenering }}",
"ai_score_datum": "{{ $json.scoredAt }}"
}
}
Stap 7: Hot leads naar Slack sturen
Voeg een 'IF' node toe: als leadCategorie gelijk is aan 'hot', stuur een Slack-bericht naar het sales-kanaal. Zo wordt je team direct gewaarschuwd voor de meest kansrijke leads.
{
"channel": "#sales-hot-leads",
"text": "Nieuwe hot lead!",
"blocks": [
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "Naam: {{ $json.firstname }} {{ $json.lastname }}\nBedrijf: {{ $json.company }}\nScore: {{ $json.leadScore }}/100\nReden: {{ $json.leadRedenering }}"
}
}
]
}
Test de integratie door een testcontact aan te maken in HubSpot met een directeursfunctie bij een middelgroot bedrijf. Je zou binnen 30 seconden een Slack-bericht moeten ontvangen.
Stap 8: Wekelijks rapport genereren
Maak een tweede workflow aan die elke maandag om 08:00 draait. Deze haalt alle contacten van de afgelopen week op, groepeert ze per categorie (hot/warm/cold) en stuurt een overzicht naar Slack en/of e-mail.
// Wekelijks rapport cron trigger
{
"trigger": "0 8 * * 1",
"stappen": [
"HubSpot Search: contacten uit laatste 7 dagen",
"Group By: ai_lead_categorie",
"Calculate: gemiddelde score per categorie",
"Claude: schrijf samenvatting met inzichten",
"Slack: stuur rapport naar #sales-weekly"
]
}
Troubleshooting: als Claude een ongeldige JSON teruggeeft, voeg een try-catch toe in de Function node en val terug op een standaardscore van 50 (warm). Log de error naar een Google Sheet voor analyse.
Uitbreidingen: koppel Calendly om automatisch een demo in te plannen voor hot leads. Of stuur hot leads direct naar een specifieke sales rep op basis van regio of branche via een Switch node in n8n.