Solucione la débil personalización del alcance en n8n agregando un paso de enriquecimiento de búsqueda que extraiga la actividad reciente de los clientes potenciales antes de la generación del correo electrónico. Se ignora la personalización genérica, como el uso de nombres y nombres de empresas. La personalización efectiva hace referencia a algo específico: una publicación de blog reciente, un anuncio de financiación, el lanzamiento de un producto o una charla en una conferencia. Al consultar la API de búsqueda para cada cliente potencial antes de redactar el correo electrónico, su flujo de trabajo n8n puede generar entradas genuinamente personalizadas que hagan referencia a eventos recientes y reales.
Requisitos previos
- Instancia n8n en ejecución (autohospedada o nube n8n)
- Una clave API de Scavio de scavio.dev
- Una lista principal con nombres y empresas
- Un nodo de envío de correo electrónico configurado en n8n
Guia paso a paso
Paso 1: Buscar actividad de prospectos
Consulta el nombre y la empresa del cliente potencial para encontrar actividad pública reciente.
import os, requests
API_KEY = os.environ['SCAVIO_API_KEY']
def find_prospect_activity(name: str, company: str) -> list:
resp = requests.post('https://api.scavio.dev/api/v1/search',
headers={'x-api-key': API_KEY},
json={'platform': 'google', 'query': f'{name} {company} 2026'}, timeout=15)
results = resp.json().get('organic_results', [])
activities = []
for r in results[:5]:
activities.append({
'title': r.get('title', ''),
'snippet': r.get('snippet', ''),
'url': r.get('link', ''),
'type': classify_activity(r),
})
return activities
def classify_activity(result: dict) -> str:
title = (result.get('title', '') + result.get('snippet', '')).lower()
if any(w in title for w in ['blog', 'article', 'wrote', 'published']):
return 'content'
if any(w in title for w in ['spoke', 'conference', 'keynote', 'panel']):
return 'speaking'
if any(w in title for w in ['raised', 'funding', 'series', 'launch']):
return 'news'
return 'mention'
activities = find_prospect_activity('Jane Smith', 'Acme Corp')
for a in activities:
print(f"[{a['type']}] {a['title'][:60]}")Paso 2: Buscar noticias de la empresa
Obtenga noticias recientes de la empresa para encontrar eventos relevantes y personalizarlos.
def get_company_news(company: str) -> list:
resp = requests.post('https://api.scavio.dev/api/v1/search',
headers={'x-api-key': API_KEY},
json={'platform': 'google', 'query': f'{company} news announcement 2026'}, timeout=15)
results = resp.json().get('organic_results', [])
return [{
'headline': r.get('title', ''),
'snippet': r.get('snippet', '')[:150],
'url': r.get('link', ''),
} for r in results[:3]]
news = get_company_news('Acme Corp')
for n in news:
print(f" {n['headline'][:60]}")Paso 3: Seleccione el mejor gancho de personalización
Clasifique las actividades y noticias descubiertas para elegir el ángulo de personalización más sólido.
def select_hook(activities: list, news: list) -> dict:
# Prioritize: content > speaking > news > mention
priority = {'content': 1, 'speaking': 2, 'news': 3, 'mention': 4}
sorted_activities = sorted(activities, key=lambda a: priority.get(a['type'], 5))
if sorted_activities:
best = sorted_activities[0]
return {
'type': best['type'],
'reference': best['title'],
'url': best['url'],
'snippet': best['snippet'][:100],
}
if news:
return {
'type': 'company_news',
'reference': news[0]['headline'],
'url': news[0]['url'],
'snippet': news[0]['snippet'][:100],
}
return {'type': 'none', 'reference': '', 'url': '', 'snippet': ''}
hook = select_hook(activities, news)
print(f"Best hook: [{hook['type']}] {hook['reference'][:60]}")Paso 4: Generar abridor personalizado
Cree una apertura de correo electrónico que haga referencia a la actividad específica o a la noticia encontrada.
def personalized_opener(name: str, company: str, hook: dict) -> str:
first_name = name.split()[0] if name else 'there'
if hook['type'] == 'content':
return f"Hi {first_name}, I came across your piece \"{hook['reference'][:50]}\" and it resonated with something we have been working on."
if hook['type'] == 'speaking':
return f"Hi {first_name}, I noticed your talk at {hook['reference'][:40]} and wanted to connect."
if hook['type'] in ('news', 'company_news'):
return f"Hi {first_name}, saw the news about {company} - {hook['reference'][:40]}. Congrats on the milestone."
return f"Hi {first_name}, I have been following {company}'s work and wanted to reach out."
opener = personalized_opener('Jane Smith', 'Acme Corp', hook)
print(opener)Paso 5: Lista de clientes potenciales de enriquecimiento por lotes
Procese una lista completa de clientes potenciales y genere abridores personalizados para cada uno.
import time
def enrich_leads(leads: list) -> list:
enriched = []
for lead in leads:
activities = find_prospect_activity(lead['name'], lead['company'])
news = get_company_news(lead['company'])
hook = select_hook(activities, news)
opener = personalized_opener(lead['name'], lead['company'], hook)
enriched.append({
**lead,
'hook_type': hook['type'],
'hook_reference': hook['reference'][:80],
'personalized_opener': opener,
})
print(f"{lead['name']}: [{hook['type']}] {hook['reference'][:40]}")
time.sleep(0.5)
return enriched
test_leads = [
{'name': 'Jane Smith', 'company': 'Acme Corp', 'email': '[email protected]'},
{'name': 'John Doe', 'company': 'Beta Inc', 'email': '[email protected]'},
]
results = enrich_leads(test_leads)Ejemplo en Python
import requests, os
H = {'x-api-key': os.environ['SCAVIO_API_KEY']}
def personalize(name, company):
data = requests.post('https://api.scavio.dev/api/v1/search', headers=H,
json={'platform': 'google', 'query': f'{name} {company} 2026'}).json()
top = data.get('organic_results', [{}])[0]
return f"Re: {top.get('title', 'your recent work')[:50]}"
print(personalize('Jane Smith', 'Acme Corp'))Ejemplo en JavaScript
const H = {'x-api-key': process.env.SCAVIO_API_KEY, 'Content-Type': 'application/json'};
async function personalize(name, company) {
const r = await fetch('https://api.scavio.dev/api/v1/search', {
method: 'POST', headers: H,
body: JSON.stringify({platform: 'google', query: `${name} ${company} 2026`})
});
const top = ((await r.json()).organic_results || [{}])[0];
return `Re: ${(top.title || 'your recent work').slice(0, 50)}`;
}
personalize('Jane Smith', 'Acme Corp').then(console.log);Salida esperada
An n8n-compatible outreach personalization pipeline that enriches each lead with real prospect activity and company news, generating specific personalized email openers.