La puntuación de clientes potenciales basada en señales de búsqueda web identifica qué clientes potenciales merecen atención inmediata. En lugar de calificar únicamente según los datos del formulario (cargo, tamaño de la empresa), puede enriquecer cada cliente potencial con datos de búsqueda en vivo sobre su empresa (estado de financiación, pila tecnológica, actividad de contratación y señales de crecimiento) y luego calificar según ese contexto. Este tutorial crea un flujo de trabajo n8n que recibe clientes potenciales a través de un webhook, los enriquece con datos de la API de búsqueda, calcula una puntuación de calificación y envía clientes potenciales con puntuaciones altas a su equipo de ventas. Cada enriquecimiento cuesta entre 0,005 y 0,015 dólares a través de Scavio.
Requisitos previos
- Instancia n8n en ejecución (autohospedada o en la nube)
- Una clave API de Scavio de scavio.dev
- Una URL de webhook para recibir clientes potenciales (o activador manual para pruebas)
- Slack o correo electrónico para notificaciones de clientes potenciales
Guia paso a paso
Paso 1: Configurar el webhook de admisión de clientes potenciales
Cree un webhook n8n que reciba nuevos clientes potenciales. Esto puede conectarse a su herramienta de formulario, CRM o cualquier sistema que genere clientes potenciales.
// 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"}'Paso 2: Enriquecer con datos de búsqueda de empresas
Busque la empresa para encontrar noticias recientes, financiación e información general. Utilice dos búsquedas específicas para obtener la máxima extracción de señal.
// 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"
}Paso 3: Extraer señales de puntuación de los resultados de búsqueda
Analice los resultados de la búsqueda para identificar señales de crecimiento, estado de financiación, tamaño de la empresa y uso de tecnología. Cada señal contribuye a la puntuación principal.
// 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 } }];Paso 4: Calcular la puntuación compuesta de clientes potenciales
Asigne valores de puntos a cada señal y calcule una puntuación total. Enrute clientes potenciales según umbrales de puntuación.
// 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
}
}];Paso 5: Enrutar y notificar según la puntuación
Utilice un nodo Switch n8n para enrutar clientes potenciales por nivel. Los clientes potenciales calientes van a Slack inmediatamente, los clientes potenciales calientes a una cola de revisión, los clientes potenciales fríos a la crianza.
// 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)Ejemplo en 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"]})')Ejemplo en 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));Salida esperada
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