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:
- Webhook: recibe el formulario.
- Edit Fields: limpia los datos.
- If: comprueba email y mensaje.
- Respond to Webhook: contesta al formulario.
- Text Classifier: decide si es presupuesto, soporte o spam.
- Google Sheets o tu CRM con HTTP Request: guarda el lead.
- 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, ponN8N_WEBHOOK_URLcon tu dirección pública (por ejemplohttps://n8n.tudominio.com/) yN8N_PROXY_HOPS=1, y haz que el proxy pase las cabecerasX-Forwarded-*; si no, las URL de webhook salen mal. En guías antiguas verásWEBHOOK_URL, obsoleta desde la 2.35. - Cierra el 5678 al exterior. El
compose.ymllo 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 a127.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 elcompose.ymly 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 -vborra 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.



