AI Automation · Ruta de proyecto

AI Automation: automatiza procesos reales con IA

Automatiza procesos reales con IA, sin ser científico de datos. Cada módulo combina teoría aplicada, flujos de n8n comentados y ejercicios en negocio real. Al completarlos, todos los entregables se integran en un sistema de automatización end-to-end listo para entregar a un cliente.

módulos
10
entregables
10
proyecto final
1
duración estimada
~8 sem

Proyecto final · FlowBot: agente de automatización para PyME

Sistema completo de automatización para un negocio real. End-to-end: WhatsApp bot, RAG sobre catálogo, pipeline de ventas automatizado, generación de contenido, soporte con escalamiento y dashboard de métricas.

Arquitectura

CapaComponentes
EntradaWhatsApp API · Webhook HTTP · Email / Form
Orquestaciónn8n Workflows · AI Agent Node · Router Logic
InteligenciaClaude / GPT API · RAG (pgvector) · Tool Calling
MemoriaSupabase DB · Redis Session · Vector Store
Canales de salidaWhatsApp/Telegram · Email/CRM · Redes sociales
Observabilidadn8n Logs · Error alerts · Cost tracker

Qué aporta cada módulo

  1. M1 → StackSetup
  2. M2 → LLMWrapper
  3. M3 → AgentFlow
  4. M4 → RAGPipeline
  5. M5 → WhatsAppBot
  6. M6 → SalesPipeline
  7. M7 → ContentEngine
  8. M8 → SupportAgent
  9. M9 → ResilienceLayer
  10. M10 → ProductionDeploy

Cronograma sugerido

SemanasFaseMódulos
Semanas 1–2FundamentosStack + LLMs
Semanas 3–4ArquitecturaAgentes + RAG
Semana 5CanalesWhatsApp + bots
Semanas 6–7Casos realesVentas + Contenido + Soporte
Semana 8ProducciónResiliencia + Deploy
Compartir WhatsAppLinkedInX

Módulo 1 · Fase 1 · Fundamentos: Stack y LLMs como herramientas

El stack del automatizador

n8n, Make, APIs, webhooks — cuándo usar qué

¿Por qué n8n y no solo Python?

El 80% de las automatizaciones de negocio no necesitan código. n8n permite construir flujos complejos con lógica visual, conectar 400+ servicios con un clic, y desplegar en self-hosted sin depender de un vendor. El desarrollador de automatizaciones no reemplaza al ingeniero — tiene un mercado propio: las PyMEs que necesitan resultados hoy, no en seis meses.

Analogía

n8n es como Lego Technic: las piezas son los nodos (HTTP, Supabase, OpenAI, Slack), y tú decides cómo ensamblarlos. El código entra solo donde el Lego no alcanza — y con n8n, ese límite es más lejano de lo que parece.

La decisión de arquitectura más importante: n8n vs Make vs Zapier

  • n8n (self-hosted): control total, sin límites de operaciones, código JavaScript en nodos, ideal para datos sensibles o flujos complejos. Requiere un VPS (~$5/mes).
  • Make (antes Integromat): visual avanzado, mejor para flujos de datos no lineales, pricing por operaciones. Bueno para clientes que no quieren self-host.
  • Zapier: el más simple, el más caro por operación. Solo para integraciones simples de 2–3 pasos donde la velocidad de setup importa más que el costo.
Error frecuente

Usar Zapier para flujos con más de 5 pasos o con volumen mayor a 1000 tareas/mes. El costo se dispara y el debuggeo se vuelve imposible. Migra a n8n antes de que el cliente vea la factura.

Anatomía de un flujo n8n en producción

ComponenteDescripciónCuándo usarlo
TriggerWebhook, Cron, o evento de app externaSiempre — todo flujo empieza aquí
HTTP RequestLlamada a cualquier API RESTCuando no existe nodo nativo
AI AgentLLM con tools y memoria nativa en n8nRazonamiento y decisiones dinámicas
Code (JS)JavaScript para transformación de datosLógica que los nodos no cubren
If / SwitchRouting condicional del flujoMúltiples caminos por tipo de input
Error TriggerCaptura errores del flujo completoSiempre en flujos de producción

Flujo n8n: stack-setup.json (n8n workflow)

{
  "name": "M1 · StackSetup — Webhook → AI → Supabase",
  // Patrón base que todos los flujos del proyecto usarán

  "nodes": [
    {
      "type": "n8n-nodes-base.webhook",
      "name": "Webhook Entry",
      // Recibe POST desde WhatsApp, formularios, o cualquier fuente
      "parameters": {
        "httpMethod": "POST",
        "path": "flowbot-entry",
        "responseMode": "responseNode"
      }
    },
    {
      "type": "n8n-nodes-base.code",
      "name": "Validate & Normalize",
      // Siempre valida el input antes de pasar al LLM
      "parameters": {
        "jsCode": "
const { body } = $input.first().json;

// Regla de oro: nunca confíes en el input sin validar
if (!body?.message || typeof body.message !== 'string') {
  throw new Error('INPUT_INVALID: campo message requerido');
}

return [{
  json: {
    message: body.message.trim().slice(0, 2000),
    user_id: body.user_id || 'anonymous',
    channel: body.channel || 'webhook',
    timestamp: new Date().toISOString(),
    trace_id: crypto.randomUUID()
  }
}];"
      }
    },
    {
      "type": "@n8n/n8n-nodes-langchain.lmChatAnthropic",
      "name": "Claude (STANDARD)",
      "parameters": {
        "model": "claude-3-5-sonnet-20241022",
        "options": { "temperature": 0.3 }
      }
    },
    {
      "type": "n8n-nodes-base.supabase",
      "name": "Log to Supabase",
      // Todo flujo de prod logea inputs y outputs
      "parameters": {
        "operation": "insert",
        "tableId": "automation_logs"
      }
    }
  ]
}

Para profundizar: n8n docs · Supabase quickstart · Anthropic pricing

Ejercicio 1

Levanta tu stack local en 30 minutos

Antes de automatizar algo, tienes que tener el ambiente funcionando. Sin esto, ningún módulo siguiente tiene sentido.

  1. Instala n8n en local con Docker: docker run -it --rm --name n8n -p 5678:5678 n8nio/n8n
  2. Crea una cuenta en Supabase y genera una tabla automation_logs con campos: id, trace_id, message, response, channel, created_at
  3. Obtén tu API key de Anthropic (o OpenAI) y configúrala como credential en n8n
  4. Crea el flujo del código base: Webhook → Code (validación) → AI → Supabase → Respond
  5. Envíale un POST con curl y verifica que el log quede en Supabase con el trace_id correcto
Ejercicio 2

Compara el costo de 1000 requests

Antes de elegir un modelo, calcula cuánto costará en producción.

  1. Escribe un prompt de ~300 palabras (system + user) representativo de tu caso de uso
  2. Usa el tokenizer de Anthropic para contar tokens de input y output estimado
  3. Calcula el costo para 1000 requests con Haiku vs Sonnet vs GPT-4o-mini
  4. ¿Cuánto ahorra usar Haiku para clasificaciones simples? Documenta el número
  5. Decide qué modelo usará cada nodo del proyecto y justifícalo en un ADR de 1 página

Entregable del módulo

Va al proyecto final: El docker-compose.yml y el flujo base son la capa de infraestructura de FlowBot. Todos los módulos siguientes añaden nodos a este flujo base — nunca crean uno nuevo desde cero.

Módulo 2 · Fase 1 · Fundamentos: Stack y LLMs como herramientas

LLMs como herramientas de negocio

Prompts que funcionan en producción, sin sorpresas

El prompt es el contrato con el modelo

En automatizaciones de negocio, el output del LLM no lo lee un humano — lo procesa el siguiente nodo del flujo. Esto cambia completamente cómo se escribe un prompt. No buscas "una respuesta buena", buscas un JSON parseable, un booleano, o una categoría de un enum. La ambigüedad en el prompt es un bug de producción.

Regla de oro para automatizaciones

El LLM en un flujo de n8n es como una función: entrada predecible → output predecible. Si tu prompt puede producir dos formatos distintos, tienes un bug. Siempre especifica el formato exacto del output y valídalo antes de pasarlo al siguiente nodo.

Estructura de prompt para automatizaciones (4 secciones)

  • ROL + TAREA: quién es el modelo y exactamente qué debe hacer. Sin ambigüedad.
  • CONTEXTO DINÁMICO: variables que cambian por request (datos del usuario, historial, catálogo). Inyectadas en tiempo de ejecución.
  • RESTRICCIONES: qué NO puede hacer. Tan importante como lo que sí puede.
  • OUTPUT FORMAT: el formato exacto de la respuesta. Para flujos: siempre JSON válido con schema explícito.

Output estructurado — la técnica más importante para n8n

TécnicaCuándo usarlaRiesgo
JSON directoClasificación, extracción de datos, routingEl modelo puede añadir texto antes del JSON
XML tags (<output>)Cuando necesitas separar razonamiento de respuestaHay que hacer parse del XML
Structured Outputs APIClaude/OpenAI soportan JSON schema nativoSolo funciona con ciertos modelos
Few-shot + formatoCuando el formato es complejo y el modelo fallaAñade tokens y costo

Flujo n8n: llm-wrapper.json (n8n workflow)

// Nodo Code en n8n: LLM wrapper con output estructurado garantizado

const systemPrompt = `
ROL: Eres un clasificador de intenciones para un bot de soporte de PyME.
TAREA: Analiza el mensaje del usuario y devuelve una clasificación.

CATEGORÍAS DISPONIBLES:
- "product_inquiry": pregunta sobre producto, precio, disponibilidad
- "order_status": consulta sobre estado de pedido
- "complaint": queja o problema con producto/servicio
- "general": saludo, despedida, o conversación fuera de scope

RESTRICCIONES:
- Devuelve SOLO el JSON especificado. Sin texto adicional.
- No inventes categorías fuera de las 4 definidas.
- confidence debe ser un número entre 0.0 y 1.0.

OUTPUT FORMAT (devuelve EXACTAMENTE este JSON):
{
  "intent": "product_inquiry|order_status|complaint|general",
  "confidence": 0.0-1.0,
  "key_entities": ["entidad1", "entidad2"],
  "requires_human": true|false
}
`;

// Llamada con retry automático y validación de output
async function classifyWithRetry(message, maxRetries = 3) {
  for (let attempt = 0; attempt < maxRetries; attempt++) {
    const response = await $node["Claude API"].call({
      messages: [{ role: "user", content: message }],
      system: systemPrompt,
      max_tokens: 150  // output pequeño = más rápido y barato
    });

    try {
      // Limpia posibles decoradores del modelo antes de parsear
      const clean = response.text
        .replace(/```json\n?/g, '')
        .replace(/```/g, '')
        .trim();

      const parsed = JSON.parse(clean);

      // Valida que el schema sea correcto antes de continuar
      const validIntents = ['product_inquiry','order_status','complaint','general'];
      if (!validIntents.includes(parsed.intent)) throw new Error('INVALID_INTENT');
      if (typeof parsed.confidence !== 'number') throw new Error('INVALID_CONFIDENCE');

      return parsed;

    } catch (e) {
      if (attempt === maxRetries - 1) {
        // Último intento: devuelve fallback seguro en vez de romper el flujo
        return { intent: 'general', confidence: 0.5, key_entities: [], requires_human: true };
      }
    }
  }
}

return [{ json: await classifyWithRetry($json.message) }];

Para profundizar: Anthropic tool use · JSON schema validation · n8n Code node

Ejercicio 1

Construye un clasificador de intenciones

El clasificador es el nodo más crítico de cualquier bot. Si falla aquí, todo el flujo toma el camino equivocado.

  1. Crea el prompt de clasificación con 5 categorías para tu caso de uso (ej: ventas, soporte, precios, ubicación, otro)
  2. Pruébalo con 20 mensajes variados — ¿en cuántos acierta el intent?
  3. Identifica los 3 casos donde falla. ¿Es un problema del prompt o del modelo?
  4. Agrega ejemplos few-shot para los casos que fallan. ¿Mejora?
  5. Implementa el wrapper con retry y fallback. Verifica que nunca rompa el flujo, aunque el JSON sea inválido.
Ejercicio 2

Extracción de datos estructurados de lenguaje natural

Convertir texto libre en datos estructurados es el caso de uso más valioso del LLM en automatizaciones.

  1. Toma 10 emails de pedidos reales (o simulados) de un cliente hipotético
  2. Escribe un prompt que extraiga: nombre, producto, cantidad, fecha requerida, urgencia (alta/media/baja)
  3. Verifica que el JSON output sea parseable en los 10 casos
  4. Añade el nodo "Validate & Store" en n8n que guarda el objeto extraído en Supabase
  5. ¿Qué pasa si el email está en mezcla de español e inglés? ¿Sigue funcionando?

Entregable del módulo

Va al proyecto final: El LLMWrapper es el primer nodo inteligente del FlowBot. En M3 se extenderá para soportar Tool Calling. En M8, el clasificador determinará el agente al que se enruta cada conversación.

Módulo 3 · Fase 2 · Arquitectura: Agentes, RAG y canales

Agentes en n8n

AI Agent node, tool calling, memoria y loops controlados

¿Qué es el nodo AI Agent de n8n?

El nodo AI Agent de n8n implementa nativamente el patrón ReAct (Reason + Act) sin necesitar código Python. El agente puede usar herramientas (otros nodos de n8n), mantener memoria entre turnos, y decidir cuándo ya tiene suficiente información para responder. La diferencia con un simple nodo LLM es que el agente puede tomar múltiples pasos antes de responder.

Analogía

Un nodo LLM simple es como pedirle a alguien una respuesta sin que pueda buscar nada. El AI Agent es como darle acceso a Google, una calculadora, y tu base de datos — puede buscar antes de responder. La magia está en que decide solo cuándo buscar y cuándo ya sabe suficiente.

Tools disponibles en n8n para el AI Agent

  • HTTP Request Tool: cualquier API externa. El agente decide cuándo llamarla y con qué parámetros.
  • Supabase Tool: búsqueda y escritura en base de datos. El agente puede consultar información del cliente sin que tú lo hagas explícitamente.
  • Vector Store Tool: búsqueda semántica en documentos. Base del patrón RAG.
  • Code Tool: JavaScript ejecutable. Para cálculos o transformaciones que el LLM haría mal.
  • Think Tool: permite al agente razonar en voz alta antes de actuar. Mejora la calidad en casos complejos.

El riesgo más crítico: loops infinitos

Sin configuración correcta, un agente puede llamar a la misma herramienta en ciclo si el output no satisface sus criterios internos. n8n no previene esto por defecto.

Antipatrón

Configurar el AI Agent sin límite de iteraciones (maxIterations) en producción. Un loop de 50 iteraciones con Claude Sonnet cuesta ~$1.50 por conversación. Con 1000 usuarios, son $1500 en un día. Siempre setea maxIterations entre 5 y 10.

Flujo n8n: agent-flow.json (configuración AI Agent node)

// Configuración del nodo AI Agent en n8n (parámetros clave)

{
  "type": "@n8n/n8n-nodes-langchain.agent",
  "parameters": {
    "agentType": "toolsAgent",  // ReAct nativo
    "maxIterations": 6,          // CRÍTICO: previene loops infinitos
    "returnIntermediateSteps": false,  // true solo para debugging

    "systemMessage": "
Eres FlowBot, asistente de soporte de {{company_name}}.

CAPACIDADES:
✓ Consultar estado de pedidos (usa search_orders)
✓ Buscar información de productos (usa search_catalog)
✓ Crear tickets de soporte (usa create_ticket)
✗ NO puedes: modificar pedidos, aplicar descuentos, acceder a datos de pago

REGLAS DE COMPORTAMIENTO:
- Responde siempre en el idioma en que te hablan
- Si la confianza es menor a 0.7, pide clarificación antes de actuar
- Si el problema requiere acción humana, escala sin intentar resolver tú

ESCALACIÓN INMEDIATA cuando:
- El cliente está molesto después de 2 intentos de resolución
- La consulta es sobre devolución de dinero
- El cliente pregunta explícitamente por un humano

OUTPUT: Siempre respuestas cortas (máx 3 oraciones para chat)
",

    "tools": [
      {
        "name": "search_orders",
        "description": "Busca pedidos del cliente. Usa order_id o email del cliente.",
        "node": "Supabase - Orders"
      },
      {
        "name": "search_catalog",
        "description": "Busca información de productos en el catálogo. Usa el nombre o descripción del producto.",
        "node": "Vector Store - Catalog"
      },
      {
        "name": "create_ticket",
        "description": "Crea un ticket de soporte. Úsalo cuando no puedas resolver el problema directamente.",
        "node": "HTTP - CRM Create Ticket"
      }
    ]
  }
}

Para profundizar: n8n AI Agent docs · ReAct paper · Tool calling Anthropic

Ejercicio 1

Implementa el loop ReAct visual en n8n

Antes de usar el nodo AI Agent, entiende el patrón construyéndolo manualmente para ver cada paso.

  1. Crea un flujo manual: Webhook → Code (parse intent) → If (¿necesita tool?) → HTTP Tool → Code (format response)
  2. Prueba con: "¿cuánto cuesta el producto X?" — el flujo debe buscar en catálogo
  3. Prueba con: "hola buenas tardes" — el flujo debe responder directo sin buscar
  4. Ahora reemplaza toda esa lógica con el nodo AI Agent. ¿Es más simple? ¿Qué control perdiste?
  5. Fuerza el loop: haz que la herramienta siempre devuelva error. ¿El maxIterations se activa?
Ejercicio 2

Mide el impacto de maxIterations en costo

Entender empíricamente cuánto cuesta cada iteración adicional.

  1. Configura el agente con maxIterations=10 y registra el costo de 20 conversaciones variadas
  2. ¿Cuántas conversaciones usaron más de 5 iteraciones? ¿Cuánto costaron en promedio?
  3. Ajusta maxIterations=5. ¿Qué conversaciones ahora no se resuelven correctamente?
  4. Documenta el balance óptimo para tu caso de uso específico
  5. Implementa un fallback: si se alcanza maxIterations, escala a humano automáticamente

Entregable del módulo

Va al proyecto final: El AgentFlow es el núcleo del FlowBot. En M4 se conectará al RAGPipeline como tool. En M5 recibirá mensajes desde WhatsApp. En M8 se especializará por tipo de conversación.

Módulo 4 · Fase 2 · Arquitectura: Agentes, RAG y canales

RAG sin código — conocimiento del negocio

Supabase pgvector, embeddings y retrieval real en n8n

RAG en términos de negocio

RAG (Retrieval-Augmented Generation) es la técnica que permite al bot responder preguntas usando el conocimiento específico de tu cliente — catálogo, FAQs, políticas — sin necesitar fine-tuning. El flujo es simple: el usuario hace una pregunta → el sistema busca los documentos más relevantes → el LLM responde usando esos documentos como contexto.

En palabras simples

Imagina que le das al LLM una caja de apuntes con la información del negocio. Antes de responder, el LLM busca en la caja qué apuntes son relevantes para la pregunta, los lee, y responde basándose en ellos. Tú controlas qué entra en la caja — eso es RAG.

Los 4 pasos del pipeline RAG en n8n

  • Ingesta (offline): documento → split en chunks (400-600 tokens) → embedding (OpenAI o Anthropic) → guardar en Supabase pgvector con metadata.
  • Retrieval (online): query del usuario → embedding → búsqueda por similaridad coseno → top-5 chunks más relevantes.
  • Augmentation: chunks recuperados → inyectar como contexto en el prompt del agente con instrucción "Usa solo esta información para responder".
  • Citation check: ¿la respuesta del LLM está respaldada por los chunks? Si no hay chunks relevantes, el agente debe admitirlo en vez de alucinar.
El error más común en RAG

Chunks demasiado pequeños (<200 tokens) o demasiado grandes (>1200 tokens). Los pequeños pierden contexto. Los grandes introducen ruido que confunde al LLM. El sweet spot para catálogos de productos y FAQs es 400–600 tokens con 10% de overlap.

Flujo n8n: rag-pipeline.sql + n8n workflow

-- 1. Tabla de documentos con vector en Supabase
CREATE TABLE knowledge_base (
  id          uuid DEFAULT gen_random_uuid() PRIMARY KEY,
  content     text              NOT NULL,
  embedding   vector(1536),       -- OpenAI ada-002 / text-3-small
  source      text,             -- "catalog", "faq", "policy"
  metadata    jsonb,            -- producto_id, categoria, etc.
  created_at  timestamptz DEFAULT now()
);

-- 2. Función de búsqueda semántica (llama desde n8n HTTP Request)
CREATE OR REPLACE FUNCTION search_knowledge(
  query_embedding vector(1536),
  match_threshold float DEFAULT 0.78,
  match_count     int   DEFAULT 5
)
RETURNS TABLE(content text, similarity float, source text)
LANGUAGE sql STABLE AS $$
  SELECT content, 1 - (embedding <=> query_embedding) AS similarity, source
  FROM knowledge_base
  WHERE 1 - (embedding <=> query_embedding) > match_threshold
  ORDER BY similarity DESC
  LIMIT match_count;
$$;

-- 3. En n8n: nodo Code para preparar el contexto RAG
const chunks = $json.chunks;  // resultado de search_knowledge

if (chunks.length === 0) {
  return [{ json: { context: "", has_context: false } }];
}

const context = chunks
  .map((c, i) => `[Fuente ${i+1}]: ${c.content}`)
  .join('\n\n');

return [{ json: {
  context,
  has_context: true,
  sources: chunks.map(c => c.source)
}}];

Para profundizar: pgvector docs · n8n Vector Store node · OpenAI embeddings

Ejercicio 1

Indexa el catálogo de un cliente real

La calidad del RAG depende 80% de cómo indexas los documentos, no del LLM.

  1. Toma 20-30 productos de un catálogo real (o invéntalo) — nombre, descripción, precio, categoría
  2. Diseña la estrategia de chunking: ¿un chunk por producto? ¿por categoría? Justifica
  3. Crea el flujo de ingesta en n8n: CSV/Sheet → Code (format) → OpenAI Embeddings → Supabase upsert
  4. Ejecuta 10 preguntas sobre el catálogo. ¿El retrieval devuelve los productos correctos?
  5. Ajusta el match_threshold hasta lograr que las preguntas irrelevantes devuelvan 0 chunks
Ejercicio 2

Conecta RAG al AI Agent como tool

El verdadero poder del RAG es cuando el agente decide cuándo buscarlo — no cuando tú lo fuerzas en cada request.

  1. Configura el nodo "Vector Store Tool" en el AI Agent apuntando a tu tabla knowledge_base
  2. Prueba: "¿Cuál es el precio del producto X?" — ¿el agente llama la tool o responde de memoria?
  3. Prueba: "hola, ¿cómo estás?" — ¿el agente evita llamar la tool innecesariamente?
  4. Agrega la instrucción "Si no encuentras la información en el catálogo, admítelo" al system prompt
  5. Verifica: pregunta sobre algo que NO está en el catálogo. ¿El agente alucina o admite que no sabe?

Entregable del módulo

Va al proyecto final: El RAGPipeline convierte el catálogo del cliente en memoria consultable. En M6 (ventas), el agente lo usará para recomendar productos. En M8 (soporte), para responder sobre políticas y FAQ.

Módulo 5 · Fase 3 · Producción: canales, casos de negocio y resiliencia

WhatsApp & canales de mensajería

Evolution API, Chatwoot, Telegram — bots que hacen cosas reales

WhatsApp como canal principal en LATAM

En América Latina, WhatsApp es el canal de comunicación por defecto de las PyMEs. El 90%+ de los clientes prefiere resolver problemas por WhatsApp antes que por email o formulario web. Un bot de WhatsApp que funciona bien genera ROI inmediato y visible: el dueño del negocio lo ve en la reducción de mensajes que tiene que responder manualmente.

Evolution API vs WhatsApp Business API oficial

Evolution API usa la sesión de WhatsApp Web (no oficial, gratuita, más fácil de implementar). La API oficial de Meta requiere verificación de negocio y tiene costo por mensaje. Para probar y para clientes pequeños: Evolution. Para escala y cumplimiento regulatorio: API oficial.

Los 3 estados de una conversación en WhatsApp

  • Automatizada: el bot maneja todo. Aplica para el 70% de las consultas repetitivas (precio, horarios, estado de pedido).
  • Asistida (HITL): el bot propone, el humano aprueba antes de enviar. Para cotizaciones o cambios de pedido.
  • Escalada: el bot detecta que no puede resolver y transfiere a un humano en Chatwoot. Para quejas o casos complejos.
Error que molesta al cliente

Escalar a un humano sin darle contexto. El cliente no quiere repetir su problema. El flujo de escalación debe incluir: historial completo de la conversación, clasificación del problema, y lo que ya intentó el bot. Chatwoot recibe todo esto via n8n antes de notificar al agente humano.

Flujo n8n: whatsapp-flow.json (Evolution API → n8n → Chatwoot)

// Flujo: mensaje WhatsApp → bot → respuesta automática o escalación

// PASO 1: Webhook de Evolution API (entrada)
// POST /webhook → { data: { key: { remoteJid }, message: { conversation } } }

const phone = $json.data.key.remoteJid.replace('@s.whatsapp.net', '');
const message = $json.data.message?.conversation
              || $json.data.message?.extendedTextMessage?.text
              || '';

// PASO 2: Recuperar o crear sesión del usuario
const session = await $node["Supabase - Get Session"].run({
  phone,
  create_if_missing: true
});

// PASO 3: Pasar al AI Agent con contexto completo
return [{ json: {
  phone,
  message,
  session_id: session.id,
  history: session.messages.slice(-10),  // últimos 10 mensajes
  channel: 'whatsapp'
}}];

// ─────────────────────────────────────────
// PASO 5: Enviar respuesta via Evolution API

const agentResponse = $json.output;
const shouldEscalate = $json.escalate === true;

if (shouldEscalate) {
  // Crear conversación en Chatwoot con contexto completo
  await $node["HTTP - Chatwoot Create Conv"].run({
    phone,
    initial_message: `[BOT escaló] Razón: ${$json.escalation_reason}\n\nHistorial:\n${session.history_text}`
  });
  // Notificar al cliente
  return [{ json: { text: "Te conecto con un asesor ahora mismo, espera un momento" }}];
}

return [{ json: { text: agentResponse }}];

Para profundizar: Evolution API docs · Chatwoot API · n8n WhatsApp node

Ejercicio 1

Levanta un bot de WhatsApp en 60 minutos

El objetivo es tener un bot funcional end-to-end, aunque sea simple. El primer bot que funciona en producción es el más importante.

  1. Instala Evolution API en tu VPS con Docker. Escanea el QR para conectar WhatsApp.
  2. Configura el webhook de Evolution apuntando a tu n8n
  3. Crea el flujo básico: Webhook → Code (parse WA message) → AI Agent → HTTP (send response via Evolution)
  4. Envíate un mensaje de WhatsApp. ¿Responde el bot?
  5. Agrega el nodo Supabase para guardar el historial de la conversación
Ejercicio 2

Implementa la escalación a Chatwoot con contexto

La escalación sin contexto frustra al agente humano tanto como al cliente. Este ejercicio garantiza que la transferencia sea fluida.

  1. Conecta Chatwoot a n8n via API (necesitas el API key y el inbox_id)
  2. Implementa el trigger de escalación: confianza < 0.6 OR "quiero hablar con persona" OR 3er intento fallido
  3. Cuando se escala, crea la conversación en Chatwoot con el historial formateado
  4. Envía al cliente el mensaje de transferencia + tiempo estimado de espera
  5. Verifica: el agente humano en Chatwoot ve el historial completo sin tener que preguntar nada al cliente

Entregable del módulo

Va al proyecto final: El WhatsAppBot es la capa de entrada del FlowBot. En M6 se añade el flujo de calificación de leads. En M8, el agente de soporte responde desde este mismo canal.

Módulo 6 · Fase 3 · Producción: canales, casos de negocio y resiliencia

Pipeline de ventas automatizado

Lead enrichment, outreach, CRM sync y follow-up automático

El pipeline de ventas automatizado

Un lead entra por WhatsApp o formulario → el sistema califica automáticamente (BANT: Budget, Authority, Need, Timeline) → enriquece el perfil con información pública → agenda follow-up → actualiza el CRM. El vendedor solo toca los leads calificados.

  • Calificación con LLM: el agente extrae BANT del texto de la conversación. Score 0-10. Si <5, nurturing automático. Si ≥5, asigna a vendedor.
  • Lead enrichment: con el email o teléfono, busca información pública (LinkedIn, Google) usando HTTP Request nodes.
  • CRM sync: n8n tiene nodos nativos para HubSpot, Pipedrive, Salesforce, y Twenty CRM (self-hosted). Un lead calificado se crea automáticamente con todas sus propiedades.
  • Follow-up scheduler: si no hay respuesta en 24h, n8n envía un mensaje de seguimiento. Se detiene automáticamente cuando el lead responde.
GDPR y LGPD — lo que no puedes ignorar

En Brasil (LGPD) y Europa (GDPR), automatizar mensajes de outreach sin consentimiento explícito es ilegal. Siempre incluye opt-in en el primer mensaje y guarda el timestamp del consentimiento en Supabase. El flujo debe tener un nodo "check_consent" antes de cualquier mensaje automático.

Entregable del módulo

Va al proyecto final: El SalesPipeline se alimenta del WhatsAppBot del M5. Cuando el clasificador detecta intent de compra, activa este flujo. El score del lead determina si va a automatización o a vendedor humano.

Módulo 7 · Fase 3 · Producción: canales, casos de negocio y resiliencia

Motor de contenido automatizado

Pipelines de generación, aprobación humana y publicación multi-canal

Contenido generado con aprobación humana — el patrón correcto

Publicar contenido generado por IA directamente sin revisión humana es el antipatrón más común y más costoso. El patrón correcto es: generación automática → revisión humana en 1 clic → publicación programada. n8n implementa esto nativamente con el nodo "Wait for Webhook" que pausa el flujo hasta recibir aprobación.

  • Generación: a partir de brief, keywords o datos del producto → LLM genera variantes de post para Instagram, LinkedIn, WhatsApp.
  • Revisión (HITL): n8n envía las variantes por email o Slack con botones Aprobar/Rechazar/Editar. El flujo espera (máx 24h).
  • Publicación programada: al aprobar, n8n usa las APIs nativas de cada red social (o Buffer/Later como proxy) para publicar en el horario óptimo.
  • Reciclado: posts con buen engagement se guardan como few-shot examples para mejorar la generación futura.

Entregable del módulo

Va al proyecto final: El ContentEngine se dispara por cron (ej: lunes 9am, miércoles 9am, viernes 9am) o manualmente. El RAGPipeline del M4 le da contexto sobre los productos del cliente para generar contenido relevante.

Módulo 8 · Fase 3 · Producción: canales, casos de negocio y resiliencia

Agente de soporte especializado

Clasificación, respuesta, escalación y tickets — un flujo real

Soporte automatizado que no frustra al cliente

El bot de soporte tiene que cumplir una regla simple: si puede resolver el problema en el primer intento, lo hace. Si no puede, escala rápido y con contexto. El 70% de las consultas de soporte en una PyME son repetitivas (estado de pedido, horarios, precios). Automatizar esas libera al equipo para los casos que sí necesitan atención humana.

  • Clasificación de urgencia: el agente detecta si la consulta es crítica (producto defectuoso, pago no procesado) y escala inmediatamente sin intentar resolver.
  • Resolución con RAG: para preguntas sobre productos, políticas o FAQ, el agente usa el knowledge base del M4 antes de responder.
  • Creación automática de tickets: cualquier consulta que el bot no pueda resolver genera un ticket en el CRM con la categoría, prioridad y resumen del problema.
  • CSAT automático: 30 minutos después de cerrar una conversación, el bot envía una pregunta de satisfacción (1-5). Los resultados se guardan para análisis.

Entregable del módulo

Va al proyecto final: El SupportAgent integra el RAGPipeline del M4 y el WhatsAppBot del M5. Es el sistema más completo del proyecto — une todos los módulos anteriores en un flujo de atención real.

Módulo 9 · Fase 4 · Resiliencia y deploy: que no se rompa solo y que el cliente lo opere

Resiliencia — cuando las cosas fallan

Logs, alertas, retry, circuit breaker y error handling real

El sistema nunca debe romper en silencio

En producción, los flujos fallan. La API de WhatsApp se cae, Supabase tiene timeout, el LLM devuelve un rate limit. El trabajo del automatizador no es prevenir todos los fallos (imposible) — es asegurarse de que cuando fallan, el sistema responde con gracia y alerta a la persona correcta.

Principio de diseño

Todo flujo de producción tiene exactamente 3 capas: (1) Happy path — funciona bien el 95% del tiempo. (2) Retry — intenta de nuevo automáticamente ante fallos transitorios. (3) Fallback — si todo falla, el sistema responde algo útil y alerta al operador. Sin capa 3, no está listo para producción.

Las 4 técnicas de resiliencia para automatizadores

  • Error Trigger node: captura cualquier error en el flujo, guarda el contexto completo en Supabase, y envía alerta por WhatsApp/Telegram al operador.
  • Retry con backoff: el nodo HTTP Request de n8n tiene retry nativo. Configura 3 intentos con backoff exponencial (1s, 2s, 4s) para APIs inestables.
  • Fallback estático: si el LLM falla después de 3 intentos, el flujo envía un mensaje pre-escrito al usuario y crea un ticket automáticamente.
  • Circuit breaker manual: si una herramienta externa falla más de N veces en 1 hora, desactivar ese nodo automáticamente y notificar al operador antes de seguir causando errores.

Flujo n8n: resilience-layer.json (Error Trigger + fallback)

// Error Trigger — nodo especial que captura fallos de cualquier flujo
// Se configura como "Error Workflow" en los settings del flujo principal

{
  "type": "n8n-nodes-base.errorTrigger",
  "name": "FlowBot Error Catcher"
}

// Al activarse, recibe: execution, workflowData, error
// Nodo Code a continuación:

const { execution, error } = $json;

// 1. Log completo en Supabase para debugging
const errorLog = {
  execution_id: execution.id,
  workflow_name: execution.workflowData.name,
  error_message: error.message,
  error_node: error.node,
  input_data: JSON.stringify(execution.data.resultData?.lastNodeExecuted),
  timestamp: new Date().toISOString()
};
// → Supabase insert en tabla error_logs

// 2. Alerta inmediata por WhatsApp al operador
const alertMessage = `FlowBot Error
Flujo: ${execution.workflowData.name}
Error: ${error.message}
Nodo: ${error.node}
ID: ${execution.id}`;
// → HTTP Request POST a Evolution API

// 3. Si el error fue en conversación de usuario, enviar fallback
const userPhone = execution.data?.startData?.destinationNode?.phone;
if (userPhone) {
  // → Respuesta al usuario: "Lo siento, estamos teniendo problemas técnicos..."
  // → Crear ticket automático en CRM para dar seguimiento
}

return [{ json: { logged: true, alerted: true } }];

Para profundizar: n8n Error workflows · Supabase functions

Ejercicio 1

Fuerza un fallo y verifica la cadena de respuesta

La única forma de saber si tu sistema de resiliencia funciona es rompiendo el flujo intencionalmente.

  1. En el flujo del AgentFlow del M3, añade un nodo Code que lanza un error con 30% de probabilidad
  2. Envía 10 mensajes de prueba. ¿Cuántos fallan? ¿Se activa el Error Trigger?
  3. Verifica que el error log quede en Supabase con el contexto completo
  4. Verifica que llegue la alerta de WhatsApp al operador con el detalle del error
  5. Verifica que el usuario reciba el mensaje de fallback (no un error 500 vacío)
Ejercicio 2

Implementa el dashboard de errores en Supabase

Un sistema de monitoreo simple que el cliente pueda ver sin necesitar acceso a n8n.

  1. Crea una vista en Supabase: errores de las últimas 24h por flujo
  2. Crea una función Postgres que retorna el health score: (requests_exitosos / total) * 100
  3. Construye un flujo n8n de cron diario que envía el reporte de salud por WhatsApp al cliente
  4. Agrega una alerta automática: si error_rate > 5% en 1h, alerta inmediata
  5. Documenta qué errores son "normales" (rate limits transitorios) vs. críticos (API caída)

Entregable del módulo

Va al proyecto final: El ResilienceLayer se conecta a todos los flujos anteriores como "Error Workflow". Es la capa de seguridad del sistema completo. Sin ella, un fallo silencioso puede dejar a 100 clientes sin respuesta durante horas.

Módulo 10 · Fase 4 · Resiliencia y deploy: que no se rompa solo y que el cliente lo opere

Deploy y monetización

Self-host en VPS, entregar a clientes y cobrar por automatización

De flujo local a sistema en producción para un cliente

El deploy no es solo subir el código. Es configurar el ambiente del cliente, documentar el sistema para que lo puedan operar sin ti, y establecer el modelo de precios para que la automatización sea rentable a largo plazo.

  • Infraestructura mínima: VPS de $10/mes (Hetzner, Hostinger, DigitalOcean) + Docker Compose con n8n, Redis y Evolution API. Supabase puede ser el tier gratuito para empezar.
  • Variables de entorno por cliente: nunca hardcodear API keys en los flujos. Usar el sistema de credenciales de n8n, separado por workspace por cliente.
  • Documentación del sistema: cada flujo debe tener una nota interna en n8n explicando qué hace, qué puede fallar, y cómo reiniciarlo. El cliente o tú lo leerán en un incidente a las 2am.
  • Modelo de precios: setup fee único ($500-$3000) + mantenimiento mensual ($100-$300/mes) + costo de LLM pass-through con margen (cobrar 2x el costo real de tokens).
El antipatrón más caro de la consultoría de automatización

Entregar el sistema sin documentación y sin mantenimiento mensual. En 3 meses, el cliente te llama porque "dejó de funcionar" — y como no hay documentación ni contrato de soporte, tienes que arreglarlo gratis. El mantenimiento mensual es donde está la rentabilidad real del negocio.

Para profundizar: n8n self-host docs · Docker Compose reference · Hetzner VPS pricing

Entregable del módulo

Va al proyecto final: Este módulo no añade lógica nueva — integra todos los entregables anteriores en un paquete entregable. El proyecto final empieza aquí: tomar el FlowBot completo, desplegarlo en un VPS real, y documentarlo para que el cliente lo opere.

Proyecto final

Proyecto final: FlowBot, sistema multi-flujo end-to-end

FlowBot: sistema de automatización para PyME. Un sistema multi-flujo end-to-end: todos los entregables de los 10 módulos integrados en un sistema de automatización real (WhatsApp bot, ventas, contenido, soporte, resiliencia y deploy), listo para entregar a un cliente real.

Automatización

  • Clasificación de mensajes por intención
  • RAG sobre catálogo y FAQ del negocio
  • Calificación automática de leads (BANT)
  • Generación de contenido con aprobación
  • Follow-up automático de ventas

Canales e integraciones

  • WhatsApp vía Evolution API
  • Escalación a Chatwoot con historial
  • CRM sync (HubSpot / Twenty / Pipedrive)
  • Publicación multi-canal de contenido
  • Alertas al operador vía WhatsApp

Resiliencia y operación

  • Error handling global con fallback
  • Logs estructurados en Supabase
  • Health monitoring con alertas
  • Retry con backoff en todas las APIs
  • Documentación operativa para el cliente

Criterios de aprobación

Criterio

Tu progreso queda guardado en este navegador.