Telefoniestatus als Slack-Status
Anforderung
Kollegen sehen in Slack sofort, wer gerade telefoniert – und schreiben dann lieber eine Nachricht, statt anzurufen. Rückfragen im Chat landen nicht mehr bei jemandem, der gerade ein Kundengespräch führt.
In diesem Beispiel setzt die EventBridge bei Gesprächsbeginn den Slack-Status
:telephone_receiver: Im Gespräch. Nach dem Auflegen entfernt sie ihn wieder. Ein manuell gesetzter
Slack-Status, etwa „Urlaub“, bleibt dabei unangetastet.
Ein Vertriebsteam mit 25 Mitarbeitern arbeitet in Slack. Statt 25 Handler anzulegen, pflegt der Administrator je Mitarbeiter eine globale Variable mit der Slack-Mitglieds-ID. Zwei Handler übertragen den Status aller Mitarbeiter. Ein neuer Mitarbeiter braucht nur eine weitere Variable.
- Die Option Unterstützung für verschachtelte Variablen ist aktiv (siehe unten).
- Ein bezahlter Slack-Plan: Nur dort darf ein Admin-Token den Status anderer Mitglieder setzen. Ohne bezahlten Plan nutzen Sie die Variante mit Token je Mitarbeiter.
Vorbereitung in Slack
- Legen Sie unter api.slack.com/apps eine neue App an (Create New App → From scratch).
- Fügen Sie unter OAuth & Permissions bei den User Token Scopes den Scope
users.profile:writehinzu. - Installieren Sie die App mit einem Admin- oder Owner-Konto in Ihrem Workspace (Install to Workspace).
- Kopieren Sie das angezeigte User OAuth Token. Es beginnt mit
xoxp-.
Slack prüft die Rolle: Den Status eines Admins darf nur ein Owner-Token ändern, den eines Owners nur das Token des Primary Owners. Installieren Sie die App deshalb am besten mit dem Konto des Primary Owners.
Die Mitglieds-ID eines Mitarbeiters finden Sie in Slack im Profil unter ⋮ → Mitglieds-ID kopieren.
Sie beginnt mit U, z. B. U04ABCDEF12.
EventBridge Konfiguration
Verschachtelte Variablen aktivieren
Aktivieren Sie den Expertenmodus. Auf dem Tab erscheint die Karte Einstellungen. Setzen Sie dort den Haken bei Unterstützung für verschachtelte Variablen.
Globale Variablen anlegen
Legen Sie auf demselben Tab diese globalen Variablen an:
| Name | Wert | Bedeutung |
|---|---|---|
slackAdminToken | xoxp-… | Token aus der Slack-App |
slackUser_4508 | U04ABCDEF12 | Slack-Mitglieds-ID des STARFACE-Benutzers mit der Account-ID 4508 |
slackUser_5470 | U07XYZ98765 | … eine Zeile je Mitarbeiter |
Die Account-ID eines Benutzers sehen Sie im EventBridge-Tab
: Telefonieren Sie kurz und lesen Sie
accountId im TelephonyStateChangedEvent ab.
Das Event
Ändert sich der Telefoniestatus eines Benutzers, löst die STARFACE das
TelephonyStateChangedEvent aus.
{
"accountId": 4508,
"cause": { },
"requesterAccountId": 4508,
"rootCause": { },
"telephonyState": "ACTIVE"
}
Der Wert telephonyState kennt diese Zustände:
| Wert | Bedeutung |
|---|---|
AVAILABLE | frei |
RINGING | klingelt |
ACTIVE | im Gespräch |
QUEUE_PAUSE | Pause in der Warteschlange |
UNAVAILABLE | nicht erreichbar, z. B. kein Telefon angemeldet |
Über die Schaltfläche im Event Logging übernehmen Sie das Event direkt in die Event Handling Konfiguration.
Handler 1: Status „Im Gespräch“ setzen
- Event:
de.starface.ch.processing.bo.api.events.TelephonyStateChangedEvent - Event-Daten/Extraktion:
- accountId
$.accountId - telephonyState
$.telephonyState
- accountId
- Bedingung:
telephonyState == "ACTIVE" - Aktion: Webhook / HTTP-POST-Request
URL:https://slack.com/api/users.profile.set
Header:
Content-Type: application/json; charset=utf-8
Authorization: Bearer {{slackAdminToken}}
Body:
{
"user": "{{slackUser_{{accountId}}}}",
"profile": {
"status_text": "Im Gespräch",
"status_emoji": ":telephone_receiver:",
"status_expiration": 0
}
}
- Zustand speichern (Tab Zustand-Speicherung):
- Name
slackCallStatus_{{accountId}} - Wert
{{slackUser_{{accountId}}}} - TTL 12 Stunden
- Name
Der Zustand merkt sich: Diesen Status hat die EventBridge gesetzt. Handler 2 entfernt nur solche Status.






Handler 2: Status nach dem Gespräch entfernen
- Event:
de.starface.ch.processing.bo.api.events.TelephonyStateChangedEvent - Event-Daten/Extraktion: wie Handler 1
- Bedingung:
telephonyState == "AVAILABLE" || telephonyState == "UNAVAILABLE" - Aktion: Webhook / HTTP-POST-Request
URL und Header: wie Handler 1
Body:
{
"user": "{{slackCallStatus_{{accountId}}}}",
"profile": {
"status_text": "",
"status_emoji": ""
}
}
- Zustand speichern:
- Name
slackCallStatus_{{accountId}} - Wert
- - TTL 1 Minute
- Name
Leere Werte für status_text und status_emoji löschen den Slack-Status.
So bleibt ein manueller Slack-Status erhalten
Handler 2 liest die Mitglieds-ID aus dem Zustand slackCallStatus_<accountId>. Diesen Zustand schreibt
nur Handler 1.
- Status stammt von der EventBridge: Der Zustand enthält die Mitglieds-ID. Slack entfernt den Status.
- Status wurde manuell gesetzt: Es gibt keinen Zustand, oder er enthält
-. Slack lehnt den Aufruf ab, der manuelle Status bleibt stehen.
Handler 2 nutzt für den Request noch den alten Zustand. Das Überschreiben mit - wirkt erst für
das nächste Ereignis.
Verwenden Sie im Feld user keinen Ersatzwert wie {{slackUser_{{accountId}}:-}}. Bei einem
leeren user ändert Slack den Status des Token-Inhabers. Ohne Ersatzwert bleibt der Platzhalter
für Benutzer ohne Zuordnung stehen, und Slack lehnt den Aufruf ab.
Variante: Token je Mitarbeiter
Ohne bezahlten Slack-Plan autorisiert jeder Mitarbeiter die Slack-App einmal selbst. Das dabei
ausgestellte User-Token (xoxp-…) hinterlegen Sie als globale Variable slackToken_<accountId>.
Passen Sie dann beide Handler an:
- Header:
Authorization: Bearer {{slackToken_{{accountId}}}} - Body Handler 1: ohne das Feld
user - Zustand Handler 1: Wert
{{slackToken_{{accountId}}}} - Header Handler 2:
Authorization: Bearer {{slackCallStatus_{{accountId}}}} - Body Handler 2: ohne das Feld
user
Hinweise zu Slack
- Slack erlaubt höchstens 10 Profiländerungen pro Minute und Mitglied. Die EventBridge wiederholt abgelehnte Aufrufe nicht; Fehler stehen im Modul-Log.
- Ereignisse von Benutzern ohne Zuordnung, etwa Gruppen, lehnt Slack ab. Das ist erwartet und ohne Folgen.
- Prüfen Sie die Konfiguration mit der Testfunktion des Handlers. Sie zeigt die aufgelösten Platzhalter, ohne Slack aufzurufen.
Mehr zur Syntax lesen Sie in der Platzhalter-Referenz.