Crea tu primer workflow en n8n: webhooks, llamadas API y notificaciones

15 min de lectura·Matthieu|

Construye dos workflows reales en n8n desde cero en tu instancia autoalojada. Un webhook que obtiene datos meteorológicos y los envía a Discord, y un monitor RSS que publica nuevos artículos en un canal.

Tienes n8n funcionando en tu VPS. ¿Y ahora qué?

En este tutorial vas a construir dos workflows reales. No son ejemplos de juguete que devuelven datos a ningún sitio. Son automatizaciones que vas a mantener en producción:

  1. Webhook meteorológico: recibir una petición HTTP, llamar a la API meteorológica de wttr.in, formatear la respuesta y enviarla a un canal de Discord.
  2. Monitor RSS: comprobar un feed RSS de un blog de forma periódica y publicar los artículos nuevos en Discord.

Ambos workflows cubren los conceptos fundamentales de n8n durante la construcción: nodes, conexiones, expresiones, el sistema draft/publish de n8n 2.0 y el manejo de errores.

Requisitos previos:

  • Una instancia de n8n funcionando en tu VPS. Si todavía no tienes una, sigue primero Instalar n8n con Docker Compose en un VPS.
  • Un servidor de Discord donde puedas crear un webhook (o un workspace de Slack. Las instrucciones son intercambiables; aquí usamos Discord).
  • Soltura básica con el terminal y curl.

¿Qué son los nodes y las conexiones en n8n?

Los nodes son los pasos individuales de un workflow. Cada node hace una sola cosa: recibir un trigger, hacer una petición HTTP, transformar datos o enviar un mensaje. Las conexiones son las líneas entre los nodes. Pasan datos de la salida de un node a la entrada del siguiente. Cada workflow es una cadena de nodes conectados de izquierda a derecha.

Los tipos de node utilizados en este tutorial:

Node Función
Webhook Escucha peticiones HTTP entrantes e inicia el workflow
HTTP Request Llama a una API externa y devuelve la respuesta
Set Crea o reestructura campos de datos
If Bifurca el workflow según una condición
Discord Envía un mensaje a un canal de Discord mediante webhook
RSS Feed Trigger Consulta un feed RSS y se activa cuando aparecen nuevos elementos
Error Trigger Captura los fallos del workflow y ejecuta un workflow de notificación

¿Cómo construyes tu primer workflow en n8n?

Abre tu instancia de n8n en el navegador. Haz clic en Add workflow en la página Workflows. n8n te coloca en un canvas vacío con un placeholder de node trigger.

Este primer workflow hace lo siguiente: recibir un nombre de ciudad a través de un webhook HTTP, obtener el tiempo actual de wttr.in, formatear el resultado y publicarlo en un canal de Discord.

Paso 1: Crear un webhook de Discord

Antes de construir en n8n, necesitas un lugar donde enviar las notificaciones.

  1. Abre tu servidor de Discord. Haz clic derecho en el canal donde quieres recibir las actualizaciones meteorológicas.
  2. Selecciona Editar canal > Integraciones > Webhooks.
  3. Haz clic en Nuevo webhook. Dale un nombre como n8n Weather Bot.
  4. Haz clic en Copiar URL del webhook. Guarda esta URL. Tiene este aspecto: https://discord.com/api/webhooks/123456789/abcDEF...

Trata esta URL como una contraseña. Cualquiera que la tenga puede publicar en tu canal.

Paso 2: Añadir el node trigger Webhook

Haz clic en el botón + del placeholder del canvas. Busca Webhook y selecciónalo.

Configura el webhook:

  • HTTP Method: POST
  • Path: weather

Deja todo lo demás con los valores por defecto. El path hace que tu URL de webhook sea única. Con el path definido como weather, tus URLs de webhook serán:

  • URL de prueba: https://tu-dominio-n8n.com/webhook-test/weather
  • URL de producción: https://tu-dominio-n8n.com/webhook/weather

Fíjate en la diferencia: /webhook-test/ vs /webhook/. Esta distinción importa. Más sobre esto en un momento.

Paso 3: Probar el webhook con curl

Haz clic en Listen for test event en el node webhook. n8n ahora espera una petición entrante en la URL de prueba.

Abre un terminal en tu máquina local y envía una petición de prueba:

curl -X POST https://your-n8n-domain.com/webhook-test/weather \
  -H "Content-Type: application/json" \
  -d '{"city": "Paris"}'

Vuelve a n8n. El node webhook debería mostrar una marca verde con los datos recibidos. Verás el cuerpo JSON con city: "Paris" en el panel de salida.

Si no ocurre nada, comprueba que:

  • Tu instancia de n8n es accesible desde internet (el reverse proxy está configurado).
  • Has hecho clic en Listen for test event antes de enviar la petición curl.
  • La URL coincide exactamente, incluyendo el prefijo /webhook-test/.

Paso 4: Añadir el node HTTP Request (llamar a la API meteorológica)

Haz clic en el botón + a la derecha del node Webhook. Busca HTTP Request y añádelo.

Configúralo:

  • Method: GET
  • URL: https://wttr.in/{{ $json.city }}?format=j1

La parte {{ $json.city }} es una expresión n8n. Extrae el campo city de los datos entrantes del webhook. Cuando alguien envía {"city": "Paris"}, n8n sustituye la expresión por Paris, resultando en la URL final https://wttr.in/Paris?format=j1.

El parámetro ?format=j1 le dice a wttr.in que devuelva JSON estructurado en lugar del informe meteorológico en arte ASCII.

Haz clic en Test step para ejecutar solo este node. Deberías ver una respuesta JSON con datos meteorológicos que incluyen campos como current_condition, temp_C, weatherDesc y otros.

Fíjate bien: mira el panel de salida. La respuesta está anidada. La temperatura actual está en $json.current_condition[0].temp_C y la descripción en $json.current_condition[0].weatherDesc[0].value. Necesitarás estas rutas en el siguiente paso.

Paso 5: Añadir un node Set para formatear el mensaje

La respuesta bruta de la API meteorológica es grande. Solo necesitas unos pocos campos para el mensaje de Discord.

Añade un node Set después del node HTTP Request. Haz clic en Add field y crea esta asignación:

Nombre del campo Tipo Valor (expresión)
message String Weather in {{ $('Webhook').item.json.city }}: {{ $json.current_condition[0].temp_C }}°C, {{ $json.current_condition[0].weatherDesc[0].value }}. Humidity: {{ $json.current_condition[0].humidity }}%. Wind: {{ $json.current_condition[0].windspeedKmph }} km/h.

La expresión {{ $('Webhook').item.json.city }} accede a la salida del node Webhook para obtener el nombre de la ciudad. Las referencias $json sin nombre de node toman datos del node inmediatamente anterior (HTTP Request).

Haz clic en Test step. La salida debería mostrar un único campo message con algo como:

Weather in Paris: 14°C, Partly cloudy. Humidity: 72%. Wind: 15 km/h.

Paso 6: Añadir el node Discord

Añade un node Discord después del node Set.

  1. Establece Connection Type en Webhook.
  2. En Credential for Discord, haz clic en Create New Credential.
  3. Pega la URL de tu webhook de Discord del paso 1 en el campo Webhook URL. Haz clic en Save.
  4. Establece Operation en Send a Message.
  5. En el campo Message, usa la expresión: {{ $json.message }}

Haz clic en Test step. Comprueba tu canal de Discord. Deberías ver el mensaje meteorológico publicado por tu bot.

Verificación: abre Discord. El mensaje debería aparecer en el canal para el que configuraste el webhook. Si no aparece, revisa la URL del webhook en la configuración del credential.

Paso 7: Probar el workflow completo

Vuelve al node Webhook. Haz clic de nuevo en Listen for test event. Envía otra petición curl:

curl -X POST https://your-n8n-domain.com/webhook-test/weather \
  -H "Content-Type: application/json" \
  -d '{"city": "Tokyo"}'

Observa la ejecución fluir a través de los cuatro nodes. Cada node se pone verde cuando termina. Un informe meteorológico de Tokyo debería aparecer en tu canal de Discord.

Consulta la pestaña Executions en la barra lateral izquierda. Verás una entrada de log para esta ejecución de prueba con el tiempo, estado y los datos en cada node. Este log de ejecución es donde depuras los problemas.

¿Cómo recibe datos externos el node webhook de n8n?

El node Webhook crea un endpoint HTTP en tu instancia de n8n. Cuando un servicio externo (o un comando curl) envía una petición a ese endpoint, n8n recibe los datos e inicia el workflow. El node soporta los métodos GET, POST, PUT, PATCH, DELETE y HEAD. POST con cuerpo JSON es el patrón más común.

¿Cómo pruebas un webhook de n8n con curl?

Ya lo hiciste más arriba. Esto es lo que importa:

URL de prueba URL de producción
Formato de ruta /webhook-test/<path> /webhook/<path>
Cuándo está activa Solo mientras tienes "Listen for test event" o "Execute workflow" abierto en el editor Solo después de publicar el workflow
Muestra datos en el editor Sí, en directo en el panel de salida del node No (consulta la pestaña Executions)
Caso de uso Construcción y depuración Integraciones externas reales

Durante el desarrollo, usa siempre la URL de prueba. Te permite ver los datos fluyendo a través de cada node en tiempo real. La URL de producción solo funciona después de publicar el workflow.

¿Cuál es la diferencia entre workflows en borrador y publicados en n8n 2.0?

n8n 2.0 separó el guardado de la activación. Tus ediciones permanecen en borrador y no afectan a la versión live hasta que publicas explícitamente. Desde n8n 2.4 (enero de 2026), el editor guarda automáticamente tu trabajo cada pocos segundos. Ya no hay botón de guardado manual.

Esta es la secuencia:

  1. Construyes y pruebas tu workflow usando la URL de prueba. n8n guarda automáticamente sobre la marcha.
  2. Tus cambios solo existen en borrador. La versión live (si existe) sigue ejecutándose sin cambios.
  3. Haces clic en Publish. La URL de producción está activa y el workflow se ejecuta automáticamente cuando se activa.
  4. Si editas el workflow más tarde, tus cambios permanecen en borrador hasta que publiques de nuevo.

En n8n 1.x, guardar y activar eran la misma acción. Ya no lo son.

Publica tu workflow meteorológico ahora. Haz clic en el botón Publish arriba a la derecha (o pulsa Shift+P). El estado del workflow cambia a "Active".

Verifica con curl usando la URL de producción esta vez:

curl -X POST https://your-n8n-domain.com/webhook/weather \
  -H "Content-Type: application/json" \
  -d '{"city": "Berlin"}'

Comprueba Discord. El informe meteorológico de Berlín debería aparecer. Después consulta la pestaña Executions en n8n para ver la ejecución de producción registrada.

¿Cómo manejas los errores en un workflow de n8n?

El node Error Trigger captura los fallos del workflow y ejecuta un workflow de notificación separado. Cuando un workflow activo falla (por ejemplo, la API meteorológica no responde o Discord rechaza el mensaje), n8n activa el Error Trigger en el workflow de error vinculado. Esto solo funciona para ejecuciones publicadas y activadas automáticamente. Las ejecuciones de prueba manuales no lo activan.

Construir un workflow de notificación de errores

  1. Vuelve a la página Workflows. Haz clic en Add workflow. Nómbralo Error Handler.
  2. Añade un node Error Trigger como trigger. Este node recibe automáticamente los datos de error cuando un workflow vinculado falla.
  3. Añade un node Discord después del Error Trigger.
  4. Configúralo con el mismo credential de webhook de Discord que creaste antes.
  5. Establece el mensaje en:
⚠️ Workflow failed: {{ $json.workflow.name }}
Error: {{ $json.execution.error.message }}
Execution ID: {{ $json.execution.id }}
  1. El workflow de error se activa automáticamente porque contiene un node Error Trigger. No necesitas publicarlo por separado.

Vincular el workflow de error a tu workflow meteorológico

  1. Abre tu workflow Weather Webhook.
  2. Haz clic en el menú de tres puntos (⋮) arriba a la derecha y luego en Settings.
  3. En Error Workflow, selecciona el workflow Error Handler que acabas de crear.
  4. Haz clic en Publish para aplicar el cambio.

Ahora, si la API meteorológica se cae o cualquier node de tu workflow produce un error durante una ejecución de producción, recibirás una notificación en Discord con el nombre del workflow, el mensaje de error y el ID de ejecución. Puedes usar ese ID para encontrar la ejecución fallida en la pestaña Executions e inspeccionar exactamente qué salió mal.

Este es un patrón que deberías reutilizar en cada workflow que construyas. Crea un solo workflow Error Handler y luego vincula todos tus demás workflows a él.

Referencia rápida de expresiones n8n

Las expresiones permiten referenciar datos de nodes anteriores. Se colocan entre dobles llaves {{ }} y están disponibles en la mayoría de los campos de los nodes.

Expresión Qué hace
{{ $json.fieldName }} Accede a un campo de la salida del node anterior
{{ $json.nested.field }} Accede a propiedades JSON anidadas
{{ $('NodeName').item.json.field }} Accede a la salida de un node específico por nombre
{{ $json.current_condition[0].temp_C }} Accede a un elemento de array
{{ $now.toFormat('yyyy-MM-dd') }} Fecha actual formateada con Luxon
{{ $now.toFormat('HH:mm') }} Hora actual (formato 24h)
{{ $if($json.score > 80, "high", "low") }} Expresión condicional
{{ $json['field with spaces'] }} Notación con corchetes para caracteres especiales

n8n utiliza Luxon para el manejo de fechas. Si necesitas formatear fechas de respuestas API, los métodos Luxon están disponibles en cualquier objeto DateTime.

¿Cómo construyes un workflow monitor de RSS en n8n?

Ahora construye un segundo workflow que se ejecuta según un horario en lugar de un webhook. Este monitoriza un feed RSS y publica los artículos nuevos en Discord.

Paso 1: Crear el workflow

Haz clic en Add workflow en la página Workflows. Nómbralo RSS to Discord.

Paso 2: Añadir el RSS Feed Trigger

Haz clic en el placeholder del trigger y busca RSS Feed Trigger. Añádelo.

Configúralo:

  • Feed URL: Usa cualquier feed RSS de un blog. Por ejemplo: https://blog.n8n.io/rss/ (el blog de n8n).
  • Poll Times: Establece Every X > Value: 30 > Unit: Minutes.

Esto comprueba el feed cada 30 minutos buscando nuevos elementos. El RSS Feed Trigger recuerda qué elementos ya ha visto. En la primera ejecución, devuelve todos los elementos actuales. Después, solo los nuevos.

Haz clic en Fetch Test Event para obtener los elementos actuales del feed. Deberías ver entradas con campos como title, link, contentSnippet, isoDate y creator.

Paso 3: Añadir un node Set para formatear el mensaje

Añade un node Set. Crea un campo:

Nombre del campo Tipo Valor (expresión)
message String 📰 New post: **{{ $json.title }}**\n{{ $json.link }}\nPublished: {{ $json.isoDate }}

El \n inserta saltos de línea en el mensaje de Discord. Los ** alrededor del título lo ponen en negrita en el Markdown de Discord.

Paso 4: Añadir el node Discord

Añade un node Discord. Usa el mismo credential de webhook. Establece el mensaje en {{ $json.message }}.

Haz clic en Test step. Una notificación formateada de entrada de blog debería aparecer en tu canal de Discord.

Paso 5: Publicar el workflow

Haz clic en Publish. El RSS Feed Trigger comprobará el feed cada 30 minutos y publicará los nuevos elementos en Discord.

Vincular el Error Handler: abre los ajustes del workflow y establece el Error Workflow en tu workflow Error Handler. Publica de nuevo para aplicar el cambio.

Verificación: consulta la pestaña Executions después de 30 minutos (o cambia temporalmente el intervalo de polling a 1 minuto). Deberías ver una ejecución registrada, incluso si no había nuevos elementos (el workflow se ejecuta pero no produce salida si no hay nada nuevo).

¿Cómo exportas e importas workflows de n8n?

Exporta tus workflows como JSON para hacer copias de seguridad, compartirlos o moverlos entre instancias de n8n.

Exportar un workflow

  1. Abre el workflow que quieres exportar.
  2. Haz clic en el menú de tres puntos (⋮) > Download.
  3. n8n guarda un archivo .json en tu ordenador.

También puedes exportar desde la línea de comandos si tienes acceso shell al contenedor de n8n:

docker exec n8n n8n export:workflow --id=<workflow-id> --output=/tmp/workflow.json

Importar un workflow

  1. En la página Workflows, haz clic en el menú de tres puntos > Import from file.
  2. Selecciona tu archivo .json.
  3. n8n importa el workflow como borrador. Revísalo, actualiza los credentials y luego publícalo.

Nota: los workflows exportados no incluyen credentials. Necesitarás volver a añadirlos después de importar en una nueva instancia.

Solución de problemas

El webhook devuelve 404: La URL de prueba solo está activa mientras tienes "Listen for test event" abierto en el editor. La URL de producción solo está activa después de publicar el workflow. Asegúrate de usar la URL correcta para el modo correcto.

El mensaje de Discord no aparece: Verifica la URL del webhook en tu credential de Discord. Pruébala directamente con curl:

curl -X POST "https://discord.com/api/webhooks/YOUR/WEBHOOK_URL" \
  -H "Content-Type: application/json" \
  -d '{"content": "Test message from curl"}'

Si esto funciona pero n8n no, el problema está en la configuración de tu node Discord en n8n.

La expresión devuelve undefined: Abre el editor de expresiones (haz clic en el campo y luego en el toggle de expresión). n8n muestra los datos disponibles de los nodes anteriores. Comprueba la ruta exacta del campo. Error común: usar $json.field cuando los datos están anidados en $json.data.field.

El RSS Feed Trigger se activa para todos los elementos en la primera ejecución: Esto es esperado. En la primera ejecución después de publicar, el trigger devuelve todos los elementos actuales del feed porque no tiene historial de lo que ya ha procesado. Las ejecuciones posteriores solo devuelven elementos nuevos.

El workflow de error no se activa: Los workflows de error solo se activan en workflows publicados y ejecutados automáticamente. Las ejecuciones de prueba manuales no los activan. Verifica que el workflow de error esté vinculado en los ajustes del workflow principal.

Consulta los logs: Si algo no funciona a nivel de la aplicación n8n, revisa los logs del contenedor:

docker logs n8n --tail 50

Para monitorización continua:

docker logs n8n -f

Próximos pasos

Dos workflows funcionando y un manejador de errores. A partir de aquí:

  • Asegura tus endpoints webhook con cabeceras de autenticación.
  • Añade procesamiento de IA a tus workflows con Ollama o Claude.
  • Explora la guía completa para endurecimiento en producción.
  • Aprende los fundamentos de Docker Compose para gestionar stacks multi-servicio. Consulta Docker Compose para despliegues VPS multi-servicio.

Copyright 2026 Virtua.Cloud. Todos los derechos reservados. Este contenido es una obra original del equipo de Virtua.Cloud. La reproducción, republicación o redistribución sin permiso escrito está prohibida.

¿Listo para probarlo?

Despliega tu propio servidor en segundos. Linux, Windows o FreeBSD.

Ver planes VPS