Workflow n8n + IA para cobranza automatica via WhatsApp (paso a paso)
Workflow n8n + WhatsApp + IA para cobranza automatica reduce 60-70% trabajo manual del gestor + mejora ratio recuperacion 30-50% en primer trimestre. Stack: n8n self-hosted ($10-25 USD/mes) + Evolution API + OpenRouter (Claude Haiku) + Postgres. Setup: 2-4 semanas, $15K-25K MXN. ROI <30 dias en cartera >$500K MXN. Arquitectura: Cron trigger -> Postgres query clientes vencidos -> classify tier escalation -> LLM mensaje personalizado -> strip URLs -> Evolution API send -> log -> alerta Telegram si >D+30.
El problema clasico: cobranza manual no escala
PyME B2B mexicana tipica tiene 100-500 clientes activos. Cartera vencida es 15-30% del total. Gestor de cobranza dedica 25-35 horas/semana a llamadas, WhatsApp manual, follow-ups. Resultado: relaciones cliente deterioradas, recuperacion baja, gestor saturado y caro.
El workflow n8n + WhatsApp con IA descrito aqui automatiza 70-80% del trabajo de cobranza, mejora ratio de recuperacion 30-50%, y mantiene relacion comercial intacta. Implementacion: 2-4 semanas, ROI <30 dias en mayoria de casos.
Arquitectura del workflow
Trigger: Cron diario 09:00 CST
|
v
1. Postgres query: SELECT clientes WITH cartera_vencida_dias BETWEEN X AND Y
|
v
2. Loop por cliente:
a) Verificar ventana 24h WA activa (regla BESKAR)
b) Determinar tier escalation segun dias mora:
- D+5: recordatorio amable
- D+15: seguimiento formal
- D+30: derivacion humano
c) Llamar LLM (Claude Haiku) para generar mensaje personalizado
d) Strip URLs no whitelisted (regla nuclear)
e) Send via Evolution API
f) Log en tabla cobranza_log
|
v
3. Si dias mora > 45 sin pago: alerta Telegram al account manager
|
v
4. Update dashboard Metabase metrics
Implementacion paso a paso en n8n
Nodo 1 — Schedule Trigger
Cron 0 9 * * 1-5 (lunes a viernes 9am). Configurable a fin de semana opcional.
Nodo 2 — Postgres Query
Query que retorna clientes con cartera vencida:
SELECT
c.id, c.nombre, c.whatsapp, c.email,
cf.factura_id, cf.monto, cf.fecha_vencimiento,
(CURRENT_DATE - cf.fecha_vencimiento) AS dias_mora
FROM clientes c
JOIN cartera_facturas cf ON c.id = cf.cliente_id
WHERE cf.status = 'vencida'
AND (CURRENT_DATE - cf.fecha_vencimiento) BETWEEN 5 AND 45
AND NOT EXISTS (
SELECT 1 FROM cobranza_log cl
WHERE cl.factura_id = cf.factura_id
AND cl.fecha >= CURRENT_DATE - INTERVAL '3 days'
)
Nodo 3 — Function (clasificar tier)
const dias = item.dias_mora; let tier; if (dias <= 10) tier = 'amable'; else if (dias <= 20) tier = 'formal'; else tier = 'urgente'; item.tier = tier; return item;
Nodo 4 — HTTP Request (verificar ventana 24h)
Llama endpoint propio que retorna boolean si ventana 24h del cliente esta abierta. Si no, ramifica a "usar template aprobado".
Nodo 5 — OpenRouter (generar mensaje)
Prompt:
Eres asistente IA de cobranza para [Empresa]. Cliente: {nombre}. Factura {factura_id} por ${monto} MXN vencida hace {dias_mora} dias.
Tier escalation: {tier}
Reglas:
- Tono profesional, NO agresivo
- Lenguaje mexicano natural
- Maximo 80 palabras
- Cerrar con opcion clara de respuesta
- NO incluir URLs (las agregamos por codigo)
- NO inventar promociones o descuentos
Genera el mensaje en JSON: { "mensaje": "..." }
Nodo 6 — Function (strip URLs + post-process)
let msg = item.mensaje; // Nuclear strip URLs (LLM no controla URLs) msg = msg.replace(/https?:\/\/[^\s]+/gi, ''); // Append link de pago oficial por codigo msg += '\n\nPaga ahora: https://empresa.com/pagar?factura=' + item.factura_id; item.mensaje_final = msg; return item;
Nodo 7 — Evolution API (send WA)
POST a https://evolution.varelainsights.com/message/sendText/INSTANCIA con payload:
{
"number": "{{cliente_whatsapp}}",
"text": "{{mensaje_final}}"
}
Nodo 8 — Postgres Insert (log)
Insert en tabla cobranza_log para tracking + evitar duplicados.
Nodo 9 — IF (si dias_mora > 30)
Branch a Telegram bot notificando al account manager: "Cliente X con factura Y vencida 35 dias, sin respuesta a 3 mensajes. Considerar contacto directo".
KPIs a monitorear
| KPI | Target | Como medir |
|---|---|---|
| Tasa respuesta mensajes | >25% | Mensajes con reply / total enviados |
| Tasa recuperacion 30 dias | >60% | Facturas pagadas / facturas vencidas iniciadas en periodo |
| Reduccion dias promedio mora | >30% | vs baseline pre-implementacion |
| Carga gestor humano reducida | >60% | Horas gestor cobranza pre vs post |
| NPS clientes en cobranza | Mantener o mejorar | Encuesta post-resolucion |
Errores comunes
- Tono muy agresivo: LLM puede inclinarse a urgency lenguaje que dana relacion. Test 100 mensajes antes de produccion.
- Sin throttling: enviar 500 mensajes simultaneos viola rate limit Evolution. Agregar delay 30-60s entre mensajes.
- Olvidar opt-out: cuando cliente responde "no me escribas mas", flag cliente y excluir de futuros runs.
- Sin escalamiento humano: tier >D+30 sin alerta humano = perdida garantizada.
Preguntas frecuentes
Cuanto cuesta implementar este workflow?
Setup tipico: $15,000-25,000 MXN una vez (incluye configuracion n8n, integracion Postgres + Evolution + Telegram, testing E2E, capacitacion equipo). Operacional: $20-40 USD/mes (VPS + LLM + storage). Para PyME con cartera vencida $500K MXN: recuperacion adicional 30% = $150K MXN/mes vs costo $25K setup una vez. ROI primer mes.
El bot puede sonar agresivo y perder clientes?
Si esta mal calibrado, si. Mitigacion: (1) prompt explicito "tono profesional, NO agresivo", (2) test 100 mensajes antes de produccion con review humano, (3) limite de 80 palabras (evita florituras pasivo-agresivas), (4) escalamiento a humano cuando cliente expresa molestia, (5) monitoreo NPS continuo. Bien calibrado, el bot suena profesional mantener relacion.
Que pasa cuando el cliente responde?
El workflow es asincrono: bot envia mensaje, response del cliente llega al bot inbound (separado). Sub-workflow: clasifica respuesta (pago confirmado / negociar fecha / queja / fuera de tema), responde apropiadamente o escala humano. La respuesta del cliente reinicia la ventana 24h, permitiendo conversacion libre.
Como evito enviar mensajes en madrugada?
El cron schedule (nodo 1) corre 9am-5pm horario laboral. Adicional: nodo IF que verifica hora actual antes de enviar. Para clientes en otras zonas horarias, ajustar segun TZ del cliente (campo en DB). NUNCA enviar 22:00-07:00 hora local — viola best practices y dana NPS.
¿Tu PyME necesita una solución de IA medible?
Conversación de 30 min, sin compromiso. Cotizamos en menos de 24 horas. Precios públicos en pesos mexicanos.
Agenda conversación →