Generación de leads con n8n: las cinco etapas de un flujo que corre solo
Casi todas las plantillas de «prospección con IA» se rompen en los mismos tres puntos: el precio de la API de mapas, la memoria del nodo de duplicados y el modelo devolviendo algo que no es JSON. Esta es la arquitectura que sobrevive a los tres, con los números que medimos en una corrida real.
Qué tiene que hacer el flujo, en realidad
Sin marketing, prospectar a mano son cinco pasos repetidos por una persona: encontrar negocios candidatos, decidir cuáles tienen un problema visible, anotar por qué vale la pena contactarlos, redactar el primer mensaje y dejar el resultado donde un CRM pueda leerlo. Cada uno de esos pasos es un nodo.
El flujo de abajo es un scheduleTrigger con 13 nodos ejecutables. Corre a las 08:00, produce
una hoja y un CSV, y no le escribe a nadie: el envío queda manual y tuyo, por diseño.
Etapa 1 — Encontrar candidatos sin sobrepagar el mapa
Usa Places API (New) con el endpoint places:searchText. La API antigua está cerrada a
clientes nuevos desde 2025, así que la mitad de los tutoriales que encuentres apuntan a un endpoint que
responde 403 en un proyecto nuevo de Google Cloud.
El detalle importante y poco documentado es que la máscara de campos define el precio. Google
factura la SKU más alta presente en la respuesta. Pide displayName y
formattedAddress y estás en Essentials. Agrega rating y estás en Pro. Agrega
nationalPhoneNumber o websiteUri y estás en Enterprise, a USD 35 por
1.000 solicitudes en vez de gratis.
X-Goog-FieldMask: places.id,places.displayName,places.formattedAddress,
places.primaryTypeDisplayName,places.rating,places.userRatingCount,
places.businessStatus,places.nationalPhoneNumber,places.websiteUri
Es a propósito. Una lista de nombres sin teléfono ni web no es una lista de leads: es un directorio. Los dos campos que hacen contactable a un prospecto son justamente los dos que te suben a Enterprise, así que presupuesta eso en lugar de llevarte la sorpresa:
| Leads buscados | Solicitudes | Costo Places | Costo IA | Total |
|---|---|---|---|---|
| 60 (una corrida diaria) | 3 | 0,105 | 0,003 | 0,11 |
| 1.000 | 50 | 1,75 | 0,056 | 1,81 |
| 10.000 | 500 | 0 (tramo gratis) | 0,56 | 0,56 |
| 20.000 | 1.000 | 0 (tramo gratis) | 1,12 | 1,12 |
| 100.000 | 5.000 | 140,00 | 5,60 | 145,60 |
USD, medido el 16/10/2026: tramo Enterprise de Google Text Search (las primeras 1.000 solicitudes del mes
son gratis, lo que cubre unos 20.000 leads) y deepseek-flash con 660 tokens de entrada y
~120 de salida por lead. Los precios de los proveedores cambian: re-verifica antes de un mes grande.
La paginación es donde vive la segunda sorpresa. Google pide un par de segundos entre páginas antes de que
nextPageToken sea válido; pagina a toda velocidad y la API responde 400. El nodo
HTTP Request de n8n tiene paginación nativa: pon Max Requests en 3 y un
requestInterval de 2000 ms. Tres páginas × 20 resultados = 60 negocios por corrida, y el
bucle se detiene solo cuando la respuesta deja de traer token.
Etapa 2 — Normalizar a una fila por negocio
Nunca dejes que la forma de la respuesta de una API se filtre al resto del flujo. Un solo nodo Code
aplana cada lugar a una fila fija: placeId, nombre, dirección, rubro, calificación, cantidad
de reseñas, teléfono, web, y una pequeña heurística de brecha digital calculada con esos campos —
sin web propia, sitio solo móvil, pocas reseñas, cerrado permanentemente. Esa heurística no es el puntaje
final: es un prior barato que mantiene honesto al modelo caro.
Etapa 3 — Deduplicar (sabiendo que este nodo recuerda)
El nodo removeDuplicates con la operación Remove Items Seen in Previous Executions
guarda las claves que ya vio, por workflow, en la base de datos de la instancia — no en la ejecución. Esa
es la función que quieres: una corrida diaria no debe volver a mandar al CRM los leads de ayer.
También es la razón más común por la que una plantilla «funciona una vez y después no devuelve nada». Segunda corrida, mismos datos, 0 items, la cadena se detiene. Si estás depurando exactamente eso, la explicación completa y el remedio de un clic están en el post-mortem del dedupe.
Etapa 4 — Puntuar y redactar con un modelo, en lotes
Un solo nodo HTTP Request al modelo, en lotes de 4 items con 1,2 s de intervalo. Dos ajustes importan más que el prompt:
response_format: { type: "json_object" }— elimina casi todos los fallos de parseo antes de que ocurran.- Razonamiento desactivado — medido en nuestra propia cuenta: 117–121 tokens de salida por lead con razonamiento apagado, frente a 351–800 con razonamiento activo, más respuestas vacías intermitentes cuando el modelo gastaba su presupuesto pensando. Cinco veces el costo por una respuesta peor.
El prompt debe devolver el id que recibió, y el nodo Code siguiente debe reconstruir el mapa
placeId → negocio en vez de confiar en el orden de los items. Las respuestas por lote vuelven
desordenadas, parciales o no vuelven; emparejar por identificador hace el flujo determinista igual.
{
"places": [
{ "id": "ChIJ...", "score": 78, "senales": ["sin web propia", "3 resenas"],
"dolor": "no aparece al buscar su servicio",
"pitch": "Hola, vi que ..." }
]
}
Y envuelve el parseo en try/catch. Perder un lead de un lote es barato; perder la corrida
completa de 60 leads porque la salida número 41 traía una coma de más no lo es.
Etapa 5 — Ramificar salidas y filtrar con un umbral
Un nodo if compara el puntaje del modelo con un minScore que configuras una vez.
Arriba: Google Sheets, luego CSV y, opcionalmente, un webhook a tu CRM. Abajo: un no-op para poder contar
los descartes y ver si tu rúbrica está calibrada. Las salidas cuelgan en paralelo de la misma rama, así que
puedes desactivar Sheets sin romper el CSV.
Empieza con minScore en 60 y súbelo a 70 cuando tengas una semana de salida real. Subirlo no
cuesta nada y ahorra tokens; bajarlo es cómo terminas con 200 filas que nadie llama.
Qué verificar antes de confiar en cualquier plantilla (incluida la nuestra)
- Impórtala en una instancia limpia y cuenta los tipos de nodo resueltos. Un tipo que no existe en tu versión falla al importar, en silencio o con ruido según la versión.
- Ejecuta la lógica con los terceros simulados, para que la única variable sean tus datos.
- Revisa el techo de
typeVersion. Un flujo hecho con un paquete más nuevo puede correr en una instancia más vieja —n8n usa la versión más nueva que tenga—, pero eso es una razón para preferir una instancia actual, no una garantía. - Lee la lista de fallos antes de necesitarla. Todo workflow tiene un conjunto pequeño de fallos que va a reproducir en una máquina nueva.
Eso es lo que corrimos sobre nuestro propio kit: los dos flujos importados y ejecutados en instancias
limpias de n8n 2.43.6 y n8n 1.60.0, 28/28 tipos de nodo resueltos, 13/13 y 8/8 nodos en
success, y un CSV real de 1.065 bytes producido por la corrida.
Si prefieres no construirlo desde cero
El kit Starter es exactamente este flujo más el de notas de reunión a CRM, el nodo de configuración de 8 campos, un validador, un script de auto-diagnóstico y seis documentos en ES/EN — USD 49, pago único, corre en el n8n que ya tienes.
Ver qué incluye Siguiente: la rúbrica de puntajeRelacionado: una rúbrica de puntaje que aguanta datos reales · por qué tu flujo devuelve 0 items la segunda vez · todos los artículos