Uitgaande webhooks
Webhooks
Webhooks stellen je in staat om Fotostudio te verbinden met externe tools zoals Make, Zapier, n8n of je eigen back-end. Bij elke belangrijke gebeurtenis (nieuw contact, betaalde factuur, getekend contract...) stuurt Fotostudio automatisch de gegevens naar de URL van jouw keuze.
Een webhook configureren
Ga naar Modules → Uitgaande webhooks en klik op Webhook toevoegen.
Vul de volgende velden in:
Veld | Beschrijving |
|---|---|
Label | Een naam om het gemakkelijk terug te vinden (bv: "Make – facturen") |
Bestemmings-URL | De HTTPS URL die je tool aanlevert (Make, Zapier...) |
Gebeurtenissen | De gebeurtenissen om te monitoren (je kunt er meerdere aanvinken) |
Een geheim wordt automatisch gegenereerd bij het aanmaken. Kopieer het meteen: het wordt daarna niet meer getoond. Het dient om te verifiëren dat de aanroepen wel degelijk van Fotostudio komen.
Beschikbare gebeurtenissen
Gebeurtenis | Geactiveerd wanneer... |
|---|---|
| Een nieuw contact wordt aangemaakt |
| Een contact wordt gewijzigd (coördinaten, info...) |
| Een nieuwe fotoshoot wordt aangemaakt |
| De status van een fotoshoot verandert |
| Een fotoshoot wordt bevestigd |
| Een factuur wordt aangemaakt |
| Een factuur wordt als betaald gemarkeerd |
| Een betaling wordt geregistreerd |
| Een offerte wordt door de klant geaccepteerd |
| Een offerte wordt door de klant geweigerd |
| Een contract wordt getekend |
Formaat van de verzonden gegevens
Elke aanroep is een POST in JSON met de volgende structuur:
{
"event": "invoice.paid",
"timestamp": "2026-06-12T10:30:00Z",
"data": {
...
}
}
HTTP-headers
Header | Waarde |
|---|---|
|
|
| Naam van de gebeurtenis (bv: |
|
|
| Unieke identificatie van de levering |
De handtekening verifiëren
De handtekening in X-FS-Signature wordt als volgt berekend:
HMAC-SHA256(secret, body_json)In Node.js bijvoorbeeld:
const crypto = require('crypto')
const sig = 'sha256=' + crypto.createHmac('sha256', SECRET).update(rawBody).digest('hex')
if (sig !== req.headers['x-fs-signature']) throw new Error('Ongeldige handtekening')
Detail van de gegevens per gebeurtenis
contact.created / contact.updated
{
"id": 123,
"firstname": "Marie",
"lastname": "Dupont",
"email": "marie@example.com",
"phone": "+33 6 12 34 56 78",
"company": "Studio Photo",
"street": "12 rue de la Paix",
"zipcode": "75001",
"city": "Paris",
"country": "France",
"created_at": "2026-01-15T09:00:00Z",
"url": "https://www.fotostudio.io/app/contacts/123"
}
project.created / project.status_changed / project.confirmed
{
"id": 456,
"name": "Huwelijk Dupont",
"start_time": "2026-07-20T14:00:00Z",
"end_time": "2026-07-20T18:00:00Z",
"project_type": "Huwelijk",
"status": "Bevestigd",
"validated": true,
"location": "Château de Versailles",
"contact_id": 123,
"created_at": "2026-01-15T09:00:00Z",
"url": "https://www.fotostudio.io/app/projects/456"
}
invoice.created / invoice.paid
{
"id": 789,
"numero": "F2026-042",
"title": "Huwelijk Dupont",
"invoice_date": "2026-06-01",
"total_price": 1500.00,
"amount_to_pay": 750.00,
"paid": false,
"draft": false,
"contact_id": 123,
"project_id": 456,
"created_at": "2026-06-01T10:00:00Z",
"url": "https://www.fotostudio.io/app/invoices/789"
}
amount_to_payis het resterende te betalen saldo (totaal - reeds ontvangen betalingen).
payment.created
{
"id": 101,
"amount": 750.00,
"payment_date": "2026-06-10",
"payment_type": "Overschrijving",
"invoice_id": 789,
"contact_id": 123,
"created_at": "2026-06-10T14:00:00Z"
}
estimate.accepted / estimate.refused
{
"id": 202,
"numero": "D2026-018",
"title": "Huwelijk Dupont",
"total_price": 1500.00,
"accepted": true,
"refused": false,
"accepted_at": "2026-06-05T16:00:00Z",
"contact_id": 123,
"project_id": 456,
"created_at": "2026-05-20T09:00:00Z",
"url": "https://www.fotostudio.io/app/estimates/202"
}
contract.signed
{
"id": 303,
"title": "Contract Huwelijk Dupont",
"signed_at": "2026-06-08T11:30:00Z",
"project_id": 456,
"contact_id": 123,
"created_at": "2026-05-25T10:00:00Z",
"url": "https://www.fotostudio.io/app/contracts/303"
}
Geschiedenis van de leveringen
In de fiche van elke webhook toont het tabblad Logs de geschiedenis van de aanroepen met:
- de datum en tijd
- de geactiveerde gebeurtenis
- de status (succes / mislukt)
- de HTTP-responscode
- de foutmelding bij mislukking
Bij mislukking probeert Fotostudio automatisch tot 3 keer opnieuw met een exponentiële vertraging. Je kunt ook handmatig een aanroep opnieuw starten vanuit de logs.
Gebruiken met Make
- Maak in Make een nieuw scenario aan en voeg een module Webhooks → Custom webhook toe
- Kopieer de door Make gegenereerde URL
- Maak in Fotostudio een webhook aan met deze URL en selecteer de gewenste gebeurtenissen
- Activeer een testgebeurtenis vanuit Fotostudio (bijvoorbeeld: maak een contactpersoon aan)
- Make ontvangt de gegevens. Vervolgens kun je je automatisering opzetten
Gebruiken met Zapier
- Maak in Zapier een nieuwe Zap aan en kies ‘Webhooks by Zapier → Catch Hook’ als trigger
- Kopieer de URL die Zapier je geeft
- Maak in Fotostudio een webhook aan met deze URL
- Start een testgebeurtenis. Zapier herkent automatisch de gegevensstructuur
- Stel je actie in (Google Sheets, Notion, Slack...)
FAQ
Wat gebeurt er als mijn server niet beschikbaar is?
Fotostudio probeert het drie keer met een steeds langere wachttijd. Na drie pogingen wordt de verzending als mislukt gemarkeerd, maar blijft deze wel in de logbestanden staan. Je kunt de verzending handmatig opnieuw starten.
Binnen hoeveel tijd moet mijn webhook reageren?
Je endpoint moet binnen 10 seconden reageren. Daarna wordt het verzoek als mislukt beschouwd.
Kan ik meerdere webhooks hebben?
Ja, je kunt zoveel webhooks aanmaken als je wilt, elk met zijn eigen gebeurtenissen en URL.
Hoe schakel ik een webhook tijdelijk uit?
Gebruik in de lijst de schakelaar om een webhook in of uit te schakelen zonder deze te verwijderen.
Bijgewerkt op: 29/06/2026
Dankuwel!
