> ## Documentation Index
> Fetch the complete documentation index at: https://knowledge.flowella.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Webhaken

> Konfigurieren Sie ausgehende Webhooks in Flowella: Endpunkte hinzufügen, Ereignisse abonnieren, Signaturen prüfen und Zustellversuche im Log einsehen.

<Frame>
  <img src="https://mintcdn.com/flowella/PuGNWwHHg6Nlq3MM/images/Screenshots/flowella-webhooks.png?fit=max&auto=format&n=PuGNWwHHg6Nlq3MM&q=85&s=6b4378754549ac127c02626ed49d468d" alt="Flowella outbound webhooks" width="2774" height="1686" data-path="images/Screenshots/flowella-webhooks.png" />
</Frame>

Mit Webhooks kann Flowella Ereignisse in Echtzeit an Ihre eigenen Systeme weiterleiten. So können Sie beispielsweise Ihr CRM benachrichtigen, wenn eine WhatsApp-Nachricht zugestellt wird, oder einen Hintergrundjob starten, wenn die Synchronisierung eines HubSpot-Formulars fehlschlägt. Diese Seite behandelt den In-App-Bildschirm **Einstellungen → Webhooks**.

Die Schemata für die Nutzdaten der einzelnen Ereignisse finden Sie unter [Webhooks-Referenz](/de/api-reference/webhooks).

## Wer kann Webhooks verwalten

Nur die Rollen **Owner** und **Admin** sehen Einstellungen → Webhooks. Andere Rollen haben keinen Zugriff.

## Hinzufügen eines Webhook-Endpunkts

<Steps>
  <Step title="Öffnen Sie Einstellungen → Webhooks">
    Gehen Sie in der linken Navigation zu **Einstellungen → Webhooks**.
  </Step>

  <Step title="Klicken Sie auf Endpunkt hinzufügen">
    Geben Sie die öffentliche HTTPS-URL ein, an die Flowella Ereignisse posten soll. HTTP (ohne TLS) wird nicht akzeptiert.
  </Step>

  <Step title="Wählen Sie die Ereignisse, die Sie abonnieren möchten">
    Wählen Sie einen oder mehrere Ereignistypen - zum Beispiel `message.delivered`, `template.approved`, `flow.sync.failed`. Die vollständige Ereignisliste finden Sie unter [Webhooks-Referenz](/de/api-reference/webhooks). Sie können alle Ereignisse mit einem einzigen Kontrollkästchen abonnieren.
  </Step>

  <Step title="Kopieren Sie das Unterschriftsgeheimnis">
    Flowella zeigt das Signiergeheimnis **einmal** am Ende des Erstellungsvorgangs an. Speichern Sie es in einem sicheren Speicher - Sie werden es verwenden, um die HMAC-Signatur bei jeder eingehenden Anfrage zu überprüfen.
  </Step>

  <Step title="Ein Test-Ereignis senden">
    Verwenden Sie die Schaltfläche **Test senden**, um ein synthetisches Ereignis an Ihrem Endpunkt auszulösen. Das Sendeprotokoll zeichnet das Ergebnis auf, so dass Sie sich vergewissern können, dass Ihr Handler richtig verkabelt ist, bevor Sie live gehen.
  </Step>
</Steps>

## Signierung und Überprüfung

Jede Webhook-Anfrage enthält einen `X-Flowella-Signature`-Header mit einer HMAC-SHA256-Signatur des rohen Anfragekörpers, die mit dem Signiergeheimnis Ihres Endpunkts berechnet wurde. Überprüfen Sie ihn, bevor Sie der Nutzlast vertrauen:

<CodeGroup>
  ```js Node.js theme={null}
  import crypto from "crypto";

  function verify(rawBody, signature, secret) {
    const expected = crypto.createHmac("sha256", secret).update(rawBody).digest("hex");
    return crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(signature));
  }
  ```

  ```python Python theme={null}
  import hmac, hashlib

  def verify(raw_body: bytes, signature: str, secret: str) -> bool:
      expected = hmac.new(secret.encode(), raw_body, hashlib.sha256).hexdigest()
      return hmac.compare_digest(expected, signature)
  ```

  ```ruby Ruby theme={null}
  require "openssl"

  def verify(raw_body, signature, secret)
    expected = OpenSSL::HMAC.hexdigest("sha256", secret, raw_body)
    Rack::Utils.secure_compare(expected, signature)
  end
  ```

  ```php PHP theme={null}
  function verify(string $rawBody, string $signature, string $secret): bool {
      $expected = hash_hmac('sha256', $rawBody, $secret);
      return hash_equals($expected, $signature);
  }
  ```
</CodeGroup>

Die Anfrage umfasst auch:

* `X-Flowella-Timestamp` - den Unix-Zeitstempel zur Sendezeit. Weisen Sie Anfragen zurück, bei denen der Zeitstempel mehr als 5 Minuten in der Vergangenheit oder in der Zukunft liegt, um Replay-Angriffe zu verhindern.
* `X-Flowella-Event` - der Ereignistyp (zum Beispiel `message.delivered`).
* `X-Flowella-Delivery` - eine eindeutige Zustellungs-ID, nützlich für die Deduplizierung.

## Wiederholungen und Back-Off

Wenn Ihr Endpunkt einen Statuscode ungleich 2xx zurückgibt (oder nach 10 Sekunden eine Zeitüberschreitung eintritt), wiederholt Flowella den Vorgang mit exponentieller Verzögerung:

| Attempt       | Delay after previous |
| ------------- | -------------------- |
| 1 (initial)   | -                    |
| 2             | 30 Sekunden          |
| 3             | 2 Minuten            |
| 4             | 10 Minuten           |
| 5             | 1 Stunde             |
| 6             | 6 Stunden            |
| 7 (endgültig) | 24 Stunden           |

Nach 7 fehlgeschlagenen Versuchen wird die Zustellung als **fehlgeschlagen** markiert und abgebrochen. Der Endpunkt wird **nicht** automatisch deaktiviert - Sie können weiterhin zukünftige Ereignisse über denselben Endpunkt empfangen.

Wenn 100 aufeinanderfolgende Zustellungen fehlschlagen, **pausiert** Flowella den Endpunkt automatisch und sendet eine `WEBHOOK_PAUSED`-Benachrichtigung. Nehmen Sie den Vorgang über das Menü der Zeile wieder auf, sobald Sie das zugrunde liegende Problem behoben haben.

## Zustellungsprotokoll

Jede Endpunktzeile wird zu einem Zustellungsprotokoll, das die Versuche der letzten 7 Tage anzeigt:

* **Ereignistyp und ID**
* **Status** - erfolgreich, fehlgeschlagen, erneuter Versuch
* **Versuchsnummer**
* **Antwortcode und Dauer**
* **Antwortkörper** (erste 1 KB)
* **Gesendet an**

Klicken Sie auf eine beliebige Zustellung, um die vollständige Anfrage und Antwort zu sehen, oder um sie **manuell erneut zuzustellen**.

## Endpunkte verwalten

Über das Menü der Endpunktzeile können Sie:

* **Bearbeiten** - die URL oder die Ereignisabonnements ändern. (Das Signiergeheimnis bleibt dabei erhalten.)
* **Geheimnis rotieren** - ein neues Signiergeheimnis erzeugen. Das alte Geheimnis funktioniert sofort nicht mehr, stimmen Sie die Änderung also mit Ihrem Handler ab.
* **Pause** - stoppt vorübergehend die Lieferungen, ohne die Konfiguration zu verlieren.
* **Wiederaufnahme** - schaltet einen pausierten Endpunkt wieder ein.
* **Löschen** - entfernt den Endpunkt und seinen Zustellungsverlauf.

## Allgemeine Fragen

<AccordionGroup>
  <Accordion title="Kann ich mehr als einen Endpunkt haben?">
    Ja - es gibt keine feste Grenze. Die meisten Unternehmen haben 1-3 Endpunkte (Produktion, Staging und eine interne Protokollsenke). Halten Sie die Anzahl niedrig, damit sich die Ereignisse vorhersehbar verteilen.
  </Accordion>

  <Accordion title="Was ist der Unterschied zwischen Webhooks und der API?">
    Die API ist **pull** - Ihr Code fragt Flowella nach dem Status. Webhooks sind **Push** - Flowella teilt Ihrem Code mit, wenn sich der Status ändert. Verwenden Sie Webhooks für alles, was Sie sonst abfragen würden.
  </Accordion>

  <Accordion title="Enthalten Webhooks sensible Daten?">
    Webhook-Payloads enthalten Konversations-IDs, Telefonnummern von Kontakten, Nachrichteninhalte und Vorlagennamen. Behandeln Sie das Geheimnis und die Endpunkt-URL als sensibel. Schränken Sie Ihren Endpunkt auf POST aus dem IP-Bereich von Flowella ein, wenn Ihre Infrastruktur dies zulässt.
  </Accordion>

  <Accordion title="Wie kann ich Webhooks lokal testen?">
    Verwenden Sie ein Tunnel-Tool (ngrok, Cloudflare Tunnel), um Ihren localhost-Endpunkt einer öffentlichen HTTPS-URL auszusetzen, und verweisen Sie dann einen **Test-Endpunkt** auf diesen. Geben Sie keine Tunnel-URL in Ihren Produktionsendpunkt ein - sie laufen ab.
  </Accordion>
</AccordionGroup>

## Verwandt

<CardGroup cols={2}>
  <Card title="Webhooks-Referenz" icon="webhook" href="/de/api-reference/webhooks">
    Ereignistypen, Nutzdatenschemata und Kopfzeilen.
  </Card>

  <Card title="API-Schlüssel" icon="key" href="/de/settings/api-keys">
    Die andere Hälfte der programmatischen Integration.
  </Card>

  <Card title="API-Einführung" icon="code" href="/de/api-reference/introduction">
    Fehler, Ratenbeschränkungen und Paginierung.
  </Card>

  <Card title="Ereignisse zur Benachrichtigung" icon="bell" href="/de/app/notification-events">
    Die gleichen Ereignisse, die im In-App-Feed und per E-Mail geliefert werden.
  </Card>
</CardGroup>
