Documento interno · Grupo Making Of
n8n
Playbook
Cómo automatizamos, conectamos y escalamos con n8n en GMO
7Capítulos
4Flujos MOVA documentados
2Velocidades de lectura
2026Versión
01¿Qué es n8n?
📖 Para todo el equipo

El motor de automatización de GMO

Antes de entender los flujos de MOVA hay que entender qué es n8n y por qué GMO lo eligió. Este capítulo no requiere conocimiento técnico.

La idea central

n8n es una herramienta de automatización de flujos de trabajo. La idea es simple: conectar aplicaciones y servicios para que hagan cosas automáticamente, sin que una persona tenga que estar en el medio coordinando.

Imagina que cada vez que llega una factura al email de GMO, alguien tiene que: abrir el email, descargar el PDF, revisar los datos, buscar si existe una OC para esa factura, registrar todo en una planilla y notificar al responsable. Eso es trabajo humano repetitivo. n8n hace exactamente eso, solo, las 24 horas del día, sin errores por cansancio.

🔗
La analogía exactan8n es como un empleado que no duerme, no se olvida de los pasos, sigue instrucciones al pie de la letra y puede hacer mil cosas a la vez. No reemplaza el criterio humano — ejecuta las instrucciones que el equipo define una vez.

Los flujos en n8n se construyen visualmente: arrastra bloques (llamados nodos), los conectas con flechas y defines qué hace cada uno. Un flujo puede ser tan simple como "cuando llegue un email, guárdalo en una planilla", o tan complejo como el M8 que procesa facturas con inteligencia artificial.

Por qué GMO usa n8n

n8n es el sistema nervioso de MOVA. Conecta el frontend HTML (lo que ve el equipo), con Claude (la inteligencia), con Google Workspace (los datos) y con servicios externos (SII, PDFs, APIs). Sin n8n, cada módulo MOVA sería una isla — con n8n, todos hablan entre sí.

Qué hace n8n en GMOMódulo MOVA relacionado
Recibe facturas por email y las procesa con ClaudeM8 · Receptor de Egresos
Verifica 750 URLs de contenido SEO automáticamenteM15 · Auditor de Contenido
Autentica con el SII y descarga el RCV mensualM7 · Conciliador SII
Recibe mensajes de AXON y los enruta al modelo correctoAXON · Agente conversacional
Genera OCs y las registra en la BBDD de egresosM2 · Generador de OC

n8n vs las alternativas

Criterion8nZapierMake (Integromat)
Modelo de precioSelf-hosted gratis en dropletPor tarea ejecutada — se disparaPor operación — más razonable
Integración con Claude APIHTTP Request nativo, total controlExiste pero limitadoExiste pero menos flexible
Código en los flujosNodo Code con JS o Python completoNo permite código realLimitado
Control sobre el servidorTotal — en nuestro propio dropletSolo en la nube de ZapierSolo en la nube de Make
Privacidad de datosLos datos no salen del droplet GMOPasan por servidores de ZapierPasan por servidores de Make
Por qué el droplet propio es claveGMO procesa facturas, datos de proveedores y información financiera en los flujos n8n. Que eso pase por servidores de un tercero es un riesgo innecesario. En el droplet propio, los datos se quedan en GMO.
02Cómo leer un flujo
📖 Para todo el equipo

Entender un flujo sin construirlo

No necesitas saber programar para entender cómo funciona un flujo de n8n. Este capítulo te da el vocabulario para leerlos, discutirlos y proponer mejoras.

Anatomía de un flujo

Un flujo en n8n es una secuencia de pasos conectados. Cada paso se llama nodo. Los nodos se conectan de izquierda a derecha: el resultado de uno es la entrada del siguiente.

🔔 Trigger
⚙️ Procesar
🤖 Claude
✅ Validar
📊 Guardar

Todo flujo tiene tres partes:

  • Trigger (inicio): Qué dispara el flujo. Puede ser un email nuevo, un webhook, una hora programada, o un clic en el frontend MOVA.
  • Proceso (medio): Los pasos que transforman los datos. Aquí viven las llamadas a Claude, las validaciones y las transformaciones.
  • Output (fin): Qué pasa con el resultado. Normalmente: escribir en Google Sheets, enviar una notificación, o devolver una respuesta al frontend.

Tipos de nodos

🔔
Trigger
Inicia el flujo. Puede ser: email nuevo, webhook HTTP, horario programado (cron), o trigger manual.
Inicio del flujo
🌐
HTTP Request
Llama a cualquier API externa. Así se conecta n8n con Claude, con el SII, con APIs de Meta o Google.
Llamada externa
🔀
IF / Switch
Toma decisiones. "Si la factura fue aprobada, ve por este camino. Si fue rechazada, ve por el otro."
Lógica
🔁
Split in Batches / Loop
Itera sobre una lista. "Para cada una de las 750 URLs, ejecuta estos pasos." Base del M15.
Iteración
📊
Google Sheets
Lee y escribe en hojas de cálculo. Es la base de datos principal de MOVA para datos estructurados.
Datos
⚙️
Code
Ejecuta JavaScript o Python. Para transformaciones complejas que no tienen nodo dedicado.
Código libre
⏱️
Wait
Pausa el flujo N milisegundos. Esencial en batches para no superar los rate limits de la API de Claude.
Control
📧
Email / Slack / Gmail
Envía notificaciones. El paso final de muchos flujos MOVA: avisa al responsable cuando algo fue procesado.
Notificación

El patrón MOVA

Todos los módulos MOVA que usan Claude siguen el mismo esquema de 3 capas. Entender esto es entender la arquitectura completa de MOVA.

Frontend HTML
El equipo completa un formulario o hace un clic en acme-chile.cl
Webhook n8n
n8n recibe los datos y prepara el prompt para Claude
Claude API
Claude analiza, extrae o genera — devuelve JSON estructurado
Validación + Parseo
n8n verifica que el output sea válido y lo procesa
Google Sheets / Notificación
El resultado se guarda y/o se notifica al responsable
Respuesta al Frontend
n8n devuelve el resultado y el frontend lo muestra en pantalla
03Flujos MOVA
📖 Para todo el equipo

Qué automatiza n8n en GMO hoy

Cuatro flujos en producción o avanzado desarrollo. Para cada uno: qué hace, cómo funciona y qué aprendimos.

🤖

AXON · Agente conversacional

Webhook conversacional · Gemini + Claude · Asana

AXON recibe cada mensaje del equipo, decide qué modelo usar (Gemini para respuestas rápidas, Claude para análisis complejos) y puede crear tareas en Asana si detecta que el mensaje lo requiere.

Mensaje AXON
Webhook n8n
Router Gemini/Claude
API IA
Respuesta + Asana

Lección: El historial de conversación lo pasa el frontend en cada request — n8n solo lo recibe y lo incluye en el array de messages de la API. Claude ve toda la conversación en cada llamada.

~$3
USD/mes
2
Modelos IA
24/7
Disponibilidad
📄

M8 · Receptor de Egresos

IMAP · PDF base64 · Claude extracción · Validación vs OC · Google Sheets

Monitorea proveedores@mkof.cl, extrae datos de facturas PDF con Claude, las valida contra las órdenes de compra registradas y aprueba o rechaza automáticamente.

Email IMAP
PDF → base64
Claude extrae datos
Lookup OC en Sheets
IF aprobada/rechazada
Sheets + Notificación

Lección: El nodo IF posterior al output de Claude es crítico. No asumas que Claude siempre devuelve JSON válido — valida antes de escribir en Sheets.

94%
Precisión
$0.004
USD/factura
~5h
Ahorro mensual
🔍

M15 · Auditor de Contenido

750 URLs · Loop · Scraping · Claude compara · Semáforo en Sheets

Lee una planilla con URLs y contenido esperado, scrapeea cada URL, le pide a Claude que compare y escribe el estado (✅⚠️❌🚫) en la misma planilla. 750 URLs en 15 minutos.

Trigger manual
Sheets: lee 750 filas
Loop · 1 URL a la vez
Wait 1200ms
Scrape URL
Claude compara
Sheets: escribe estado

Lección: El Wait de 1.200ms es obligatorio. Sin él, superas los 50 requests/minuto de la API y el flujo empieza a fallar con error 429 a mitad del proceso.

750
URLs por ciclo
$0.60
USD total
15 min
Tiempo total
🏛️

M7 · Conciliador SII

Auth SOAP · Token SII · RCV mensual · PM2 en droplet

Autentica con el SII usando el certificado digital de GMO, descarga el RCV mensual y lo procesa para conciliación contable. Phase 1 completa (autenticación válida). Phase 2 (query RCV + categorización con Claude) en desarrollo.

Trigger mensual
Auth SII (SOAP + cert .pfx)
Token válido
Query RCV SII
Claude categoriza
Sheets BBDD Egresos

Arquitectura especial: El servicio de autenticación SII corre como proceso Node.js independiente en PM2 en el droplet, no dentro de n8n. n8n llama a ese servicio vía HTTP local para obtener el token.

Lección: El certificado .pfx del SII expira en julio 2026. Antes de esa fecha hay que renovarlo con E-Certchile o el flujo completo deja de funcionar.

Phase 1
Autenticación ✓
Jul 2026
Renovar cert .pfx
PM2
Auth service
04Nodos esenciales
🔧 Sección técnica

Los nodos que usa MOVA

Estos son los nodos que aparecen en prácticamente todos los flujos de GMO. Con dominar estos tienes el 90% de lo que necesitas para construir y mantener módulos MOVA.

Triggers

Webhook — el más usado en MOVA

Recibe una petición HTTP POST desde el frontend y dispara el flujo. Es la base del patrón MOVA.

// Configuración del nodo Webhook:
HTTP Method: POST
Path: /webhook/nombre-modulo          ← ej: /webhook/m8-egresos
Response Mode: When Last Node Finishes ← devuelve resultado al frontend

// URL pública resultante:
https://grupomakingof.app.n8n.cloud/webhook/nombre-modulo

Schedule Trigger — para procesos periódicos

Dispara el flujo en un horario definido. Para M15 (auditoría semanal) o M7 (descarga mensual del SII).

// Ejemplos de expresión cron:
0 8 * * 1      ← Lunes 8:00 AM (M15)
0 2 1 * *      ← Día 1 de cada mes a las 2AM (M7 SII)
0 7 * * 1-5    ← Lunes a viernes 7AM (briefing AXON)

Email Trigger (IMAP) — para M8

// Nodo: Email Trigger (IMAP)
Host: imap.gmail.com  (o el de GoDaddy para mkof.cl)
Port: 993
Mailbox: INBOX
Action: Mark as read  ← para no procesar 2 veces

HTTP Request

El nodo más versátil de n8n. Llama a cualquier API. En GMO lo usamos principalmente para Claude API y para servicios externos (SII, PDF.co).

// Configuración base para Claude API:
Method: POST
URL: https://api.anthropic.com/v1/messages
Authentication: Header Auth → credencial "Anthropic API"
Headers:
  anthropic-version: 2023-06-01
Body (JSON):
{
  "model": "claude-sonnet-4-20250514",
  "max_tokens": 1000,
  "system": "Tu system prompt",
  "messages": [{
    "role": "user",
    "content": "={{ $json.input }}"
  }]
}
Settings:
  Retry On Fail: ON
  Max Tries: 3
  Wait Between Tries: 2000ms
⚠️
Retry siempre activoSiempre activa "Retry On Fail" en cualquier HTTP Request a Claude API. Los errores 529 (servidor sobrecargado) son transitorios — un retry a los 2 segundos generalmente funciona sin que tengas que hacer nada.

Lógica e iteración

IF — para bifurcar según el resultado de Claude

// Ejemplo: validar que Claude devolvió JSON antes de parsear
Condición: {{ $json.content[0].text }} contains "{"
Branch TRUE  → nodo JSON Parse → continúa el flujo
Branch FALSE → nodo Set (marca error) → notifica al equipo

Split in Batches + Loop — para M15 y otros batches

// Configuración para 750 URLs:
Batch Size: 1         ← procesa de a 1 para control total
Reset: false          ← mantiene el estado entre iteraciones

// SIEMPRE agregar Wait node después del Split:
Wait: 1200ms          ← = 50 requests/min máximo

Datos e integración

Google Sheets — la base de datos de MOVA

// Leer todas las filas activas:
Operation: Get Many Rows
Sheet ID: [ID del Sheet]
Filters: column "estado" equals "activo"

// Actualizar una fila específica por ID:
Operation: Update Row
Row Number: {{ $json.fila_id }}
Column: estado → "procesado"
Column: fecha_proceso → {{ $now.toISO() }}

Code node — para transformaciones complejas

// Extraer y parsear JSON de respuesta Claude:
const rawText = $input.first().json.content[0].text;
const clean = rawText.replace(/```json|```/g, '').trim();
try {
  const parsed = JSON.parse(clean);
  return [{ json: parsed }];
} catch(e) {
  return [{ json: { error: 'JSON inválido', raw: rawText } }];
}
05Claude desde n8n
🔧 Sección técnica

Patrones de integración Claude + n8n

Todo lo que necesitas para integrar Claude en cualquier flujo MOVA: desde la configuración base hasta el procesamiento de PDFs y el manejo de batches largos.

Configurar el nodo base

Antes de cualquier flujo que use Claude, crea la credencial en n8n:

  1. Settings → Credentials → New Credential → Header Auth
  2. Name: Anthropic API
  3. Header Name: x-api-key
  4. Header Value: sk-ant-XXXXXXXX

Una vez creada, la referencias en todos los nodos HTTP Request que llamen a Claude sin volver a pegar la key.

⚠️
La key nunca en el body JSONNunca pongas la API key dentro del body del request. Siempre en la credencial de autenticación del nodo. Si el body JSON llega a loguearse o exponerse, la key no estará ahí.

Extraer el texto de la respuesta

// En el nodo siguiente al HTTP Request:
{{ $json.content[0].text }}

// Tokens usados (para monitoreo de costo):
Input:  {{ $json.usage.input_tokens }}
Output: {{ $json.usage.output_tokens }}

Pasar PDFs e imágenes

// Body JSON para PDF adjunto de email:
{
  "model": "claude-sonnet-4-20250514",
  "max_tokens": 1000,
  "system": "Extractor de facturas. Solo JSON válido.",
  "messages": [{
    "role": "user",
    "content": [
      {
        "type": "document",
        "source": {
          "type": "base64",
          "media_type": "application/pdf",
          "data": "={{ $binary.data }}"
        }
      },
      {
        "type": "text",
        "text": "Extrae los datos de esta factura."
      }
    ]
  }]
}

Para imágenes: cambia "document" por "image" y "application/pdf" por "image/jpeg" o "image/png".

Batch con Loop (patrón M15)

// Arquitectura completa de un flujo batch:

Google Sheets → [todas las filas]
  ↓
Split In Batches (size: 1)
  ↓
Wait (1200ms)         ← OBLIGATORIO — rate limit
  ↓
HTTP Request → URL del ítem  ← scraping
  ↓
Code → limpia el HTML, extrae texto
  ↓
HTTP Request → Claude API  ← análisis
  ↓
IF → ¿JSON válido?
  ├── TRUE → Google Sheets Update (escribe resultado)
  └── FALSE → Google Sheets Update (marca error)
  ↓
[vuelve al Loop]
  ↓
[fin] → Slack/Email notificación de completado
💡
Escribe el error, no lo ignoresEn el branch FALSE del IF, siempre escribe algo en el Sheet. Aunque sea "ERROR - revisar". Un fallo silencioso hace que esa fila quede sin estado y nunca sepas que falló.

Parsear el output de Claude

El problema más frecuente en producción: Claude responde con texto envuelto en backticks de markdown. El JSON Parse de n8n falla.

// Code node después del HTTP Request a Claude:
const raw = $input.first().json.content[0].text;

// Limpiar backticks y espacios:
const clean = raw
  .replace(/```json\n?/g, '')
  .replace(/```\n?/g, '')
  .trim();

// Intentar parsear con manejo de error:
try {
  const data = JSON.parse(clean);
  return [{ json: { ...data, _raw_ok: true } }];
} catch (e) {
  // Si falla, devolver el texto crudo para debug:
  return [{ json: { _raw_ok: false, _raw: clean, _error: e.message } }];
}

Luego usa un IF que verifica _raw_ok === true para bifurcar el flujo.

06Producción y droplet
🔧 Sección técnica

El servidor de GMO

La infraestructura técnica que sostiene MOVA: el droplet de DigitalOcean, cómo está organizado y las reglas para trabajar en producción sin romper cosas.

Infraestructura GMO

ComponenteDetallePara qué se usa
Droplet DigitalOceanUbuntu 22.04 · IP: 134.209.40.247 · nombre: n8n-mkofn8n de producción, servicio de auth SII (PM2), base de Node.js services
n8n Cloudgrupomakingof.app.n8n.cloudDesarrollo y pruebas. Los flujos que funcionan pasan al droplet.
GoDaddy cPanelacme-chile.clFrontend HTML de los módulos MOVA, público en /public_html
MySQL GoDaddyHost: p3plzcpnl508505.prod.phx3.secureserver.netAuth MOVA (sistema PHP/MySQL en desarrollo)
Cert SII.pfx · E-Certchile · expira jul 2026Autenticación con SII para M7

Regla de los dos entornos

Siempre desarrolla en n8n Cloud primero. Cuando un flujo está probado y estable, se migra al droplet de producción. Nunca experimentes directamente en el droplet — si el flujo falla en producción afecta módulos reales que el equipo está usando.

🏢
Acceder al dropletVía SSH: ssh root@134.209.40.247. Para editar archivos en el servidor sin terminal, usa Claude Code directamente — lee el archivo, hace el cambio, lo verifica. Mucho más seguro que editar a mano en producción.

Errores comunes y solución

ErrorCausa más probableSolución
401 UnauthorizedAPI key de Claude incorrecta o expirada en las credenciales de n8nSettings → Credentials → Anthropic API → verificar la key
429 Rate LimitDemasiados requests por minuto (más de 50)Agregar Wait de 1200ms antes del HTTP Request a Claude
JSON Parse failedClaude envolvió el JSON en backticks de markdownUsar el Code node de limpieza antes del JSON Parse
Webhook timeoutEl flujo tarda más de 30s y el frontend pierde la conexiónCambiar Response Mode a "Immediately" y devolver el resultado por otro canal (Sheets + polling)
IMAP connection errorContraseña de email cambiada o 2FA activadoActualizar credencial IMAP en n8n con app password
Flujo se ejecuta 2 vecesWebhook recibe el mismo request dos veces (frontend con retry)Agregar nodo deduplicación con ID único del request

Seguridad y credenciales

  • API keys siempre en Credentials de n8n — nunca en el body JSON de un nodo, nunca en variables de texto plano, nunca en el código de un nodo Code.
  • Webhooks con shared secret — para webhooks que reciben datos desde el frontend MOVA, agrega un header secreto que n8n verifica antes de procesar. Evita que cualquier persona pueda llamar al webhook si conoce la URL.
  • Variables de entorno en el droplet — las credenciales más sensibles (cert SII, DB password) van en variables de entorno del sistema, no dentro de n8n.
  • Google OAuth restringido a @mkof.cl — las integraciones con Google Workspace solo permiten autenticación con cuentas del dominio GMO.
// Shared secret en webhook MOVA:
// En el nodo Webhook de n8n, agregar validación:
Header: X-MOVA-Secret
Value: {{ $env.MOVA_WEBHOOK_SECRET }}

// En el frontend HTML:
headers: {
  'Content-Type': 'application/json',
  'X-MOVA-Secret': '[valor del secret]'
}
07Referencia rápida

Cheatsheet

Todo lo que necesitas a mano.

URLs y endpoints GMO

n8n GMO
Cloud (dev)grupomakingof.app.n8n.cloud
Droplet (prod)134.209.40.247
Webhook base Cloud…n8n.cloud/webhook/[nombre]
MOVA Frontendacme-chile.cl
AXONacme-chile.cl/axon/
Claude API
Endpointapi.anthropic.com/v1/messages
Versión header2023-06-01
Sonnet (default)claude-sonnet-4-20250514
Haiku (batch)claude-haiku-4-5-20251001
Consoleconsole.anthropic.com
Rate limits Claude
Requests/min (Tier 1)~50
Tokens/min~40.000
Wait entre requests1.200ms mínimo
750 URLs → tiempo~15 min
Retry en 5292000ms · 3 intentos
Costos por módulo
M8 por factura~$0.004 USD
M15 ciclo completo~$0.60 USD
M13 por CV~$0.018 USD
AXON por mes~$3 USD
Evaluador proyecto~$0.02 USD

Snippets de código

Fetch desde frontend al webhook n8n

async function llamarMOVA(endpoint, datos) {
  const res = await fetch(
    `https://grupomakingof.app.n8n.cloud/webhook/${endpoint}`, {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'X-MOVA-Secret': '[secret]'
    },
    body: JSON.stringify(datos)
  });
  return await res.json();
}

Limpiar y parsear output de Claude

const raw = $input.first().json.content[0].text;
const clean = raw.replace(/```json\n?|```\n?/g, '').trim();
try {
  return [{ json: JSON.parse(clean) }];
} catch(e) {
  return [{ json: { _error: true, _raw: clean } }];
}

Google Sheets: update de fila por número

// Nodo Google Sheets:
Operation: Update Row
Spreadsheet: [ID del Sheet]
Sheet: BBDD Egresos
Row Number: {{ $json.fila_numero }}
Columns: estado = "procesado", fecha = {{ $now.toFormat('yyyy-MM-dd') }}

Tabla de errores rápida

CódigoQué significaFix inmediato
401API key inválidaVerificar credencial Anthropic en n8n Settings
400Body JSON malformadoProbar el prompt en console.anthropic.com/workbench primero
429Rate limit superadoAgregar Wait 1200ms antes del HTTP Request
529Servidores Anthropic saturadosRetry automático lo resuelve; si persiste, esperar 5 min
ECONNRESETTimeout de red en el dropletReiniciar el proceso n8n en PM2: pm2 restart n8n
JSON Parse errorClaude devolvió texto con backticksUsar el Code node de limpieza antes del JSON Parse