Ausgehende Webhooks
Webhooks
Webhooks ermöglichen es dir, Fotostudio mit externen Tools wie Make, Zapier, n8n oder deinem eigenen Backend zu verbinden. Bei jedem wichtigen Ereignis (neuer Kontakt, bezahlte Rechnung, unterzeichneter Vertrag...) sendet Fotostudio automatisch die Daten an die URL deiner Wahl.
Einen Webhook konfigurieren
Gehe zu Module → Ausgehende Webhooks und klicke auf Neuer Webhook.
Fülle die folgenden Felder aus:
Feld | Beschreibung |
|---|---|
Label | Ein Name zur Orientierung (z.B. "Make – Rechnungen") |
Ziel-URL | Die HTTPS-URL von deinem Tool (Make, Zapier...) |
Ereignisse | Die zu überwachenden Ereignisse (du kannst mehrere auswählen) |
Ein Geheimnis wird automatisch bei der Erstellung generiert. Kopiere es sofort: Es wird danach nicht mehr angezeigt. Es dient zur Überprüfung, dass die Aufrufe tatsächlich von Fotostudio kommen.
Verfügbare Ereignisse
Ereignis | Ausgelöst wenn... |
|---|---|
| Ein neuer Kontakt wird erstellt |
| Ein Kontakt wird geändert (Kontaktdaten, Infos...) |
| Eine neue Sitzung wird erstellt |
| Der Status einer Sitzung ändert sich |
| Eine Sitzung wird bestätigt |
| Eine Rechnung wird erstellt |
| Eine Rechnung wird als bezahlt markiert |
| Eine Zahlung wird erfasst |
| Ein Angebot wird vom Kunden angenommen |
| Ein Angebot wird vom Kunden abgelehnt |
| Ein Vertrag wird unterschrieben |
Format der gesendeten Daten
Jeder Aufruf ist ein POST in JSON mit folgender Struktur:
{
"event": "invoice.paid",
"timestamp": "2026-06-12T10:30:00Z",
"data": {
...
}
}
HTTP-Header
Header | Wert |
|---|---|
|
|
| Name des Ereignisses (z.B. |
|
|
| Eindeutige Kennung der Zustellung |
Die Signatur überprüfen
Die Signatur in X-FS-Signature wird wie folgt berechnet:
HMAC-SHA256(secret, body_json)In Node.js zum Beispiel:
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('Ungültige Signatur')
Details der Daten pro Ereignis
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": "Hochzeit Dupont",
"start_time": "2026-07-20T14:00:00Z",
"end_time": "2026-07-20T18:00:00Z",
"project_type": "Hochzeit",
"status": "Bestätigt",
"validated": true,
"location": "Schloss 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": "Hochzeit 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_payist der noch zu zahlende Restbetrag (Gesamt - bereits erhaltene Zahlungen).
payment.created
{
"id": 101,
"amount": 750.00,
"payment_date": "2026-06-10",
"payment_type": "Überweisung",
"invoice_id": 789,
"contact_id": 123,
"created_at": "2026-06-10T14:00:00Z"
}
estimate.accepted / estimate.refused
{
"id": 202,
"numero": "D2026-018",
"title": "Hochzeit 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": "Vertrag Hochzeit 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"
}
Zustellungsverlauf
Im Reiter Logs jedes Webhooks findest du den Verlauf aller Aufrufe mit:
- Datum und Uhrzeit
- dem ausgelösten Ereignis
- dem Status (erfolgreich / fehlgeschlagen)
- dem HTTP-Antwortcode
- der Fehlermeldung im Fehlerfall
Schlägt ein Aufruf fehl, versucht Fotostudio die Zustellung automatisch bis zu 3-mal erneut mit exponentiell ansteigendem Zeitabstand. Du kannst einen Aufruf auch jederzeit manuell über die Logs erneut ausführen.
Verwendung mit Make
- Erstelle in Make ein neues Szenario und füge das Modul Webhooks → Custom webhook hinzu.
- Kopiere die von Make generierte URL.
- Erstelle in Fotostudio einen Webhook mit dieser URL und wähle die gewünschten Ereignisse aus.
- Löse in Fotostudio ein Testereignis aus (z. B. indem du einen Kontakt erstellst).
- Make empfängt die Daten. Anschließend kannst du deine Automatisierung erstellen.
Verwendung mit Zapier
- Erstelle in Zapier einen neuen Zap und wähle Webhooks by Zapier → Catch Hook als Trigger aus.
- Kopiere die von Zapier bereitgestellte URL.
- Erstelle in Fotostudio einen Webhook mit dieser URL.
- Löse ein Testereignis aus. Zapier erkennt die Datenstruktur automatisch.
- Konfiguriere deine gewünschte Aktion (Google Sheets, Notion, Slack usw.).
FAQ
Was passiert, wenn mein Server nicht erreichbar ist?
Fotostudio versucht die Zustellung bis zu 3-mal mit zunehmend längeren Wartezeiten erneut. Nach dem dritten Versuch wird die Zustellung als fehlgeschlagen markiert, bleibt jedoch in den Logs erhalten. Du kannst sie jederzeit manuell erneut ausführen.
Wie schnell muss mein Webhook antworten?
Dein Endpoint muss innerhalb von 10 Sekunden antworten. Danach wird die Anfrage als fehlgeschlagen betrachtet.
Kann ich mehrere Webhooks erstellen?
Ja, du kannst beliebig viele Webhooks erstellen – jeder mit eigenen Ereignissen und einer eigenen URL.
Wie kann ich einen Webhook vorübergehend deaktivieren?
Nutze in der Liste den Schalter, um einen Webhook zu aktivieren oder zu deaktivieren, ohne ihn zu löschen.
Aktualisiert am: 30/06/2026
Danke!
