Saltar al contenidoSkip to content
info@kromagency.esVer proyectosView projects
Portal ClientesClient Portal (abre en otra pestaña)
KROMSoftware Engineering
Iniciar proyectoStart a project→
InicioHome/Insights/Automatización
▸Automatización//04 OCT 2026

Cómo automatizar procesos con n8n: tutorial paso a paso

Automatizar procesos con n8n paso a paso, sobre un caso práctico: un formulario de contacto que te avisa, clasifica cada mensaje y te alerta si algo falla.

PorBy Joan Torres··16 min de lecturamin read
Cómo automatizar procesos con n8n: tutorial paso a paso

En resumen: un flujo de n8n para el formulario de tu web que valida cada mensaje, lo clasifica (presupuesto, soporte o spam), lo guarda, te avisa y te dice cuándo algo se rompe. Más la instalación con Docker y lo básico de seguridad y RGPD.

Imagina que alguien rellena el formulario de tu web un martes a las once de la noche y pide presupuesto. La web le dice «Mensaje enviado», pero el aviso va a una bandeja que nadie mira, cae en spam o el plugin que lo mandaba dejó de funcionar con la última actualización. Nadie contesta, y esa persona le escribe a otro.

Lo peor es que no hace ruido: nadie se queja, el formulario simplemente deja de traer clientes.

Yo hago software a medida y automatizaciones en Krom, aquí en A Coruña, y este es justo el tipo de problema que n8n resuelve bien. Te enseño a montar el flujo entero: recibir el formulario, validarlo, clasificar el mensaje con IA (o SI, Super Inteligencia, como la llama ahora el Gobierno de EE. UU.), guardarlo, avisarte y, lo más importante, enterarte cuando algo falle.

Qué es n8n y cómo funciona

n8n es una herramienta para automatizar procesos conectando aplicaciones. En un editor visual añades nodos (cada uno es un paso: recibir un formulario, escribir en una hoja, mandar un mensaje) y los unes con flechas. Al conjunto lo llaman workflow, o flujo.

Lo que a mí me convence es que no te encierra en lo visual. Cuando un nodo se queda corto, escribes una expresión (un trocito de JavaScript entre dobles llaves) o metes un nodo Code con JavaScript o Python. Lo simple se hace en dos clics y lo raro no te bloquea.

Hay dos formas de usarlo: n8n Cloud, donde ellos lo alojan y mantienen a cambio de una suscripción, o autoalojado en tu servidor. La edición Community autoalojada es gratuita y trae casi todo; lo de empresa (inicio de sesión único, entornos, proyectos compartidos) va con licencia de pago.

Ojo: n8n no es open source en sentido estricto. Usa la Sustainable Use License, una licencia propia de tipo fair-code: gratis para los procesos internos de tu empresa, y también puedes cobrar por montar y mantener flujos a tus clientes. Lo que pide acuerdo comercial es, por ejemplo, ofrecerlo para que tus clientes creen o editen sus propios flujos. Los casos dudosos los repasan en sus preguntas frecuentes sobre la licencia.

¿n8n, Zapier o Make?

Hacen lo mismo a grandes rasgos. Cambia cómo cobran, dónde viven tus datos y cuánto trabajo te toca.

n8n autoalojado n8n Cloud Zapier y Make
Cómo se paga Servidor y tu tiempo; la edición Community no paga licencia Por ejecución del flujo completo Zapier, por cada acción ejecutada; Make, por créditos (por defecto, uno por operación de cada módulo)
Dónde están los datos En tu servidor En la nube de n8n En la nube del proveedor
Mantenimiento Tuyo Del proveedor Del proveedor
Qué necesitas saber Servidores y Docker Manejar el editor Manejar el editor

Con volumen, el modelo de cobro pesa. En Zapier, un flujo de cinco acciones que corre mil veces al mes son 5.000 tareas. En n8n Cloud son mil ejecuciones, tenga cinco nodos o veinte. En la edición Community autoalojada no hay cuota: el límite lo pone tu servidor.

Mi resumen honesto: para algo rápido, con poco volumen y sin tocar servidores, Zapier o Make son muy cómodos. Si quieres los datos en casa, mucho volumen o meter código cuando haga falta, n8n. Y si el proceso es el corazón de tu negocio, con reglas complicadas, a veces compensa más un desarrollo a medida.

El ejemplo: automatizar un formulario con n8n paso a paso

El flujo, en el orden en que queda en el lienzo:

  1. Webhook: recibe el formulario.
  2. Edit Fields: limpia los datos.
  3. If: comprueba email y mensaje.
  4. Respond to Webhook: contesta al formulario.
  5. Text Classifier: decide si es presupuesto, soporte o spam.
  6. Google Sheets o tu CRM con HTTP Request: guarda el lead.
  7. Telegram o Gmail: te avisa.

Aparte, un flujo pequeño con Error Trigger te escribe si algo revienta.

Partimos de que el backend de tu web (WordPress, Laravel o lo que uses) reenvía cada mensaje del formulario a n8n con un POST en JSON así:

{
  "nombre": "Lucía Martínez",
  "email": "  Lucia.Martinez@Example.com ",
  "mensaje": "Hola, necesito presupuesto para una tienda online con unos 200 productos.",
  "web": ""
}

El campo web es un honeypot: va oculto con CSS, así que una persona no lo rellena y muchos bots sí. Por qué envía el backend y no el navegador te lo explico en la parte de seguridad.

Paso 1: el nodo Webhook

Crea un workflow y añade un nodo Webhook:

  • HTTP Method: POST.
  • Path: algo legible, como formulario-contacto (por defecto n8n pone uno aleatorio).
  • Authentication: Header Auth, que vemos en seguridad.
  • Respond: Using ‘Respond to Webhook’ Node, para decidir nosotros qué contestar y cuándo.

Tiene dos URL. La de test (/webhook-test/...) solo escucha durante 120 segundos después de pulsar Listen for test event o Execute workflow, y te enseña en el editor lo que llega. La de producción (/webhook/...) funciona cuando publicas el flujo.

n8n no te entrega tu JSON tal cual: lo envuelve en un objeto con headers, params, query y body. Para leer el email escribirás {{ $json.body.email }}. Las dobles llaves marcan una expresión, y $json son los datos que llegan al nodo.

Para el honeypot, en Add Option elige Only Run If y pon {{ !$json.body.web }}. Si el campo oculto viene relleno, n8n contesta con un 200 sin crear ninguna ejecución. El bot cree que ha funcionado y tu historial queda limpio.

Paso 2: limpiar con Edit Fields

Un nodo Edit Fields (Set) en modo Manual Mapping:

nombre   → {{ ($json.body.nombre || '').trim() }}
email    → {{ ($json.body.email || '').trim().toLowerCase() }}
mensaje  → {{ ($json.body.mensaje || '').trim() }}
recibido → {{ $now.toFormat('yyyy-MM-dd HH:mm') }}

El || '' evita un error si falta un campo. trim() quita espacios sobrantes y toLowerCase() pasa el email a minúsculas, para no acabar con el mismo contacto duplicado. $now es la fecha y hora actuales; configura la zona horaria Europe/Madrid en los ajustes del flujo o de la instancia (en autoalojado, con la variable GENERIC_TIMEZONE), porque si no n8n usa la de Nueva York.

Deja desactivado Include Other Input Fields (viene así por defecto): solo salen estos cuatro campos y no arrastras las cabeceras (IP, navegador), que no necesitas. En versiones antiguas del nodo, lo equivalente era activar Keep Only Set Fields.

Paso 3: validar con If y contestar

Un nodo If con dos condiciones unidas con AND:

  • {{ $json.email.isEmail() }} con Boolean > is true. isEmail() es una función que n8n añade a los textos y te ahorra una expresión regular.
  • {{ $json.mensaje }} con String > is not empty.

En la salida false, un Respond to Webhook con Respond With > JSON, código 400 (en Add Option > Response Code) y { "ok": false }. En la true, otro con código 200 y { "ok": true }, y de este cuelga el resto del flujo: el nodo deja pasar los datos que recibe, así que lo que viene detrás sigue teniendo nombre, email y mensaje.

¿Por qué contesto aquí y no al final? Lo que viene (IA, hoja, Telegram) puede tardar unos segundos y quien rellena el formulario no tiene por qué esperar: el nodo responde y el flujo sigue por detrás. La contrapartida es que, si algo falla después, el formulario ya dijo «recibido». Por eso el aviso de errores no es opcional.

Paso 4: clasificar el mensaje con IA

Añade un Text Classifier. Necesita un modelo de chat conectado como subnodo (OpenAI Chat Model, Anthropic Chat Model u otro) con la API key de ese proveedor. En n8n Cloud, con los planes Starter y Pro, también puedes pagarlo con Gateway credits, un saldo de prepago de n8n, sin abrir cuenta en el proveedor.

  • Input Prompt: {{ $json.mensaje }}. Solo el mensaje, sin nombre ni email: el modelo no los necesita y no mandas datos personales de más a un tercero.
  • Categories, con nombre y descripción:
    • presupuesto: «Pide precio o presupuesto, o quiere contratar algo nuevo».
    • soporte: «Ya es cliente y tiene un problema o una duda sobre algo que existe».
    • spam: «Publicidad, ofertas de SEO o de enlaces, mensajes automáticos o sin sentido».
  • En Add Option, When No Clear Match: Output on Extra, ‘Other’ Branch. Por defecto el nodo descarta lo que no sabe clasificar, y un lead descartado en silencio es justo lo que queremos evitar.

El nodo saca una salida por categoría, más la de Other. En el modelo, baja la Sampling Temperature a 0 o casi, si el modelo lo permite (algunos de razonamiento no dejan tocarla): para clasificar quieres respuestas consistentes, no creativas. Aun así se equivocará alguna vez, así que yo no borraría el spam: guárdalo aparte y revísalo de vez en cuando.

¿Prefieres no meter IA? Un nodo Switch con reglas por palabras clave («presupuesto», «precio») hace un apaño. Acertará menos con mensajes ambiguos, y conviene configurar su Fallback Output para que lo que no encaje no se pierda.

Paso 5: guardar el lead

En la rama presupuesto, un Google Sheets con la operación Append Row: eliges documento y hoja, y mapeas fecha, nombre, email, mensaje y categoría (aquí, el texto fijo presupuesto). La rama spam puede ir a otra pestaña.

Si tienes CRM, cambia la hoja por un HTTP Request que haga POST a su API, con la API key guardada como credencial de n8n (se almacena cifrada).

Paso 6: avisar

Detrás de la hoja, un nodo Telegram con Send Message. Necesitas un bot (te lo crea @BotFather, que te da el token) y el ID del chat donde recibirás los avisos:

Nuevo presupuesto de {{ $('Edit Fields').item.json.nombre }}
{{ $('Edit Fields').item.json.email }}
Recibido: {{ $('Edit Fields').item.json.recibido }}

Después de Google Sheets, $json ya son los datos que devolvió la hoja; con $('Nombre del nodo').item.json lees la salida de cualquier nodo anterior. Yo no metería el mensaje completo: ya está en la hoja, y cuantos menos datos personales pasen por un tercero, mejor.

En la rama soporte, un Gmail con Send al buzón de soporte, o un HTTP Request que abra un ticket (por qué los tickets ayudan). Gmail añade por defecto «This email was sent automatically with n8n», y Telegram una frase parecida; en los dos se quita desactivando Append n8n attribution en las opciones del nodo. La rama Other, a un Telegram de «revisar a mano».

Probar y publicar

Prueba con la URL de test y Execute workflow. Desde la terminal:

curl -X POST https://n8n.tudominio.com/webhook-test/formulario-contacto \
  -H "Content-Type: application/json" \
  -H "X-Webhook-Secret: tu-secreto-largo" \
  -d '{"nombre":"Prueba","email":"prueba@example.com","mensaje":"Quiero presupuesto para una web","web":""}'

Manda uno de cada tipo, uno con el email mal escrito y otro con el honeypot relleno. Cuando todo cuadre, pon la URL de producción en el backend de tu web y pulsa Publish (en tutoriales antiguos lo llaman «activar»).

Cómo hacer que n8n te avise cuando algo falla

Tarde o temprano un flujo en producción falla: caduca un permiso de Google, el proveedor de IA está saturado o alguien cambia una columna de la hoja. Si nadie se entera, vuelves al formulario que no avisa. Yo lo planteo en tres capas.

Reintentos. En la pestaña Settings de cada nodo que llama a un servicio externo, activa Retry On Fail y ajusta Max. Tries (de 2 a 5) y Wait Between Tries (ms) (hasta 5.000). Muchos fallos de red o de saturación son pasajeros; tres intentos con unos segundos de espera es un buen punto de partida.

Qué hacer si un paso falla. En la misma pestaña, On Error te deja elegir entre Stop Workflow, Continue y Continue (using error output), que añade al nodo una salida de error. Esta última va bien cuando tienes plan B: si falla el Telegram, por esa salida mandas el aviso por Gmail. Eso sí, un fallo que recoges así no deja la ejecución como fallida, así que no dispara el flujo de errores que viene ahora.

Un flujo de errores. Crea un workflow «Avisos de error» que empiece con Error Trigger y siga con un Telegram o un Gmail:

Ha fallado «{{ $json.workflow.name }}»
Nodo: {{ $json.execution.lastNodeExecuted }}
Error: {{ $json.execution.error.message }}
Ver ejecución: {{ $json.execution.url }}

En el flujo del formulario, abre Settings desde el menú de los tres puntos y en Error Workflow elige «Avisos de error». Ese mismo flujo de avisos te vale para todos tus workflows: basta con elegirlo en los ajustes de cada uno (detalles en la documentación sobre errores). Dos avisos: no salta en ejecuciones manuales, así que para probarlo provoca un fallo en un flujo publicado con un nodo Stop And Error. Y deja que n8n guarde las ejecuciones fallidas: el enlace del aviso te lleva a los datos que entraron, así que el lead no se pierde.

Falta un caso: si se cae el servidor, el Error Trigger cae con él. Para eso, un monitor de disponibilidad externo que compruebe cada pocos minutos la ruta /healthz de tu instancia.

Cómo instalar n8n con Docker

Si no quieres mantener servidores, usa n8n Cloud y sáltate esto. Si lo alojas tú, necesitas un servidor (un VPS sirve) con Docker y Docker Compose v2. Para instalaciones nuevas, n8n recomienda su instalador de una línea:

curl -fsSL https://get.n8n.io | sh

El script comprueba Docker, crea una carpeta n8n con un compose.yml y un .env con secretos generados, y arranca n8n en el puerto 5678 con los datos en un volumen de Docker. Si no te fías de ejecutar un script de internet a ciegas (bien hecho), descárgalo con curl -fsSL https://get.n8n.io -o get-n8n.sh, léelo y ejecútalo después.

Además de n8n, levanta los servicios que usa su asistente (n8n Assistant), y para ese conjunto su guía de Docker Compose pide al menos 4 GB de RAM y 2 vCPU. El clásico docker run de muchos tutoriales sigue documentado, pero n8n lo marca como desactualizado.

Para producción:

  • HTTPS con proxy inverso (Traefik, Nginx, Caddy) delante del puerto 5678. En el .env, pon N8N_WEBHOOK_URL con tu dirección pública (por ejemplo https://n8n.tudominio.com/) y N8N_PROXY_HOPS=1, y haz que el proxy pase las cabeceras X-Forwarded-*; si no, las URL de webhook salen mal. En guías antiguas verás WEBHOOK_URL, obsoleta desde la 2.35.
  • Cierra el 5678 al exterior. El compose.yml lo publica en todas las interfaces, y los puertos que publica Docker se saltan cortafuegos como ufw. Si el proxy está instalado en el propio servidor, cambia esa línea a 127.0.0.1:5678:5678.
  • PostgreSQL en vez de SQLite, que es lo que recomienda n8n para producción con flujos funcionando todo el día. La guía de Docker Compose explica cómo añadirlo. Decídelo antes de empezar: cambiar de base de datos con flujos ya hechos obliga a migrarlos.
  • Copias de la carpeta .n8n (en Docker, el volumen): guarda la base de datos SQLite y la clave que cifra tus credenciales; sin ella, una copia no te sirve para recuperarlas. Con SQLite, para n8n antes de copiar, y guarda también el compose.yml y el .env. Lo detalla su guía de copias y restauración, y por qué deben estar fuera del servidor lo explico en la importancia de los backups.
  • Actualizar con curl -fsSL https://get.n8n.io | sh -s -- --upgrade. Sacan versión casi cada semana y recomiendan actualizar al menos una vez al mes, leyendo antes las notas de versión y con copia hecha.
  • Cuidado con down -v: docker compose -f ./n8n/compose.yml down -v borra todos los datos. Sin -v, solo lo detiene.

Te soy sincero con el coste: el servidor es barato; el tiempo, no. La propia n8n dice que el autoalojamiento es para gente con experiencia en servidores y que, si no es tu caso, uses su nube. Coincido.

Seguridad y privacidad: webhook, datos y RGPD

Protege el webhook. En el nodo Webhook, Authentication > Header Auth: una credencial con un nombre de cabecera (por ejemplo X-Webhook-Secret) y un valor largo y aleatorio. Lo que llegue sin ella se rechaza.

El matiz que más gente se salta: eso solo protege si llama un servidor. Si el formulario envía desde el navegador, el secreto va en el código de la página y cualquiera lo ve. Por eso en el ejemplo reenvía el backend, y si sale siempre por la misma IP, añade IP(s) Allowlist. Sin backend, asume que el endpoint es público: honeypot con Only Run If y Allowed Origins (CORS) limitado a tu dominio. Lo de CORS frena a otras webs que intenten usarlo desde el navegador, no a un bot que llame directamente.

No guardes datos de más.

  • n8n guarda en el historial los datos que pasan por cada nodo. En los ajustes del flujo puedes desactivar Save successful production executions y quedarte solo con las fallidas.
  • Si lo alojas tú, n8n borra por defecto las ejecuciones de más de 14 días; con EXECUTIONS_DATA_MAX_AGE (en horas) acortas el plazo. Ocultar esos datos a quien ve el flujo solo existe en el plan Enterprise.
  • Al modelo de IA, solo el mensaje. Y revisa el acuerdo de tratamiento de datos del proveedor: para el RGPD es un encargado del tratamiento más.

El RGPD, en corto. Explica en tu política de privacidad para qué usas los datos y qué terceros intervienen (Google, Telegram, el proveedor de IA, quien aloje n8n), guarda solo lo necesario y bórralo cuando sobre: minimización y limitación del plazo de conservación, del artículo 5 del RGPD. Si algún proveedor trata datos fuera de la UE, eso también hay que contemplarlo. No soy abogado: con datos sensibles o mucho volumen, que lo revise alguien que sepa.

Otras ideas para automatizar en tu empresa

  • Pedidos de tu tienda online. Cada pedido dispara por webhook sus avisos y su seguimiento. Es lo que monté con n8n en la tienda Shopify de Kiki Sport.
  • Facturas que llegan por email. Extraer proveedor, fecha e importe con IA y pedir el visto bueno a contabilidad con Send and Wait for Approval de Gmail antes de registrarlas.
  • Recordatorios de citas. Un Schedule Trigger que cada mañana mira la agenda y avisa por email o por WhatsApp (hay nodo de WhatsApp Business Cloud).
  • Informe semanal. Los lunes, ventas, leads e incidencias de la semana en tu correo.
  • Alta de clientes. Ficha en el CRM, carpeta compartida y email de bienvenida, siempre igual y sin olvidos.
  • Leads de varias fuentes. Web, campañas y portales, todos al mismo sitio y con el mismo formato.

¿Lo montas tú o te echo una mano?

Con esto puedes montarlo por tu cuenta, y te animo a hacerlo. Si quieres ver qué cambia (y qué no) con la IA en distintas profesiones, lo cuento en la IA en el trabajo, profesión por profesión.

Si prefieres que lo haga yo, o tu caso tiene más miga (varios sistemas, datos sensibles, un CRM propio), en Krom diseño, monto y mantengo estos flujos: lo tienes en automatizaciones con IA. Cuéntame en contacto qué proceso te está comiendo horas y te diré con franqueza si merece la pena automatizarlo.

EtiquetasTags
n8nAutomatizaciónIADocker
←Volver al logBack to the logAbrir el briefing técnicoOpen the technical briefing→
▸//Sigue leyendoKeep reading

Otras entradas del logMore entries in the log

Cómo la Super Inteligencia (IA) te ayuda en el trabajo: 8 profesionesAutomatización
04 OCT 2026

Cómo la Super Inteligencia (IA) te ayuda en el trabajo: 8 profesiones

Qué puede hacer la inteligencia artificial en tu trabajo, profesión a profesión: tareas concretas, ejemplos, herramientas reales y dónde no fiarse.

Hosting WordPress en España: cómo elegirlo sin equivocarteWordPress
04 OCT 2026

Hosting WordPress en España: cómo elegirlo sin equivocarte

Qué mirar antes de contratar un hosting para WordPress en España: tipo de disco, servidor web y caché, copias de seguridad, seguridad, ubicación del servidor, soporte y precio de renovación. Con una checklist para comparar proveedores y los errores más habituales.

LucusHost opiniones: nuestra experiencia tras 5 añosWordPress
04 OCT 2026

LucusHost opiniones: nuestra experiencia tras 5 años

Nuestra opinión sobre LucusHost después de cinco años trabajando con ellos: planes y precios de hosting WordPress, soporte, tecnología, valoraciones públicas y en qué casos no es la opción adecuada.

WhatsApp
00//CookiesCookies

Usamos cookies propias y de terceros para medir el tráfico, y podríamos usarlas para medir campañas publicitarias. No se activa ninguna hasta que decidas. Puedes aceptarlas todas, rechazarlas todas o elegir por categoría, y cambiar de opinión cuando quieras desde «Preferencias de cookies», en el pie. Detalle completo en la política de cookies.We use first- and third-party cookies to measure traffic, and we may use them to measure advertising campaigns. None are enabled until you decide. You can accept all, reject all or choose by category, and change your mind at any time from “Cookie preferences” in the footer. Full detail in our cookie policy.