Créer votre premier workflow n8n : webhooks, appels API et notifications
Construisez deux workflows n8n concrets sur votre instance auto-hébergée. Un webhook qui récupère la météo et l'envoie sur Discord, et un moniteur RSS qui publie les nouveaux articles dans un canal.
Vous avez n8n qui tourne sur votre VPS. Et maintenant ?
Dans ce tutoriel, vous allez construire deux workflows concrets. Pas des exemples jouets qui renvoient des données dans le vide. Ce sont des automatisations que vous garderez en production :
- Webhook météo : recevoir une requête HTTP, appeler l'API météo wttr.in, formater la réponse et l'envoyer dans un canal Discord.
- Moniteur RSS : vérifier un flux RSS à intervalles réguliers et publier les nouveaux articles sur Discord.
Les deux workflows couvrent les concepts fondamentaux de n8n au fil de la construction : nodes, connexions, expressions, le système draft/publish de n8n 2.0 et la gestion des erreurs.
Prérequis :
- Une instance n8n fonctionnelle sur votre VPS. Si vous n'en avez pas encore, suivez d'abord Installer n8n avec Docker Compose sur un VPS.
- Un serveur Discord où vous pouvez créer un webhook (ou un workspace Slack. Les instructions sont interchangeables ; nous utilisons Discord ici).
- Une aisance de base avec le terminal et
curl.
Que sont les nodes et connexions dans n8n ?
Les nodes sont les étapes individuelles d'un workflow. Chaque node fait une seule chose : recevoir un déclencheur, faire une requête HTTP, transformer des données ou envoyer un message. Les connexions sont les lignes entre les nodes. Elles transmettent les données de la sortie d'un node vers l'entrée du suivant. Chaque workflow est une chaîne de nodes connectés de gauche à droite.
Les types de nodes utilisés dans ce tutoriel :
| Node | Rôle |
|---|---|
| Webhook | Écoute les requêtes HTTP entrantes et démarre le workflow |
| HTTP Request | Appelle une API externe et renvoie la réponse |
| Set | Crée ou restructure les champs de données |
| If | Fait bifurquer le workflow selon une condition |
| Discord | Envoie un message dans un canal Discord via webhook |
| RSS Feed Trigger | Interroge un flux RSS et se déclenche quand de nouveaux éléments apparaissent |
| Error Trigger | Capture les échecs d'un workflow et lance un workflow de notification |
Comment construire votre premier workflow n8n ?
Ouvrez votre instance n8n dans le navigateur. Cliquez sur Add workflow dans la page Workflows. n8n vous place sur un canvas vide avec un placeholder de node déclencheur.
Ce premier workflow fait ceci : recevoir un nom de ville via un webhook HTTP, récupérer la météo actuelle depuis wttr.in, formater le résultat et le publier dans un canal Discord.
Étape 1 : Créer un webhook Discord
Avant de construire dans n8n, il vous faut un endroit où envoyer les notifications.
- Ouvrez votre serveur Discord. Faites un clic droit sur le canal où vous voulez les mises à jour météo.
- Sélectionnez Modifier le salon > Intégrations > Webhooks.
- Cliquez sur Nouveau webhook. Donnez-lui un nom comme
n8n Weather Bot. - Cliquez sur Copier l'URL du webhook. Gardez cette URL. Elle ressemble à :
https://discord.com/api/webhooks/123456789/abcDEF...
Traitez cette URL comme un mot de passe. Toute personne qui la possède peut publier dans votre canal.
Étape 2 : Ajouter le node déclencheur Webhook
Cliquez sur le bouton + sur le placeholder du canvas. Cherchez Webhook et sélectionnez-le.
Configurez le webhook :
- HTTP Method : POST
- Path :
weather
Laissez le reste par défaut. Le path rend votre URL de webhook unique. Avec le path défini sur weather, vos URLs de webhook seront :
- URL de test :
https://votre-domaine-n8n.com/webhook-test/weather - URL de production :
https://votre-domaine-n8n.com/webhook/weather
Notez la différence : /webhook-test/ vs /webhook/. Cette distinction compte. On y revient dans un instant.
Étape 3 : Tester le webhook avec curl
Cliquez sur Listen for test event dans le node webhook. n8n attend maintenant une requête entrante sur l'URL de test.
Ouvrez un terminal sur votre machine locale et envoyez une requête de test :
curl -X POST https://your-n8n-domain.com/webhook-test/weather \
-H "Content-Type: application/json" \
-d '{"city": "Paris"}'
Retournez dans n8n. Le node webhook devrait afficher une coche verte avec les données reçues. Vous verrez le corps JSON avec city: "Paris" dans le panneau de sortie.
Si rien ne se passe, vérifiez que :
- Votre instance n8n est accessible depuis internet (le reverse proxy est configuré).
- Vous avez cliqué sur Listen for test event avant d'envoyer la requête curl.
- L'URL correspond exactement, y compris le préfixe
/webhook-test/.
Étape 4 : Ajouter le node HTTP Request (appeler l'API météo)
Cliquez sur le bouton + à droite du node Webhook. Cherchez HTTP Request et ajoutez-le.
Configurez-le :
- Method : GET
- URL :
https://wttr.in/{{ $json.city }}?format=j1
La partie {{ $json.city }} est une expression n8n. Elle extrait le champ city des données du webhook entrant. Quand quelqu'un envoie {"city": "Paris"}, n8n remplace l'expression par Paris, ce qui donne l'URL finale https://wttr.in/Paris?format=j1.
Le paramètre ?format=j1 indique à wttr.in de renvoyer du JSON structuré au lieu du rapport météo en art ASCII.
Cliquez sur Test step pour exécuter uniquement ce node. Vous devriez voir une réponse JSON avec des données météo comprenant des champs comme current_condition, temp_C, weatherDesc et d'autres.
Coup d'œil attentif : regardez le panneau de sortie. La réponse est imbriquée. La température actuelle se trouve à $json.current_condition[0].temp_C et la description à $json.current_condition[0].weatherDesc[0].value. Vous aurez besoin de ces chemins à l'étape suivante.
Étape 5 : Ajouter un node Set pour formater le message
La réponse brute de l'API météo est volumineuse. Vous n'avez besoin que de quelques champs pour le message Discord.
Ajoutez un node Set après le node HTTP Request. Cliquez sur Add field et créez cette affectation :
| Nom du champ | Type | Valeur (expression) |
|---|---|---|
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. |
L'expression {{ $('Webhook').item.json.city }} remonte à la sortie du node Webhook pour récupérer le nom de la ville. Les références $json sans nom de node tirent les données du node immédiatement précédent (HTTP Request).
Cliquez sur Test step. La sortie devrait afficher un seul champ message avec quelque chose comme :
Weather in Paris: 14°C, Partly cloudy. Humidity: 72%. Wind: 15 km/h.
Étape 6 : Ajouter le node Discord
Ajoutez un node Discord après le node Set.
- Définissez Connection Type sur Webhook.
- Sous Credential for Discord, cliquez sur Create New Credential.
- Collez votre URL de webhook Discord de l'étape 1 dans le champ Webhook URL. Cliquez sur Save.
- Définissez Operation sur Send a Message.
- Dans le champ Message, utilisez l'expression :
{{ $json.message }}
Cliquez sur Test step. Vérifiez votre canal Discord. Le message météo devrait apparaître, publié par votre bot.
Vérification : ouvrez Discord. Le message devrait apparaître dans le canal pour lequel vous avez configuré le webhook. Si ce n'est pas le cas, revérifiez l'URL du webhook dans les paramètres du credential.
Étape 7 : Tester le workflow complet
Revenez au node Webhook. Cliquez à nouveau sur Listen for test event. Envoyez une autre requête curl :
curl -X POST https://your-n8n-domain.com/webhook-test/weather \
-H "Content-Type: application/json" \
-d '{"city": "Tokyo"}'
Observez l'exécution traverser les quatre nodes. Chaque node passe au vert quand il termine. Un bulletin météo pour Tokyo devrait apparaître dans votre canal Discord.
Consultez l'onglet Executions dans la barre latérale gauche. Vous verrez une entrée de log pour cette exécution de test avec le timing, le statut et les données à chaque node. Ce log d'exécution est l'endroit où vous déboguez les problèmes.
Comment le node webhook n8n reçoit-il des données externes ?
Le node Webhook crée un endpoint HTTP sur votre instance n8n. Quand un service externe (ou une commande curl) envoie une requête à cet endpoint, n8n reçoit les données et démarre le workflow. Le node supporte les méthodes GET, POST, PUT, PATCH, DELETE et HEAD. POST avec un corps JSON est le pattern le plus courant.
Comment tester un webhook n8n avec curl ?
Vous l'avez déjà fait plus haut. Voici ce qui compte :
| URL de test | URL de production | |
|---|---|---|
| Format du path | /webhook-test/<path> |
/webhook/<path> |
| Quand actif | Uniquement quand vous cliquez sur « Listen for test event » ou « Execute workflow » dans l'éditeur | Uniquement après avoir publié le workflow |
| Affiche les données dans l'éditeur | Oui, en direct dans le panneau de sortie du node | Non (consultez l'onglet Executions) |
| Cas d'usage | Construction et débogage | Intégrations externes réelles |
Pendant le développement, utilisez toujours l'URL de test. Elle vous permet de voir les données circuler dans chaque node en temps réel. L'URL de production ne fonctionne qu'après publication du workflow.
Quelle est la différence entre les workflows draft et publiés dans n8n 2.0 ?
n8n 2.0 a séparé la sauvegarde de l'activation. Vos modifications restent en brouillon et n'affectent pas la version live tant que vous ne publiez pas explicitement. Depuis n8n 2.4 (janvier 2026), l'éditeur sauvegarde automatiquement votre travail toutes les quelques secondes. Il n'y a plus de bouton Save manuel.
Voici la séquence :
- Vous construisez et testez votre workflow avec l'URL de test. n8n sauvegarde automatiquement au fur et à mesure.
- Vos modifications n'existent qu'en brouillon. La version live (s'il y en a une) continue de tourner sans changement.
- Vous cliquez sur Publish. L'URL de production est maintenant active et le workflow se lance automatiquement quand il est déclenché.
- Si vous modifiez le workflow plus tard, vos changements restent en brouillon jusqu'à ce que vous republiiez.
Dans n8n 1.x, sauvegarder et activer étaient la même action. Ce n'est plus le cas.
Publiez votre workflow météo maintenant. Cliquez sur le bouton Publish en haut à droite (ou appuyez sur Shift+P). Le statut du workflow passe à « Active ».
Vérifiez avec curl en utilisant l'URL de production cette fois :
curl -X POST https://your-n8n-domain.com/webhook/weather \
-H "Content-Type: application/json" \
-d '{"city": "Berlin"}'
Vérifiez Discord. Le bulletin météo de Berlin devrait apparaître. Puis consultez l'onglet Executions dans n8n pour voir l'exécution de production journalisée.
Comment gérer les erreurs dans un workflow n8n ?
Le node Error Trigger capture les échecs de workflows et lance un workflow de notification séparé. Quand un workflow actif échoue (par exemple, l'API météo est indisponible ou Discord rejette le message), n8n déclenche l'Error Trigger dans le workflow d'erreur lié. Cela ne fonctionne que pour les exécutions publiées et déclenchées automatiquement. Les exécutions de test manuelles ne le déclenchent pas.
Construire un workflow de notification d'erreur
- Retournez à la page Workflows. Cliquez sur Add workflow. Nommez-le
Error Handler. - Ajoutez un node Error Trigger comme déclencheur. Ce node reçoit automatiquement les données d'erreur quand un workflow lié échoue.
- Ajoutez un node Discord après l'Error Trigger.
- Configurez-le avec le même credential webhook Discord que vous avez créé précédemment.
- Définissez le message sur :
⚠️ Workflow failed: {{ $json.workflow.name }}
Error: {{ $json.execution.error.message }}
Execution ID: {{ $json.execution.id }}
- Le workflow d'erreur s'active automatiquement parce qu'il contient un node Error Trigger. Pas besoin de le publier séparément.
Lier le workflow d'erreur à votre workflow météo
- Ouvrez votre workflow Weather Webhook.
- Cliquez sur le menu trois points (⋮) en haut à droite, puis Settings.
- Sous Error Workflow, sélectionnez le workflow
Error Handlerque vous venez de créer. - Cliquez sur Publish pour appliquer le changement.
Maintenant, si l'API météo tombe en panne ou si un node de votre workflow produit une erreur pendant une exécution de production, vous recevrez une notification Discord avec le nom du workflow, le message d'erreur et l'ID d'exécution. Vous pouvez utiliser cet ID pour retrouver l'exécution échouée dans l'onglet Executions et inspecter exactement ce qui a mal tourné.
C'est un pattern à réutiliser dans chaque workflow que vous construisez. Créez un seul workflow Error Handler, puis liez-y tous vos autres workflows.
Référence rapide des expressions n8n
Les expressions permettent de référencer des données des nodes précédents. Elles se placent entre doubles accolades {{ }} et sont disponibles dans la plupart des champs de configuration.
| Expression | Ce qu'elle fait |
|---|---|
{{ $json.fieldName }} |
Accède à un champ de la sortie du node précédent |
{{ $json.nested.field }} |
Accède à des propriétés JSON imbriquées |
{{ $('NodeName').item.json.field }} |
Accède à la sortie d'un node spécifique par son nom |
{{ $json.current_condition[0].temp_C }} |
Accède à un élément de tableau |
{{ $now.toFormat('yyyy-MM-dd') }} |
Date actuelle formatée avec Luxon |
{{ $now.toFormat('HH:mm') }} |
Heure actuelle (format 24h) |
{{ $if($json.score > 80, "high", "low") }} |
Expression conditionnelle |
{{ $json['field with spaces'] }} |
Notation entre crochets pour les caractères spéciaux |
n8n utilise Luxon pour la gestion des dates. Si vous devez formater des dates issues de réponses API, les méthodes Luxon sont disponibles sur tout objet DateTime.
Comment construire un workflow moniteur RSS dans n8n ?
Construisons maintenant un second workflow qui tourne sur un planning au lieu d'un webhook. Celui-ci surveille un flux RSS et publie les nouveaux articles sur Discord.
Étape 1 : Créer le workflow
Cliquez sur Add workflow dans la page Workflows. Nommez-le RSS to Discord.
Étape 2 : Ajouter le RSS Feed Trigger
Cliquez sur le placeholder du déclencheur et cherchez RSS Feed Trigger. Ajoutez-le.
Configurez-le :
- Feed URL : utilisez n'importe quel flux RSS de blog. Par exemple :
https://blog.n8n.io/rss/(le blog de n8n). - Poll Times : définissez sur Every X > Value :
30> Unit : Minutes.
Cela vérifie le flux toutes les 30 minutes pour détecter les nouveaux éléments. Le RSS Feed Trigger mémorise les éléments déjà vus. Au premier lancement, il renvoie tous les éléments actuels. Ensuite, il ne renvoie que les nouveaux.
Cliquez sur Fetch Test Event pour récupérer les éléments actuels du flux. Vous devriez voir des entrées avec des champs comme title, link, contentSnippet, isoDate et creator.
Étape 3 : Ajouter un node Set pour formater le message
Ajoutez un node Set. Créez un champ :
| Nom du champ | Type | Valeur (expression) |
|---|---|---|
message |
String | 📰 New post: **{{ $json.title }}**\n{{ $json.link }}\nPublished: {{ $json.isoDate }} |
Le \n insère des sauts de ligne dans le message Discord. Les ** autour du titre le mettent en gras dans le Markdown de Discord.
Étape 4 : Ajouter le node Discord
Ajoutez un node Discord. Utilisez le même credential webhook. Définissez le message sur {{ $json.message }}.
Cliquez sur Test step. Une notification de billet de blog formatée devrait apparaître dans votre canal Discord.
Étape 5 : Publier le workflow
Cliquez sur Publish. Le RSS Feed Trigger va maintenant vérifier le flux toutes les 30 minutes et publier les nouveaux éléments sur Discord.
Lier l'Error Handler : ouvrez les paramètres du workflow et définissez l'Error Workflow sur votre workflow Error Handler. Publiez à nouveau pour appliquer le changement.
Vérification : consultez l'onglet Executions après 30 minutes (ou passez temporairement l'intervalle de polling à 1 minute). Vous devriez voir une exécution journalisée, même s'il n'y avait aucun nouvel élément (le workflow s'exécute mais ne produit aucune sortie si rien n'est nouveau).
Comment exporter et importer des workflows n8n ?
Exportez vos workflows au format JSON pour les sauvegarder, les partager ou les déplacer entre instances n8n.
Exporter un workflow
- Ouvrez le workflow que vous souhaitez exporter.
- Cliquez sur le menu trois points (⋮) > Download.
- n8n enregistre un fichier
.jsonsur votre ordinateur.
Vous pouvez aussi exporter depuis la ligne de commande si vous avez un accès shell au conteneur n8n :
docker exec n8n n8n export:workflow --id=<workflow-id> --output=/tmp/workflow.json
Importer un workflow
- Sur la page Workflows, cliquez sur le menu trois points > Import from file.
- Sélectionnez votre fichier
.json. - n8n importe le workflow comme brouillon. Revoyez-le, mettez à jour les credentials, puis publiez.
Note : les workflows exportés n'incluent pas les credentials. Vous devrez les recréer après importation sur une nouvelle instance.
Dépannage
Le webhook renvoie un 404 : L'URL de test n'est active que tant que « Listen for test event » est ouvert dans l'éditeur. L'URL de production n'est active qu'après publication du workflow. Assurez-vous d'utiliser la bonne URL pour le bon mode.
Le message Discord n'apparaît pas : Vérifiez l'URL du webhook dans votre credential Discord. Testez-la directement avec curl :
curl -X POST "https://discord.com/api/webhooks/YOUR/WEBHOOK_URL" \
-H "Content-Type: application/json" \
-d '{"content": "Test message from curl"}'
Si cela fonctionne mais pas n8n, le problème se trouve dans la configuration de votre node Discord dans n8n.
L'expression renvoie undefined :
Ouvrez l'éditeur d'expression (cliquez sur le champ, puis sur le bouton expression). n8n affiche les données disponibles des nodes précédents. Vérifiez le chemin exact du champ. Erreur courante : utiliser $json.field quand les données sont imbriquées dans $json.data.field.
Le RSS Feed Trigger se déclenche pour tous les éléments au premier lancement : C'est normal. Lors de la première exécution après publication, le déclencheur renvoie tous les éléments actuels du flux parce qu'il n'a pas d'historique de ce qu'il a déjà traité. Les exécutions suivantes ne renvoient que les nouveaux éléments.
Le workflow d'erreur ne se déclenche pas : Les workflows d'erreur ne se déclenchent que sur les workflows publiés et exécutés automatiquement. Les exécutions de test manuelles ne les déclenchent pas. Vérifiez que le workflow d'erreur est bien lié dans les paramètres du workflow principal.
Consultez les logs : Si quelque chose ne va pas au niveau de l'application n8n, vérifiez les logs du conteneur :
docker logs n8n --tail 50
Pour un suivi continu :
docker logs n8n -f
Prochaines étapes
Deux workflows fonctionnels et un gestionnaire d'erreurs. À partir de là :
- Sécurisez vos endpoints webhook avec des en-têtes d'authentification.
- Ajoutez du traitement IA à vos workflows avec Ollama ou Claude.
- Explorez le guide complet pour le durcissement en production.
- Apprenez les fondamentaux de Docker Compose pour gérer des stacks multi-services. Voir Docker Compose pour les déploiements VPS multi-services.
Copyright 2026 Virtua.Cloud. Tous droits réservés. Ce contenu est une création originale de l'équipe Virtua.Cloud. Toute reproduction, republication ou redistribution sans autorisation écrite est interdite.
Prêt à essayer ?
Déployez votre serveur en quelques secondes. Linux, Windows ou FreeBSD.
Voir les offres VPS