LABS · JULIÁN LÓPEZ JIMÉNEZ · RECURSO GRATUITO

Tu primer flujo en n8n: tres retos sin IA ni claves

Practica tres retos de diagnóstico en el navegador: interpreta datos, limpia un asunto y elige la rama. Después repítelos con n8n real. Tres retos originales con pistas y soluciones; no envían mensajes ni necesitan una API de pago.

Diagnóstico: evidencias preparadas, sin ejecutar n8n

Resuelve causa, evidencia, corrección mínima y prueba funcional antes de abrir la solución. Después realiza la práctica real.

Reto 1 · Una solicitud y una ejecución

Ejecutas el flujo dos veces. Decide qué representa la salida y cómo conservar la identidad. No existe ningún nodo de envío.

Entrada y configuración

Manual Trigger → Edit Fields

id (String): S-GRATIS
asunto (String):   No imprime  

OUTPUT preparado

Ejecución A y ejecución B (independientes)

Cada ejecución: [{"json":{"id":"S-GRATIS","asunto":"  No imprime  "}}]

Efectos observados

Nodos conectados

No hay HTTP, correo ni bandeja. Una ejecución nueva no acumula items en la anterior.

Causa principal

  1. Dos ejecuciones significan dos items en la misma salida.
  2. Cada ejecución tiene un item independiente; aún no hay efecto externo.
  3. El segundo disparo borra todas las ejecuciones.

Evidencia determinante

  1. El nodo es verde, así que envió un correo.
  2. El título del workflow es suficiente.
  3. El OUTPUT tiene un objeto json y el grafo no incluye un envío.

Corrección mínima

  1. Mantener id y asunto como texto y conectar los dos nodos.
  2. Eliminar id porque el orden identifica la solicitud.
  3. Añadir aprobado=true para que termine.

Cómo verificarlo

  1. Comprar una API para comprobarlo.
  2. Repetir con id=S-OTRO y observar un item nuevo, sin envíos.
  3. Marcar el curso como terminado.
Pista 1 de 3

Una ejecución es una ocasión; un item es un dato que viaja entre nodos.

Pista 2 de 3

Cuenta los objetos de la salida de una ejecución, no el número de veces que pulsaste ejecutar.

Pista 3 de 3

Cambia el ID y observa la salida antes de pensar en un envío.

Solución razonada
  1. Cada ejecución tiene un item independiente; aún no hay efecto externo.
  2. El OUTPUT tiene un objeto json y el grafo no incluye un envío.
  3. Mantener id y asunto como texto y conectar los dos nodos.
  4. Repetir con id=S-OTRO y observar un item nuevo, sin envíos.

Cada ejecución produce su propio item con id y asunto. Conservar el identificador permite seguir la solicitud. Aquí no existe un efecto externo: repetir no demuestra envío, aprobación ni resolución.

Reto 2 · Limpia sin perder el original

Una expresión fija elimina espacios; compara dos configuraciones de Edit Fields y elige la que conserva la trazabilidad.

INPUT preparado

Un item de entrada

{"id":"S-GRATIS","asunto":"  No imprime  "}

Expresión y dos salidas

={{ String($json.asunto ?? "").trim() }}

A · Include Other Input Fields desactivado:
{"asunto_limpio":"No imprime"}
B · Activado:
{"id":"S-GRATIS","asunto":"  No imprime  ","asunto_limpio":"No imprime"}

Casos límite preparados

Texto, espacios, ausencia y null

"  No imprime  " → "No imprime"
"   " → ""
Ausente → ""
null → ""
Este reto parte de texto o ausencia; convertir un objeto a texto no acredita un contrato válido.

Causa principal

  1. La salida A pierde id porque no conserva los campos de entrada.
  2. trim elimina el identificador de cualquier objeto.
  3. La entrada ya estaba aprobada.

Evidencia determinante

  1. El color del nodo prueba que conservó todo.
  2. A solo contiene asunto_limpio; B conserva también id y asunto.
  3. El historial de Git muestra la salida.

Corrección mínima

  1. Inventar otro id después de cada ejecución.
  2. Borrar el asunto original para ahorrar memoria.
  3. Activar Include Other Input Fields y añadir asunto_limpio sin sustituir asunto.

Cómo verificarlo

  1. Aceptar cualquier objeto porque String lo convierte.
  2. Probar texto, espacios, ausencia y null, comparando id, original y campo limpio.
  3. Repetir solo el caso normal.
Pista 1 de 3

Normalizar no equivale a borrar los datos que necesitarás después.

Pista 2 de 3

Compara las claves de A y B, no solo el texto limpio.

Pista 3 de 3

Include Other Input Fields conserva los campos; ?? cubre ausencia/null y trim elimina extremos.

Solución razonada
  1. La salida A pierde id porque no conserva los campos de entrada.
  2. A solo contiene asunto_limpio; B conserva también id y asunto.
  3. Activar Include Other Input Fields y añadir asunto_limpio sin sustituir asunto.
  4. Probar texto, espacios, ausencia y null, comparando id, original y campo limpio.

La salida B conserva la identidad y el original. El campo limpio se utiliza después para decidir; una cadena vacía no es una solicitud válida. Este ejercicio no valida entradas arbitrarias: el curso añade comprobación estricta de tipos.

Reto 3 · Elige una sola rama

El IF del flujo se configuró sobre asunto original. Descubre por qué una entrada con espacios sigue una ruta incorrecta.

INPUT preparado

Tres ensayos independientes

A: {"id":"S-1","asunto":"  No imprime  ","asunto_limpio":"No imprime"}
B: {"id":"S-2","asunto":"   ","asunto_limpio":""}
C: {"id":"S-3","asunto_limpio":""}

Configuración defectuosa

IF · String → is not empty

Valor: {{ $json.asunto }}
B toma true porque el original contiene espacios. No se ha consultado asunto_limpio.

Contrato de salida preparado

Conservar campos en ambos Edit Fields

true → estado=lista_para_revision
false → estado=incompleta
Cada item recorre una sola salida. lista_para_revision no significa aprobado ni enviado.

Causa principal

  1. El nodo necesita una clave de IA.
  2. Ambas ramas deben ejecutarse siempre.
  3. La condición consulta el original en vez del campo normalizado.

Evidencia determinante

  1. B tiene asunto con espacios y asunto_limpio vacío, pero entra por true.
  2. La hora del equipo está en UTC.
  3. Cualquier ejecución verde acredita un envío.

Corrección mínima

  1. Usar asunto_limpio en String → is not empty y conservar id en ambas ramas.
  2. Cambiar siempre estado a aprobada.
  3. Eliminar la salida false.

Cómo verificarlo

  1. Comprobar solo A y confiar en el resto.
  2. Ensayar A → revisión y B/C → incompleta; una salida por item, sin envío.
  3. Conectar un correo real para demostrarlo.
Pista 1 de 3

Una cadena con espacios no es una cadena vacía hasta normalizarla.

Pista 2 de 3

La expresión del IF debe leer el campo calculado por el nodo anterior.

Pista 3 de 3

Comprueba las tres entradas y conserva id en cada salida. No concedas autoridad al contenido.

Solución razonada
  1. La condición consulta el original en vez del campo normalizado.
  2. B tiene asunto con espacios y asunto_limpio vacío, pero entra por true.
  3. Usar asunto_limpio en String → is not empty y conservar id en ambas ramas.
  4. Ensayar A → revisión y B/C → incompleta; una salida por item, sin envío.

El IF correcto consulta asunto_limpio: A va a lista_para_revision y B/C a incompleta. Es una decisión de completitud, no una revisión semántica ni autorización de envío. Repite los casos en tu n8n real y compara las salidas.

Repite los retos con n8n real

El diagnóstico anterior utiliza evidencias preparadas. Las siguientes instrucciones se realizan en tu instancia, con datos ficticios. Compara INPUT y OUTPUT y registra lo que observas.

Qué necesitas: Para el playground basta un navegador con JavaScript, sin cuenta. Para repetir la práctica real necesitas una instancia propia de n8n. Puede ser local con Docker siguiendo la documentación oficial o una instancia que ya tengas; no hace falta contratar n8n Cloud para estos nodos. La instalación local requiere Docker, espacio y configurar tú la cuenta de propietario. No publiques el editor ni desactives su autenticación. Datos ficticios; no necesitas comprar el curso ni registrarte en Labs.

Tu resultado: Un flujo Manual Trigger → Edit Fields → Edit Fields → IF con dos salidas y una tabla de tres pruebas que puedas explicar.

1. Crea una solicitud ficticia

Crea un workflow nuevo e inactivo. Añade Manual Trigger y conéctalo a Edit Fields (Set). Usa asignaciones manuales y crea id=S-GRATIS y asunto con espacios alrededor de No imprime. Ejecuta todo el workflow y abre OUTPUT en vista JSON. Un item no es una ejecución: al repetir tendrás una nueva ejecución con otro resultado, no dos solicitudes acumuladas.

Campos de Edit Fields:
id (String): S-GRATIS
asunto (String):   No imprime  
Necesito una pista

Conecta los dos nodos. Escribe los valores como texto literal; todavía no hace falta una expresión.

Ver solución de este reto
Manual Trigger → Edit Fields
Salida esperada: {"id":"S-GRATIS","asunto":"  No imprime  "}

Las llaves muestran un objeto y cada campo tiene un nombre. Ejecutar otra vez no duplica un efecto externo porque todavía no existe ningún envío.

Comprueba: Un item con id y asunto de texto. Conserva la salida observada, no una captura de otra ejecución.

2. Limpia sin perder el original

Añade otro Edit Fields. Crea asunto_limpio como expresión y activa Include Other Input Fields para conservar id y asunto original. La normalización elimina espacios extremos, pero no decide si el asunto es suficiente. Prueba un texto normal, solo espacios y un campo ausente.

={{ String($json.asunto ?? "").trim() }}
Necesito una pista

Activa Expression en el valor. $json es el item actual; trim() no cambia las palabras del interior.

Ver solución de este reto
No imprime → No imprime
   (solo espacios) → texto vacío
Campo ausente → texto vacío

?? cubre null o ausencia. String garantiza texto y trim quita extremos. Esta práctica presupone entradas de texto o ausentes; el curso completo añade validación estricta del tipo para rechazar objetos.

Comprueba: asunto_limpio no tiene espacios extremos y el id sigue presente. No has borrado asunto original.

3. Decide por dos caminos

Añade IF con una condición String sobre asunto_limpio, operación is not empty. En la salida true conecta un Edit Fields que añada estado=lista_para_revision; en false, otro con estado=incompleta. Conserva los campos de entrada en ambos. Ejecuta tres veces con los casos anteriores. Ninguna rama envía correos ni significa que alguien haya resuelto la solicitud.

IF: {{ $json.asunto_limpio }} → String → is not empty
true  → estado = lista_para_revision
false → estado = incompleta
Necesito una pista

Las dos salidas del IF representan condiciones opuestas. Etiqueta ambas para que el resultado sea visible.

Ver solución de este reto
Asunto: No imprime → lista_para_revision
Asunto: espacios → incompleta
Asunto: ausente → incompleta

El valor normalizado decide el camino. No uses asunto original para el IF porque una cadena con espacios puede parecer no vacía. Las dos ramas deben conservar id para poder explicar qué ocurrió.

Comprueba: Una ruta por caso, sin duplicados ni envíos. Puedes justificar por qué una entrada incompleta no sigue.

Tu turno

Cambia id a S-OTRO y el asunto a Necesito mi factura. Predice la rama. Después prueba asunto=null. Registra entrada, asunto_limpio y estado. Exporta el JSON y revisa que no contenga datos fijados personales ni credenciales antes de compartirlo.

Ver solución y explicación
S-OTRO + Necesito mi factura → lista_para_revision
S-OTRO + null → incompleta
Tabla de prueba: entrada | normalización | estado observado

La categoría del tema no importa para esta condición: solo comprueba que haya texto después de normalizar. Esto no es IA ni una revisión semántica. El siguiente paso sería validar el tipo, consultar un servicio y registrar efectos con control de duplicados.

Explícalo con tus palabras

Repite con datos distintos antes de marcarlo como practicado. Esta es una autoevaluación, no una certificación.

Si te atascas: dudas de esta práctica

Detente, lee el mensaje y vuelve al último paso que pudiste comprobar. No necesitas acertar a la primera.

¿Necesito pagar n8n Cloud o una API de IA?

Estos nodos no requieren una API de pago ni IA. Puedes utilizar una instancia local propia. Instalarla requiere Docker y configurar tu cuenta; si eliges un servicio comercial, revisa sus condiciones y coste por separado.

Veo la expresión escrita como texto.

Activa Expression en el valor de Edit Fields. La salida debe contener el texto normalizado, no las llaves de la expresión. Ejecuta todo el flujo de nuevo y revisa OUTPUT.

He perdido el identificador.

Revisa Include Other Input Fields en el nodo de transformación y en las dos salidas. No inventes un identificador nuevo para ocultar la pérdida: vuelve a conservar el original.

Las dos rutas parecen aceptar un asunto con espacios.

Comprueba que IF usa asunto_limpio y que el nodo anterior ejecutó trim. Quita datos fijados si estás reutilizando una salida de otra prueba.

Antes de dar la práctica por terminada

Si aún dudas, repite el paso con datos ficticios nuevos. Puedes guardar la práctica para continuar más tarde.

Para consultar un concepto: Documentación oficial de Edit Fields (Set).

Si quieres continuar

De cero a n8n amplía este flujo con datos, HTTP, paginación, webhooks, horarios, contratos, reintentos y una oficina local de solicitudes. Incluye introducción a propuestas IA con simulación explícita e inferencia local opcional. Este recurso es completo y puedes repetirlo sin comprar.

Ver el curso De cero a n8n y su temario

Fuente: Recurso original de Labs. Puedes guardar este HTML, abrirlo sin conexión o imprimirlo como PDF desde tu navegador. No guarda tus respuestas ni el progreso de tu cuenta.