Channels
Die sechs Kanäle der Inbox — Setup, Webhooks, Limits, Eigenheiten.
Die Inbox versteht heute sechs Kanäle. Jeder hat seinen eigenen Adapter (src/Service/Messaging/Adapter/...), eigene Webhook-Routen und kanalspezifische Eigenheiten — aber alle landen am Ende im selben Inbox-Thread.
Übersicht
| Kanal | Modus | Webhook-Pfad | Reply-Fenster | Templates erforderlich |
|---|---|---|---|---|
| IMAP-Polling + SMTP-Versand | /webhooks/email/{tenant} (Catch-All) |
unbegrenzt | nein | |
| Facebook Messenger | Meta Webhook (Push) | /webhooks/meta/{tenant}/messenger |
24h Standard, 7d HSM | Tags + HSM für >24h |
| Instagram-DM | Meta Webhook (Push) | /webhooks/meta/{tenant}/instagram |
24h | optional |
| WhatsApp Business | Meta Cloud API (Push) | /webhooks/meta/{tenant}/whatsapp |
24h | HSM-Templates zwingend für initiale Nachrichten |
| Facebook Comments | Meta Webhook (Push) | /webhooks/meta/{tenant}/page-feed |
unbegrenzt | Public Reply + Private Reply |
| Web-Chat-Widget | SSE-Verbindung | direkt im Chat-Endpoint | nur Session-Dauer | nein |
Der älteste und am gründlichsten getestete Adapter. Eingang läuft über IMAP-Polling (alle 60 Sekunden), Versand über tenant-spezifisches SMTP oder Resend.
Setup:
- IMAP-Postfach (z. B.
support@deine-firma.de) inconfig/tenants/<code>/email.phpeintragen - SMTP-Zugang einrichten oder Resend-API-Key hinterlegen
- Auto-Reply-Regeln + Klassifizierungs-Profil definieren (siehe Auto-Reply)
Eigenheiten:
- Threading via
In-Reply-ToundReferencesHeader. Bei Mailclients, dieRe:-Prefix mit ihrer eigenen Konvention überschreiben, kann Threading reißen — der Adapter hat einen Fuzzy-Fallback überSubject-Normalisierung + Email-Adresse. - Anhänge werden als Files persistiert und stehen dem Agenten als
uploadszur Verfügung. Bilder werden bei Bedarf an das Vision-Modell weitergereicht. - HTML→Text-Konvertierung entfernt Marketing-Wrapper, Signaturen mit Trennlinien (
--), Quoting-Blöcke (>Zitate). So sieht der Agent die eigentliche Nachricht. - Auto-Resolve für Bounces (Subject enthält „Delivery failed", X-Failed-Recipients-Header), Out-of-Office (Auto-Submitted-Header), Spam (X-Spam-Status, sender reputation).
Facebook Messenger
Setup:
- Facebook App im Meta-Developer-Dashboard anlegen
- Page-Token für die Seite generieren
- Webhook-URL
https://app.taskmonkey.de/webhooks/meta/{tenant}/messengermit dem Verify-Token aus der Tenant-Config registrieren messages,messaging_postbacks,message_reactionsals Events abonnieren
Eigenheiten:
- 24-Stunden-Antwortfenster: Nach 24 Stunden ohne User-Interaktion brauchst du ein Message Tag oder Human Agent Tag, um eine Nachricht zu senden, ohne dass Meta sie ablehnt. Die Plattform setzt das Tag automatisch, wenn du via Inbox-UI antwortest und das Fenster abgelaufen ist.
- PSID (Page-Scoped User ID) statt User-Profil: du siehst keinen echten Namen, sondern Vorname + Nachname, wie der User sie für Messenger eingestellt hat. Über
User Profile APIkannst du Profilbild + öffentliche Daten nachladen. - Threading ist trivial: PSID = Thread.
Instagram-DM
Setup analog Facebook Messenger, aber:
- Instagram Business Account muss mit einer Facebook-Seite verknüpft sein (sonst keine API-Permission)
- Webhook-Event:
messagesauf deminstagramSubscription Object - Comments und DMs sind getrennte Webhook-Events — DMs kommen über den Instagram-Adapter, Comments über den Facebook-Adapter (Page-Feed)
Eigenheiten:
- Nur Text + ein Bild pro Nachricht
- Reactions (Herz, Lachen, …) lösen ebenfalls Webhook-Events aus — die Inbox blendet sie als Status-Update im Thread ein, aber der Agent reagiert nicht darauf
- Story-Replies werden als reguläre DM zugestellt, mit Reference auf die Story
WhatsApp Business
Über die Meta WhatsApp Cloud API.
Setup:
- Meta Business Account mit WhatsApp Business API aktivieren (Phone Number Verification)
- Phone-Number-ID und Access Token in
config/tenants/<code>/apis.phphinterlegen - Webhook auf
https://app.taskmonkey.de/webhooks/meta/{tenant}/whatsappregistrieren
Eigenheiten:
- 24-Stunden-Antwortfenster wie bei Messenger. Außerhalb dieses Fensters darfst du nur HSM-Templates (Pre-approved Templates mit Variablen) senden — Freitext ist verboten und wird von Meta abgelehnt.
- Templates musst du im Meta Business Manager anlegen und genehmigen lassen. Die Plattform unterstützt das Senden via Template-Name + Variablen-Map (siehe Templates).
- Kostenmodell: Konversationsbasiert. Jede Konversation (= 24-Stunden-Fenster) kostet je nach Region 0.005–0.07 €. Die Plattform aggregiert das pro Tenant für die spätere Abrechnung.
Facebook Comments
Kommentare unter Posts deiner Facebook-Seite. Anders als DMs sind sie öffentlich und tauchen unter dem Post auf — was ein Standard-Customer-Service-Tool damit machen kann, ist begrenzt.
Setup:
- Standard-Meta-Webhook, Subscription auf
feedEvent - Filter: nur Comments auf eigenen Posts, nicht eigene Comments
Eigenheiten:
- Public Reply: öffentlicher Kommentar als Antwort. Alle sehen sie.
- Private Reply: Meta erlaubt einmal pro Comment, dem User eine private Messenger-Nachricht zu schicken (nur einmal!). Das ist nützlich für „Wir helfen dir gerne — schreib uns bitte privat".
- Threading: ein Comment-Thread wird in der Inbox als ein Thread dargestellt, mit
post_id:psidals Thread-Key. - Hide/Delete: Spam-Comments kann der Agent automatisch ausblenden (nicht löschen — Deletion ist destruktiv und nicht reversibel).
Web-Chat-Widget
Das TaskMonkey Chat-Widget auf deiner eigenen Website. Im Gegensatz zu den Social-Channels ist es direkt mit dem Chat-System integriert — keine externen Webhooks nötig.
Setup:
- Widget per
<script>-Tag einbinden (siehe Widget-Embedding) - Public-Chat-Config mit eigenem Assistant + erlaubten Tools
- Branding via Widget-Theme
Eigenheiten:
- Anonyme Sessions: kein Login. User wird über ein gehashtes Cookie identifiziert (max. 30 Tage), Reload startet neue Session.
- Realtime via SSE: Antworten streamen direkt ohne Polling, gleicher Mechanismus wie der eingeloggte Chat.
- Lead-Erfassung optional: Wenn ein User Kontakt aufnehmen will, fragt der Agent nach Name/Email/Telefon und legt einen Lead in Supabase an.
- Cross-Channel-Bridge: Mit der gleichen Email-Adresse, mit der ein User später per Mail schreibt, wird der Web-Widget-Thread mit dem Email-Thread automatisch zusammengeführt (falls Auto-Merge aktiviert ist).
Adapter-Architektur
Jeder Channel hat einen Adapter im Verzeichnis src/Service/Messaging/Adapter/. Der Adapter ist verantwortlich für:
- Inbound: Webhook-Payload entgegennehmen, validieren (Signature-Check), in ein generisches
InboundMessage-Objekt überführen - Outbound: Generisches Reply-Objekt entgegennehmen, kanalspezifisch (Tag, Template, Public/Private) ausliefern
- Threading: chat_id deterministisch ableiten (PSID, Email-Adresse, Phone-Number)
- Profil-Lookup: User-Daten lazy laden (Avatar, Name)
Das InboundMessage-Objekt ist generisch — ab dem Punkt, an dem es übergeben wird, kennt der nachgelagerte Code (Klassifizierung, Auto-Reply, LLM-Aufruf) den Channel nicht mehr. Das bedeutet: ein neuer Channel = neuer Adapter, der Rest funktioniert ohne Änderung.
Aktuell vorhanden:
src/Service/Messaging/Adapter/
├── EmailAdapter.php
├── FacebookAdapter.php
├── FacebookCommentAdapter.php
├── InstagramAdapter.php
├── MetaMessagingAdapter.php # gemeinsame Basisklasse
└── WhatsAppAdapter.php
Geplante Channels (siehe Roadmap): Telegram, Slack, Microsoft Teams, LinkedIn-DMs.