Profundizamos en n8n, tipos de nodos, buenas …
En el capítulo anterior repasamos qué es la automatización de procesos y por qué herramientas como …
leer másEn artículos anteriores hemos explorado los fundamentos de n8n, desde su configuración inicial hasta los diferentes tipos de nodos y mejores prácticas profesionales. Ahora es momento de dar un paso más allá y trabajar con conceptos intermedios que encontrarás constantemente en automatizaciones del mundo real.
En esta ocasión construiremos un analizador de equipos Pokémon que demuestra patrones esenciales como el procesamiento de múltiples elementos, la transformación de datos complejos provenientes de APIs, y la combinación de información de diferentes fuentes. Aunque el tema es lúdico, los conceptos que aprenderás se aplican directamente a casos de uso empresariales como el enriquecimiento de datos de clientes, análisis de inventarios, o agregación de métricas.
Prueba la aplicación: Puedes experimentar la herramienta final en funcionamiento visitando pokeanalyzer.betazeta.dev antes de construir tu propio workflow.
La mayoría de las APIs modernas no devuelven datos simples y planos. En su lugar, entregan estructuras JSON anidadas con arrays, objetos dentro de objetos, y referencias a otros endpoints. Este es precisamente el escenario que enfrentarás al trabajar con PokéAPI, una API gratuita y bien documentada que proporciona información exhaustiva sobre el universo Pokémon.
Un ejemplo de respuesta de PokéAPI para un Pokémon individual incluye:
  {
    "name": "charizard",
    "stats": [
      { "base_stat": 78, "stat": { "name": "hp" } },
      { "base_stat": 84, "stat": { "name": "attack" } },
      { "base_stat": 78, "stat": { "name": "defense" } }
    ],
    "types": [
      { "type": { "name": "fire" } },
      { "type": { "name": "flying" } }
    ],
    "abilities": [
      { "ability": { "name": "blaze" } }
    ]
  }
   
Este nivel de complejidad requiere técnicas específicas para extraer, transformar y analizar la información útil. Veamos cómo construir un workflow que maneje esto de forma elegante.
Nuestro analizador de equipos Pokémon seguirá esta estructura modular accesible vía webhook:
Esta arquitectura nos permite:
Comenzaremos con dos puntos de entrada: un Webhook para recibir peticiones HTTP desde aplicaciones externas, y un Manual Trigger para pruebas durante el desarrollo. Ambos se conectan al nodo Code (Preparar Input).
Configuración del nodo Webhook:
pokemon-team-analyzerhttps://pokemon-team-analyzer.netlify.app) o “*” para admitir todos los orígenes (sólo para pruebas).Using 'Respond to Webhook' NodeEl webhook espera recibir un JSON con este formato:
  {
    "names": ["charizard", "blastoise", "venusaur", "pikachu", "gengar", "dragonite"]
  }
   
Configuración del nodo Code (Preparar Input):
El código de este nodo extrae el array de nombres del JSON recibido, valida que haya entre 2 y 6 Pokémon, normaliza los nombres (minúsculas, sin espacios), y los convierte al formato de items que n8n espera para la iteración.
📦 Código completo: Tienes el archivo
workflow.jsoncompleto con el código fuente en el repositorio de GitHub
El nodo Loop Over Items (antiguamente Split In Batches en n8n) es clave para workflows intermedios. Nos permite procesar cada elemento de un array de forma secuencial, ejecutando los nodos siguientes una vez por cada item.
Configuración:
loop) ejecuta el procesamiento iterativo, la segunda (done) se activa cuando todos los items han sido procesadosCómo funciona el loop:
Ahora usaremos un nodo HTTP Request para obtener los datos de cada Pokémon desde la API.
Configuración del HTTP Request:
https://pokeapi.co/api/v2/pokemon/{{ $json.pokemon_name }}La expresión {{ $json.pokemon_name }} se reemplazará automáticamente con el nombre de cada Pokémon durante la iteración. Por ejemplo, en la primera vuelta será charizard, en la segunda blastoise, y así sucesivamente.
La respuesta de PokéAPI es extensa (más de 100 líneas de JSON). Necesitamos extraer solo la información relevante en un nodo Code.
Qué hace este nodo:
?., ??) para evitar erroresDespués del Loop, necesitamos agregar todos los Pokémon procesados para analizar el equipo como conjunto. Este nodo Code se conecta a la salida “done” del Loop.
Qué hace este nodo:
safeStat📦 Código completo: Tienes el archivo
workflow.jsoncompleto con el código fuente en el repositorio de GitHub
Usaremos dos nodos finales: Edit Fields (Formatear Salida) para estructurar los datos, y Respond to Webhook para enviar la respuesta HTTP.
Configuración del nodo Edit Fields:
title: Pokémon Team Analysis (tipo: String)team_size: {{ $json.team_size }} (tipo: Number)members: {{ $json.team_members.join(', ') }} (tipo: String)stats: {{ $json.team_stats }} (tipo: String/Object)highlights: {{ $json.highlights }} (tipo: String/Object)type_coverage: {{ $json.type_coverage }} (tipo: String/Object)Configuración del nodo Respond to Webhook:
Este último nodo cierra el ciclo del webhook, enviando automáticamente la respuesta HTTP con el análisis completo en formato JSON. Esto permite que aplicaciones externas (como frontends web, apps móviles, o scripts) consuman directamente el análisis.
Resultado en acción: ¿Quieres ver este workflow funcionando en tiempo real? Prueba la demo práctica en pokeanalyzer.betazeta.dev y analiza tu equipo favorito.
Una vez construido el workflow completo, puedes probarlo de varias formas: mediante el Manual Trigger para desarrollo interno, o a través del webhook con herramientas como curl, Postman o tu propia aplicación web. Para hacer el analizador verdaderamente accesible, vamos a crear una interfaz web completa que consuma el webhook de n8n.
Antes de construir la interfaz, verifica que el webhook funcione correctamente:
  curl -X POST https://tu-n8n-domain.com/webhook/pokemon-team-analyzer \
    -H "Content-Type: application/json" \
    -d '{
      "names": ["charizard", "blastoise", "venusaur", "pikachu", "gengar", "dragonite"]
    }'
   
Ejemplo de respuesta del webhook:
  [
    {
      "title": "Pokémon Team Analysis",
      "team_size": 3,
      "members": "charizard, blastoise, pikachu",
      "stats": "{\"avg_hp\":64,\"avg_attack\":74,\"avg_defense\":73,\"avg_speed\":89,\"avg_total\":461}",
      "highlights": "{\"strongest\":{\"name\":\"charizard\",\"total_stats\":534},\"fastest\":{\"name\":\"charizard\",\"speed\":100}}",
      "type_coverage": "{\"unique_types\":[\"fire\",\"flying\",\"water\",\"electric\"],\"coverage_count\":4,\"total_types\":4}",
      "detailed_members": [
        {
          "name": "charizard",
          "id": 6,
          "height": 17,
          "weight": 905,
          "stats": {
            "hp": 78,
            "attack": 84,
            "defense": 78,
            "special-attack": 109,
            "special-defense": 85,
            "speed": 100
          },
          "total_stats": 534,
          "types": [
            "fire",
            "flying"
          ],
          "abilities": [
            "blaze",
            "solar-power"
          ],
          "sprite": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/6.png",
          "artwork": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/other/official-artwork/6.png",
          "dream_world": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/other/dream-world/6.svg"
        },
        {
          "name": "blastoise",
          "id": 9,
          "height": 16,
          "weight": 855,
          "stats": {
            "hp": 79,
            "attack": 83,
            "defense": 100,
            "special-attack": 85,
            "special-defense": 105,
            "speed": 78
          },
          "total_stats": 530,
          "types": [
            "water"
          ],
          "abilities": [
            "torrent",
            "rain-dish"
          ],
          "sprite": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/9.png",
          "artwork": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/other/official-artwork/9.png",
          "dream_world": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/other/dream-world/9.svg"
        },
        ...
      ]
    }
  ]
   
La interfaz web consume el webhook de n8n mediante una aplicación HTML/JavaScript vanilla con Tailwind CSS. La implementación incluye un formulario de 6 campos para nombres de Pokémon, validación cliente (mínimo 2, máximo 6), y renderizado dinámico de resultados con estadísticas agregadas, cobertura de tipos y cards individuales de cada Pokémon con sus sprites oficiales.
El flujo de comunicación es directo:
  const res = await fetch('https://tu-n8n.com/webhook/pokemon-team-analyzer', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ names: ["charizard", "blastoise", ...] })
  });
   
La respuesta JSON del webhook se procesa para mostrar estadísticas del equipo, badges de colores por tipo (fuego=rojo, agua=azul), sprites animados, y estados de carga con spinners. El diseño es completamente responsivo (mobile, tablet, desktop) y maneja errores CORS y validaciones de forma elegante.
📦 Código completo: Tanto el workflow n8n (
workflow.json) como la aplicación web completaindex.htmlestán disponibles en el repositorio de GitHub con instrucciones detalladas de despliegue.
Este patrón demuestra cómo usar n8n como un backend serverless completo, eliminando la necesidad de crear APIs tradicionales con Express, FastAPI o similar. El frontend estático puede desplegarse en Netlify, Vercel o GitHub Pages, mientras n8n maneja toda la lógica de negocio, validaciones y transformación de datos.
Este workflow demuestra patrones intermedios esenciales que aplicarás constantemente en automatizaciones profesionales:
?., ??) y validaciones para evitar errores en tiempo de ejecuciónExperimenta el ejemplo práctico: ¿Listo para ver estos conceptos en acción? Visita pokeanalyzer.betazeta.dev y descubre cómo el workflow que acabas de aprender analiza equipos Pokémon en tiempo real.
Los mismos principios de webhook → loop → transform → aggregate → respond se pueden aplicar a:
Con estos fundamentos, estás equipado para construir automatizaciones profesionales que manejen datos complejos del mundo real. Los mismos principios de iteración, transformación y agregación se aplican sin importar si trabajas con Pokémon, clientes, productos o cualquier otro tipo de datos.
Happy Coding!
Quizá te puedan interesar
En el capítulo anterior repasamos qué es la automatización de procesos y por qué herramientas como …
leer másEn un mundo donde la eficiencia y la escalabilidad son factores clave para cualquier equipo de …
leer másn8n se ha consolidado como una de las herramientas más poderosas para la creación de flujos de …
leer másDe concepto a realidad