Zum Inhalt springen
OmniChannels.ai

WhatsApp-Webhooks: Ereignisse, Sicherheit und Wiederholungen

WhatsApp-Webhooks verstehen: Nachrichten- und Statusereignisse, zuverlässiger Handler, Metas Signaturprüfung, Wiederholungen, Idempotenz, fehlende Ereignisse.

Aktualisiert 10 Min. Lesezeit

Von OmniChannels.ai Editorial Team · Geprüft von BroadNet Messaging Solutions Team

Integration

Kurze Antwort

Ein WhatsApp-Webhook ist ein HTTPS-Endpunkt auf Ihrem Server, der Ereignisse empfängt: Zustellstatus für von Ihnen gesendete Nachrichten und Nachrichten, die Kunden Ihnen senden. Bei OmniChannels.ai kommen Status als SUBMITTED, SENT, DELIVERED, READ, FAILED oder REJECTED an. Speichern Sie den Roh-Body, antworten Sie schnell mit 2xx, deduplizieren Sie nach Nachrichten-ID und verarbeiten Sie asynchron. Meta signiert seine eigenen Webhooks; unsere Dokumentation definiert keinen Signatur-Header, sichern Sie Ihren Endpunkt daher auf Transport- und Anwendungsebene ab.

Auf dieser Seite
  1. Was sind WhatsApp-Webhooks und warum sollte man sie nutzen?
  2. Welche Ereignisse und Status erhalte ich?
  3. Wie richte ich den Endpunkt ein?
  4. Wie sieht die Payload aus?
  5. Wie schreibe ich einen zuverlässigen Handler?
  6. Wie sichere ich einen WhatsApp-Webhook ab?
  7. Was passiert, wenn die Zustellung fehlschlägt?
  8. Wie stelle ich fehlende Ereignisse wieder her?
  9. Praxisbeispiel: die Benachrichtigungs-Pipeline eines Händlers
  10. Welche typischen Fehler gibt es?
  11. So unterstützt OmniChannels.ai

Das Wichtigste

  • Webhooks senden Status und eingehende Nachrichten an Ihren HTTPS-Endpunkt, sodass Sie nicht pollen müssen; WhatsApp-Status werden auf SUBMITTED, SENT, DELIVERED, READ, FAILED und REJECTED normalisiert.
  • Ein zuverlässiger Handler tut drei Dinge in dieser Reihenfolge: Roh-Ereignis speichern, 2xx zurückgeben, dann asynchron und idempotent verarbeiten.
  • Status können in falscher Reihenfolge oder doppelt eintreffen, ordnen Sie sie daher nach Rang und lassen Sie ein verspätetes SENT nie ein gespeichertes DELIVERED überschreiben.
  • Meta signiert Webhooks an Apps mit einem X-Hub-Signature-256-Header, doch die API-Spezifikation von OmniChannels.ai definiert keine Webhook-Signatur, nutzen Sie daher HTTPS, einen nicht erratbaren Pfad und Body-Validierung.
  • Wurden Ereignisse verpasst, lesen Sie den WhatsApp-Status je Batch über den Bulk-Insights-Endpunkt, statt Nachrichten erneut zu senden.

Dieser Leitfaden richtet sich an Entwickler, die WhatsApp-Ereignisse zuverlässig empfangen müssen: Zustellstatus für die von ihnen gesendeten Nachrichten und eingehende Nachrichten von Kunden. Er erklärt, wie Webhooks funktionieren, was im Handler zu bauen ist, wie sich die Sicherheit zwischen Metas Webhooks und unseren unterscheidet und was zu tun ist, wenn Ereignisse fehlen.

Was sind WhatsApp-Webhooks und warum sollte man sie nutzen?

WhatsApp-Webhooks sind HTTP-Callbacks. Wenn sich der Zustand einer Nachricht ändert oder ein Kunde Ihnen schreibt, sendet die Plattform einen POST mit JSON-Body an Ihren Endpunkt. Sie müssen nicht pollen und sehen Ereignisse, sobald sie eintreten.

Zwei Ereignisfamilien sind wichtig:

  • Statusereignisse für von Ihnen gesendete Nachrichten: in der Warteschlange, gesendet, zugestellt, gelesen, fehlgeschlagen.
  • Eingehende Nachrichten von Kunden, die das 24-Stunden-Kundenservice-Fenster öffnen oder verlängern. Siehe unseren Fenster-Leitfaden.

Ein Sendeaufruf sagt Ihnen nur, dass Nachrichten in die Warteschlange gestellt wurden. Im Webhook erfahren Sie, was mit jedem Empfänger geschehen ist.

Welche Ereignisse und Status erhalte ich?

Bei OmniChannels.ai melden alle Kanäle dieselben normalisierten Status, sodass ein Handler WhatsApp, SMS und die übrigen Kanäle bedienen kann.

Status Bedeutung Final?
SUBMITTED Von der Plattform angenommen und in die Warteschlange gestellt Nein
SENT An den Kanal übergeben Nein
DELIVERED Auf dem Gerät des Empfängers bestätigt Meist; READ kann folgen
READ Vom Empfänger geöffnet, sofern der Kanal Lesebestätigungen meldet Ja
FAILED Nicht zugestellt; das Ereignis enthält einen Grund, sofern verfügbar Ja
REJECTED Abgelehnt, zum Beispiel wegen gesperrter Inhalte oder eines nicht registrierten Absenders Ja

Behandeln Sie Status als Abfolge, die in falscher Reihenfolge eintreffen kann, und rechnen Sie mit neuen Werten im Lauf der Zeit. Scheitern Sie nicht an einem Status, den Sie nicht kennen. Siehe Nachrichten-Zustellstatus erklärt.

Wie richte ich den Endpunkt ein?

Stellen Sie einen HTTPS-Endpunkt bereit, geben Sie die URL Ihrem Anbieter und testen Sie dann mit Ihrer eigenen Nummer.

  1. Erstellen Sie einen Endpunkt, der POST mit JSON-Body akzeptiert, zum Beispiel https://api.example.com/webhooks/omnichannels.
  2. Senden Sie die URL an unser Team oder Ihren Account-Admin, damit sie in Ihrem Account konfiguriert wird. Reseller können einen eigenen Webhook pro Unterkonto haben.
  3. Senden Sie eine Testnachricht an Ihre eigene Nummer und prüfen Sie, dass die Ereignisse ankommen.

Während der Entwicklung gibt Ihnen ein Tunnel wie ngrok Ihrem lokalen Server eine öffentliche HTTPS-URL. Wenn Sie zusätzlich eine App direkt mit Meta verbinden, ist Metas Endpunktverifizierung ein separater Schritt: eine GET-Anfrage mit einem Verify-Token und einem hub.challenge-Wert, auf die Sie mit 200 und dem Challenge antworten, wie in Metas Dokumentation zum Webhook-Endpunkt beschrieben.

Wie sieht die Payload aus?

Das variiert je Kanal. Die API-Spezifikation definiert kein einheitliches Webhook-Schema, protokollieren Sie daher zuerst den Roh-Body und ordnen Sie die benötigten Felder anhand echter Ereignisse Ihres Accounts zu. Das Beispiel zeigt, welche Art von Informationen ein Zustellereignis trägt, und ist nur illustrativ.

{
  "messageId": "2603121407537573731",
  "channel": "SMS",
  "destination": "447700900123",
  "status": "DELIVERED",
  "timestamp": "2026-10-10T09:15:42Z",
  "reason": null
}

Programmieren Sie nicht gegen diese Feldnamen, ohne ein echtes Ereignis zu prüfen. Bitten Sie Ihren Onboarding-Ingenieur um Beispiel-Payloads je Kanal und bewahren Sie sie als Test-Fixtures auf. Die weitere Dokumentation finden Sie in der Webhooks-Referenz.

Wie schreibe ich einen zuverlässigen Handler?

Tun Sie drei Dinge in dieser Reihenfolge: das Roh-Ereignis speichern, mit einem 2xx bestätigen, dann asynchron verarbeiten. Der folgende Handler folgt dem Muster aus unserer Dokumentation.

import express from "express";

const app = express();

// Den Roh-Body erfassen, um ihn exakt wie empfangen zu speichern.
app.post(
  "/webhooks/omnichannels",
  express.json({ verify: (req, _res, buf) => { req.rawBody = buf.toString("utf8"); } }),
  async (req, res) => {
    try {
      await db.webhookEvents.insert({ receivedAt: new Date(), body: req.rawBody });
    } catch (err) {
      return res.sendStatus(500); // Speichern fehlgeschlagen: Ereignis wiederholen lassen
    }
    res.sendStatus(200);          // schnell bestätigen
    queue.publish("status-events", req.body); // die eigentliche Arbeit woanders erledigen
  },
);

// Worker: idempotente Verarbeitung
async function processEvent(event) {
  const id = event.messageId ?? event.message_id ?? event.id; // je Kanal zuordnen
  const status = event.status;
  const rank = { SUBMITTED: 1, SENT: 2, DELIVERED: 3, READ: 4, FAILED: 4, REJECTED: 4 };

  const current = await db.messages.findOne({ providerId: id });
  if (!current) return; // unbekannte Nachricht: protokollieren und untersuchen
  if ((rank[status] ?? 0) <= (rank[current.status] ?? 0)) return; // Duplikat oder veraltet

  await db.messages.update({ providerId: id }, { status, updatedAt: new Date() });
}
from datetime import datetime, timezone
from flask import Flask, request

app = Flask(__name__)

RANK = {"SUBMITTED": 1, "SENT": 2, "DELIVERED": 3, "READ": 4, "FAILED": 4, "REJECTED": 4}


@app.post("/webhooks/omnichannels")
def omnichannels_webhook():
    raw = request.get_data(as_text=True)
    try:
        db.webhook_events.insert({"received_at": datetime.now(timezone.utc), "body": raw})
    except Exception:
        return "", 500           # Speichern fehlgeschlagen: Ereignis wiederholen lassen
    queue.publish("status-events", raw)  # asynchron verarbeiten
    return "", 200               # schnell bestätigen

Die Objekte db und queue sind Ihr eigener Speicher und Ihre eigene Job-Warteschlange. Die rank-Map macht die Verarbeitung idempotent: Ein Duplikat oder veraltetes Ereignis ist kein Fortschritt und wird ignoriert.

Regeln für einen zuverlässigen Handler

  • Antworten Sie innerhalb weniger Sekunden. Erledigen Sie vor der Antwort keine aufwendige Arbeit.
  • Geben Sie 2xx erst zurück, nachdem das Ereignis gespeichert ist. Schlägt das Speichern fehl, geben Sie 5xx zurück.
  • Deduplizieren Sie nach Nachrichten-ID. Derselbe Status kann mehrfach eintreffen.
  • Senden Sie nie eine Nachricht aus dem Handler erneut. Entscheiden Sie über Wiederholungen in einem separaten Job, nach Prüfung des Status.
  • Bewahren Sie den Roh-Body auf für die Fehlersuche und um Ereignisse nach einer Korrektur wiederzugeben.

Wie sichere ich einen WhatsApp-Webhook ab?

Das hängt davon ab, wer an Ihren Endpunkt sendet. Meta signiert Webhooks, die es an bei Meta registrierte Apps sendet. Die API-Spezifikation von OmniChannels.ai definiert keinen Webhook-Signatur-Header, warten Sie also nicht auf einen.

Meta an Ihre eigene App OmniChannels.ai an Ihren Endpunkt
Signatur Header X-Hub-Signature-256, laut Metas Dokumentation In der API-Spezifikation nicht definiert
Verifizierung HMAC-SHA256 der Roh-Payload mit Ihrem App Secret, verglichen mit dem Header Nicht zutreffend
Ihre Kontrollen Signatur bei jedem POST prüfen HTTPS mit gültigem Zertifikat, nicht erratbarer Pfad, strenge Body-Validierung

Zu Metas Verfahren sagt Metas Dokumentation, dass Sie aus der JSON-Payload mit Ihrem App Secret einen HMAC-SHA256-Hash erzeugen und mit dem Wert nach sha256= im Header X-Hub-Signature-256 vergleichen. HMAC selbst ist in RFC 2104 definiert. Berechnen Sie ihn über die Roh-Bytes, nicht über ein neu serialisiertes Objekt, und vergleichen Sie in konstanter Zeit.

Für unseren Endpunkt:

  • Nutzen Sie ausschließlich HTTPS mit gültigem Zertifikat.
  • Verwenden Sie einen langen, nicht erratbaren Pfad und tauschen Sie ihn aus, wenn er bekannt wird.
  • Validieren Sie die Form des Bodys und weisen Sie Unerwartetes ab.
  • Behandeln Sie Ereignisse als Benachrichtigungen. Bestätigen Sie vor einer unumkehrbaren Aktion wie einer Erstattung oder Betrugssperre den Zustand mit einem Abruf.

Was passiert, wenn die Zustellung fehlschlägt?

Wiederholungen hängen vom Absender ab. Metas Dokumentation sagt, dass eine fehlgeschlagene Zustellung mit abnehmender Häufigkeit bis zu 7 Tage lang wiederholt wird, was doppelte Benachrichtigungen erzeugen kann. Das ist ein Grund, idempotent zu sein, auch wenn Sie selten Duplikate sehen. Klären Sie das Wiederholungsverhalten für Ereignisse unserer Plattform mit Ihrem Onboarding-Ingenieur, statt anzunehmen, dass es dem von Meta entspricht.

Bauen Sie in jedem Fall auf Verlust ebenso wie auf Duplikate: Ihr Endpunkt kann während eines Deployments ausfallen, und eine Firewall-Regel kann Anfragen stillschweigend verwerfen.

Wie stelle ich fehlende Ereignisse wieder her?

Fragen Sie den Batch ab, senden Sie die Nachricht nicht erneut.

Bedarf Aufruf Hinweise
WhatsApp-Status je Empfänger lesen GET /whatsapp/message/bulk-insights Einen Batch nach status oder destination filtern; mit page und size paginiert
SMS-Zustellberichte erneut senden POST /sms/resendDlr Nach startDate, endDate, senderId und messageStatus filtern
curl "https://api.broadnet.me/whatsapp/message/bulk-insights?batch_Id=2609091405000000001&page=0&size=100" \
  -H "Authorization: Bearer $BROADNET_TOKEN"

batch_Id ist die vom Sendeaufruf zurückgegebene ID, und page ist nullbasiert. Führen Sie einen nächtlichen Abgleich durch, der die Batches des Vortags liest und Lücken füllt.

Checkliste zur Fehlersuche

  1. Ist die URL im richtigen Account oder Unterkonto konfiguriert?
  2. Ist der Endpunkt über HTTPS mit gültigem Zertifikat erreichbar?
  3. Antwortet er schnell mit 2xx oder läuft er in ein Timeout?
  4. Blockiert eine Firewall- oder WAF-Regel die Anfragen?
  5. Protokollieren Sie den Roh-Body vor dem Parsen, damit ein Parserfehler das Ereignis nicht verbirgt?

Praxisbeispiel: die Benachrichtigungs-Pipeline eines Händlers

„Souq Rafiq“ (fiktiv), ein Händler in den VAE, sendet Bestellupdates per WhatsApp und möchte in seinem Bestell-Tool einen korrekten Status sehen.

  1. Bestellungen werden mit sendbulk gesendet, und die batchId wird an der Bestellung gespeichert. Siehe WhatsApp-Nachricht per API senden.
  2. Der Webhook-Endpunkt schreibt jedes Ereignis in eine Tabelle und gibt dann 200 zurück.
  3. Ein Worker ordnet Status nach Rang und aktualisiert den Nachrichtenstatus der Bestellung.
  4. FAILED-Ereignisse erzeugen eine Aufgabe für den Support mit dem Grund, und ein SMS-Fallback wird gemäß Kanal-Fallback erwogen.
  5. Eingehende Kundennachrichten werden in die Shared Inbox geleitet, damit Mitarbeiter im Fenster antworten können.
  6. Ein nächtlicher Job ruft bulk-insights für die Batches des Vortags auf und korrigiert Verpasstes.

Welche typischen Fehler gibt es?

  • Aufwendige Arbeit vor der Antwort, was Timeouts und wiederholte Zustellungen verursacht.
  • Bestätigen vor dem Speichern, was Ereignisse verliert, wenn das Speichern fehlschlägt.
  • Der Reihenfolge vertrauen. Ein verspätetes SENT überschreibt DELIVERED.
  • Gegen die illustrative Payload programmieren statt gegen echte Ereignisse.
  • JSON vor der Signaturprüfung neu serialisieren, was die Bytes verändert.
  • Aus dem Handler erneut senden, was Schleifen verursachen kann.
  • Grenzen: Dieser Leitfaden beschreibt unser dokumentiertes Verhalten. Wiederholungsregel und Payload-Felder für Ihren Account sollten Sie beim Onboarding bestätigen.

So unterstützt OmniChannels.ai

OmniChannels.ai sendet Zustellstatus und eingehende Nachrichten für WhatsApp, SMS, RCS und weitere Kanäle in einem einheitlichen, normalisierten Format an Ihren Webhook, mit getrennten Webhooks je Unterkonto für Reseller. BroadNet ist ein offizieller Meta Business Solution Provider, daher werden Metas eigene Webhook-Anforderungen für Sie erledigt, und Sie arbeiten mit unserer API. Lesen Sie die Webhooks-Referenz und die WhatsApp-API-Dokumentation oder sehen Sie, wie Ereignisse in der Shared Inbox erscheinen.

Häufige Fragen

Was ist ein WhatsApp-Webhook?

Ein WhatsApp-Webhook ist eine URL auf Ihrem Server, die die Plattform per HTTP-POST aufruft, wann immer etwas geschieht, etwa eine Nachricht zugestellt, gelesen wird oder fehlschlägt oder ein Kunde Ihnen schreibt. Er ersetzt das Polling. Sie stellen einen HTTPS-Endpunkt bereit, teilen ihn Ihrem Anbieter mit und verarbeiten die empfangenen JSON-Ereignisse.

Wie prüfe ich die Signatur eines WhatsApp-Webhooks?

Bei einem Webhook, den Meta direkt an Ihre eigene App sendet, sagt Metas Dokumentation, dass Sie einen HMAC-SHA256 der Roh-Payload mit Ihrem App Secret berechnen und mit dem Header X-Hub-Signature-256 vergleichen. Für den Webhook von OmniChannels.ai definiert die API-Spezifikation keinen Signatur-Header, verlassen Sie sich daher auf HTTPS, einen nicht erratbaren Pfad und die Validierung des Bodys.

Was passiert, wenn mein Webhook-Endpunkt nicht erreichbar ist?

Metas Dokumentation sagt, dass fehlgeschlagene Zustellungen mit abnehmender Häufigkeit bis zu 7 Tage lang wiederholt werden, was Duplikate erzeugen kann. Klären Sie das Wiederholungsverhalten für Ereignisse unserer Plattform mit Ihrem Onboarding-Ingenieur und nutzen Sie den Bulk-Insights-Endpunkt, um den WhatsApp-Status je Empfänger eines Batches zu lesen. Bei SMS sendet der Endpunkt resendDlr die Berichte erneut.

Wie gehe ich mit doppelten Webhook-Ereignissen um?

Machen Sie die Verarbeitung idempotent. Suchen Sie die Nachricht über ihre ID, vergleichen Sie den Rang des eingehenden Status mit dem gespeicherten und ignorieren Sie Ereignisse, die keinen Fortschritt darstellen. Dasselbe Ereignis zweimal anzuwenden muss dieselbe Wirkung haben wie einmal. Speichern Sie den Roh-Body jedes Ereignisses, damit Sie ihn nach einer Fehlerbehebung wiedergeben können.

Wie schnell muss mein Endpunkt antworten?

Innerhalb weniger Sekunden. Speichern Sie das Roh-Ereignis, geben Sie ein 2xx zurück und erledigen Sie die eigentliche Arbeit in einer Warteschlange oder einem Worker. Rufen Sie vor der Antwort keine anderen Dienste auf, senden Sie keine Nachrichten und führen Sie keine aufwendigen Abfragen aus. Schlägt das Speichern fehl, geben Sie ein 5xx zurück, damit der Absender wiederholen kann, statt ein verlorenes Ereignis zu bestätigen.

Kann ich per Webhook automatisch eine Antwort senden?

Ja, aber nicht aus dem Handler heraus. Bestätigen Sie das Ereignis und entscheiden Sie dann in einem separaten Job über die Antwort. Innerhalb des 24-Stunden-Kundenservice-Fensters können Sie eine Freitextnachricht senden; außerhalb brauchen Sie eine freigegebene Vorlage. Senden Sie niemals eine Nachricht aus dem Webhook-Handler selbst erneut, um Schleifen und Duplikate zu vermeiden.

Quellen

  1. Webhooks overview — WhatsApp Business Platform, Meta for Developers
  2. Create a webhook endpoint — WhatsApp Business Platform, Meta for Developers
  3. RFC 2104: HMAC: Keyed-Hashing for Message Authentication