Je eerste n8n-workflow bouwen: webhooks, API-calls en notificaties

14 min leestijd·Matthieu|

Bouw twee echte n8n-workflows vanaf nul op je zelf gehoste instantie. Een webhook die weerdata ophaalt en naar Discord stuurt, en een RSS-monitor die nieuwe artikelen in een kanaal plaatst.

Je hebt n8n draaien op je VPS. Wat nu?

In deze tutorial bouw je twee echte workflows. Geen speelgoedvoorbeelden die data terugsturen naar het niets. Dit zijn automatiseringen die je daadwerkelijk blijft draaien:

  1. Weer-webhook: een HTTP-verzoek ontvangen, de weer-API van wttr.in aanroepen, het antwoord formatteren en naar een Discord-kanaal sturen.
  2. RSS-monitor: een blog-RSS-feed periodiek controleren en nieuwe artikelen naar Discord posten.

Beide workflows behandelen de basisconcepten van n8n tijdens het bouwen: nodes, verbindingen, expressies, het draft/publish-systeem van n8n 2.0 en foutafhandeling.

Vereisten:

  • Een draaiende n8n-instantie op je VPS. Als je die nog niet hebt, volg dan eerst n8n installeren met Docker Compose op een VPS.
  • Een Discord-server waar je een webhook kunt aanmaken (of een Slack-workspace. De instructies zijn uitwisselbaar; we gebruiken hier Discord).
  • Basiskennis van de terminal en curl.

Wat zijn n8n-nodes en -verbindingen?

Nodes zijn de individuele stappen in een workflow. Elke node doet één ding: een trigger ontvangen, een HTTP-verzoek maken, data transformeren of een bericht versturen. Verbindingen zijn de lijnen tussen nodes. Ze geven data door van de uitvoer van de ene node naar de invoer van de volgende. Elke workflow is een keten van nodes die van links naar rechts zijn verbonden.

De node-typen die in deze tutorial worden gebruikt:

Node Doel
Webhook Luistert naar inkomende HTTP-verzoeken en start de workflow
HTTP Request Roept een externe API aan en geeft het antwoord terug
Set Maakt datavelden aan of herstructureert ze
If Vertakt de workflow op basis van een voorwaarde
Discord Stuurt een bericht naar een Discord-kanaal via webhook
RSS Feed Trigger Pollt een RSS-feed en activeert wanneer nieuwe items verschijnen
Error Trigger Vangt workflow-fouten op en start een notificatie-workflow

Hoe bouw je je eerste n8n-workflow?

Open je n8n-instantie in de browser. Klik op Add workflow op de Workflows-pagina. n8n toont een leeg canvas met een trigger-node-placeholder.

Deze eerste workflow doet het volgende: een stadsnaam ontvangen via een HTTP-webhook, het huidige weer ophalen van wttr.in, het resultaat formatteren en publiceren in een Discord-kanaal.

Stap 1: Een Discord-webhook aanmaken

Voordat je in n8n gaat bouwen, heb je een plek nodig om notificaties naartoe te sturen.

  1. Open je Discord-server. Klik met rechts op het kanaal waar je weerupdates wilt ontvangen.
  2. Selecteer Kanaal bewerken > Integraties > Webhooks.
  3. Klik op Nieuwe webhook. Geef het een naam zoals n8n Weather Bot.
  4. Klik op Webhook-URL kopiëren. Bewaar deze URL. Die ziet er zo uit: https://discord.com/api/webhooks/123456789/abcDEF...

Behandel deze URL als een wachtwoord. Iedereen die hem heeft kan in je kanaal posten.

Stap 2: De Webhook-trigger-node toevoegen

Klik op de +-knop op de trigger-placeholder van het canvas. Zoek naar Webhook en selecteer het.

Configureer de webhook:

  • HTTP Method: POST
  • Path: weather

Laat al het andere op de standaardwaarden staan. Het path maakt je webhook-URL uniek. Met het path ingesteld op weather zijn je webhook-URL's:

  • Test-URL: https://jouw-n8n-domein.com/webhook-test/weather
  • Productie-URL: https://jouw-n8n-domein.com/webhook/weather

Let op het verschil: /webhook-test/ vs /webhook/. Dit onderscheid is belangrijk. Daarover zo meer.

Stap 3: De webhook testen met curl

Klik op Listen for test event in de webhook-node. n8n wacht nu op een inkomend verzoek op de test-URL.

Open een terminal op je lokale machine en stuur een testverzoek:

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

Ga terug naar n8n. De webhook-node zou een groen vinkje moeten tonen met de ontvangen data. Je ziet de JSON-body met city: "Paris" in het uitvoerpaneel.

Als er niets gebeurt, controleer dan:

  • Je n8n-instantie is bereikbaar vanaf het internet (reverse proxy is geconfigureerd).
  • Je hebt op Listen for test event geklikt voordat je het curl-verzoek verstuurde.
  • De URL klopt precies, inclusief het /webhook-test/-prefix.

Stap 4: De HTTP Request-node toevoegen (weer-API aanroepen)

Klik op de +-knop rechts van de Webhook-node. Zoek naar HTTP Request en voeg het toe.

Configureer het:

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

Het deel {{ $json.city }} is een n8n-expressie (expression). Het haalt het veld city uit de inkomende webhookdata. Wanneer iemand {"city": "Paris"} stuurt, vervangt n8n de expressie door Paris, waardoor de uiteindelijke URL https://wttr.in/Paris?format=j1 wordt.

De parameter ?format=j1 vertelt wttr.in om gestructureerde JSON terug te geven in plaats van het ASCII-art weerrapport.

Klik op Test step om alleen deze node uit te voeren. Je zou een JSON-antwoord moeten zien met weerdata inclusief velden als current_condition, temp_C, weatherDesc en meer.

Goed kijken: bekijk het uitvoerpaneel. Het antwoord is genest. De huidige temperatuur staat op $json.current_condition[0].temp_C en de beschrijving op $json.current_condition[0].weatherDesc[0].value. Je hebt deze paden nodig in de volgende stap.

Stap 5: Een Set-node toevoegen om het bericht te formatteren

Het ruwe antwoord van de weer-API is groot. Je hebt slechts een paar velden nodig voor het Discord-bericht.

Voeg een Set-node toe na de HTTP Request-node. Klik op Add field en maak deze toewijzing:

Veldnaam Type Waarde (expressie)
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.

De expressie {{ $('Webhook').item.json.city }} grijpt terug naar de uitvoer van de Webhook-node om de stadsnaam op te halen. De $json-verwijzingen zonder node-naam halen data uit de direct voorgaande node (HTTP Request).

Klik op Test step. De uitvoer zou één message-veld moeten tonen met iets als:

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

Stap 6: De Discord-node toevoegen

Voeg een Discord-node toe na de Set-node.

  1. Stel Connection Type in op Webhook.
  2. Klik onder Credential for Discord op Create New Credential.
  3. Plak je Discord-webhook-URL uit stap 1 in het veld Webhook URL. Klik op Save.
  4. Stel Operation in op Send a Message.
  5. Gebruik in het veld Message de expressie: {{ $json.message }}

Klik op Test step. Controleer je Discord-kanaal. Het weerbericht zou door je bot gepost moeten zijn.

Verificatie: open Discord. Het bericht zou moeten verschijnen in het kanaal waarvoor je de webhook hebt geconfigureerd. Als het er niet is, controleer dan de webhook-URL in de credential-instellingen.

Stap 7: De volledige workflow testen

Ga terug naar de Webhook-node. Klik opnieuw op Listen for test event. Stuur nog een curl-verzoek:

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

Bekijk hoe de uitvoering door alle vier nodes stroomt. Elke node wordt groen wanneer deze klaar is. Een weerbericht voor Tokyo zou in je Discord-kanaal moeten verschijnen.

Controleer het Executions-tabblad in de linkerzijbalk. Je ziet een logvermelding voor deze testuitvoering met timing, status en de data bij elke node. Dit uitvoeringslog is waar je problemen debugt.

Hoe ontvangt de n8n-webhook-node externe data?

De Webhook-node maakt een HTTP-endpoint aan op je n8n-instantie. Wanneer een externe dienst (of een curl-commando) een verzoek naar dat endpoint stuurt, ontvangt n8n de data en start de workflow. De node ondersteunt de methoden GET, POST, PUT, PATCH, DELETE en HEAD. POST met een JSON-body is het meest voorkomende patroon.

Hoe test je een n8n-webhook met curl?

Dat heb je hierboven al gedaan. Dit is waar het op aankomt:

Test-URL Productie-URL
Padformaat /webhook-test/<path> /webhook/<path>
Wanneer actief Alleen terwijl je "Listen for test event" of "Execute workflow" hebt geklikt in de editor Alleen nadat je de workflow hebt gepubliceerd
Toont data in editor Ja, live in het uitvoerpaneel van de node Nee (controleer het Executions-tabblad)
Gebruiksscenario Bouwen en debuggen Echte externe integraties

Gebruik tijdens de ontwikkeling altijd de test-URL. Daarmee zie je data in realtime door elke node stromen. De productie-URL werkt pas na publicatie van de workflow.

Wat is het verschil tussen draft- en gepubliceerde workflows in n8n 2.0?

n8n 2.0 heeft opslaan gescheiden van activeren. Je bewerkingen blijven in concept en beïnvloeden de live-versie niet totdat je expliciet publiceert. Sinds n8n 2.4 (januari 2026) slaat de editor je werk elke paar seconden automatisch op. Er is geen handmatige Save-knop meer.

Dit is de volgorde:

  1. Je bouwt en test je workflow met de test-URL. n8n slaat automatisch op terwijl je werkt.
  2. Je wijzigingen bestaan alleen als concept. De live-versie (indien aanwezig) blijft ongewijzigd draaien.
  3. Je klikt op Publish. Nu is de productie-URL actief en draait de workflow automatisch wanneer deze wordt getriggerd.
  4. Als je de workflow later bewerkt, blijven je wijzigingen in concept totdat je opnieuw publiceert.

In n8n 1.x waren opslaan en activeren dezelfde actie. Dat is niet meer zo.

Publiceer je weer-workflow nu. Klik op de knop Publish rechtsboven (of druk op Shift+P). De workflowstatus verandert naar "Active".

Verifieer met curl via de productie-URL dit keer:

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

Controleer Discord. Het weerbericht voor Berlijn zou moeten verschijnen. Controleer dan het Executions-tabblad in n8n om de productie-uitvoering in het log te zien.

Hoe ga je om met fouten in een n8n-workflow?

De Error Trigger-node vangt workflow-fouten op en start een aparte notificatie-workflow. Wanneer een actieve workflow faalt (bijvoorbeeld als de weer-API down is of Discord het bericht weigert), activeert n8n de Error Trigger in de gekoppelde fout-workflow. Dit werkt alleen voor gepubliceerde, automatisch getriggerde uitvoeringen. Handmatige testuitvoeringen activeren het niet.

Een foutnotificatie-workflow bouwen

  1. Ga terug naar de Workflows-pagina. Klik op Add workflow. Noem het Error Handler.
  2. Voeg een Error Trigger-node toe als trigger. Deze node ontvangt automatisch foutdata wanneer een gekoppelde workflow faalt.
  3. Voeg een Discord-node toe na de Error Trigger.
  4. Configureer het met dezelfde Discord-webhook-credential die je eerder hebt aangemaakt.
  5. Stel het bericht in op:
⚠️ Workflow failed: {{ $json.workflow.name }}
Error: {{ $json.execution.error.message }}
Execution ID: {{ $json.execution.id }}
  1. De fout-workflow wordt automatisch geactiveerd omdat deze een Error Trigger-node bevat. Afzonderlijk publiceren is niet nodig.

De fout-workflow koppelen aan je weer-workflow

  1. Open je Weather Webhook-workflow.
  2. Klik op het driepuntsmenu (⋮) rechtsboven en dan op Settings.
  3. Selecteer onder Error Workflow de Error Handler-workflow die je zojuist hebt aangemaakt.
  4. Klik op Publish om de wijziging toe te passen.

Als nu de weer-API uitvalt of een node in je workflow een fout geeft tijdens een productie-uitvoering, krijg je een Discord-notificatie met de workflownaam, de foutmelding en het uitvoerings-ID. Je kunt dat ID gebruiken om de mislukte uitvoering in het Executions-tabblad te vinden en precies te onderzoeken wat er misging.

Dit is een patroon dat je in elke workflow zou moeten hergebruiken. Maak één Error Handler-workflow en koppel dan al je andere workflows eraan.

Snelle referentie voor n8n-expressies

Expressies zijn de manier om te verwijzen naar data uit voorgaande nodes. Ze staan tussen dubbele accolades {{ }} en zijn beschikbaar in de meeste node-velden.

Expressie Wat het doet
{{ $json.fieldName }} Toegang tot een veld van de uitvoer van de vorige node
{{ $json.nested.field }} Toegang tot geneste JSON-eigenschappen
{{ $('NodeName').item.json.field }} Toegang tot de uitvoer van een specifieke node op naam
{{ $json.current_condition[0].temp_C }} Toegang tot een array-element
{{ $now.toFormat('yyyy-MM-dd') }} Huidige datum geformateerd met Luxon
{{ $now.toFormat('HH:mm') }} Huidige tijd (24-uursnotatie)
{{ $if($json.score > 80, "high", "low") }} Voorwaardelijke expressie
{{ $json['field with spaces'] }} Haakjesnotatie voor speciale tekens

n8n gebruikt Luxon voor datumverwerking. Als je datums uit API-antwoorden moet formatteren, zijn Luxon-methoden beschikbaar op elk DateTime-object.

Hoe bouw je een RSS-feed-monitor-workflow in n8n?

Bouw nu een tweede workflow die op een schema draait in plaats van via een webhook. Deze monitort een RSS-feed en plaatst nieuwe artikelen op Discord.

Stap 1: De workflow aanmaken

Klik op Add workflow op de Workflows-pagina. Noem het RSS to Discord.

Stap 2: De RSS Feed Trigger toevoegen

Klik op de trigger-placeholder en zoek naar RSS Feed Trigger. Voeg het toe.

Configureer het:

  • Feed URL: Gebruik een willekeurige blog-RSS-feed. Bijvoorbeeld: https://blog.n8n.io/rss/ (de blog van n8n).
  • Poll Times: Stel in op Every X > Value: 30 > Unit: Minutes.

Dit controleert de feed elke 30 minuten op nieuwe items. De RSS Feed Trigger onthoudt welke items hij al heeft gezien. Bij de eerste uitvoering geeft hij alle huidige items terug. Daarna alleen nieuwe.

Klik op Fetch Test Event om de huidige feed-items op te halen. Je zou vermeldingen moeten zien met velden als title, link, contentSnippet, isoDate en creator.

Stap 3: Een Set-node toevoegen om het bericht te formatteren

Voeg een Set-node toe. Maak één veld:

Veldnaam Type Waarde (expressie)
message String 📰 New post: **{{ $json.title }}**\n{{ $json.link }}\nPublished: {{ $json.isoDate }}

De \n voegt regeleindes in het Discord-bericht in. De ** rond de titel maken het vet in Discords Markdown.

Stap 4: De Discord-node toevoegen

Voeg een Discord-node toe. Gebruik dezelfde webhook-credential. Stel het bericht in op {{ $json.message }}.

Klik op Test step. Een geformatteerde blogpost-notificatie zou in je Discord-kanaal moeten verschijnen.

Stap 5: De workflow publiceren

Klik op Publish. De RSS Feed Trigger controleert de feed nu elke 30 minuten en plaatst nieuwe items op Discord.

Koppel de Error Handler: open de workflowinstellingen en stel de Error Workflow in op je Error Handler-workflow. Publiceer opnieuw om de wijziging toe te passen.

Verificatie: controleer het Executions-tabblad na 30 minuten (of wijzig het poll-interval tijdelijk naar 1 minuut). Je zou een gelogde uitvoering moeten zien, zelfs als er geen nieuwe items waren (de workflow draait maar produceert geen uitvoer als er niets nieuws is).

Hoe exporteer en importeer je n8n-workflows?

Exporteer je workflows als JSON om ze te back-uppen, te delen of te verplaatsen tussen n8n-instanties.

Een workflow exporteren

  1. Open de workflow die je wilt exporteren.
  2. Klik op het driepuntsmenu (⋮) > Download.
  3. n8n slaat een .json-bestand op je computer op.

Je kunt ook exporteren via de commandoregel als je shell-toegang hebt tot de n8n-container:

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

Een workflow importeren

  1. Klik op de Workflows-pagina op het driepuntsmenu > Import from file.
  2. Selecteer je .json-bestand.
  3. n8n importeert de workflow als concept. Controleer het, werk de credentials bij en publiceer het dan.

Let op: geëxporteerde workflows bevatten geen credentials. Je moet ze opnieuw toevoegen na import op een nieuwe instantie.

Problemen oplossen

Webhook geeft 404 terug: De test-URL is alleen actief terwijl je "Listen for test event" open hebt in de editor. De productie-URL is alleen actief na publicatie van de workflow. Zorg ervoor dat je de juiste URL voor de juiste modus gebruikt.

Discord-bericht verschijnt niet: Controleer de webhook-URL in je Discord-credential. Test het direct met curl:

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

Als dit werkt maar n8n niet, zit het probleem in de configuratie van je n8n Discord-node.

Expressie geeft undefined terug: Open de expressie-editor (klik op het veld en dan op de expressie-toggle). n8n toont beschikbare data van voorgaande nodes. Controleer het exacte veldpad. Veelgemaakte fout: $json.field gebruiken terwijl de data genest is in $json.data.field.

RSS Feed Trigger activeert voor alle items bij de eerste uitvoering: Dit is verwacht gedrag. Bij de eerste uitvoering na publicatie geeft de trigger alle huidige feed-items terug omdat hij geen geschiedenis heeft van wat hij al heeft verwerkt. Volgende uitvoeringen geven alleen nieuwe items.

Fout-workflow wordt niet geactiveerd: Fout-workflows activeren alleen bij gepubliceerde, automatisch uitgevoerde workflows. Handmatige testuitvoeringen activeren ze niet. Controleer of de fout-workflow is gekoppeld in de instellingen van de hoofdworkflow.

Controleer de logs: Als er iets mis is op applicatieniveau van n8n, controleer dan de containerlogs:

docker logs n8n --tail 50

Voor doorlopende monitoring:

docker logs n8n -f

Volgende stappen

Twee werkende workflows en een foutafhandelaar. Vanaf hier:

  • Beveilig je webhook-endpoints met authenticatieheaders.
  • Voeg AI-verwerking toe aan je workflows met Ollama of Claude.
  • Bekijk de volledige gids voor productiehardening.
  • Leer de basisprincipes van Docker Compose voor het beheren van multi-service stacks. Zie Docker Compose voor multi-service VPS-deployments.

Copyright 2026 Virtua.Cloud. Alle rechten voorbehouden. Deze inhoud is een origineel werk van het Virtua.Cloud-team. Reproductie, herpublicatie of herdistributie zonder schriftelijke toestemming is verboden.

Klaar om het zelf te proberen?

Deploy uw eigen server in seconden. Linux, Windows of FreeBSD.

Bekijk VPS-aanbod