Bloque 3 · Sección 07 · práctica

Tu primer
workflow

El pseudocódigo que escribimos en la sección 02 —en una pantalla, con palabras— lo vamos a convertir hoy en nodos reales. Misma lógica, sin escribir una línea de código.

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
La idea central de esta sección

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.

Form Trigger
formulario n8n
IF ¿spam?
false → sigue
Edit Fields
normalizar datos
📊
Google Sheets
agregar fila CRM
✉️
Gmail
respuesta automática
IF ¿presupuesto?
true → avisa ventas
💬
Slack / WA
aviso a ventas
1 trigger 2 condiciones IF 1 Edit Fields 1 Google Sheets 1 Gmail 1 Slack o WA 6 nodos en total

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:

Durante la construcción

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.

Una vez que todo funciona

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 }}
Tip: el editor de expresiones

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:

CUANDO se envía el formulario
Form Trigger → leer nombre, email, mensaje, pidio_presupuesto
SI el mensaje parece spam → DETENER
IF · rama true sin conexión
leer { nombre, email, mensaje, pidió_presupuesto }
Edit Fields · normalizar y enriquecer
📊
guardar contacto en el CRM
Google Sheets · Append Row
✉️
enviar email de respuesta a {email}
Gmail · Send Email con expresiones
SI pidió_presupuesto == verdadero
IF · rama true → avisa a ventas
💬
enviar aviso al equipo de ventas
Slack · Send Message con nombre y email
Lo que viene: cuando las reglas fijas no alcanzan

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.