Google Maps es una de las fuentes más ricas de datos comerciales locales para la generación de leads B2B. Un canal n8n puede automatizar el proceso: busque empresas en un nicho y ubicación objetivo, extraiga información de contacto de sus sitios web, valide correos electrónicos y envíe clientes potenciales calificados a su CRM. Este tutorial construye el proceso completo utilizando el nodo de solicitud HTTP de n8n con la API de búsqueda de Scavio. Cada consulta de búsqueda cuesta $0,005, lo que hace que una extracción de 500 empresas cueste $2,50.
Requisitos previos
- Instancia n8n en ejecución (autohospedada o en la nube)
- Una clave API de Scavio de scavio.dev
- Familiaridad básica con el editor de flujo de trabajo n8n
- Un CRM u hoja de cálculo para recibir leads
Guia paso a paso
Paso 1: Configurar el nodo de consulta de búsqueda
Cree un nodo de solicitud HTTP en n8n que consulte la API de Scavio para obtener resultados de Google Maps. Utilice el parámetro de la plataforma de mapas para obtener listados de empresas con direcciones y números de teléfono.
// n8n HTTP Request Node configuration:
// Method: POST
// URL: https://api.scavio.dev/api/v1/search
// Headers:
// x-api-key: {{ $env.SCAVIO_API_KEY }}
// Content-Type: application/json
// Body (JSON):
{
"query": "plumbers in Austin TX",
"platform": "maps",
"country_code": "us"
}Paso 2: Recorrer múltiples consultas de búsqueda
Utilice un nodo SplitInBatches para recorrer una lista de nichos y ubicaciones. Introduce cada combinación en el nodo de búsqueda.
// Generate query list in a Code node:
const niches = ['plumbers', 'electricians', 'HVAC contractors'];
const cities = ['Austin TX', 'Dallas TX', 'Houston TX'];
const queries = [];
for (const niche of niches) {
for (const city of cities) {
queries.push({ json: { query: `${niche} in ${city}` } });
}
}
return queries;
// Output: 9 query combinationsPaso 3: Extraer datos comerciales de los resultados
Analice los resultados de Maps para extraer el nombre de la empresa, la dirección, el teléfono, el sitio web y la calificación. Utilice un nodo Código para normalizar los datos.
// n8n Code node to extract business data:
const results = $input.first().json;
const businesses = (results.local_results || []).map(b => ({
name: b.title || '',
address: b.address || '',
phone: b.phone || '',
website: b.website || '',
rating: b.rating || 0,
reviews: b.reviews || 0,
query: results.search_metadata?.query || ''
}));
return businesses
.filter(b => b.website)
.map(b => ({ json: b }));Paso 4: Buscar direcciones de correo electrónico de sitios web
Para cada empresa con un sitio web, busque su página de contacto para encontrar direcciones de correo electrónico. Utilice una segunda consulta de búsqueda dirigida al dominio.
// n8n HTTP Request node for email discovery:
// URL: https://api.scavio.dev/api/v1/search
// Body:
{
"query": "site:{{ $json.website }} contact email",
"country_code": "us"
}
// Then in a Code node, extract emails from snippets:
const data = $input.first().json;
const snippets = (data.organic_results || [])
.map(r => r.snippet || '')
.join(' ');
const emailRegex = /[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/g;
const emails = [...new Set(snippets.match(emailRegex) || [])];
return [{ json: { ...($input.first().json), emails } }];Paso 5: Enviar a CRM o Google Sheets
Envíe clientes potenciales validados a su CRM. Este ejemplo utiliza el nodo Google Sheets pero funciona con HubSpot, Pipedrive o cualquier CRM con integración n8n.
// n8n Google Sheets node configuration:
// Operation: Append Row
// Sheet: Lead Pipeline
// Columns mapping:
// A: {{ $json.name }}
// B: {{ $json.address }}
// C: {{ $json.phone }}
// D: {{ $json.website }}
// E: {{ $json.emails[0] || '' }}
// F: {{ $json.rating }}
// G: {{ $json.reviews }}
// H: {{ $json.query }}
// I: {{ new Date().toISOString() }}
// Cost summary for 9 queries (3 niches x 3 cities):
// Search queries: 9 x $0.005 = $0.045
// Email discovery: ~50 domains x $0.005 = $0.25
// Total: ~$0.30 for 50+ validated leadsEjemplo en Python
import os, re, requests, time
API_KEY = os.environ['SCAVIO_API_KEY']
ENDPOINT = 'https://api.scavio.dev/api/v1/search'
def search(body: dict) -> dict:
resp = requests.post(ENDPOINT,
headers={'x-api-key': API_KEY, 'Content-Type': 'application/json'},
json=body)
resp.raise_for_status()
return resp.json()
def extract_leads(niche: str, city: str) -> list:
data = search({'query': f'{niche} in {city}', 'platform': 'maps', 'country_code': 'us'})
leads = []
for b in data.get('local_results', []):
if not b.get('website'):
continue
# Find emails from website
email_data = search({'query': f'site:{b["website"]} contact email', 'country_code': 'us'})
snippets = ' '.join(r.get('snippet', '') for r in email_data.get('organic_results', []))
emails = list(set(re.findall(r'[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}', snippets)))
leads.append({'name': b.get('title'), 'phone': b.get('phone'),
'website': b['website'], 'emails': emails})
time.sleep(0.3)
return leads
leads = extract_leads('plumbers', 'Austin TX')
for lead in leads[:5]:
print(f'{lead["name"]}: {lead["emails"] or "no email found"}')Ejemplo en JavaScript
const API_KEY = process.env.SCAVIO_API_KEY;
async function search(body) {
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(body)
});
return resp.json();
}
async function extractLeads(niche, city) {
const data = await search({ query: `${niche} in ${city}`, platform: 'maps', country_code: 'us' });
const leads = [];
for (const b of (data.local_results || []).filter(b => b.website)) {
const emailData = await search({ query: `site:${b.website} contact email`, country_code: 'us' });
const text = (emailData.organic_results || []).map(r => r.snippet || '').join(' ');
const emails = [...new Set(text.match(/[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/g) || [])];
leads.push({ name: b.title, phone: b.phone, website: b.website, emails });
}
return leads;
}
extractLeads('plumbers', 'Austin TX').then(leads => {
leads.slice(0, 5).forEach(l => console.log(`${l.name}: ${l.emails.length ? l.emails[0] : 'no email'}`));
});Salida esperada
Austin Plumbing Pros: info@austinplumbingpros.com
Capital City Plumbers: contact@capitalcityplumbers.com
Reliable Plumbing Austin: no email found
Lone Star Plumbing: service@lonestarplumbing.com
Premier Plumbing Co: no email found
Cost: 9 search queries + ~50 email lookups = ~$0.30 total