Créditos:
* Solicitado por: Shuberth (mail@shub.sh)
n8n es una potente plataforma de automatización de flujos de trabajo diseñada para conectar diversas aplicaciones y servicios, permitiendo automatizar tareas repetitivas y complejas sin necesidad, en muchos casos, de conocimientos avanzados de programación. Se destaca por ser una herramienta flexible, personalizable y con un fuerte enfoque en la interoperabilidad a través de APIs.
n8n (pronunciado "n-eight-n") se define como una herramienta de automatización de flujos de trabajo extensibles. Permite a los usuarios conectar diferentes aplicaciones y servicios para crear cadenas de acciones automatizadas. Sus características principales incluyen:
Ilustración: n8n como un hub central conectando diversas aplicaciones para la automatización.
Ilustración: Representación visual de un flujo de trabajo básico en n8n: Disparador -> Acción 1 -> Acción 2.
* Nodo (Node): Representa una aplicación, servicio o una función específica dentro de un flujo de trabajo. Cada nodo realiza una tarea concreta (leer datos, enviar un email, actualizar una base de datos, etc.).
* Nodo Disparador (Trigger Node): Inicia la ejecución del flujo de trabajo. Puede ser un evento (ej. nuevo email recibido, formulario enviado), una programación horaria (cron), o una llamada manual (webhook).
* Nodo de Acción (Action Node): Ejecuta una tarea específica utilizando los datos recibidos del nodo anterior. n8n ofrece nodos para cientos de aplicaciones y servicios, así como nodos genéricos para lógica (IF, Switch), manipulación de datos, ejecución de código, llamadas HTTP, etc.
Ilustración: Diferencia conceptual entre un Nodo Disparador y un Nodo de Acción.
* Conexión (Connection): Líneas que unen los nodos, definiendo el flujo de datos y el orden de ejecución de las acciones.
Ilustración: Cómo los datos JSON fluyen y se transforman a través de los nodos en n8n.
* Credenciales (Credentials): Permiten a n8n autenticarse de forma segura con las diferentes aplicaciones y servicios utilizados en los flujos de trabajo.
Ilustración: n8n utilizando credenciales seguras para conectar con diversos servicios externos.
* Integraciones: n8n soporta oficialmente cientos de integraciones con aplicaciones populares (Google Sheets, Slack, Discord, OpenAI, bases de datos SQL, CRM, ERP, etc.) y su comunidad contribuye constantemente con nuevas integraciones.
n8n es extremadamente versátil y se puede utilizar para:
Ilustración: Concepto de n8n sincronizando datos entre una base de datos, una hoja de cálculo y una aplicación en la nube.
* Notificaciones: Enviar alertas personalizadas a través de Slack, Discord, Email, SMS, etc., basadas en eventos específicos.
* Automatización del Hogar (Smart Home): Integrar y controlar dispositivos inteligentes.
Esta visión general sienta las bases para comprender el potencial de n8n. Las siguientes secciones del manual profundizarán en sus nodos, funcionalidades y ejemplos prácticos.
Esta sección ofrece una visión general y concisa de n8n, ideal para entender rápidamente qué es, qué puede hacer y cómo empezar.
n8n es una plataforma de automatización de flujos de trabajo extensible y de código abierto (con opciones de autoalojamiento o en la nube). Permite conectar cientos de aplicaciones y servicios (más de 1047 integraciones confirmadas) para automatizar tareas repetitivas y complejas mediante una interfaz visual basada en nodos, aunque también permite código personalizado para mayor flexibilidad. Sus ventajas clave incluyen el control sobre los datos (especialmente si se autoaloja), una gran personalización y un coste potencialmente inferior a alternativas como Zapier o Make, de las que se diferencia principalmente por su naturaleza open-source y su capacidad para manejar flujos más complejos.
n8n organiza sus nodos en categorías. Algunos nodos y funcionalidades esenciales incluyen:
Webhook: Inicia el flujo al recibir una petición HTTP.Cron: Inicia el flujo en intervalos de tiempo programados.Gmail Trigger, Google Sheets Trigger) Inician flujos basados en eventos de esas apps.HTTP Request: Realiza llamadas a cualquier API REST.Google Sheets: Lee, añade y actualiza filas en hojas de cálculo.Slack/Discord/Telegram: Envía mensajes y notificaciones.OpenAI/AI Agent: Integra capacidades de IA generativa y agentes.MySQL/Postgres/MongoDB: Interactúa con bases de datos.IF/Switch: Dirige el flujo basado en condiciones.Set: Define o modifica datos dentro del flujo.Code (antes Function/Function Item): Ejecuta código JavaScript o Python personalizado.Merge: Combina datos de diferentes ramas del flujo.
Ilustración: Comparativa visual entre n8n Cloud (gestionado, fácil configuración) y n8n Autoalojado (control total, personalizable).
n8n Cloud (opción gestionada de pago) o Autoalojar n8n usando Docker (recomendado) o npm en tu propio servidor (gratuito, requiere gestión de infraestructura).Manual para empezar).Send Email o Slack).Test step) y actívalo (Activate).Este resumen cubre lo esencial. Para una comprensión profunda, ejemplos detallados, configuración avanzada, casos de uso complejos y dominio de todas las funcionalidades:
Bienvenido a la guía detallada de n8n. Esta sección profundiza en cada aspecto de la plataforma, desde sus fundamentos arquitectónicos hasta casos de uso avanzados y desarrollo personalizado. A diferencia del resumen rápido, aquí exploraremos cada concepto con ejemplos prácticos, explicaciones paso a paso y consideraciones importantes para que puedas dominar n8n y aplicarlo eficazmente en tus propios proyectos de automatización.
Para utilizar n8n de manera efectiva y solucionar problemas complejos, es crucial comprender su arquitectura subyacente y los conceptos fundamentales que rigen su funcionamiento. Este capítulo sienta las bases para todo lo que sigue.
n8n, aunque presenta una interfaz de usuario intuitiva, se compone de varios elementos que trabajan conjuntamente. Comprender estos componentes es especialmente importante si optas por autoalojar n8n.
Esta arquitectura modular permite a n8n ser flexible, desde una configuración simple en una sola máquina hasta despliegues escalables y de alta disponibilidad en entornos empresariales.
Un flujo de trabajo es la representación visual de tu proceso automatizado. Es una secuencia de nodos conectados que definen las tareas a realizar y el flujo de datos entre ellas.
Supr o Backspace, o usa el menú contextual (clic derecho).Ctrl+S / Cmd+S.Active toggle en la esquina superior derecha) para que se ejecute automáticamente (ej. con disparadores Cron o Webhook). Los flujos inactivos solo pueden ejecutarse manualmente.Los nodos son los bloques de construcción fundamentales de cualquier flujo de trabajo en n8n.
Cron (basado en tiempo), Webhook (llamada HTTP externa), Google Sheets Trigger (cambio en una hoja), Manual Trigger (inicio manual). Solo puede haber un disparador activo por flujo.Cron y Webhook, nodos de lógica como IF y Switch, nodos de manipulación de datos como Set y Code, y nodos de comunicación genéricos como HTTP Request.Gmail, HubSpot, MySQL). Requieren configuración de credenciales.Spreadsheet, Sheet, Row) y luego por "Operación" (ej. para Row: Append, Get, Update, Delete). Debes seleccionar la combinación adecuada para tu tarea.Spreadsheet ID, Sheet Name y los Columns con sus valores. Estos parámetros a menudo se pueden rellenar con datos estáticos, datos de nodos anteriores (usando expresiones) o una combinación.Continue On Fail), cómo renombrar campos de salida, etc. Es crucial revisar estas opciones.</> o fx junto a un campo para abrir el editor de expresiones.Las conexiones entre nodos no solo definen el orden de ejecución, sino también cómo fluyen los datos.
Merge) como su entrada. Los datos se estructuran generalmente como un array de objetos JSON.json: Un objeto que contiene los datos principales del ítem (ej. los valores de una fila de Google Sheets, los detalles de un email).binary: (Opcional) Un objeto que contiene datos binarios asociados al ítem (ej. el contenido de un archivo descargado). n8n maneja la referencia a estos datos binarios.Test step). Haz clic en el nodo y mira las pestañas Input y Output en el panel de resultados. Esto es fundamental para el debugging y para entender cómo construir expresiones.{{ $json.nombre_del_campo }} para acceder a un campo del objeto json del ítem actual, o {{ $node["Nombre del Nodo"].json.nombre_del_campo }} para acceder a datos de un nodo específico anterior.$now (fecha y hora actual), $workflow (información sobre el flujo), $execution (información sobre la ejecución actual)..toUpperCase(), .split()), métodos de array (.map(), .filter()), operadores matemáticos, lógica condicional (operador ternario cond ? val1 : val2), etc.Execute Once). El nodo Merge es crucial para combinar datos de diferentes ramas o para controlar cómo se agrupan los ítems.Las credenciales almacenan de forma segura la información necesaria para que n8n se autentique con servicios de terceros.
N8N_ENCRYPTION_KEY). Esta clave se genera automáticamente la primera vez que se inicia n8n (o puede ser definida manualmente a través de variables de entorno). Es absolutamente crucial hacer una copia de seguridad de esta clave. Sin ella, no podrás descifrar las credenciales si necesitas restaurar la base de datos o migrar la instancia.N8N_ENCRYPTION_KEY en el archivo de configuración por defecto, es más seguro definirla como una variable de entorno, especialmente en despliegues con Docker o Kubernetes.Una ejecución representa una única instancia de un flujo de trabajo que se ha disparado y ha corrido (o está corriendo).
Test step: Mientras diseñas, puedes ejecutar un nodo individualmente haciendo clic en "Test step". Esto ejecuta solo ese nodo (y los anteriores si es necesario para obtener datos de entrada) y te muestra inmediatamente la salida. Es la forma más rápida de verificar la configuración de un nodo.Test workflow): Ejecuta todo el flujo desde el disparador (si es un disparador manual o uno que se pueda simular). Te permite ver el flujo completo de datos y cómo interactúan los nodos.Input y Output para cada nodo en una ejecución pasada o de prueba es la herramienta de debugging más potente de n8n.NoOp: El nodo "No Operation, do nothing" puede ser útil para colocar puntos de interrupción visuales o para terminar ramas lógicas sin errores.N8N_LOG_LEVEL=debug) para obtener más información durante la resolución de problemas.Comprender estos fundamentos te permitirá no solo construir flujos de trabajo, sino también entender por qué funcionan (o no funcionan) y cómo optimizarlos y escalarlos eficazmente.
Ahora que comprendemos los fundamentos de n8n, el siguiente paso es ponerlo en marcha. Este capítulo cubre las diferentes formas de instalar y configurar n8n, desde la opción más sencilla en la nube hasta el autoalojamiento avanzado, junto con la configuración inicial esencial.
n8n ofrece flexibilidad en cómo puedes ejecutarlo:
Si eliges autoalojar, tienes varias opciones:
~/n8n-data).docker-compose.yml: Crea un archivo docker-compose.yml en un directorio de tu elección con un contenido similar a este (consulta la documentación oficial para la versión más reciente y opciones avanzadas):version: '3.7'
services:
n8n:
image: n8nio/n8n
restart: always
ports:
- "5678:5678"
environment:
# Variables de entorno esenciales y opcionales (ver sección de configuración)
- N8N_HOST=${SUBDOMAIN}.${DOMAIN_NAME}
- N8N_PORT=5678
- N8N_PROTOCOL=https
- NODE_ENV=production
- WEBHOOK_URL=https://${SUBDOMAIN}.${DOMAIN_NAME}/
- GENERIC_TIMEZONE=${GENERIC_TIMEZONE} # Ej: Europe/Berlin
# - N8N_ENCRYPTION_KEY=tu_clave_secreta_muy_larga # ¡Importante para producción!
volumes:
- ~/.n8n:/home/node/.n8n # Monta el volumen para persistencia
# Opcional: Red específica si usas proxy inverso
# networks:
# - n8n-network
# Opcional: Definición de red
# networks:
# n8n-network:
# external: true
SUBDOMAIN, DOMAIN_NAME, GENERIC_TIMEZONE) ya sea exportándolas en tu terminal, usando un archivo .env en el mismo directorio del docker-compose.yml, o reemplazándolas directamente en el archivo.docker-compose up -d en el directorio donde está tu docker-compose.yml.http://localhost:5678 (o la URL configurada si usas un proxy inverso).
Ilustración: Concepto general de la instalación de n8n usando Docker.
* Persistencia: El volume - ~/.n8n:/home/node/.n8n es crucial. Mapea el directorio .n8n dentro del contenedor (donde n8n guarda sus datos) a un directorio en tu máquina host (~/.n8n en este ejemplo). Esto asegura que tus flujos de trabajo y credenciales persistan incluso si el contenedor se detiene y se reinicia.
* Actualizaciones: Para actualizar, generalmente ejecutas docker-compose pull n8n y luego docker-compose up -d.
* npm:
* Descripción: Instalar n8n directamente usando el gestor de paquetes de Node.js.
* Ventajas: Puede ser más simple si ya tienes Node.js y npm configurados y no quieres usar Docker.
* Desventajas: Gestionar las dependencias de Node.js puede ser más complejo, menos aislamiento que Docker, las actualizaciones pueden requerir más pasos manuales.
* Requisitos: Tener Node.js (versión LTS recomendada) y npm instalados.
* Proceso:
1. Instalar n8n globalmente: npm install n8n -g
2. Iniciar n8n: Simplemente ejecuta n8n en tu terminal.
3. Persistencia: Por defecto, n8n creará un directorio .n8n en tu directorio home (~/.n8n) para almacenar los datos.
* n8n AI Starter Kit (Docker):
* Descripción: Un paquete preconfigurado por n8n que utiliza Docker Compose para desplegar n8n junto con otras herramientas útiles para casos de uso de IA, como un LLM local (Ollama) y una base de datos vectorial (Qdrant).
* Ventajas: Configuración rápida para experimentar con las capacidades de IA de n8n sin depender completamente de APIs externas.
* Proceso: Clona el repositorio de GitHub (git clone https://github.com/n8n-io/self-hosted-ai-starter-kit.git), sigue las instrucciones del README.md para configurar las variables de entorno (en .env) y ejecuta docker compose up -d.
* Kubernetes (Avanzado):
* Descripción: Para despliegues a gran escala, de alta disponibilidad y con orquestación avanzada, puedes desplegar n8n en un clúster de Kubernetes usando Helm Charts proporcionados por la comunidad o configuraciones personalizadas.
* Ventajas: Máxima escalabilidad, resiliencia, gestión centralizada.
* Desventajas: Requiere experiencia significativa con Kubernetes.
Independientemente del método de instalación (especialmente para autoalojamiento), hay varias variables de entorno y configuraciones importantes:
N8N_HOST: El nombre de host con el que se accederá a n8n (ej. n8n.midominio.com). Crucial para que los webhooks y redirecciones OAuth funcionen correctamente.N8N_PORT: El puerto en el que n8n escucha (por defecto 5678).N8N_PROTOCOL: El protocolo utilizado para acceder a n8n (http o https - usa https en producción).NODE_ENV: Establecer en production para optimizaciones y seguridad.WEBHOOK_URL: La URL base pública para los webhooks (ej. https://n8n.midominio.com/). Debe coincidir con cómo se accede a n8n desde el exterior.GENERIC_TIMEZONE: La zona horaria en la que operará tu instancia de n8n (ej. America/New_York, Europe/Paris). Importante para la programación de Cron y el manejo de fechas.N8N_ENCRYPTION_KEY (¡MUY IMPORTANTE!):
config dentro del volumen .n8n.DB_TYPE=postgresdb (o mysqldb)DB_POSTGRESDB_HOST=tu_host_dbDB_POSTGRESDB_PORT=5432DB_POSTGRESDB_DATABASE=n8nDB_POSTGRESDB_USER=n8n_userDB_POSTGRESDB_PASSWORD=tu_contraseña_dbQUEUE_BULL_ENABLE=trueQUEUE_BULL_REDIS_HOST=tu_host_redisQUEUE_BULL_REDIS_PORT=6379QUEUE_BULL_REDIS_PASSWORD=tu_contraseña_redis (si aplica)5678, es una práctica estándar usar un proxy inverso (como Nginx, Caddy, Traefik).https://n8n.midominio.com) al host y puerto donde se ejecuta n8n (ej. http://localhost:5678). Asegúrate de que las variables N8N_HOST, N8N_PROTOCOL y WEBHOOK_URL en la configuración de n8n reflejen la URL pública.N8N_BASIC_AUTH_ACTIVE, N8N_BASIC_AUTH_USER, N8N_BASIC_AUTH_PASSWORD y la gestión de usuarios más avanzada.Una vez instalado y configurado n8n:
Manual y un nodo Respond to Webhook. Ejecútalo manualmente para asegurarte de que el núcleo funciona.Webhook. Copia la URL de prueba y envíale una solicitud (usando curl o una herramienta como Postman). Verifica que la ejecución se registre en n8n.List Spreadsheets).Cron y un nodo Code que devuelva {{ $now.toISO() }}. Ejecútalo y verifica que la hora refleje la zona horaria que configuraste.Superar estos pasos confirma que tu instancia de n8n está correctamente instalada, configurada y lista para empezar a automatizar.
La interfaz de usuario de n8n es donde pasarás la mayor parte del tiempo diseñando, probando y gestionando tus flujos de trabajo. Aunque es intuitiva, conocer a fondo sus componentes y funcionalidades te permitirá trabajar de manera más eficiente.
Al iniciar sesión en tu instancia de n8n (Cloud o autoalojada), lo primero que verás es el dashboard principal. Este actúa como tu centro de control.
Ilustración: Vista general del Editor UI de n8n, mostrando el lienzo, paneles y barras principales.
Esta es el área principal donde construyes tus automatizaciones.
Lienzo (Canvas):
Ilustración: El lienzo (Canvas) es el área principal para construir el flujo de trabajo.
El espacio central donde arrastras, conectas y organizas los nodos. Puedes hacer zoom (rueda del ratón o trackpad) y paneo (arrastrar con el botón central del ratón o mantener presionada la barra espaciadora y arrastrar).
Panel de Nodos:
Ilustración: El panel de nodos, donde puedes buscar y seleccionar nodos para añadir al flujo.
Situado a la derecha (por defecto, puede minimizarse). Contiene:
Test step) o un flujo completo (Test workflow). Muestra los datos de entrada (Input), salida (Output) y errores (Error) del nodo seleccionado. Es esencial para el debugging.
Barra Superior del Editor:
Ilustración: Detalle de la barra superior del editor.
Test workflow / Execute workflow: Inicia una ejecución manual del flujo completo.Active / Inactive: Controla si el flujo se ejecutará automáticamente según su disparador....): Acceso a acciones como guardar manualmente, descargar el flujo (como JSON), ver ejecuciones pasadas, duplicar, eliminar.Shift y haz clic para seleccionar múltiples nodos.Supr/Backspace, o haz clic derecho y elige "Delete".Test step), desactivar/activar o eliminar.
Ilustración: Detalle del panel lateral izquierdo, mostrando acceso a Flujos, Credenciales, Ejecuciones, Plantillas y Configuración.
Accesible desde el menú lateral izquierdo.
Accesible desde el menú lateral izquierdo.
Accesible desde el menú lateral izquierdo.
Accesible desde el menú lateral izquierdo. Las opciones disponibles pueden variar dependiendo de si usas n8n Cloud o una instancia autoalojada, y si eres administrador.
Dominar la navegación y el uso eficiente de estos paneles y herramientas en la interfaz de usuario es clave para construir y mantener tus automatizaciones en n8n de forma productiva.
Cuando comienzas a construir flujos de trabajo en n8n, notarás que al añadir un nuevo nodo, la interfaz te presenta varias categorías principales para ayudarte a encontrar lo que necesitas. Estas categorías agrupan los nodos según su función general. Comprender estas categorías te facilitará la navegación y la selección de las herramientas adecuadas para tus automatizaciones. Basándonos en la interfaz común y la documentación, exploremos estas categorías principales (anteriormente Capítulo 3, renumerado para coherencia):
Webhook, Google Sheets Trigger, Slack Trigger, GitHub Trigger, Notion Trigger). Estos nodos suelen requerir configuración en la aplicación externa para enviar notificaciones (webhooks) a n8n.Cron para ejecuciones diarias, horarias, etc.).Execute Workflow Trigger para llamar a un sub-flujo, Form Trigger para formularios embebidos, Webhook para llamadas API directas).Google Sheets (leer/escribir filas), Slack (enviar mensaje), Postgres (ejecutar consulta SQL), HTTP Request (interactuar con cualquier API REST), OpenAI (generar texto/imagen), HubSpot (gestionar contactos).IF: Divide el flujo en dos ramas (true/false) basándose en una condición.Switch: Divide el flujo en múltiples ramas basándose en el valor de una expresión (similar a un if/else if/else).Merge: Combina ítems de diferentes ramas de entrada en una sola salida. Tiene varios modos (Append, Combine, Wait, Pass-through) para diferentes escenarios de fusión.Execute Workflow: Llama a otro flujo de trabajo (sub-flujo), pasando datos y recibiendo resultados. Útil para modularizar y reutilizar lógica.Loop Over Items (anteriormente implícito o con SplitInBatches + Merge): Aunque la iteración es a menudo implícita, nodos específicos o combinaciones permiten controlar bucles de forma más explícita o procesar ítems uno por uno si es necesario.Wait: Pausa la ejecución del flujo durante un tiempo determinado o hasta una hora específica.IF), procesar pedidos de diferentes regiones por separado (Switch), recopilar resultados de búsquedas paralelas (Merge), ejecutar una rutina de limpieza reutilizable (Execute Workflow).Set: Añade, modifica o elimina campos en los ítems de datos. Permite usar expresiones para calcular nuevos valores.Edit Fields: Una interfaz más visual para renombrar, eliminar, convertir tipos de datos o establecer valores fijos para los campos.Item Lists: Realiza operaciones sobre listas de ítems, como sumar valores, dividir, ordenar, filtrar, agrupar.Code: Permite escribir código JavaScript o Python personalizado para realizar transformaciones complejas que no son fáciles con otros nodos.Spreadsheet File: Lee o escribe datos desde/hacia archivos de hoja de cálculo (Excel, ODS) locales.Filter: Permite pasar solo los ítems que cumplen ciertas condiciones, descartando los demás.Remove Duplicates: Elimina ítems duplicados basándose en campos específicos.HTTP Request: Uno de los nodos más versátiles. Permite realizar llamadas a cualquier API REST (GET, POST, PUT, DELETE, etc.), incluso si no existe un nodo de integración específico.Webhook: Actúa como un disparador esperando llamadas HTTP entrantes, pero también puede usarse como un nodo de acción para enviar datos a otra URL (aunque HTTP Request es más común para esto).Code: (También listado en Transformación) Permite ejecutar código JS/Python.Execute Command: Ejecuta comandos de shell en el servidor donde corre n8n (si está permitido).Start: El nodo inicial por defecto en cualquier flujo nuevo, aunque generalmente se reemplaza por un disparador específico.Static Data: Almacena datos estáticos (JSON) que pueden ser referenciados en otras partes del flujo, útil para configuraciones.No Operation, do nothing: Un nodo vacío que no hace nada, útil como placeholder o para terminar ramas de IF/Switch.n8n Trigger: Dispara un flujo cuando la instancia de n8n se inicia/reinicia o un flujo se activa/actualiza.OpenAI, Anthropic, Google Gemini, Hugging Face Inference.Pinecone, Qdrant, Weaviate, etc., usados para almacenar y buscar embeddings (representaciones numéricas de texto/datos) para búsqueda semántica o RAG (Retrieval-Augmented Generation).Summarization, Text Classification, Embeddings Generation.Langchain Agent o el AI Agent nativo de n8n. Estos nodos permiten a un LLM usar otras herramientas (otros nodos de n8n, como HTTP Request, Google Search, etc.) para realizar tareas complejas. El agente recibe un objetivo, planifica los pasos, utiliza las herramientas disponibles y genera una respuesta final.AI Agent) se conecta a sub-nodos que definen el LLM, las herramientas, la memoria, etc.Wait for Webhook (usado en patrones HITL): Puede esperar una llamada externa que indique la aprobación o el rechazo.Comprender estas categorías te da una visión estructurada de las capacidades de n8n y te ayuda a pensar en cómo combinar diferentes tipos de nodos para construir las automatizaciones que necesitas.
Los Nodos Principales (Core Nodes) son la columna vertebral de la mayoría de los flujos de trabajo en n8n. A diferencia de los nodos de integración, no se conectan a un servicio externo específico (con la excepción notable del HTTP Request), sino que proporcionan funcionalidades esenciales para iniciar flujos, controlar la lógica, manipular datos y gestionar el flujo de ejecución. Dominar estos nodos es crucial para construir automatizaciones robustas y flexibles.
Los disparadores inician la ejecución de un flujo de trabajo.
Manual / Start:
Test workflow / Execute workflow).Cron:
Every Minute/Hour/Day/Week/Month/Year: Modos predefinidos fáciles de configurar.Custom: Permite definir una expresión CRON estándar para programaciones complejas (ej. 0 9 * * 1-5 para ejecutar de lunes a viernes a las 9:00 AM).Webhook:
None, Header Auth, Basic Auth (para proteger el webhook).GET, POST, PUT, DELETE, PATCH.my-custom-webhook). La URL completa será https://tu-n8n-url/webhook/tu-path (para producción) o https://tu-n8n-url/webhook-test/tu-path (para pruebas).On Received: Responde inmediatamente a la solicitud HTTP (útil para webhooks que no esperan una respuesta compleja).Using 'Respond to Webhook' node: Permite construir una respuesta personalizada más adelante en el flujo usando el nodo Respond to Webhook.$json.headers: Cabeceras de la solicitud.$json.params: Parámetros de la ruta (si se definen en el path, ej. /webhook/:id).$json.query: Parámetros de la URL (query string).$json.body: Cuerpo de la solicitud (para POST, PUT, PATCH).Error Trigger:
$json.execution) y el error ($json.error).Estos nodos dirigen el camino que toman los datos a través del flujo.
IF:
{{ $json.status }}) con valores estáticos u otros valores dinámicos usando varios operadores (Equal, Not Equal, Contains, Greater Than, Regex, etc.).ALL (todas las condiciones deben ser verdaderas) o ANY (al menos una condición debe ser verdadera).true, los que no, a la salida false.
Ilustración: Funcionamiento conceptual del nodo IF, dividiendo el flujo basado en una condición Verdadera o Falsa.
* Switch:
* Propósito: Divide el flujo en múltiples ramas basándose en el valor de un campo específico.
* Configuración:
* Field to Route By: La expresión que define el valor a evaluar (ej. {{ $json.priority }}).
* Routing Rules: Define reglas donde cada regla especifica un valor y una salida correspondiente. Si el campo coincide con el valor de una regla, el ítem se dirige a esa salida.
* Fallback Output: Una salida para los ítems que no coinciden con ninguna regla.
* Salida: Múltiples puntos de salida (0, 1, 2,... y Fallback).
* Caso de Uso: Manejar diferentes tipos de eventos o estados con acciones específicas para cada uno (ej. dirigir un ticket a diferentes equipos según su categoría), más eficiente que múltiples nodos IF anidados para el mismo campo.
* Merge:
* Propósito: Combina datos de diferentes ramas del flujo o controla cómo se agrupan los ítems.
* Configuración:
* Mode:
* Append: Simplemente concatena los ítems de todas las entradas en un solo array de salida.
* Pass-through: Espera a que lleguen datos de todas las entradas conectadas, pero solo pasa los datos de una entrada específica (definida por Source Input).
* Combine: Intenta emparejar ítems de diferentes entradas basándose en una clave (Key) y combina sus datos. Modos de combinación: Merge By Key (combina objetos JSON), Keep Key Matches (solo pasa ítems cuya clave existe en todas las entradas), Remove Key Matches (solo pasa ítems cuya clave NO existe en otras entradas).
* Wait for: All inputs (espera a que todas las ramas conectadas terminen) o Any input (procesa tan pronto como llega un ítem).
* Caso de Uso: Reunir resultados después de un IF o Switch, combinar datos enriquecidos desde diferentes fuentes, sincronizar ramas paralelas.
Ilustración: Funcionamiento conceptual del nodo Merge, combinando múltiples entradas en una salida única.
* Wait:
* Propósito: Pausa la ejecución del flujo durante un tiempo determinado o hasta una hora específica.
* Configuración: Define la duración (segundos, minutos, horas) o la hora exacta y la zona horaria.
* Caso de Uso: Esperar a que un sistema externo procese algo, introducir retrasos deliberados, esperar hasta un momento específico para continuar (ej. enviar un informe solo después de las 8 AM).
* No Operation, do nothing (NoOp):
* Propósito: Un nodo que no realiza ninguna acción. Es sorprendentemente útil.
* Configuración: Ninguna.
* Caso de Uso: Como marcador de posición, para terminar explícitamente una rama de un IF donde no se necesita acción, para organizar visualmente el flujo, como punto de entrada para un Merge.
* Execute Workflow:
* Propósito: Llama y ejecuta otro flujo de trabajo (sub-flujo) dentro del flujo actual.
* Configuración: Selecciona el flujo de trabajo a ejecutar. Los datos del nodo actual se pasan como entrada al disparador Start del sub-flujo.
* Salida: Los datos producidos por el nodo final del sub-flujo.
* Caso de Uso: Reutilizar lógica común en múltiples flujos, dividir flujos muy grandes en partes más manejables.
Ilustración: Funcionamiento conceptual del nodo Execute Workflow, mostrando un flujo principal que llama a un sub-flujo.
* Execute Command:
* Propósito: Ejecuta un comando de shell en el servidor donde se ejecuta n8n.
* Configuración: El comando a ejecutar.
* Salida: La salida estándar (stdout) y el error estándar (stderr) del comando.
* Caso de Uso: Interactuar con scripts locales, ejecutar herramientas de línea de comandos. ¡Usar con extrema precaución! Permite ejecutar cualquier comando, lo que puede ser un riesgo de seguridad significativo si el flujo puede ser disparado o influenciado por entradas externas.
Estos nodos permiten modificar, crear o reestructurar los datos que fluyen.
Set:
Append (añadir/sobrescribir campos) o Define (reemplazar completamente el objeto json del ítem).Code (anteriormente Function y Function Item):
items. Debes devolver un array de objetos con la estructura esperada por n8n (ej. [{ json: { nuevoCampo: item.json.campoExistente.toUpperCase() } }]).Edit Fields:
Set para realizar operaciones comunes en los campos de los ítems.Rename Fields, Set Field Values, Keep Fields, Delete Fields, Duplicate Fields, Change Field Type.Spreadsheet File:
Read from file o Write to file.data si viene de un nodo como HTTP Request o Read Binary File).HTTP Request:
None, Header Auth, Basic Auth, OAuth1, OAuth2, Digest Auth (o usa credenciales predefinidas).GET, POST, PUT, DELETE, PATCH, HEAD, OPTIONS.Query Parameters, Headers, Body (JSON, Form-Data, Raw, Binary).json o binary), las cabeceras de respuesta (headers), y el código de estado (statusCode).Estos nodos trabajan con datos binarios (archivos).
Read Binary File:
data) que contiene el contenido del archivo.Write Binary File:
Move Binary Data:
json y binary de un ítem.json antes de guardar un archivo binario.Dominar los Nodos Principales te proporciona las herramientas fundamentales para estructurar tus flujos, controlar su lógica, manipular datos de diversas formas e interactuar con el mundo exterior a través de HTTP. Son la base sobre la cual se construyen las integraciones más específicas.
n8n brilla por su vasta biblioteca de integraciones con cientos de servicios y aplicaciones. Si bien los Nodos Principales proporcionan la estructura y la lógica, los Nodos de Integración son los que conectan tus flujos de trabajo con las herramientas que usas a diario. Este capítulo explora algunos de los nodos de integración más populares y versátiles, mostrando cómo configurarlos y utilizarlos en escenarios comunes.
Recuerda que casi todos los nodos de integración requerirán Credenciales. El proceso de creación de credenciales se cubrió en el Capítulo 1, pero cada servicio tendrá sus particularidades (API Keys, OAuth2, etc.).
Google Sheets:
Spreadsheet, Sheet, Row.Row -> Append: Añadir una o más filas al final de una hoja. Necesitas especificar el ID de la hoja de cálculo, el nombre de la hoja y los datos de las columnas (generalmente como un objeto JSON donde las claves son los nombres de las cabeceras).Row -> Get: Leer filas de una hoja. Puedes especificar un rango, obtener todas las filas, o filtrar basándote en valores de columnas.Row -> Update: Modificar filas existentes. Necesitas una forma de identificar la fila a actualizar (ej. número de fila o un valor de clave única) y los nuevos datos.Row -> Delete: Eliminar filas basándose en su número de fila o contenido.Sheet -> Get All: Obtener información sobre todas las hojas dentro de una hoja de cálculo.Spreadsheet ID: El ID largo en la URL de tu Google Sheet.Sheet Name: El nombre exacto de la hoja (pestaña).Range: (Opcional) Especifica un rango como A1:C10.Options -> Raw: Devuelve los valores sin formato (útil para fechas/números).Options -> Value Render Mode: Cómo se deben interpretar los valores (Formateado, Sin formato, Fórmula).Airtable:
Record, Table.Record -> Create, Record -> Get Many, Record -> Update, Record -> Delete.Base ID, Table ID/Name, mapeo de campos.Slack:
Message, File, User, Channel.Message -> Post: Enviar un mensaje a un canal, usuario o grupo. Puedes usar formato de bloque (Block Kit) para mensajes enriquecidos.File -> Upload: Subir un archivo a un canal.User -> Get By Email: Encontrar un usuario de Slack por su email para enviarle mensajes directos.Channel/User ID or Name, Text (contenido del mensaje), Blocks (para Block Kit JSON).Email (Send) / SMTP:
Send Email.From, To, Subject, Body (HTML o Texto), Attachments (usando la propiedad binaria de ítems anteriores).Email (Read) / IMAP:
Get Messages.Folder (ej. INBOX), Criteria (para filtrar correos por remitente, asunto, no leídos, etc.), Fetch (qué partes del correo obtener: cuerpo, adjuntos).json y adjuntos en binary.Telegram:
Message, Document, Photo, etc.Message -> Send Text, Document -> Send, Photo -> Send.Chat ID (del usuario o grupo al que enviar), Text o referencia a datos binarios.n8n soporta las bases de datos SQL más comunes.
Postgres, MySQL, Microsoft SQL Server, SQLite.Execute Query: Permite escribir y ejecutar cualquier consulta SQL.Insert, Select, Update, Delete (varían ligeramente entre tipos de DB).$1, $2 en Postgres; ? en MySQL/MSSQL) y la sección Parameters para pasar valores dinámicos de forma segura y evitar inyecciones SQL. No insertes valores directamente en la cadena de la consulta usando expresiones {{ }}.
INSERT INTO users (name, email) VALUES ($1, $2) con Parámetros {{ $json.userName }}, {{ $json.userEmail }}.Table, Columns, Filters.n8n tiene integraciones potentes con modelos y plataformas de IA.
OpenAI:
Chat, Completions (legacy), Images, Embeddings.Chat -> Create: Enviar un prompt (y opcionalmente historial de conversación) a modelos como GPT-4/3.5 para obtener respuestas generativas.Images -> Create: Generar imágenes con DALL-E a partir de una descripción textual.Embeddings -> Create: Generar representaciones vectoriales (embeddings) de texto para búsqueda semántica o RAG.Model, Messages (para Chat, incluyendo roles system, user, assistant), Prompt (para Completions/Images), Options (temperatura, max tokens, etc.).Hugging Face Inference:
Text Generation, Summarization, Translation, Image Classification, Sentence Similarity, etc. (depende del modelo elegido).Model ID (del repositorio de Hugging Face), Inputs (el texto o datos a procesar).Langchain Agent:
LLM Node (referencia a un nodo LLM configurado, ej. OpenAI), Tools (referencia a otros nodos de n8n que el agente puede usar, ej. HTTP Request, Google Search), Prompt (instrucciones para el agente).Qdrant, Pinecone, Weaviate):
Upsert (insertar/actualizar vectores), Search (buscar vectores similares a un vector de consulta).Collection Name, Vectors (los embeddings a insertar), Query Vector (el embedding a buscar), Limit (cuántos resultados devolver).HubSpot:
Contact, Company, Deal, Ticket, Engagement, etc.Contact -> Create or Update, Contact -> Get All, Deal -> Create, Engagement -> Create (registrar emails, llamadas).Salesforce:
Account, Contact, Lead, Opportunity, Campaign, Custom Object, etc.Create Record, Get Records, Update Record, Delete Record, Search Records (SOQL).Object Type, mapeo de campos, SOQL Query (para búsquedas avanzadas).Google Drive:
Download File, Upload File, List Files/Folders, Create Folder, Move File/Folder.Trello:
Create Card, Get Cards, Update Card, Move Card, Add Comment.GitHub:
Create Issue, Get Repository Events, List Commits, Create Pull Request Comment.Esta es solo una pequeña muestra de las cientos de integraciones disponibles. La clave es buscar el servicio que necesitas en el panel de nodos, explorar sus recursos y operaciones, configurar las credenciales y luego usar los Nodos Principales (como IF, Set, Code) para adaptar los datos y la lógica a tus necesidades específicas.
La teoría y el conocimiento de los nodos individuales son importantes, pero la verdadera comprensión de n8n proviene de ver cómo se combinan para resolver problemas del mundo real. Este capítulo presenta varios casos de uso prácticos, guiándote paso a paso a través de la construcción de los flujos de trabajo correspondientes. Estos ejemplos están diseñados para ilustrar diferentes conceptos y combinaciones de nodos.
Nota: Para seguir estos ejemplos, necesitarás tener acceso a una instancia de n8n (Cloud o autoalojada) y, para algunos ejemplos, credenciales para los servicios específicos involucrados (ej. Google Sheets, Slack, OpenAI).
Objetivo: Capturar datos enviados desde un formulario web simple, guardar cada envío como una nueva fila en una hoja de Google Sheets y enviar una notificación a un canal de Slack.
Conceptos Clave: Webhook Trigger, Google Sheets (Append Row), Slack (Post Message), Mapeo de Datos.
Pasos:
Timestamp, Nombre, Email, Mensaje).Webhook (Trigger):
None por ahora (para producción, considera añadir seguridad).POST.Options, establece Response Mode a On Received (enviaremos una respuesta simple).curl o Postman para enviar una solicitud POST a la URL de prueba del webhook. El cuerpo debe ser JSON con los datos del formulario:curl -X POST -H "Content-Type: application/json" \
-d '{"nombre": "Juan Perez", "email": "juan.perez@example.com", "mensaje": "Consulta sobre el producto X"}' \
TU_URL_WEBHOOK_PRUEBA
Output -> Body).Set (Opcional pero recomendado):
Webhook al Set.Append.timestamp{{ $now.toISO() }}Test step para verificar que el campo timestamp se añade.Google Sheets:
Set al Google Sheets.Row.Append.Map Automatically (si los nombres en el JSON coinciden exactamente con las cabeceras) o Map Manually.Timestamp, Value: {{ $json.timestamp }}Nombre, Value: {{ $json.nombre }}Email, Value: {{ $json.email }}Mensaje, Value: {{ $json.mensaje }}Test step. Verifica que una nueva fila se añada a tu Google Sheet.Slack:
Google Sheets al Slack.Message.Post.Nuevo envío de formulario:
*Nombre:* {{ $json.nombre }}
*Email:* {{ $json.email }}
*Mensaje:* {{ $json.mensaje }}
Test step. Verifica que el mensaje aparezca en Slack.Inactive para ponerlo en Active.Webhook.Resultado: Cada vez que se envíe el formulario web, los datos se guardarán en Google Sheets y recibirás una notificación en Slack.
Ilustración: Un ejemplo visual de un flujo de trabajo construido en n8n, mostrando la conexión entre diferentes nodos.
Objetivo: Leer las últimas entradas de varios feeds RSS, combinarlas, obtener un resumen de IA para cada una, y enviar un único correo electrónico diario con todos los resúmenes.
Conceptos Clave: Cron Trigger, RSS Read, Merge, OpenAI (Chat), Loop (implícito), Set, Email.
Pasos:
Cron (Trigger):
Every Day.RSS Feed Read (uno por cada feed):
Cron a cada nodo RSS Feed Read.Test step para cada uno para verificar que obtienes las entradas.Merge:
RSS Feed Read a este nodo Merge.Append.All inputs.Test step (puede requerir ejecutar los nodos RSS primero). Deberías ver una lista combinada de todas las entradas de los feeds.OpenAI:
Merge al OpenAI.Chat.Create.gpt-3.5-turbo).UserPor favor, resume el siguiente artículo en 1-2 frases:
Título: {{ $json.title }}
Contenido: {{ $json.contentSnippet || $json.description || $json.content || "No content available" }}
|| para intentar obtener el contenido de diferentes campos comunes en feeds RSS).Test step. Verifica que obtienes un resumen en la salida ($json.choices[0].message.content).Set (para formatear):
OpenAI al Set.Append.formattedSummary## {{ $node["RSS Feed Read"].json.title }}
{{ $json.choices[0].message.content }}
[Link]({{ $node["RSS Feed Read"].json.link }})
---
$node["Nombre del Nodo RSS"].json.title. Ajusta el nombre del nodo si es diferente. También accedemos al resumen de OpenAI con $json.choices[0].message.content).Test step.Merge (para agregar):
Set a este Merge.Combine.Merge By Index (o Append si solo necesitas la lista).Input 1.formattedSummary.
(nueva línea).Specified Properties.aggregatedData (o el nombre que le dé por defecto).Set produce un solo ítem por ejecución (ajustando opciones en OpenAI/Set): Podrías usar un nodo Code después del Set para iterar sobre items y construir el cuerpo del email.Email (Send):
Merge (o el nodo Code alternativo) al Email.Resumen de Noticias Diario - {{ $now.toFormat('yyyy-MM-dd') }}{{ $json.aggregatedData }}). Asegúrate de marcar la opción HTML si tu texto formateado usa Markdown que quieres renderizar (puede requerir un paso adicional para convertir Markdown a HTML si tu cliente de correo no lo hace).Test step.Cron trigger funcione.Resultado: Recibirás un correo electrónico diario con los resúmenes de las últimas noticias de tus feeds RSS seleccionados.
Objetivo: Recibir detalles de un nuevo pedido a través de un webhook (simulando una tienda online), guardar el pedido en una base de datos PostgreSQL y notificar al equipo de ventas en Slack.
Conceptos Clave: Webhook, PostgreSQL (Execute Query), Placeholders SQL, IF, Slack.
Pasos:
CREATE TABLE orders (
order_id VARCHAR(255) PRIMARY KEY,
customer_email VARCHAR(255),
product_name VARCHAR(255),
quantity INT,
total_amount NUMERIC(10, 2),
order_timestamp TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP
);
Webhook (Trigger):
curl -X POST -H "Content-Type: application/json" \
-d '{"orderId": "ORD12345", "customerEmail": "cliente@example.com", "product": "Widget Pro", "qty": 2, "total": 99.98}' \
TU_URL_WEBHOOK_PRUEBA
Postgres:
Webhook al Postgres.Execute Query.INSERT INTO orders (order_id, customer_email, product_name, quantity, total_amount)
VALUES ($1, $2, $3, $4, $5)
ON CONFLICT (order_id) DO NOTHING; -- Opcional: Evita errores si el ID ya existe
{{ $json.body.orderId }}{{ $json.body.customerEmail }}{{ $json.body.product }}{{ $json.body.qty }}{{ $json.body.total }}ON CONFLICT).Test step. Verifica que los datos se inserten en la tabla orders.IF (Manejo de Error DB):
Postgres al IF.{{ $node["Postgres"].error === undefined }}Boolean -> Is Truetrue significa que la base de datos funcionó, la salida false significa que falló.Slack (Notificación de Éxito):
true del IF a este nodo Slack.Nuevo pedido recibido y guardado:
ID: {{ $node["Webhook"].json.body.orderId }}
Cliente: {{ $node["Webhook"].json.body.customerEmail }}
Producto: {{ $node["Webhook"].json.body.product }} ({{ $node["Webhook"].json.body.qty }})
Total: ${{ $node["Webhook"].json.body.total }}
Test step (asegúrate de que el IF evalúe a true).Slack (Notificación de Error DB):
false del IF a este nodo Slack.¡ERROR al guardar pedido en DB!
ID Pedido: {{ $node["Webhook"].json.body.orderId }}
Error: {{ $node["Postgres"].error.message || "Error desconocido" }}
orderId que ya exista (si no usaste ON CONFLICT) o detener temporalmente tu base de datos.Resultado: Los nuevos pedidos se registran en la base de datos y se envía una notificación a Slack, con un manejo básico de errores si falla la inserción en la base de datos.
Estos ejemplos muestran cómo combinar diferentes nodos para crear automatizaciones útiles. La clave es descomponer el problema, elegir los nodos adecuados para cada paso, configurar sus parámetros usando expresiones para pasar datos dinámicamente y manejar posibles errores.
Una vez que dominas los fundamentos y has construido algunos flujos de trabajo, puedes empezar a explorar técnicas más avanzadas para crear automatizaciones más potentes, robustas y eficientes. Este capítulo cubre estrategias para manejar escenarios complejos, optimizar el rendimiento y seguir las mejores prácticas para mantener tus flujos de trabajo.
A veces necesitas repetir un conjunto de acciones para cada ítem en una lista o hasta que se cumpla una condición. n8n no tiene un nodo de "Loop" explícito como algunas otras herramientas, pero la iteración se maneja de forma inherente o se puede construir.
Merge en ciertos modos) se ejecutan una vez por cada ítem que reciben como entrada. Si un nodo recibe un array de 10 ítems, el siguiente nodo se ejecutará 10 veces, una para cada ítem.OpenAI para resumir el contenido de cada fila; el nodo OpenAI se ejecutará 10 veces automáticamente.Do-While o Until (con IF y Merge):
HTTP Request para la página 1).IF (Condición de Salida): Comprueba si hay más datos por obtener (ej. si la respuesta de la API indica que hay una página siguiente, o si el número de resultados obtenidos es menor que el total esperado).True (Continuar Bucle):
Set para incrementar el número de página o usar la URL de la página siguiente proporcionada por la API).Merge (Modo Wait for Any Input): Conecta la salida de la rama True del IF de vuelta a la entrada del nodo que obtiene los datos (Paso 1). Esto crea el ciclo.False (Salir del Bucle): Conecta a los nodos que deben ejecutarse después de que el bucle haya terminado.IF) eventualmente se vuelva falsa. Considera añadir un contador de iteraciones y una condición adicional en el IF para salir después de un número máximo de iteraciones como medida de seguridad.
Ilustración: Diagrama conceptual de un bucle Do-While simulado con nodos IF y Merge.d.
* Nodo Split In Batches:
* Propósito: Divide una gran cantidad de ítems de entrada en lotes más pequeños. Aunque no es un bucle en sí mismo, es crucial para manejar la iteración implícita cuando se trabaja con APIs que tienen límites de tasa o de tamaño de payload.
* Configuración: Batch Size (cuántos ítems por lote).
* Salida: Se ejecuta una vez por cada lote, y cada ejecución produce un ítem que contiene un array (items) con los ítems de ese lote.
* Caso de Uso: Si necesitas insertar 1000 filas en una base de datos pero la API o el nodo de DB es más eficiente con lotes de 100, usa Split In Batches con tamaño 100. El nodo de la base de datos se ejecutará 10 veces, cada vez procesando un lote de 100 ítems (puede requerir un nodo Code o configuración específica en el nodo de DB para manejar el array items).
Más allá de Continue On Fail, puedes implementar patrones más sofisticados.
Do-While:
Set (Inicializar contador de reintentos, ej. retryCount = 0).Merge (Punto de entrada/reintento).HTTP Request). Activa Continue On Fail.IF (Comprobar éxito): Verifica si el nodo de operación falló ($node["HTTP Request"].error !== undefined).False (Éxito): Continuar con el flujo normal.True (Fallo):
IF (Comprobar límite de reintentos): Verifica si retryCount es menor que el máximo (ej. {{ $json.retryCount < 3 }}).True (Reintentar):
Wait: Espera un tiempo (ej. {{ Math.pow(2, $json.retryCount) * 1000 }} ms para retraso exponencial).Set: Incrementa retryCount ({{ $json.retryCount + 1 }}).Merge (Paso 2).False (Límite alcanzado): Manejar el error final (ej. notificar, terminar).
Ilustración: Diagrama conceptual del patrón de reintentos con retraso exponencial.
* Transacciones (Simuladas):
* Propósito: Asegurar que una serie de operaciones (ej. actualizar DB y luego llamar a una API) se completen todas o ninguna.
* Implementación: n8n no tiene soporte transaccional incorporado que abarque múltiples nodos. La implementación depende de las capacidades de los sistemas involucrados.
* Compensación: Si un paso falla después de que otros tuvieron éxito, ejecuta acciones de "compensación" para deshacer los pasos anteriores (ej. si la llamada API falla después de actualizar la DB, ejecuta una consulta SQL para revertir la actualización). Esto puede ser complejo.
* Idempotencia: Diseña tus operaciones para que puedan ejecutarse múltiples veces sin efectos secundarios negativos. Si un flujo falla a la mitad y se reintenta, las operaciones idempotentes aseguran que el resultado final sea correcto.
Ilustración: Diagrama conceptual del uso de un Error Trigger para manejar fallos en otros flujos de trabajo.
data, thumbnail, attachment1). Los nodos Read Binary File, HTTP Request, Move Binary Data te permiten gestionar esto.binary (ej. $binary.data.fileName, $binary.data.mimeType). Usa expresiones para acceder a ellos.CodeEl nodo Code es tu navaja suiza para lógica compleja.
Set o Edit Fields.IF.items de entrada.require).items es un array de objetos de ítem de n8n. Accede a los datos JSON con items[i].json.nombreCampo o itera con for (const item of items) { ... item.json ... }.[{ json: { tus_nuevos_datos } }]. Si quieres pasar datos binarios, asegúrate de incluirlos: [{ json: {...}, binary: item.binary }].try...catch dentro de tu código para manejar errores potenciales y devolver información útil.require con precaución. Asegúrate de que las librerías estén permitidas por el administrador (NODE_FUNCTION_ALLOW_EXTERNAL) y considera el impacto en el rendimiento.Code o si un nodo personalizado sería más apropiado.Flujos lentos pueden ser frustrantes y costosos.
Executions. Nodos que tardan mucho son los candidatos principales.HTTP Request (esperando respuestas de API), Code (código ineficiente), nodos que procesan grandes cantidades de datos, Wait.Static Data o una DB externa) si solicitas los mismos datos repetidamente.Merge (modo Append o Wait Any), pero ten cuidado con la gestión de datos y los límites de recursos.Code: Revisa tu código JS/Python en busca de bucles ineficientes, operaciones costosas o uso excesivo de memoria.Split In Batches: Para nodos que procesan muchos ítems y llaman a APIs, procesar en lotes puede ser más rápido (menos sobrecarga por llamada) y evita límites de tasa.IF o Filter para descartar ítems innecesarios lo antes posible en el flujo, para que los nodos posteriores no pierdan tiempo procesándolos.Execute Workflow.N8N_ENCRYPTION_KEY en producción. Revisa periódicamente y rota las credenciales de API cuando sea necesario.Workflow Menu -> Download). Puedes almacenar estos JSON en un repositorio Git para llevar un historial de cambios.Test step extensivamente durante el desarrollo.Test workflow) con diferentes escenarios de datos (incluyendo casos límite y erróneos).Executions en busca de errores. Configura flujos de Error Trigger para notificaciones proactivas.Static Data o la función de Variables globales (si está disponible) para almacenar valores de configuración (ej. IDs, URLs base) que se usan en múltiples lugares, en lugar de codificarlos directamente en cada nodo.Adoptar estas técnicas y prácticas te ayudará a pasar de crear automatizaciones simples a construir sistemas de flujo de trabajo sofisticados, mantenibles y fiables con n8n.
Si bien n8n ofrece cientos de integraciones, puede haber ocasiones en las que necesites conectarte a un servicio interno, una API específica no soportada, o implementar una lógica muy particular que no se ajusta bien a los nodos existentes. Aquí es donde entra en juego el desarrollo de nodos personalizados. Crear tus propios nodos te permite extender n8n para que se ajuste perfectamente a tus necesidades.
Este capítulo proporciona una introducción al desarrollo de nodos personalizados, cubriendo los conceptos básicos, la estructura y el proceso general. Ten en cuenta que el desarrollo de nodos requiere conocimientos de programación, específicamente TypeScript (que es un superconjunto de JavaScript), Node.js y npm.
Code o una combinación de nodos existentes.Code.HTTP Request.npm install n8n -g.La forma recomendada de empezar es usando el paquete de inicio oficial:
git clone https://github.com/n8n-io/n8n-node-starter.git tu-nombre-de-nodo
cd tu-nombre-de-nodo
npm install
npm run build
npm link
# En el directorio donde está instalado n8n globalmente (o en tu proyecto n8n si no es global):
npm link n8n-nodes-tu-nombre-de-nodo # Usa el nombre definido en tu package.json
n8n en tu terminal. Ahora deberías poder encontrar tu nodo de ejemplo en el panel de nodos dentro de n8n.El repositorio de inicio (n8n-node-starter) proporciona una estructura básica. Los archivos clave son:
package.json: Define las dependencias, scripts (build, dev, lint) y, crucialmente, la sección n8n. Esta sección le dice a n8n dónde encontrar los archivos de nodo y credenciales.{
"name": "n8n-nodes-tu-nombre-de-nodo",
"version": "0.1.0",
// ... otras propiedades ...
"n8n": {
"n8nNodesApiVersion": 1,
"credentials": [
"dist/credentials/MyCredential.credentials.js"
],
"nodes": [
"dist/nodes/MyNode/MyNode.node.js"
]
},
// ... dependencias y scripts ...
}
nodes/ Directorio: Contiene el código fuente de tus nodos.
MyNode/MyNode.node.ts: El archivo principal que define la lógica y la interfaz de tu nodo (el nombre MyNode debe ser reemplazado por el tuyo).MyNode/MyNode.node.json: (Opcional, para estilo declarativo) Define la estructura y llamadas API de forma declarativa.MyNode/description.ts: (Opcional, para estilo programático) Define las propiedades y la descripción del nodo.credentials/ Directorio: Contiene la definición de los tipos de credenciales que tu nodo podría necesitar.
MyCredential.credentials.ts: Define los campos y la lógica de autenticación para un tipo de credencial (ej. API Key, OAuth2).tsconfig.json: Configuración del compilador TypeScript..eslintrc.js, .prettierrc.js: Configuraciones para el linter y formateador de código.
Ilustración: Diagrama simplificado de la estructura de archivos y directorios para un nodo personalizado.
n8n ofrece dos enfoques principales:
.node.json. n8n genera gran parte del código de interacción con la API automáticamente..node.ts, incluyendo las llamadas API (usando this.helpers.httpRequest), manipulación de datos y definición de la interfaz de usuario.La documentación de n8n proporciona tutoriales detallados para ambos estilos.
El archivo .node.ts es el corazón de un nodo programático.
import { IExecuteFunctions } from 'n8n-core';
import {
INodeExecutionData,
INodeType,
INodeTypeDescription,
NodeOperationError,
} from 'n8n-workflow';
export class MyNode implements INodeType {
description: INodeTypeDescription = {
displayName: 'My Custom Node',
name: 'myNode', // Nombre interno, debe ser único
icon: 'file:myNode.svg', // Icono SVG en el mismo directorio
group: ['transform'], // Categoría en el panel de nodos
version: 1,
description: 'Descripción breve de lo que hace el nodo',
defaults: {
name: 'My Node', // Nombre por defecto en el lienzo
},
inputs: ['main'], // Espera una entrada
outputs: ['main'], // Produce una salida
credentials: [
// Referencia a la clase de credencial si es necesaria
// { name: 'myCredentialApi', required: true }
],
properties: [
// Aquí se definen los campos de la UI del nodo
{
displayName: 'Operation',
name: 'operation',
type: 'options',
noDataExpression: true,
options: [
{
name: 'Say Hello',
value: 'sayHello',
action: 'Say hello action',
},
],
default: 'sayHello',
},
// Ejemplo de campo de texto
{
displayName: 'Name',
name: 'name',
type: 'string',
default: '',
placeholder: 'Enter a name',
description: 'The name to say hello to',
displayOptions: {
show: {
operation: ['sayHello'], // Mostrar solo si la operación es 'sayHello'
},
},
},
],
};
// Método principal que ejecuta la lógica del nodo
async execute(this: IExecuteFunctions): Promise<INodeExecutionData[][]> {
const items = this.getInputData(); // Obtener datos de entrada
let item: INodeExecutionData;
const returnData: INodeExecutionData[] = [];
const operation = this.getNodeParameter('operation', 0, '') as string;
for (let itemIndex = 0; itemIndex < items.length; itemIndex++) {
try {
item = items[itemIndex];
if (operation === 'sayHello') {
const name = this.getNodeParameter('name', itemIndex, '') as string;
// Lógica del nodo: hacer algo con 'name' y los datos de 'item.json'
// Ejemplo: Llamar a una API
/*
const options: OptionsWithUri = {
method: 'GET',
uri: `https://api.example.com/greet?name=${name}`,
json: true,
};
const responseData = await this.helpers.httpRequest(options);
*/
const responseData = { message: `Hello, ${name || 'World'}!` };
// Añadir resultado a los datos de retorno
returnData.push({ json: responseData, pairedItem: itemIndex });
}
} catch (error) {
// Manejo de errores
if (this.continueOnFail()) {
returnData.push({ json: { error: error.message }, pairedItem: itemIndex });
}
else {
if (error.context) error.context.itemIndex = itemIndex;
throw error;
}
}
}
return [this.helpers.returnJsonArray(returnData)];
}
}
description: Define metadatos y la interfaz de usuario.
displayName, name, icon, group, version, description: Metadatos básicos.inputs, outputs: Define cuántas conexiones de entrada/salida tiene el nodo.credentials: Especifica qué tipos de credenciales puede usar el nodo.properties: Un array que define cada campo visible en el panel de parámetros del nodo (tipo, nombre, opciones, condiciones de visualización, etc.).execute(): La función principal que se ejecuta.
this.getInputData(): Obtiene los ítems de entrada.this.getNodeParameter('nombreParametro', indiceItem, valorPorDefecto): Obtiene el valor de un parámetro configurado en la UI para el ítem actual.this.getCredentials('nombreCredencial'): Obtiene las credenciales configuradas.this.helpers.httpRequest(): Realiza llamadas HTTP (muy versátil).this.helpers.returnJsonArray(): Formatea los datos de salida correctamente.for: Itera sobre los ítems de entrada (manejo de la iteración implícita).try...catch: Esencial para manejar errores durante la ejecución de un ítem.this.continueOnFail(): Comprueba si el usuario activó la opción "Continue on Fail" para decidir si lanzar el error o devolverlo como parte de los datos..credentials.ts)import { ICredentialType, INodeProperties } from 'n8n-workflow';
export class MyCredential implements ICredentialType {
name = 'myCredentialApi'; // Nombre interno, debe coincidir con el usado en el nodo
displayName = 'My Service API';
documentationUrl = 'https://docs.example.com/api'; // Enlace a la documentación de la API
properties: INodeProperties[] = [
{
displayName: 'API Key',
name: 'apiKey',
type: 'string',
typeOptions: { password: true }, // Oculta el valor en la UI
default: '',
},
{
displayName: 'API Endpoint',
name: 'endpoint',
type: 'string',
default: 'https://api.example.com',
},
];
// Opcional: Lógica de prueba de credencial
/*
async test(this: ICredentialTestFunctions): Promise<boolean> {
try {
await this.helpers.httpRequest({
method: 'GET',
url: this.credentials.endpoint + '/ping',
headers: { 'X-Api-Key': this.credentials.apiKey as string },
});
return true;
} catch (error) {
throw new NodeApiError(this.getNode(), error);
}
}
*/
}
properties).test (opcional) permite a los usuarios verificar si las credenciales son válidas desde la UI de n8n..ts), ejecuta npm run build para compilar a JavaScript (.js) en el directorio dist/.npm run dev. Esto vigilará los cambios en tus archivos .ts, los compilará automáticamente y reiniciará n8n si es necesario, acelerando el ciclo de desarrollo.Test step para ejecutarlo y verifica la salida en el panel de resultados.console.log() en tu código .node.ts; la salida aparecerá en la terminal donde estás ejecutando n8n.El starter kit viene configurado con ESLint y Prettier.
npm run lint: Verifica si hay problemas de estilo o errores potenciales.npm run format: Formatea automáticamente el código según las reglas de Prettier.Es importante ejecutar estos comandos antes de considerar compartir tu nodo.
npm publish). Otros usuarios pueden instalarlo en sus instancias de n8n (si la configuración lo permite).dist/) o usando npm link o instalándolo desde una ruta local/git.El desarrollo de nodos personalizados abre un mundo de posibilidades para adaptar n8n a cualquier flujo de trabajo imaginable. Aunque requiere esfuerzo de desarrollo, la capacidad de crear integraciones a medida es una de las características más potentes de n8n.
n8n se destaca por su amplia capacidad de integración con una vasta gama de aplicaciones y servicios. En el momento de la elaboración de este manual, la plataforma cuenta con más de 1000 integraciones oficiales y comunitarias, permitiendo conectar flujos de trabajo con prácticamente cualquier herramienta que utilices.
Ilustración: Visualización del vasto ecosistema de integraciones de n8n conectando diversas aplicaciones y servicios.
Dada la constante expansión y actualización de estas integraciones, mantener una lista exhaustiva y detallada dentro de este manual resulta impráctico. Sin embargo, podemos destacar las principales categorías bajo las cuales se agrupan estas integraciones en la documentación oficial:
Explora la Lista Completa:
Para explorar la lista completa, actualizada y searchable de todas las integraciones disponibles en n8n, te recomendamos visitar directamente la página oficial de integraciones:
Allí podrás buscar por nombre, categoría o palabra clave para encontrar exactamente las herramientas que necesitas conectar.
(Fin del Manual)