Le score des leads basé sur les signaux de recherche web identifie les leads qui méritent une attention immédiate. Au lieu de noter uniquement sur la base des données de formulaire (intitulé du poste, taille de l'entreprise), vous pouvez enrichir chaque lead avec des données de recherche en direct sur leur entreprise -- statut de financement, stack technologique, activité de recrutement et signaux de croissance -- puis attribuer un score en fonction de ce contexte. Ce tutoriel construit un workflow n8n qui reçoit des leads via webhook, les enrichit avec les données de l'API de recherche, calcule un score de qualification et achemine les leads à fort score vers votre équipe commerciale. Chaque enrichissement coûte 0,005-0,015 $ via Scavio.
Prérequis
- Instance n8n en cours d'exécution (auto-hébergée ou cloud)
- Une clé API Scavio depuis scavio.dev
- Une URL de webhook pour recevoir des leads (ou déclenchement manuel pour les tests)
- Slack ou email pour les notifications de leads
Parcours
Étape 1: Configurer le webhook de réception des leads
Créez un webhook n8n qui reçoit les nouveaux leads. Il peut se connecter à votre outil de formulaire, CRM ou tout système générant des leads.
// n8n Webhook node configuration:
// HTTP Method: POST
// Path: /score-lead
// Response Mode: Last Node
//
// Expected payload:
// {
// "company": "Acme Corp",
// "domain": "acme.com",
// "contact_name": "John Doe",
// "email": "[email protected]",
// "job_title": "VP Engineering"
// }
// Test with curl:
// curl -X POST http://your-n8n:5678/webhook/score-lead \
// -H 'Content-Type: application/json' \
// -d '{"company": "Acme Corp", "domain": "acme.com"}'Étape 2: Enrichir avec les données de recherche sur l'entreprise
Recherchez l'entreprise pour trouver des actualités récentes, financements et informations générales. Utilisez deux recherches ciblées pour une extraction maximale des signaux.
// HTTP Request node 1 - Company overview:
// POST https://api.scavio.dev/api/v1/search
// Headers: x-api-key: {{ $env.SCAVIO_API_KEY }}
// Body:
{
"query": "{{ $json.company }} company overview funding",
"country_code": "us"
}
// HTTP Request node 2 - Hiring signals:
// Body:
{
"query": "{{ $json.company }} hiring OR jobs OR careers 2026",
"country_code": "us"
}
// HTTP Request node 3 - Tech stack (optional, +1 credit):
// Body:
{
"query": "site:{{ $json.domain }} technology OR stack OR platform",
"country_code": "us"
}Étape 3: Extraire les signaux de score des résultats de recherche
Analysez les résultats de recherche pour identifier les signaux de croissance, le statut de financement, la taille de l'entreprise et l'utilisation de la technologie. Chaque signal contribue au score du lead.
// n8n Code node - Extract and score signals:
const overview = $('HTTP Request - Overview').first().json;
const hiring = $('HTTP Request - Hiring').first().json;
const overviewText = (overview.organic_results || [])
.map(r => `${r.title} ${r.snippet || ''}`).join(' ').toLowerCase();
const hiringText = (hiring.organic_results || [])
.map(r => `${r.title} ${r.snippet || ''}`).join(' ').toLowerCase();
const signals = {
hasFunding: /series [a-d]|raised|funding|venture/.test(overviewText),
isHiring: (hiring.organic_results || []).length > 3,
isSaaS: /saas|software|platform|cloud/.test(overviewText),
hasGrowth: /growing|growth|expanding|scaling/.test(overviewText),
seniorTitle: /vp|director|head|chief|cto|ceo/.test(
($input.first().json.job_title || '').toLowerCase()),
hasWebsite: Boolean($input.first().json.domain),
};
return [{ json: { ...$input.first().json, signals } }];Étape 4: Calculer le score composite du lead
Attribuez des points à chaque signal et calculez un score total. Acheminez les leads en fonction des seuils de score.
// n8n Code node - Calculate score:
const signals = $json.signals;
const weights = {
hasFunding: 25,
isHiring: 20,
isSaaS: 15,
hasGrowth: 15,
seniorTitle: 15,
hasWebsite: 10,
};
let score = 0;
const matchedSignals = [];
for (const [signal, points] of Object.entries(weights)) {
if (signals[signal]) {
score += points;
matchedSignals.push(`${signal}: +${points}`);
}
}
const tier = score >= 70 ? 'HOT' : score >= 40 ? 'WARM' : 'COLD';
return [{
json: {
...$json,
score,
tier,
matchedSignals,
enrichmentCost: '$0.010' // 2 search queries
}
}];Étape 5: Acheminer et notifier en fonction du score
Utilisez un nœud Switch n8n pour acheminer les leads par niveau. Les leads chauds vont directement dans Slack, les leads tièdes dans une file d'attente de révision, les leads froids dans un nurturing.
// Switch node on $json.tier:
// HOT -> Slack notification + CRM "Hot Lead" pipeline
// WARM -> CRM "Review" pipeline
// COLD -> CRM "Nurture" sequence
// Slack node for HOT leads:
// Channel: #sales-alerts
// Message:
// *HOT LEAD* (Score: {{ $json.score }}/100)
// Company: {{ $json.company }}
// Contact: {{ $json.contact_name }} ({{ $json.job_title }})
// Signals: {{ $json.matchedSignals.join(', ') }}
// Enrichment cost: {{ $json.enrichmentCost }}
// Cost summary:
// 2-3 search queries per lead = $0.010-0.015
// 100 leads/day = $1.00-1.50/day
// 3000 leads/month = $30-45/month ($30 plan covers it)Exemple Python
import os, requests, re
API_KEY = os.environ['SCAVIO_API_KEY']
def search(query):
resp = requests.post('https://api.scavio.dev/api/v1/search',
headers={'x-api-key': API_KEY, 'Content-Type': 'application/json'},
json={'query': query, 'country_code': 'us'})
return resp.json()
def score_lead(company, domain='', title=''):
overview = search(f'{company} company funding')
text = ' '.join(r.get('snippet', '') for r in overview.get('organic_results', [])).lower()
score = 0
if re.search(r'series [a-d]|raised|funding', text): score += 25
if re.search(r'saas|software|platform', text): score += 15
if re.search(r'growing|scaling', text): score += 15
if re.search(r'vp|director|head|chief', title.lower()): score += 15
if domain: score += 10
tier = 'HOT' if score >= 70 else 'WARM' if score >= 40 else 'COLD'
return {'company': company, 'score': score, 'tier': tier}
for company in ['Stripe', 'Local Bakery LLC']:
result = score_lead(company)
print(f'{result["company"]}: {result["score"]}/100 ({result["tier"]})')Exemple JavaScript
const API_KEY = process.env.SCAVIO_API_KEY;
async function search(query) {
const resp = await fetch('https://api.scavio.dev/api/v1/search', {
method: 'POST',
headers: { 'x-api-key': API_KEY, 'Content-Type': 'application/json' },
body: JSON.stringify({ query, country_code: 'us' })
});
return resp.json();
}
async function scoreLead(company) {
const data = await search(`${company} company funding`);
const text = (data.organic_results || []).map(r => r.snippet || '').join(' ').toLowerCase();
let score = 0;
if (/series [a-d]|raised|funding/.test(text)) score += 25;
if (/saas|software|platform/.test(text)) score += 15;
if (/growing|scaling/.test(text)) score += 15;
const tier = score >= 70 ? 'HOT' : score >= 40 ? 'WARM' : 'COLD';
console.log(`${company}: ${score}/100 (${tier})`);
}
Promise.all(['Stripe', 'Local Bakery'].map(scoreLead));Sortie attendue
Stripe: 55/100 (WARM)
hasFunding: +25
isSaaS: +15
hasGrowth: +15
Local Bakery LLC: 0/100 (COLD)
(no signals matched)
Cost: $0.010 per lead (2 searches)
100 leads/day = $1.00/day, $30/month