Webhooks Handleiding

Automatische notificaties naar externe systemen

Wat is een Webhook?

Een webhook stuurt automatisch data naar een extern systeem wanneer er iets verandert in je database. Dit is push-based: zodra er een INSERT, UPDATE of DELETE plaatsvindt op een tabel, verstuurt SQLio de data als JSON naar een door jou geconfigureerd endpoint. Het externe systeem hoeft dus niet zelf te pollen — de data wordt actief verstuurd.

Instructievideo: bij vrijgave van een order meldt een webhook de zending aan bij de transporteur en slaat SQLio het zendingnummer op in het ERP.

Webhook aanmaken

Stap 1: Navigeer naar Webhook Configuratie

Klik in het menu op Webhook Configuratie. Je ziet een overzicht van alle bestaande webhooks.

Stap 2: Klik op "Nieuw"

Bovenaan verschijnt een formulier.

Stap 3: Basisinstellingen invullen

Veld Verplicht Toelichting
Webhook Naam Ja Herkenbare naam, bijvoorbeeld "Order Status Wijziging"
Databron Ja De connectie-alias (bijv. nl) van de database waarop de trigger komt. Ligt vast na het aanmaken.
Tabel Ja Doorzoekbare dropdown — kies de tabel die je wilt monitoren
Status Nee Actief/Inactief toggle. Alleen actieve webhooks worden uitgevoerd. Een nieuwe webhook staat standaard op Actief: bij opslaan maakt SQLio direct de trigger aan.
Omschrijving Nee Beschrijving van het doel van de webhook

Stap 4: Trigger type kiezen

Kies wanneer de webhook moet afgaan:

Trigger type Wanneer Toelichting
Bij wijzigen van records UPDATE Als een bestaand record wordt aangepast
Bij toevoegen van records INSERT Als een nieuw record wordt toegevoegd
Bij verwijderen van records DELETE Als een record wordt verwijderd

Stap 5: Opslaan

Kies onderaan de bestemming: eerst de connectie en dan het endpoint (zie de handleiding Externe endpoints). Klik op Opslaan. SQLio maakt automatisch een database trigger aan op de gekozen tabel. Daarna configureer je de JSON body via de knop Request.

Webhook met trigger en conditie
Webhook op dbo.Verkooporders (databron nl): bij wijzigen, alleen als Status verandert in Vrijgegeven.

Veldcondities

Na het kiezen van een trigger type kun je bepalen onder welke voorwaarden de webhook afgaat. Klik op Veld toevoegen om condities toe te voegen.

Conditie-opties

Veld Toelichting
( Optioneel: groepeer condities met haakjes
Veld De kolom waarop je wilt controleren
Conditie Vergelijkingsoperator (zie tabel hieronder)
Waarde De waarde waarmee vergeleken wordt
Tot Waarde Alleen bij "Ligt tussen" — de bovengrens
Verbinding AND of OR — logische koppeling met volgende conditie
) Optioneel: sluit groepering

Beschikbare condities

Conditie Betekenis Voorbeeld
Altijd Altijd triggeren bij wijziging van dit veld Veld: Status, Conditie: Altijd
Is gelijk aan Waarde moet exact overeenkomen Status = "Verzonden"
Is niet gelijk aan Waarde moet anders zijn Status != "Concept"
Is groter dan Waarde moet groter zijn Bedrag > 1000
Is kleiner dan Waarde moet kleiner zijn Aantal < 0
Ligt tussen Waarde moet binnen bereik liggen Bedrag tussen 100 en 500
Bevat bepaalde tekst Tekst moet voorkomen Omschrijving bevat "urgent"
Begint met Tekst moet beginnen met Klantnr begint met "NL"
Eindigt met Tekst moet eindigen op Email eindigt op "@bedrijf.nl"

Conditie-types

Elke conditie kan twee soorten controle uitvoeren:

Type Toelichting
Change Het veld moet daadwerkelijk gewijzigd zijn (oude waarde anders dan nieuwe waarde). Optioneel met een waardeconditie.
Filter Controleert alleen de huidige waarde, ongeacht of het veld gewijzigd is.

Voorbeeld: alleen triggeren bij statuswijziging naar "Verzonden"

Veld Type Conditie Waarde
Status Change Is gelijk aan Verzonden

De webhook gaat alleen af als het veld Status daadwerkelijk is gewijzigd EN de nieuwe waarde "Verzonden" is.

Voorbeeld: alleen triggeren voor klanten uit Nederland

Veld Type Conditie Waarde
CountryCode Filter Is gelijk aan NL

De webhook gaat af bij elke wijziging, maar alleen als de klant uit Nederland komt.

JSON Request configureren

Klik op de JSON Request knop bij een webhook om te bepalen welke data wordt verstuurd.

Standaard velden van het bericht
Standaard velden: tabel, veld, oude en nieuwe waarde, actie en tijdstip.

Standaard velden

Je kunt de volgende metadata-velden aan- of uitzetten:

Veld Standaard aan Inhoud
table Ja Naam van de tabel (bijv. "dbo.Orders")
field Ja Naam van het gewijzigde veld
oldValue Ja Vorige waarde (bij UPDATE)
newValue Ja Nieuwe waarde
operation Ja Type operatie: INSERT, UPDATE, DELETE of BATCH
timestamp Ja UTC tijdstip van de trigger

Per veld kun je de JSON veldnaam aanpassen. Bijvoorbeeld: table hernoemen naar tableName.

Custom velden

Voeg extra vaste velden toe die altijd worden meegestuurd:

JSON veldnaam Waarde Voorbeeld
source SQLio "source": "SQLio"
environment Productie "environment": "Productie"

Klik op Veld toevoegen om een nieuw custom veld aan te maken.

Custom velden
Custom velden uit de gewijzigde regel: orderNr en referentie.
JSON voorbeeld
Het JSON voorbeeld: precies wat de ontvanger krijgt.

Dataset koppelen

Hier koppel je een dataset aan de webhook. De dataset bepaalt welke data als JSON body wordt verstuurd.

Instelling Toelichting
Data bron type "Geen extra data" of "Dataset"
Dataset selectie Dropdown met beschikbare datasets
JSON Knooppunt Naam Optioneel: naam waaronder de dataset data wordt genest

Zonder knooppuntnaam (merge)

De dataset-velden worden samengevoegd met de standaard/custom velden:

{
  "table": "dbo.Orders",
  "operation": "UPDATE",
  "orderId": 100,
  "orderDate": "2024-01-15",
  "customerName": "ACME Corp"
}

Met knooppuntnaam (genest)

De dataset-data wordt onder de opgegeven naam geplaatst:

{
  "table": "dbo.Orders",
  "operation": "UPDATE",
  "data": {
    "orderId": 100,
    "orderDate": "2024-01-15",
    "customerName": "ACME Corp"
  }
}

Alleen dataset (geen standaard/custom velden)

Als je geen standaard- en geen custom velden aanvinkt, wordt alleen de dataset-data verstuurd:

{
  "orderId": 100,
  "orderDate": "2024-01-15",
  "customerName": "ACME Corp"
}

Dataset parameter mapping

Als de gekoppelde dataset parameters heeft (bijv. een WHERE-conditie op :orderId), moet je instellen waar de waarde vandaan komt:

Mapping type Toelichting
Parameter Koppel aan een webhook trigger-veld (oldValue, newValue, primary key)
Waarde Vaste waarde invullen
Niet gebruiken Parameter niet meesturen
■ Let op: Verplichte parameters worden rood gemarkeerd als ze niet zijn gemapped.

JSON Preview

Onderaan zie je een live preview van de JSON-structuur die verstuurd zal worden. Deze update automatisch als je instellingen wijzigt.

Endpoint en autorisatie

Endpoint selectie

Selecteer in het hoofdformulier bij Endpoint/Authorization het externe endpoint waarnaar de webhook data moet versturen. Dit endpoint bevat de URL en authenticatie-instellingen.

Ondersteunde authenticatie-methoden

Methode Toelichting
Geen Geen authenticatie
Basic Gebruikersnaam + wachtwoord (Base64 gecodeerd)
Bearer Token Vast token in de Authorization header
API Key Custom header met API key (bijv. X-API-KEY: key123)
Basic + API Key Combinatie van Basic authenticatie en API key
Bearer + API Key Combinatie van Bearer token en API key
Custom Headers Zelf gedefinieerde headers
HMAC SHA256 Digitale handtekening over de JSON body ter beveiliging
OAuth 2.0 Client credentials flow — automatische token-verversing

OAuth 2.0

Bij OAuth 2.0 configureert de gebruiker:

Instelling Toelichting
Token URL Het endpoint waar het access token wordt opgehaald
Client ID De client identifier
Client Secret Het geheime sleutel (wordt versleuteld opgeslagen)
Scope Optioneel: de gevraagde scope
■ Tip: SQLio regelt automatisch het ophalen van een nieuw access token, caching van het token tot het verloopt, automatische verversing bij verlopen tokens, en versleutelde opslag van tokens en secrets.

Response verwerking

Optioneel kun je de response van het externe systeem terugschrijven naar je database.

Open de configuratie met de knop Response bij de webhook en zet Response verwerking inschakelen aan. Kies daarna hoe het antwoord verwerkt wordt:

Verwerken via Wanneer Hoe
Interne API Alleen bij een geslaagde aanroep (2xx) Velden uit het antwoord worden via veld-mapping doorgegeven aan een POST- of PATCH-endpoint van SQLio.
Stored Procedure Altijd, ook bij fouten SQLio roept de procedure aan met @StatusCode, @SuccesInd, @JsonBody (antwoord), @RequestJson (verstuurd bericht) en @PrimaryKeyValue. Bij identieke retry-fouten maar één keer.
Responseverwerking via stored procedure
Responseverwerking via de procedure dbo.prc_ZendingVerwerken.

Voorbeeld van zo'n procedure, die het zendingnummer uit het antwoord opslaat:

CREATE PROCEDURE dbo.prc_ZendingVerwerken
    @StatusCode int, @SuccesInd bit, @JsonBody nvarchar(max),
    @RequestJson nvarchar(max), @PrimaryKeyValue nvarchar(100)
AS
BEGIN
    SET NOCOUNT ON;
    IF @SuccesInd = 0 RETURN;
    UPDATE dbo.Verkooporders
       SET ZendingNr = JSON_VALUE(@JsonBody, '$.zendingNr')
     WHERE OrderNr = TRY_CAST(@PrimaryKeyValue AS int);
END
GO
GRANT EXECUTE ON dbo.prc_ZendingVerwerken TO SQLioRole;
Let op: SQLio voert de procedure uit met de rechten van SQLioRole. Laat de DBA EXECUTE op de procedure toekennen, anders geeft de responseverwerking de fout "EXECUTE permission was denied".

Configuratie via interne API

  1. Kies bij Verwerken via de optie Interne API
  2. Selecteer het doel proces: een POST- of PATCH-endpoint dat is aangevinkt voor de databron van de webhook
  3. Plak een voorbeeld JSON van de response die je verwacht
  4. Klik op Velden detecteren — SQLio detecteert automatisch de velden

Response field mapping

Na het parsen zie je een tabel met gedetecteerde velden:

Kolom Toelichting
JSON Field Pad naar het veld in de response (bijv. result.id, items[0].status)
Data Type Gedetecteerd type (string, number, boolean, etc.)
Voorbeeld Voorbeeldwaarde uit de geplakte JSON
Map To Hoe het veld wordt gebruikt
Target Value De doelwaarde of het doelveld

Mapping opties

Optie Toelichting
Response JSON Gebruik de waarde uit de response
Webhook Trigger Gebruik de primary key uit de oorspronkelijke trigger
Static Value Vaste waarde
Niet gebruiken Veld overslaan

Voorbeeld

Een webhook stuurt een order naar een extern systeem. Dat systeem retourneert een bevestigingsnummer:

{
  "confirmationId": "EXT-2024-0042",
  "status": "accepted"
}

Met response verwerking kun je dit confirmationId automatisch terugschrijven naar je eigen database via een PATCH API endpoint.

Verwerking en queue

Hoe de achtergrondservice werkt

SQLio controleert elke 30 seconden of er onverwerkte items in de webhook queue staan.

Stap Wat er gebeurt
1 Database trigger detecteert wijziging en plaatst item in SQLio_WebhookQueue
2 Achtergrondservice leest onverwerkte items (max 500 per keer)
3 Items worden gegroepeerd per webhook
4 Per item: dataset uitvoeren, JSON opbouwen, authenticatie toevoegen
5 HTTP-aanroep naar het externe endpoint, met de methode van dat endpoint
6 Response loggen en item als verwerkt markeren
Let op: In een testomgeving worden webhooks alleen verstuurd tijdens een actieve testsessie. Zonder sessie worden de meldingen overgeslagen en als "Skipped" gelogd. Zie Omgevingen & aliassen.
Tip: Staan er nergens actieve webhooks, dan controleert SQLio maar af en toe (instelling IdleCheckIntervalMinutes) of dat verandert. Activeer je de eerste webhook, dan kan het dus even duren voordat de eerste melding verstuurd wordt.

Rate limiting

SQLio verstuurt standaard maximaal 2 webhooks per seconde om externe API's niet te overbelasten. Dit is configureerbaar.

Retry logica

Als een webhook-call mislukt, probeert SQLio het automatisch opnieuw:

Fout Actie
5xx fouten (server error) Automatisch opnieuw proberen (standaard maximaal 5 keer; instelbaar bij Instellingen)
429 (rate limit) Automatisch opnieuw proberen
4xx fouten (behalve 429) Niet opnieuw proberen — client-fout
Max retries bereikt Item als verwerkt markeren, foutmelding loggen

Circulaire triggers voorkomen

SQLio gebruikt CONTEXT_INFO() in SQL Server om te voorkomen dat een webhook-trigger zichzelf triggert. Als de webhook-respons data terugschrijft naar dezelfde tabel, wordt er geen nieuwe webhook afgevuurd.

Logging en monitoring

Webhook logs bekijken

Klik op de Log knop bij een webhook om de call-geschiedenis te zien.

Webhooklog met een geslaagde aanroep
Het log: status 201, het antwoord van de transporteur en een geslaagde responseverwerking (groen vinkje).

Log tabel

Kolom Toelichting
Datum/Tijd Tijdstip van de call (UTC)
Type Enkel item of Batch (met aantal)
Status Code HTTP status — groen (2xx), rood (4xx/5xx), geel (overig)
Response body Ingekort antwoord (klik voor volledig)
Response proces Groen vinkje (geslaagd), rood kruis (mislukt), streepje (niet geconfigureerd)

Acties per log-regel

Actie Toelichting
Details Toon volledige request/response informatie
Retry Verstuur de webhook opnieuw
Verwijderen Verwijder deze log-regel

Log detail

Bij het uitklappen van een log-regel zie je:

Details van een logregel
Onder Info: het verstuurde bericht en het volledige antwoord.

Log beheer

Actie Toelichting
Verversen Laad de nieuwste logs
Alle logs wissen Verwijder alle logs voor deze webhook
Meer laden Laad oudere logs (10 per keer)

E-mail notificaties

Optioneel kun je e-mail notificaties inschakelen bij webhook-fouten:

  1. Zet Notificaties aan bij de webhook
  2. Selecteer de primaire ontvanger
  3. Optioneel: voeg secundaire ontvangers toe
  4. Bij een mislukte webhook-call ontvangen de geselecteerde personen een e-mail met foutdetails

Versioning

Elke webhook heeft een versie en optioneel versienotities:

Veld Toelichting
Versie Versienummer, bijvoorbeeld "1.0"
Versienotities Beschrijving van wijzigingen (zichtbaar als tooltip)

Bij het opslaan kun je in een popup de versie bijwerken.

Webhook overzicht

In het overzicht zie je alle webhooks in een tabel:

Kolom Toelichting
ID Intern volgnummer
Naam Webhook naam
Tabel Gemonitorde tabel (schema.tabel)
Omschrijving Beschrijving
Veld/Batch Veldnaam of "Batch" badge
Type Trigger type badge (Insert, Update, Delete)
Status Actief/Inactief toggle
Versie Versiebadge
Error Rode badge als er recente fouten zijn
Acties Bewerken, Verwijderen, JSON Request, Response, Log

Compleet voorbeeld: Order status webhook

Stel je wilt een extern CRM-systeem informeren wanneer een order de status "Verzonden" krijgt.

Stap 1: Maak een dataset aan

Maak eerst een dataset "Order gegevens" met de relevante orderdata (zie handleiding Datasets).

Stap 2: Maak de webhook aan

Stap 3: Veldcondities

Veld Type Conditie Waarde
Status Change Is gelijk aan Verzonden

De webhook gaat alleen af als het veld Status daadwerkelijk wijzigt naar "Verzonden".

Stap 4: Endpoint/Authorization

Selecteer het geconfigureerde CRM endpoint met OAuth 2.0 authenticatie.

Stap 5: JSON Request configureren

  1. Klik op JSON Request
  2. Zet standaardvelden uit (geen metadata nodig)
  3. Selecteer Data bron type: Dataset
  4. Kies dataset: "Order gegevens"
  5. Laat JSON Knooppunt Naam leeg (dataset data direct als root)
  6. Map de dataset parameter orderId naar Parameter → newValue (de primary key van het gewijzigde record)

Stap 6: Opslaan en activeren

De webhook verstuurt nu automatisch de volgende JSON wanneer een order op "Verzonden" wordt gezet:

{
  "orderId": 100,
  "besteldatum": "2024-01-15",
  "klantnummer": "K001",
  "totaalbedrag": 74.50,
  "status": "Verzonden",
  "regels": [
    { "artikelNr": "A001", "aantal": 5, "stuksprijs": 12.50 },
    { "artikelNr": "A002", "aantal": 2, "stuksprijs": 8.00 }
  ],
  "klant": {
    "naam": "ACME Corp",
    "stad": "Amsterdam"
  }
}

Veelvoorkomende problemen

Probleem Oorzaak Oplossing
Webhook gaat niet af Status staat op Inactief Zet de status toggle op Actief
Webhook gaat niet af Veldcondities komen niet overeen Controleer de condities en het trigger type
Oude JSON body na dataset-wijziging JSON config niet bijgewerkt Open de JSON Request configuratie en sla opnieuw op
401 Unauthorized in de logs Authenticatie-instellingen onjuist Controleer het endpoint en de OAuth/API key configuratie
5xx fouten Extern systeem heeft een probleem Controleer het externe endpoint — SQLio probeert automatisch opnieuw
Dataset parameter niet gemapped Verplichte parameter mist mapping Open JSON Request en koppel de parameter
Webhook triggert zichzelf Circulaire trigger SQLio voorkomt dit automatisch via CONTEXT_INFO
Response processing mislukt Mapping klopt niet Controleer de response veld mapping en het doel-endpoint
"Licentielimiet bereikt" Maximum aantal webhooks bereikt Upgrade de licentie of deactiveer ongebruikte webhooks