> ## Knowledge Base Index
> Fetch the complete knowledge base index at: https://help.fotostudio.io/sitemap.xml
> Use this file to discover available pages before exploring further.
> Pure-Markdown content can be obtained by appending a '.md' suffix to the content URLs listed in the sitemap (without the trailing slash).

# 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... |
| ---- |
| `contact.created` | Ein neuer Kontakt wird erstellt |
| `contact.updated` | Ein Kontakt wird geändert (Kontaktdaten, Infos...) |
| `project.created` | Eine neue Sitzung wird erstellt |
| `project.status_changed` | Der Status einer Sitzung ändert sich |
| `project.confirmed` | Eine Sitzung wird bestätigt |
| `invoice.created` | Eine Rechnung wird erstellt |
| `invoice.paid` | Eine Rechnung wird als bezahlt markiert |
| `payment.created` | Eine Zahlung wird erfasst |
| `estimate.accepted` | Ein Angebot wird vom Kunden angenommen |
| `estimate.refused` | Ein Angebot wird vom Kunden abgelehnt |
| `contract.signed` | Ein Vertrag wird unterschrieben |

---

## Format der gesendeten Daten

Jeder Aufruf ist ein `POST` in JSON mit folgender Struktur:

```json
{
  "event": "invoice.paid",
  "timestamp": "2026-06-12T10:30:00Z",
  "data": {
    ...
  }
}
```

### HTTP-Header

| Header | Wert |
| ---- |
| `Content-Type` | `application/json` |
| `X-FS-Event` | Name des Ereignisses (z.B. `invoice.paid`) |
| `X-FS-Signature` | `sha256=<hmac>` (HMAC-SHA256-Signatur des Body) |
| `X-FS-Delivery-Id` | 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:

```js
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`

```json
{
  "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`

```json
{
  "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`

```json
{
  "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_pay` ist der noch zu zahlende Restbetrag (Gesamt - bereits erhaltene Zahlungen).

### `payment.created`

```json
{
  "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`

```json
{
  "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`

```json
{
  "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

1. Erstelle in Make ein neues Szenario und füge das Modul **Webhooks → Custom webhook** hinzu.
2. Kopiere die von Make generierte URL.
3. Erstelle in Fotostudio einen Webhook mit dieser URL und wähle die gewünschten Ereignisse aus.
4. Löse in Fotostudio ein Testereignis aus (z. B. indem du einen Kontakt erstellst).
5. Make empfängt die Daten. Anschließend kannst du deine Automatisierung erstellen.

---

## Verwendung mit Zapier

1. Erstelle in Zapier einen neuen Zap und wähle **Webhooks by Zapier → Catch Hook** als Trigger aus.
2. Kopiere die von Zapier bereitgestellte URL.
3. Erstelle in Fotostudio einen Webhook mit dieser URL.
4. Löse ein Testereignis aus. Zapier erkennt die Datenstruktur automatisch.
5. 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.