El punto de partida: lo que ya sabemos
En la Sección 02 terminamos con este algoritmo para el formulario de contacto de un negocio:
CUANDO se envía el formulario de contacto:
leer { nombre, email, mensaje, pidió_presupuesto }
SI el mensaje parece spam o proveedor:
# descartar y terminar
DETENER
guardar contacto en el CRM
enviar email de respuesta a {email}
SI pidió_presupuesto == verdadero:
enviar WhatsApp al equipo de ventas con {nombre, email}
FIN
Cada línea de ese pseudocódigo va a ser un nodo. El CUANDO es el trigger. Los SI son nodos IF. Los verbos (guardar, enviar) son nodos de acción. No hay que aprender lógica nueva: ya la tenés. Solo hay que saber dónde clickear.
El workflow completo de un vistazo
Antes de construirlo nodo por nodo, mirá el flujo entero. El camino principal va de izquierda a derecha; las ramas quedan indicadas debajo de cada nodo de decisión.
Construcción nodo por nodo
Abrís n8n, creás un workflow nuevo y vas agregando nodos en este orden. Cada uno tiene su lógica, su configuración y su expresión clave.
Nodo 1 — n8n Form Trigger (o Webhook)
Es el disparador. Buscás "Form Trigger" en el panel de nodos. n8n te genera una URL de formulario nativo con campos que vos definís: nombre (texto), email (email), mensaje (texto largo), pidio_presupuesto (checkbox). Cuando alguien envía el formulario, el workflow arranca y todos esos valores llegan como $json al siguiente nodo. Si preferís un formulario externo (Typeform, Tally, etc.), podés usar el nodo Webhook en su lugar: misma lógica, distinto origen.
Nodo 2 — IF (¿es spam?)
Es el primer rombo del algoritmo. Agregás un nodo IF y configurás la condición sobre {{ $json.mensaje }}: por ejemplo, que contenga las palabras "proveedor", "publicidad" o "venta" (podés usar String contains o una expresión regex). La rama true (es spam) no tiene conexión a ningún nodo siguiente: simplemente se detiene ahí. La rama false (no es spam) continúa al paso 3.
Nodo 3 — Edit Fields (Set)
Antes de guardar, conviene normalizar los datos para que todos los nodos siguientes usen los mismos nombres de campo sin depender de cómo llegaron del formulario. Con el nodo Edit Fields creás un objeto limpio:
# Campos que definís en Edit Fields (Set):
nombre → {{ $json.nombre }}
email → {{ $json.email }}
mensaje → {{ $json.mensaje }}
pidio_presupuesto → {{ $json.pidio_presupuesto }}
fecha_contacto → {{ $now.toISO() }}
A partir de este nodo, todos los campos tienen nombre propio y predecible.
Nodo 4 — Google Sheets (CRM simple)
Para la experiencia formativa usamos Google Sheets como CRM liviano: es visual, todos lo conocen y no requiere cuenta extra. Configurás el nodo con la operación Append Row apuntando a tu planilla. Los valores de cada columna se mapean con expresiones:
# Mapeo de columnas en Google Sheets:
Nombre → {{ $json.nombre }}
Email → {{ $json.email }}
Mensaje → {{ $json.mensaje }}
Fecha → {{ $json.fecha_contacto }}
Presup. → {{ $json.pidio_presupuesto }}
Si tu stack real incluye HubSpot, Pipedrive o Notion, el nodo cambia pero las expresiones son idénticas.
Nodo 5 — Gmail (respuesta automática)
Agregás el nodo Gmail con la operación Send Email. El campo To y el cuerpo del mail usan expresiones que toman los datos que ya normalizamos:
# Configuración del nodo Gmail:
To: {{ $json.email }}
Subject: Recibimos tu consulta, {{ $json.nombre }}
Body:
Hola {{ $json.nombre }},
gracias por escribirnos. Recibimos tu mensaje
y te vamos a responder a la brevedad.
Saludos,
El equipo
Fijate que {{ $json.nombre }} y {{ $json.email }} son los mismos campos que definiste en Edit Fields. No importa de dónde vinieron originalmente: a este punto ya están normalizados.
Nodo 6 — IF (¿pidió presupuesto?) + Slack
El segundo rombo del algoritmo. Nodo IF con la condición {{ $json.pidio_presupuesto }} igual a true (o distinto de vacío, según cómo llegue el checkbox). La rama true conecta a un nodo Slack (o HTTP Request a WhatsApp Business API) que manda un mensaje al canal de ventas:
# Mensaje al canal #ventas en Slack:
Nuevo contacto con pedido de presupuesto 🎯
Nombre: {{ $json.nombre }}
Email: {{ $json.email }}
Mensaje: {{ $json.mensaje }}
La rama false no se conecta a nada: el workflow termina ahí sin hacer nada más.
Probar paso a paso y activar
n8n tiene dos modos de ejecución que vas a usar en este orden mientras construís:
Execute step
Botón de play individual en cada nodo. Ejecuta solo ese nodo usando los datos que tiene disponibles (del nodo anterior o de los datos fijados). Ideal para ver exactamente qué transforma cada paso sin correr todo el workflow.
Toggle Active
El switch Active en la esquina superior derecha del canvas. Cuando lo activás, el workflow empieza a escuchar disparadores reales. Nunca lo activés antes de haber probado el flujo completo. Un workflow activo con un bug puede mandar mails o escribir en Sheets con datos incorrectos.
Expresiones n8n que usamos en este workflow
Repasamos en un solo lugar todas las expresiones reales que aparecen en la construcción. Recordá que en n8n las expresiones van entre {{ }} y se activan con el botón de expresión (el ícono fx) en cualquier campo de texto.
# Acceder al email del contacto (campo del formulario)
{{ $json.email }}
# Saludo personalizado en el cuerpo del mail
Hola {{ $json.nombre }}, gracias por escribirnos.
# Condición en el nodo IF de spam (usando el editor de condiciones)
# Campo: $json.mensaje | Operador: Contains | Valor: "proveedor"
{{ $json.mensaje }} contains "proveedor"
# Condición en el nodo IF de presupuesto
{{ $json.pidio_presupuesto }} === true
# Fecha actual formateada para la columna de Sheets
{{ $now.toFormat('yyyy-MM-dd HH:mm') }}
# Acceder a datos del nodo anterior por nombre (si necesitás saltar nodos)
{{ $('Edit Fields').item.json.nombre }}
Cuando hacés clic en el ícono fx de cualquier campo, se abre el editor de expresiones de n8n. Ahí podés explorar la estructura del JSON de entrada, autocompletar campos y ver el resultado en tiempo real antes de guardar. Si no sabés cómo se llama un campo, buscalo ahí: n8n lo muestra como árbol.
El workflow es el pseudocódigo, hecho nodos
Mirá la equivalencia directa entre lo que escribimos en la sección 02 y lo que acabamos de construir:
Este workflow es 100% determinista: reglas fijas, decisiones binarias, siempre el mismo resultado para el mismo input. Funciona perfecto para este caso. Pero ¿y si la decisión de "¿es spam?" necesita criterio? ¿Y si querés que el email de respuesta varíe según el tono del mensaje? ¿Y si en vez de reglas rígidas necesitás comprensión? Ahí es exactamente donde entra la IA. En la Sección 08 vemos cómo n8n integra modelos de lenguaje como nodos más dentro de este mismo canvas.