Kommunikationskanäle
SMS-, WhatsApp- und Generic-Webhook-Kanäle konfigurieren, die Kanalgesundheit überwachen und verstehen, welche Kanäle heute vollständig produktiv sind.
Owlat modelliert jedes Kommunikationsmedium — E-Mail, nativen Chat, SMS, WhatsApp und einen Auffang-Webhook — als Kanal. Eingehende Nachrichten aus allen diesen Quellen landen im gemeinsamen Team-Postfach auf einer einheitlichen Chronik. Diese Seite behandelt den Einstellungsbereich Kanäle, in dem Owner und Admins Kanäle aktivieren, Anbieter-Zugangsdaten hinterlegen und den Gesundheitsstatus beobachten.
E-Mail und nativer Chat senden und empfangen durchgängig. Owlat sendet außerdem ausgehend über SMS, WhatsApp und den Generic Webhook auf drei Wegen: als Antwort des KI-Agenten (automatischer Versand oder freigegebener Entwurf), wenn der KI-Agent (ai.agent) aktiviert ist, über die Schaltfläche Antworten an der jeweiligen Nachricht in der Thread-Ansicht des Team-Postfachs sowie über den kontaktbezogenen Composer auf der einheitlichen Chronik eines Kontakts. Alle drei sind Owner-/Admin-Aktionen und alle drei laufen über denselben Anbieter-Versand. Siehe Aktuelle Einschränkungen.
Wo Sie die Kanäle finden
Öffnen Sie im Dashboard Einstellungen → Kanäle (Route /dashboard/admin/instance/channels). Für die Seite selbst genügt eine Anmeldung, aber etwas zu ändern — einen Kanal zu aktivieren/deaktivieren oder Zugangsdaten zu speichern — ist auf Owner und Admins beschränkt: Die zugrunde liegende Mutation updateChannelConfig verlangt die Berechtigung organization:manage (siehe Team & Berechtigungen). Wer ohne Adminrechte auf diesen Bildschirm gelangt, kann die Kanalliste lesen, dessen Speicher- und Umschaltaktionen werden aber abgelehnt.
Der Bildschirm listet eine Karte pro Kanal. Jede Karte zeigt Symbol und Name des Kanals, einen Schalter zum Aktivieren/Deaktivieren, ein Gesundheits-Badge und ein Panel Konfigurieren, das ein Formular für die Zugangsdaten aufklappt. Eine Seitenleiste fasst die Summen zusammen: wie viele Kanäle existieren, wie viele aktiviert sind und wie viele gesund, beeinträchtigt oder ausgefallen sind.
Was die Kanäle sind
| Kanal | Was er heute leistet |
|---|---|
| Senden und Empfangen über die eingebaute MTA. Vollständig produktiv. Hier sind keine Zugangsdaten einzutragen — die E-Mail-Zustellung verwaltet die MTA. | |
| Chat | Nativer In-App-Chat auf Basis des eingebauten Messaging-Systems. Vollständig produktiv. Keine Zugangsdaten erforderlich. |
| SMS | Eingehende Textnachrichten über Twilio empfangen. Versand über die Antwort-Schaltfläche im Team-Postfach, den Kontakt-Composer oder eine Antwort des KI-Agenten. |
| Eingehende Nachrichten über die WhatsApp-Business-API (Meta Cloud) empfangen. Versand über die Antwort-Schaltfläche im Team-Postfach, den Kontakt-Composer oder eine Antwort des KI-Agenten. | |
| Generic Webhook | Eingehende Nachrichten aus einer beliebigen HTTP-Quelle über ein gemeinsames Secret empfangen. Versand über die Antwort-Schaltfläche im Team-Postfach, den Kontakt-Composer oder eine Antwort des KI-Agenten — jeweils als POST an Ihre Endpunkt-URL. |
Was „aktiviert“ wirklich bedeutet
Der Aktivierungsschalter steuert, ob ein Kanal in die periodische Gesundheitsprüfung einbezogen und in den Übersichtszahlen als aktiv geführt wird. Für E-Mail und Chat spiegelt er einen vollständig funktionierenden Kanal wider. Für SMS, WhatsApp und den Generic Webhook regelt der Schalter nur die Gesundheitsüberwachung und die Übersicht — er kontrolliert nicht den Eingang: Eingehende Webhooks werden allein auf Basis einer gültigen Signatur gegen das konfigurierte Secret des Kanals akzeptiert (siehe Eingehende Kanal-Webhooks), unabhängig davon, ob der Kanal eingeschaltet ist. Er kontrolliert sehr wohl den manuellen Ausgang — die Antwort-Schaltfläche im Postfach und der Kontakt-Composer bieten nur Kanäle an, die aktiviert und konfiguriert sind.
SMS, WhatsApp und den Generic Webhook konfigurieren
Klicken Sie auf einer Kanalkarte auf Konfigurieren, um das zugehörige Formular zu öffnen. Jeder Kanal akzeptiert einen optionalen Anzeigenamen (wird in der Oberfläche anstelle des Standard-Kanalnamens angezeigt). Darüber hinaus unterscheiden sich die Felder für die Zugangsdaten je Kanal.
Jedes Feld wird im Ruhezustand verschlüsselt (channels.outbound.encryptAndPersistConfig) und nur innerhalb der Node-Laufzeit entschlüsselt, die es benötigt.
Der ausgehende Versand entschlüsselt sie in channels.outbound.dispatchOutbound, wenn der KI-Agent, die Antwort-Schaltfläche im Postfach oder der Kontakt-Composer über den Kanal sendet. Die Verifizierung eingehender Webhooks entschlüsselt sie über internal.channels.credentials.getInboundSecret und verwendet sie bevorzugt gegenüber der passenden Umgebungsvariablen des Deployments — siehe Eingehende Kanal-Webhooks.
Ein Feld wird nur gespeichert und erreicht keinen Anbieter: die Business Account ID von WhatsApp, weil der Meta-Sendeaufruf auf die Phone Number ID abgestellt ist. Das Formular kennzeichnet es entsprechend.
Gespeicherte Zugangsdaten werden nie ins Formular zurückgelesen — ein Feld, das bereits eines enthält, wird als gespeichert markiert und bleibt leer. Beim Speichern wird das, was Sie eingetippt haben, über das Gespeicherte gelegt; lassen Sie ein Feld also leer, um seinen aktuellen Wert zu behalten, und füllen Sie nur die Zugangsdaten aus, die Sie ändern.
SMS konfigurieren (Twilio)
Tragen Sie Ihre Twilio-Zugangsdaten ein:
| Feld | Beispiel |
|---|---|
| Account SID | ACxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
| Auth Token | Ihr Twilio Auth Token (im Formular maskiert) |
| Telefonnummer | +1234567890 |
Der Auth Token erfüllt zwei Aufgaben: Twilio signiert seine eingehenden Webhooks mit demselben Wert, sodass die Eingabe hier alles ist, was die Verifizierung eingehender SMS benötigt. Die Umgebungsvariable TWILIO_AUTH_TOKEN bleibt als Fallback für entsprechend konfigurierte Deployments bestehen.
WhatsApp konfigurieren (Meta)
Tragen Sie Ihre Zugangsdaten für die WhatsApp-Business- / Meta-Cloud-API ein:
| Feld | Beschreibung |
|---|---|
| Business Account ID | Ihre WhatsApp Business Account ID |
| Access Token | Access Token der Meta Cloud API (im Formular maskiert) |
| Phone Number ID | die Phone Number ID von Meta |
| App Secret | Meta App Secret — verifiziert die Signatur eingehender Webhooks (maskiert) |
| Verify Token | eine beliebige Zeichenfolge, die Sie auch bei Meta hinterlegen; beantwortet dessen Abo-Challenge (maskiert) |
Die letzten beiden gelten ausschließlich für den Eingang. Die Umgebungsvariablen META_APP_SECRET und META_VERIFY_TOKEN bleiben als Fallback bestehen, wenn die Felder leer gelassen werden.
Den Generic Webhook konfigurieren
| Feld | Beschreibung |
|---|---|
| Endpunkt-URL | https://example.com/webhook — das Ziel, an das Owlat ausgehende Nachrichten per POST sendet (über WebhookAdapter) |
| Secret Key | das gemeinsame Secret, das eingehende Aufrufer an /webhooks/channel zurückspiegeln müssen (maskiert) |
Ausgehende generische POSTs sind unsigniert. Der POST von Owlat an Ihren Endpunkt trägt Content-Type: application/json und sonst nichts — keine Signatur und keinen Header mit gemeinsamem Secret. Der Secret Key gilt nur für den Eingang und wird niemals nach außen gesendet. Konfigurieren Sie Ihren empfangenden Endpunkt nicht so, dass er eine Signatur verlangt, sonst wird jede Antwort abgelehnt und als fehlgeschlagene Nachricht festgehalten. Authentifizieren Sie ausgehende Zustellungen über ein nicht erratbares Pfadsegment oder ein Query-Token in der Endpunkt-URL.
Der Secret Key ist das, was ein eingehender Aufrufer in X-Webhook-Secret oder Authorization: Bearer mitgeben muss, wenn er an /webhooks/channel postet. Ist weder er noch die Umgebungsvariable GENERIC_WEBHOOK_SECRET gesetzt, wird jeder eingehende generische Webhook abgelehnt.
Klicken Sie auf Konfiguration speichern, um zu persistieren. Ein Toast bestätigt die Speicherung. Token-Felder sind standardmäßig maskiert und lassen sich über einen Schalter ein- und ausblenden.
Überwachung der Kanalgesundheit
Ein Hintergrund-Cron läuft alle 5 Minuten und aktualisiert den Gesundheitsstatus jedes aktivierten Kanals. Jede Karte zeigt ein farbiges Badge sowie — sofern verfügbar — den Zeitpunkt der letzten Prüfung, den letzten erfolgreichen Versand und den letzten Fehler.
| Status | Bedeutung |
|---|---|
| Gesund (grün) | Der Kanal hat seine letzte Prüfung bestanden. |
| Beeinträchtigt (bernstein) | Der Kanal ist erreichbar, meldet aber Probleme. |
| Ausgefallen (rot) | Der Kanal hat seine letzte Prüfung nicht bestanden. |
| Deaktiviert / Unbekannt | Der Kanal ist abgeschaltet, oder es wurde noch keine Prüfung ausgeführt. |
E-Mail und Chat werden von diesem Cron immer als gesund gemeldet (die E-Mail-Zustellbarkeit wird separat vom Provider-Health-System verfolgt, siehe Zustellbarkeit). Für SMS, WhatsApp und den Generic Webhook führt die periodische Prüfung inzwischen für konfigurierte Kanäle eine echte Anbieter-Abfrage durch — ein konfigurierter SMS-Kanal ruft das Twilio-Konto ab, ein konfigurierter WhatsApp-Kanal den Meta-Graph, sodass widerrufene oder ungültige Zugangsdaten als beeinträchtigt oder ausgefallen gemeldet werden. Ein nicht konfigurierter Kanal meldet weiterhin ausgefallen mit „Keine Zugangsdaten konfiguriert“. Nur beim Generic Webhook bleibt es bei der reinen Prüfung auf Vorhandensein von Zugangsdaten.
Ein separater Cron poll channel delivery status läuft alle 5 Minuten, damit ausgehende SMS-, WhatsApp- und generische Nachrichten nicht für immer auf sent stehen bleiben: Er fragt den Anbieter für jede in den letzten 24 Stunden angenommene Nachricht ab und setzt sie auf der einheitlichen Chronik des Kontakts auf zugestellt, gelesen oder fehlgeschlagen, sobald der Netzbetreiber zurückmeldet.
Eingehende Kanal-Webhooks
Hier kommen Nachrichten aus SMS-, WhatsApp- und generischen Quellen an. Richten Sie Ihren Anbieter auf den passenden HTTP-Endpunkt von Owlat aus:
| Kanal | Endpunkt | Methode |
|---|---|---|
| SMS (Twilio) | /webhooks/sms | POST |
| WhatsApp (Meta) | /webhooks/whatsapp | POST (eingehend), GET (Verifizierungs-Challenge von Meta) |
| Generic | /webhooks/channel | POST |
Jede eingehende Anfrage wird verifiziert, bevor sie akzeptiert wird — die Kanal-Webhooks verweigern im Zweifel (fail closed), wenn kein Secret konfiguriert ist. Jede Prüfung nutzt die am Kanal hinterlegten Zugangsdaten (Einstellungen → Kanäle) und fällt auf die Umgebungsvariable des Deployments zurück, wenn das Feld leer ist:
- Twilio-Anfragen werden mit einer HMAC-SHA1-Signatur über die kanonische Zeichenfolge aus URL plus sortierten Parametern (
X-Twilio-Signature) verifiziert, unter Verwendung des Auth Tokens des SMS-Kanals (FallbackTWILIO_AUTH_TOKEN). - **Meta-(WhatsApp-)**Anfragen werden mit einer HMAC-SHA256-Signatur des Rohbodys (
X-Hub-Signature-256) verifiziert, unter Verwendung des App Secrets des WhatsApp-Kanals (FallbackMETA_APP_SECRET). DieGET-Challenge wird mit dessen Verify Token beantwortet (FallbackMETA_VERIFY_TOKEN). - Generische Anfragen werden über einen zeitkonstanten Vergleich eines gemeinsamen Secrets authentifiziert, das per Header
X-Webhook-SecretoderAuthorization: Bearerübergeben wird, gegen den Secret Key des Kanals (FallbackGENERIC_WEBHOOK_SECRET).
Existieren sowohl hinterlegte Zugangsdaten als auch eine Umgebungsvariable, gewinnen die hinterlegten — das Rotieren eines Secrets im Formular wirkt sofort, ohne erneutes Deployment.
Trifft eine verifizierte Nachricht ein, findet oder erstellt Owlat dafür einen Kontakt und einen Konversations-Thread und speichert die Nachricht auf der einheitlichen Chronik, wo sie im Team-Postfach erscheint. Jeder Kanal ist ein eigener Identitätsraum: Ein SMS-Absender und ein E-Mail-Kontakt mit demselben Wert sind nicht automatisch derselbe Kontakt — Kontakte, die über SMS, WhatsApp oder generische Kanäle erreicht werden, haben unter Umständen überhaupt keine E-Mail-Adresse. Wie Identitäten aufgelöst werden, beschreibt Zielgruppendaten.
Die genauen Anfrageformen, Header, Verifizierungsregeln und Antwortcodes finden Sie unter Eingehende Kanal-Webhooks.
Aktuelle Einschränkungen
Seien Sie genau, was diese Kanäle heute leisten:
- Manueller Versand ist Owner/Admin vorbehalten und nur auf einem aktivierten Kanal möglich. Drei Oberflächen münden in einen Versandpfad (
channels.outbound.dispatchOutbound, der den echten Adapter für Twilio / Meta / nachgelagerten Webhook baut): die Antwort des KI-Agenten (processInboundChannel→agent.walker→agentPipeline.sendApprovedReply, abhängig vom Feature-Flagai.agent), die Schaltfläche Antworten an einer Kanalnachricht in der Thread-Ansicht des Team-Postfachs und der Composer auf der einheitlichen Chronik des Kontakts — die beiden Letzteren jeweils überchannels.outbound.sendChannelMessage, dasorganization:manageverlangt. Ein Mitglied ohne diese Berechtigung sieht keine Antwortmöglichkeit, und E-Mail-Nachrichten ebenso wenig: Diese werden über den Entwurfs-Composer des Threads beantwortet, der die Sendestrecke der MTA nutzt. - Eine Antwort braucht einen Kontakt und eine Adresse. SMS und WhatsApp werden an die Telefon-/Handle-Identität des Kontakts zugestellt; eine Nachricht von einem Kontakt ohne eine solche hinterlegte Identität wird mit einem klaren Fehler abgelehnt, statt stillschweigend als fehlgeschlagen festgehalten zu werden. Generische Antworten gehen unsigniert per POST an die Endpunkt-URL des Kanals.
- Das Eingangs-Secret des generischen Kanals ist ein gemeinsames Secret, kein HMAC pro Anfrage. Es wird zeitkonstant verglichen, aber wer es besitzt, kann posten; halten Sie den Endpunkt ratenbegrenzt und rotieren Sie den Secret Key, falls er abhandenkommt.
- Gesundheitsprüfungen prüfen nur das Vorhandensein von Zugangsdaten — beim Generic Webhook; SMS und WhatsApp führen für konfigurierte Kanäle eine echte Anbieter-Abfrage
healthCheck()aus (Twilio-Konto / Meta-Graph).
Empfangen und triagieren Sie auf diesen Kanälen im Team-Postfach und antworten Sie dort über die Schaltfläche Antworten an der jeweiligen Nachricht — oder über die einheitliche Chronik des Kontakts, wenn Sie die Konversation beginnen möchten.