Automatische notificaties naar externe systemen
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.
Klik in het menu op Webhook Configuratie. Je ziet een overzicht van alle bestaande webhooks.
Bovenaan verschijnt een formulier.
| 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 |
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 |
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.
dbo.Verkooporders (databron nl): bij wijzigen, alleen als Status verandert in Vrijgegeven.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.
| 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 |
| 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" |
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. |
| 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.
| 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.
Klik op de JSON Request knop bij een webhook om te bepalen welke data wordt verstuurd.
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.
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.
orderNr en referentie.
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 |
De dataset-velden worden samengevoegd met de standaard/custom velden:
{
"table": "dbo.Orders",
"operation": "UPDATE",
"orderId": 100,
"orderDate": "2024-01-15",
"customerName": "ACME Corp"
}
De dataset-data wordt onder de opgegeven naam geplaatst:
{
"table": "dbo.Orders",
"operation": "UPDATE",
"data": {
"orderId": 100,
"orderDate": "2024-01-15",
"customerName": "ACME Corp"
}
}
Als je geen standaard- en geen custom velden aanvinkt, wordt alleen de dataset-data verstuurd:
{
"orderId": 100,
"orderDate": "2024-01-15",
"customerName": "ACME Corp"
}
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 |
Onderaan zie je een live preview van de JSON-structuur die verstuurd zal worden. Deze update automatisch als je instellingen wijzigt.
Selecteer in het hoofdformulier bij Endpoint/Authorization het externe endpoint waarnaar de webhook data moet versturen. Dit endpoint bevat de URL en authenticatie-instellingen.
| 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 |
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 |
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. |
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;
SQLioRole. Laat de DBA EXECUTE op de procedure toekennen, anders geeft de responseverwerking de fout "EXECUTE permission was denied".
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 |
| 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 |
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.
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 |
SQLio verstuurt standaard maximaal 2 webhooks per seconde om externe API's niet te overbelasten. Dit is configureerbaar.
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 |
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.
Klik op de Log knop bij een webhook om de call-geschiedenis te zien.
| 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) |
| Actie | Toelichting |
|---|---|
| Details | Toon volledige request/response informatie |
| Retry | Verstuur de webhook opnieuw |
| Verwijderen | Verwijder deze log-regel |
Bij het uitklappen van een log-regel zie je:
| Actie | Toelichting |
|---|---|
| Verversen | Laad de nieuwste logs |
| Alle logs wissen | Verwijder alle logs voor deze webhook |
| Meer laden | Laad oudere logs (10 per keer) |
Optioneel kun je e-mail notificaties inschakelen bij webhook-fouten:
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.
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 |
Stel je wilt een extern CRM-systeem informeren wanneer een order de status "Verzonden" krijgt.
Maak eerst een dataset "Order gegevens" met de relevante orderdata (zie handleiding Datasets).
| Veld | Type | Conditie | Waarde |
|---|---|---|---|
| Status | Change | Is gelijk aan | Verzonden |
De webhook gaat alleen af als het veld Status daadwerkelijk wijzigt naar "Verzonden".
Selecteer het geconfigureerde CRM endpoint met OAuth 2.0 authenticatie.
orderId naar Parameter → newValue (de primary key van het gewijzigde record)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"
}
}
| 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 |