Zum Hauptinhalt springen
Mit ausgehenden Webhooks können Ihre Systeme auf Ereignisse in Flowella reagieren, ohne die API abzufragen. Jeder Webhook hat eine URL, ein Signatur-Secret und eine Liste von Ereignistypen. Wenn eines dieser Ereignisse eintritt, sendet Flowella einen signierten JSON-POST an die URL. Sie können Webhooks in der App unter Settings → Webhooks verwalten (siehe Ausgehende Webhooks hinzufügen und verwalten) oder mit der Webhooks-API. Diese Seite ist die Referenz dafür, was Flowella sendet.

Ereignistypen

Aktivieren Sie diese Ereignisse, wenn Sie einen Webhook hinzufügen, oder übergeben Sie sie in events, wenn Sie einen Webhook mit der API erstellen. Kontaktereignisse werden nur bei diesen API-Aufrufen für einzelne Kontakte ausgelöst. Sie werden nicht ausgelöst bei POST /v1/contacts/bulk-upsert, bei Kontakten, die durch eingehende Nachrichten erstellt werden, oder bei Änderungen, die in der App vorgenommen oder aus HubSpot synchronisiert werden.
Bekanntes Problem: optout.created wird beim ersten Opt-out eines Kontakts auf einer WhatsApp-Nummer nicht ausgelöst, egal ob der Kontakt ein Schlüsselwort sendet oder Sie POST /v1/opt-outs aufrufen. Derzeit wird es nur ausgelöst, wenn sich ein Kontakt, der sich wieder angemeldet hat, erneut abmeldet. Verlassen Sie sich nicht darauf, um jedes Opt-out zu erfassen: Listen Sie Opt-outs mit GET /v1/opt-outs auf (Scope contacts:read).
Flowella sendet außerdem webhook.test, wenn Sie in der App Send test event wählen oder POST /v1/webhooks/{id}/test aufrufen. Sie können es nicht abonnieren. Sein data ist { "test": true, "sentAt": "<ISO 8601 time>" }.
Eine ausgehende Nachricht kann zwei message.sent-Ereignisse erzeugen: eines, wenn Flowella sie an Meta übergibt, und eines, wenn Meta sie als gesendet meldet. Die beiden haben unterschiedliche id-Werte auf oberster Ebene. Verwenden Sie data.messageId, um sie derselben Nachricht zuzuordnen.

Anfrageformat

Flowella sendet jedes Ereignis als HTTP-POST mit diesen Headern: Flowella sendet keine weiteren benutzerdefinierten Header. Ereignistyp und ID stehen im Body.

Body

Jeder Webhook hat eine Payload-Version, die von der Webhooks-API als payloadVersion zurückgegeben wird. Version 1 ist der Standard für jeden Webhook, und weder in der App noch in der API gibt es eine Einstellung, um sie zu ändern. Die beiden Versionen verwenden diese Hüllen:
Flowella sendet kein Ereignis, dessen data größer als 256 KB ist.

Signaturen prüfen

Prüfen Sie die Signatur jeder Anfrage, bevor Sie ihr vertrauen. Flowella berechnet X-Flowella-Signature so:
  • Algorithmus: HMAC mit SHA-256.
  • Schlüssel: das Signatur-Secret als UTF-8-Text, genau wie gespeichert. Ein von der API erzeugtes Secret enthält sein Präfix whsec_.
  • Nachricht: der Roh-Body der Anfrage, Byte für Byte, so wie Flowella ihn gesendet hat. Sonst wird nichts signiert: Die Signatur enthält weder Zeitstempel noch URL.
  • Ausgabe: hexadezimale Kleinbuchstaben, 64 Zeichen, ohne Präfix sha256=.
Zur Prüfung berechnen Sie denselben HMAC über den Roh-Body und vergleichen ihn in konstanter Zeit mit dem Header. In den 24 Stunden nach einer Rotation über die API enthält die Anfrage beide Header: Akzeptieren Sie sie, wenn einer der Header zu einem Ihrer Secrets passt.
Berechnen Sie die Signatur über den Roh-Body, bevor eine Middleware ihn parst oder neu formatiert. Wenn Ihr Framework das JSON parst und Sie es erneut serialisieren, ändern sich die Bytes, und die Signatur stimmt nicht überein.

Antworten, Wiederholungen und Timeouts

Flowella stellt mehrere Ereignisse gleichzeitig zu, daher können sie in anderer Reihenfolge ankommen. Verwenden Sie created_at oder occurred_at, wenn die Reihenfolge wichtig ist. Antworten Sie mit einem 2xx-Status, sobald die Signatur geprüft ist, und verarbeiten Sie das Ereignis dann im Hintergrund. Wie Wiederholungen in der App aussehen, erfahren Sie unter Wiederholungen und Back-off.

Ereignisse deduplizieren

Ihr Endpunkt kann dasselbe Ereignis mehrmals erhalten: durch eine Wiederholung, nachdem Ihr Endpunkt in ein Timeout gelaufen ist, die Anfrage aber trotzdem verarbeitet hat, oder durch erneutes Senden über die API. Deduplizieren Sie anhand der id auf oberster Ebene:
  1. Speichern Sie die id jedes verarbeiteten Ereignisses.
  2. Wenn eine eingehende id bereits gespeichert ist, antworten Sie mit 200 und tun Sie sonst nichts.
  3. Bewahren Sie gespeicherte IDs mindestens so lange auf, wie Sie Zustellungen eventuell erneut senden.
Deduplizieren Sie nicht anhand von data.messageId. Verschiedene Ereignisse zur selben Nachricht, etwa message.sent und message.delivered, teilen sie.

Ereignis-Feed

Der Ereignis-Feed ist eine Pull-Alternative zu Webhooks. GET /v1/events gibt Ereignisse der letzten 7 Tage zurück, einschließlich Ereignissen, die kein Webhook abonniert. Er benötigt den Scope events:read. Filtern Sie mit type (ein Typ oder eine kommagetrennte Liste), occurredAfter und occurredBefore und blättern Sie mit limit und cursor. Jedes Element hat id, type, occurredAt, version, correlationId und data. Die id entspricht der id im Webhook-Body, sodass Sie mit dem Feed Lücken schließen können, nachdem Ihr Endpunkt ausgefallen war.

Webhooks mit der API verwalten

Alle Webhook-Endpunkte benötigen einen API-Schlüssel oder ein OAuth-Zugriffstoken mit dem Scope webhooks:manage. In der App erstellte Schlüssel haben ihn. Zur Authentifizierung siehe die API-Einführung. Webhook-Objekte enthalten id, name, url, events, isActive, consecutiveFailures, signingSecretPrefix (die ersten 8 Zeichen des aktuellen Secrets), payloadVersion, lastTriggeredAt, disabledAt, createdAt und updatedAt. Für Webhooks, die über die API verwaltet werden, gelten einige Regeln:
  • Sie können das Signatur-Secret nicht über die API wählen. POST /v1/webhooks erzeugt eines, das mit whsec_ beginnt, und gibt es einmalig als signingSecret zurück.
  • Erneute Sendungen zählen nicht zum Fehlerzähler und setzen ihn nicht zurück. Flowella stellt eine erneute Sendung nur zu, solange der Webhook aktiv ist und diesen Ereignistyp noch abonniert.
  • Die URL muss denselben URL-Regeln wie in der App entsprechen.

Signatur-Secret rotieren

Rotieren Sie ein Secret, wenn Sie vermuten, dass es offengelegt wurde, oder in regelmäßigen Abständen. Die Rotation funktioniert für jeden Webhook mit einem Secret, auch für Webhooks, deren Secret Sie in der App eingegeben haben.
1

Neues Secret anfordern

Rufen Sie den Rotations-Endpunkt auf und speichern Sie das signingSecret aus der Antwort. Flowella gibt es nur einmal zurück.
2

Beide Secrets 24 Stunden lang akzeptieren

Neue Zustellungen werden in X-Flowella-Signature mit dem neuen Secret und in X-Flowella-Signature-Previous mit dem alten Secret signiert. Ein Handler, der noch das alte Secret verwendet, funktioniert weiter, wenn er beide Header prüft, wie im Beispiel unter Signaturen prüfen.
3

Zum neuen Secret wechseln

Stellen Sie Ihren Handler innerhalb von 24 Stunden auf das neue Secret um. Danach sendet Flowella X-Flowella-Signature-Previous nicht mehr.
Wenn Sie das Secret in der App mit New signing secret ändern, gibt es keine Überschneidung: Das alte Secret funktioniert sofort nicht mehr.

Lokal testen

Um Webhooks auf Ihrem eigenen Computer zu empfangen, machen Sie Ihren lokalen Server über einen öffentlichen Tunnel wie ngrok oder Cloudflare Tunnel erreichbar. Verwenden Sie die öffentliche URL des Tunnels als Endpunkt. Senden Sie dann mit Send test event Anfragen, wann immer Sie sie benötigen. Flowella lehnt lokale und private Adressen ab, daher funktioniert eine localhost-URL nicht.

Verwandte Themen

Webhooks in der App verwalten

Endpunkte hinzufügen, Testereignisse senden und das Zustellprotokoll lesen.

API-Einführung

Authentifizierung, Scopes, Ratenlimits und Fehler.

API-Schlüssel

Erstellen Sie den Schlüssel, den Sie für die Webhooks-API benötigen.

Developer Hub

Letzte API-Anfragen, Quickstarts und die API-Sandbox.
Zuletzt geändert am 24. Oktober 2026