Zum Inhalt
Docs
API-Referenz Zum Dashboard
DocsWebhooks

Webhooks

Alpheris empfängt Webhooks von angebundenen Plattformen — Shopify, Stripe sowie Meta (Instagram & WhatsApp) — und schickt umgekehrt eigene Ereignisse an Endpunkte, die du im Dashboard hinterlegst. Jeder eingehende Aufruf wird kryptografisch signiert geprüft. Diese Seite erklärt, welche Endpunkte existieren, wie die Signaturprüfung läuft und was du dafür einrichten musst.

Worum geht es hier?

Webhooks bei Alpheris gibt es in beide Richtungen. Ausgehend ist der Teil, den du selbst einrichtest: Du hinterlegst im Dashboard eine URL, und wir schicken die dort abonnierten Ereignisse als signierten POST dorthin — das steht gleich unten. Eingehend läuft umgekehrt und ohne dein Zutun: Externe Plattformen, die du mit deinem Shop verbunden hast, melden Ereignisse an Alpheris zurück — zum Beispiel eine neue Instagram-DM, eine geänderte Stripe-Subscription oder eine deinstallierte Shopify-App. Alpheris richtet diese Endpunkte automatisch beim Verbinden der jeweiligen Integration ein. Du musst in der Regel nichts manuell registrieren.

i
Diese Webhooks sind ein internes Plattform-Detail. Sie werden beim Anbinden einer Integration (Shopify-OAuth, Meta-OAuth, Stripe-Checkout) automatisch konfiguriert. Du brauchst sie nur zu verstehen, wenn du die Signaturprüfung nachvollziehen oder eine Integration debuggen willst.

Ausgehende Webhooks

Seit dem Dashboard-Bereich Webhooks kannst du eigene Endpunkte hinterlegen: Alpheris schickt die dort abonnierten Ereignisse als POST an deine URL — signiert, damit du prüfen kannst, dass die Anfrage wirklich von uns stammt. Zu finden im Dashboard in der linken Leiste unter Webhooks, direkt unter API Keys. Verfügbar ab Business, verwalten dürfen es Owner und Admins.

1
Endpunkt anlegen
Dashboard → Webhooks → Endpunkt anlegen. Name ist optional, die URL muss https sein. Danach die Ereignisse ankreuzen, die du bekommen willst.
2
Signing Secret sichern
Direkt nach dem Anlegen zeigen wir das Secret ein einziges Mal vollständig an. Danach steht in der Übersicht nur noch whsec_…xxxx. Verloren? Über das Rotieren-Symbol erzeugst du ein neues — das alte gilt dann sofort nicht mehr.
3
Zustellung testen
Das Häkchen-Symbol in der Zeile schickt sofort ein ping-Ereignis und zeigt dir den echten HTTP-Status deines Servers zurück. Der Punkt vor dem Namen färbt sich danach grün oder rot.

Ereignisse

TypWann
conversation.createdEin Besucher beginnt eine neue Konversation
conversation.handoff_requestedEin Kunde bittet um einen Mitarbeiter
conversation.closedEine Konversation wird geschlossen
message.receivedEine Kundennachricht trifft ein
ticket.createdEin Ticket wird angelegt
ticket.closedEin Ticket wird geschlossen
lead.createdEin Lead wird erfasst
i
Aktueller Stand: Alle Ereignisse oben werden zugestellt - in der Regel innerhalb von 15 Sekunden, jedes genau einmal. Gezählt wird ab dem Anlegen des Endpunkts. Automatisierungen wie Zapier, Make oder n8n verbindest du am einfachsten unter Integrationen.

Aufbau des Payloads

json
{
  "id": "evt_9f2c1a4b7e8d0c3a5b6f2e11",
  "type": "ticket.created",
  "created_at": 1785062400,
  "data": { }
}

Signatur prüfen

Jede Zustellung trägt zwei Header. Signiert wird der rohe Body, dem der Zeitstempel mit einem Punkt vorangestellt wird — also <timestamp>.<body>, per HMAC-SHA256 mit deinem Signing Secret, hexadezimal:

HeaderInhalt
X-Alpheris-TimestampUnix-Zeit der Zustellung, in die Signatur eingerechnet
X-Alpheris-Signaturesha256=<hexdigest>
User-AgentAlpheris-Webhook/1
python
import hmac, hashlib

def signatur_ok(roh_body: bytes, headers, secret: str) -> bool:
    ts  = headers["X-Alpheris-Timestamp"]
    sig = headers["X-Alpheris-Signature"]
    erwartet = "sha256=" + hmac.new(
        secret.encode(), ts.encode() + b"." + roh_body, hashlib.sha256
    ).hexdigest()
    # zeitkonstant vergleichen, nie mit ==
    return hmac.compare_digest(sig, erwartet)
Gleiches Verfahren wie beim Formular-Webhook der Lead-Erfassung — du brauchst also nur eine Prüfroutine für beides. Und wie oben: gegen den rohen Body prüfen, nicht gegen neu serialisiertes JSON.

Gut zu wissen

PunktVerhalten
ProtokollNur https. URLs mit Zugangsdaten (https://user:pass@…) werden abgelehnt.
ZieladressenPrivate, lokale und Link-Local-Adressen sind gesperrt — inklusive Cloud-Metadata-IPs. Geprüft wird beim Senden, nicht beim Speichern.
WeiterleitungenWir folgen keinem Redirect. Deine URL muss das Ziel sein.
Zeitlimit5 Sekunden pro Zustellung. Antworte schnell und arbeite die Nutzlast asynchron ab.
ErfolgJeder Status 2xx. Alles andere gilt als Fehlschlag und färbt den Punkt in der Übersicht rot.
WiederholungenAktuell keine. Eine fehlgeschlagene Zustellung wird nicht erneut versucht — plane dein Ziel entsprechend robust.
AnzahlBis zu 10 Endpunkte je Workspace.

Was Alpheris sonst noch nach außen ruft

Lead-Formulare können ihre Daten zusätzlich direkt an deine API pushen — Einrichtung und Payload stehen unter Lead-Erfassung → Formular-Webhook. Alle übrigen ausgehenden Aufrufe richten sich ausschließlich an die nötigen Drittdienste (E-Mail über Microsoft Graph, Antworten an Meta, Abrechnung über Stripe) und sind kein konfigurierbarer Webhook.

Eingehende Webhooks im Überblick

Alle eingehenden Webhook-Routen prüfen den rohen Request-Body gegen eine Signatur des Absenders. Schlägt die Prüfung fehl, wird der Request abgewiesen — es gibt keinen ungeprüften Verarbeitungspfad.

PlattformEndpunktSignatur-HeaderVerfahren
ShopifyPOST /shopify/webhooksX-Shopify-Hmac-Sha256HMAC-SHA256 (Base64)
StripePOST /stripe/webhookStripe-SignatureStripe-Signatur (construct_event)
InstagramPOST /integrations/instagram/callbackX-Hub-Signature-256HMAC-SHA256 (Meta)
WhatsAppPOST /integrations/whatsapp/callbackX-Hub-Signature-256HMAC-SHA256 (Meta)
Gemeinsames Prinzip: Geprüft wird immer der rohe, unveränderte Request-Body — nicht ein neu serialisiertes JSON. Deshalb darf zwischen Empfang und Prüfung nichts am Payload geändert werden.

Shopify-Webhooks

Beim Verbinden eines Shopify-Stores per OAuth registriert Alpheris die App-Webhooks automatisch und empfängt sie unter POST /shopify/webhooks (Alias: /api/integrations/shopify/webhooks). Verarbeitet werden u. a. App-Deinstallation, Shop-Update und Produkt-Delta-Sync, damit dein Katalog in der Wissensbasis aktuell bleibt.

Die Echtheit wird über den Header X-Shopify-Hmac-Sha256 geprüft: Alpheris berechnet einen HMAC-SHA256 über den rohen Body mit dem App-Secret und vergleicht ihn zeitkonstant (Base64) gegen den Header.

python
# So prüft Alpheris die Shopify-Signatur (vereinfacht)
import hmac, hashlib, base64

digest = base64.b64encode(
    hmac.new(app_secret.encode("utf-8"), raw_body, hashlib.sha256).digest()
).decode("utf-8")

valid = hmac.compare_digest(digest, request.headers["X-Shopify-Hmac-Sha256"])
i
Der gleiche HMAC-Mechanismus sichert auch den Shopify-OAuth-Callback beim Verbinden des Stores ab. Mehr zur Shopify-Anbindung steht unter Shopify.

Stripe-Webhooks

Stripe meldet Abrechnungs-Ereignisse an POST /stripe/webhook. Daraus hält Alpheris deinen Plan und Abo-Status synchron — etwa wenn ein Abo erstellt, aktualisiert oder gekündigt wird oder eine Rechnung bezahlt bzw. fehlschlägt.

Die Verifizierung läuft über die offizielle Stripe-Bibliothek mit dem Header Stripe-Signature und dem Webhook-Secret (construct_event). Ungültige Signaturen werden mit 400 abgewiesen.

Idempotenz

Stripe stellt Events bei Netzwerk- oder Timeout-Fehlern erneut zu. Damit ein Event nie doppelt wirkt (keine Doppel-Provisionierung, keine doppelten Mails), führt Alpheris einen Idempotenz-Store: Jede Event-ID wird vor der Verarbeitung atomar „beansprucht". Bereits gesehene Events werden mit ok (duplicate) übersprungen.

Stripe-EventWirkung in Alpheris
checkout.session.completedPlan nach abgeschlossenem Checkout provisionieren
customer.subscription.created / .updatedPlan-/Status-Sync
customer.subscription.deletedAbo beendet → Plan deaktivieren
invoice.payment_succeeded / invoice.paidZahlung verbucht
invoice.payment_failedFehlgeschlagene Zahlung verarbeiten
i
Stripe-Webhooks betreffen ausschließlich deine eigene Abrechnung bei Alpheris. Details zu Plänen und Trial findest du unter Pläne & Abrechnung.

Meta-Webhooks (Instagram & WhatsApp)

Instagram und WhatsApp werden per Meta-OAuth verbunden. Eingehende Nachrichten und Ereignisse erreichen Alpheris über die Callback-Endpunkte und landen in deiner Inbox. Beide nutzen das Meta-Standardverfahren: Signaturprüfung über X-Hub-Signature-256 (HMAC-SHA256 über den rohen Body mit dem App-Secret).

Verify-Handshake (WhatsApp)

Beim Einrichten des WhatsApp-Webhooks führt Meta einen einmaligen Verify-Handshake aus: ein GET-Request mit hub.challenge und hub.verify_token. Alpheris prüft das Verify-Token und spiegelt die Challenge zurück, sobald es passt. Danach werden nur noch signierte POST-Events angenommen.

http
# Eingehender Meta-Event (vereinfacht)
POST /integrations/instagram/callback
X-Hub-Signature-256: sha256=<hex-digest>
Content-Type: application/json

# Alpheris verifiziert sha256(raw_body, app_secret) gegen den Header,
# bevor die Nachricht in die Inbox übernommen wird.
i
Die OAuth-Scopes für Instagram sind instagram_business_basic, instagram_business_manage_messages und instagram_business_manage_comments. Das Anbinden läuft komplett über das Dashboard — du musst keine Webhook-URL von Hand eintragen.

Eigene Events abholen (Polling)

Solange die Ereignisse oben noch nicht ausgelöst werden — und generell für den vollständigen Bestand statt einzelner Ereignisse — nutze die API-Referenz. Authentifiziere dich per API-Key und frage die relevanten Endpunkte regelmäßig ab.

1
API-Key erstellen
Im Dashboard unter API-Keys einen Schlüssel anlegen. Verfügbar für Business & Enterprise.
2
Auth prüfen
GET /api/me aufrufen und sicherstellen, dass der Key gültig ist (sonst 401/402).
3
In Intervallen abfragen
GET /api/inbox/threads oder GET /api/inbox/tickets pollen, neue Einträge in dein System übernehmen.
bash
# Neue Inbox-Threads abholen (Polling statt Outbound-Webhook)
curl -sS https://console.alpheris.com/api/inbox/threads \
  -H "Authorization: Bearer <SHOP_API_KEY>"
i
Mehr zu Auth, Endpunkten und Retry-Strategie steht unter Custom API und in der API-Referenz.

Häufige Fragen

Muss ich eine Webhook-URL irgendwo eintragen?

Nein. Die eingehenden Webhooks werden beim Verbinden der jeweiligen Integration (Shopify, Stripe-Checkout, Meta-OAuth) automatisch eingerichtet.

Warum schlägt eine Signaturprüfung fehl?

Fast immer, weil ein Proxy oder Middleware den Body verändert hat oder ein falsches/abgelaufenes Secret im Spiel ist. Da gegen den rohen Body geprüft wird, dürfen zwischen Empfang und Prüfung keine Umformatierungen passieren. Prüfe in dem Fall die Integration im Dashboard und verbinde sie ggf. neu.

Kann Alpheris mein System bei jeder neuen Nachricht benachrichtigen?

Aktuell nicht per Push. Nutze stattdessen Polling über die API (siehe oben).

i
Zur Auftragsverarbeitung und den eingesetzten Subprozessoren (Stripe, Microsoft, Meta usw.) siehe unseren AVV und die Seite Sicherheit & Datenschutz.