Teams Incoming Call Handler
Schon seit wir mit Teams telefonieren können, kommt die Frage auf, wie eingehende Calls eine Aktion auslösen können. Diese triviale Funktion wird für die Integration von CRM-Applikationen o.ä. benötigt und nicht jeder möchte eine "Server-Kopplung". Seit Sommer 2022 gibt es nun eine passende Einstellung in den "Calling Policies", über die ich eine URL hinterlegen kann, die bei den entsprechenden Benutzern aufgerufen wird.
Quelle:
https://www.microsoft.com/de-de/microsoft-365/roadmap?filters=&searchterms=98054
Am 8 Nov 2022 habe ich in meinem Tenant dazu auch eine Information bekommen:
Quelle:
https://admin.microsoft.com/AdminPortal/home?#/MessageCenter/:/messages/MC445202
Funktionsweise
Die Zusammenhänge sind schnell beschrieben:
- CRM o.ä. mit Deep-Link-Funktion
Teams startet eine URL mit der Rufnummer. Ihre CRM-Lösung muss daher für den Client per Browser über eine HTTPS-URL mit der Rufnummer als Parameter erreichbar sein. Ansonsten können Sie hier schon abbrechen. Geben Sie aber nicht zu früh auf. Auch eine lokale Kontaktlösung könnte man durchaus ertüchtigen, denn Teams könnte auch einen lokalen Webserver ansprechen, der die Parameter dann an eine klassische Software weitergibt (SendKey, API etc.) - Eingehende PSTN-Anrufe mit Rufnummer
landen auf dem Teams Client
Die Funktion ist nicht verfügbar, wenn es ein Teams-Anruf, Federation-Anruf oder eine Meeting Einladung ist. Auch anonyme PSTN-Anrufe ohne Rufnummer triggern nicht die Funktion - Der Benutzer muss den Anruf annehmen
Wenn der Anwender den Anruf ablehnt, startet kein Browserfenster. Der Anwender kann als auch nicht schon allein anhand der Rufnummer vor der Rufannahme die Details des Anrufers einsehen. Das ist aber sinnvoll, wenn die Anrufe z.B. über eine CallQueue kommen und mehrere Agenten den Anruf signalisiert bekommen - Konfiguration der "Calling Policy"
Darüber kann der Administrator steuern, ob der Anwender überhaupt die Funktion nutzen darf und welche URL aufgerufen wird. Der Anwender kann die Funktion also nicht eigenständig aktivieren oder eine eigene URL hinterlegen. Der Administrator muss also eine passende Calling Policy konfigurieren und dem Benutzer zuweisen. Denken Sie daran, dass Änderungen hier nicht immer sofort aktiv werden. - Benutzer muss die Funktion aktiviert
haben
Der Anwender kann durchaus selbst entscheiden, ob er die angebotene Integration nutzen will. Er muss die Funktion aktuell auch noch selbst einschalten:
- Wenn eine URL hinterlegt ist, ruft Teams
mit der Rufannahme den Browser mit der URL auf.
Nun kann der Anwender parallel zum Telefonat im geöffneten Browser die dazugehörigen Aktionen ausführen.
Die URL wird auch bei einer Rufannahme eines eingehenden Rufs über eine Call Queue getriggert.
Denken Sie aber daran das neu geöffnete Fenster dann auch wieder zu schließen.
Aufgrund der Funktionsweise ist diese Lösung nicht dazu geeignet, einen Server über eingehende Anrufe zu informieren. Wenn der Anwender nicht auf einem tauglichen Client angemeldet ist, passiert auch nichts.
Konfiguration
Die Konfiguration der URL finden Sie in den Calling Policies. Ich habe mir dazu eine neue Policy angelegt, um mit den URLs zu spielen und nur einen Testbenutzer zu stören:
Im Portal stellt Microsoft eine Muster-URL bereit, die Hinweise auf das Format gibt:
Die Konfiguration ist natürlich auch per Teams PowerShell mit Set-CsTeamsCallingPolicy möglich:
Set-CsTeamsCallingPolicy ` -Identity <name> ` -popoutAppPathForIncomingPstnCalls "https://www.msxfaq.de"
- Set-CsTeamsCallingPolicy
https://learn.microsoft.com/en-us/powershell/module/skype/set-csteamscallingpolicy
Es scheint so, dass Teams ein "{phone}" durch die Rufnummer ersetzt. Entsprechend habe ich einige URLs probiert:
URL | Ergebnis |
---|---|
http://localhost:10080/newcall/{phone} |
Diese URL ist NICHT möglich, denn HTTP ohne Verschlüsselung ist nicht unterstützt und wird nicht zugelassen. |
https://localhost:10080/newcall/{phone} |
Diese URL kann ich problemlos eintragen. Damit kann ich z.B. einen lokalen CRM-Client als Gegenstelle adressieren, die in dem Beispiel auf 127.0.0.1:10080 lauschen müsste. |
https://www.msxfaq.de/newcall.php/{phone} |
Eine externe URL ist sicher besser, wenn die CRM-Lösung ohne lokalen Client auskommt und über einen Browser bedient wird. Das ist bei Microsoft Dynamics CRM z.B. der Fall. |
Kontrolle auf dem Client
Ob die geänderten Richtlinien schon auf dem Client angekommen sind, können Sie einfach über die Client-Logs kontrollieren. Starten Sie diese über CTRL-ALT-SHIFT-1 und öffnen Sie die Textdatei mit einem Editor um nach dem String "popoutAppPathForIncomingPstnCalls" zu suchen.
... "callingPolicy": { "value": { "allowPrivateCalling": true, "allowGroupCalling": true, "allowCallForwarding": true, "allowWebPSTNCalling": true, "allowSIPDevicesCalling": true, "allowVoicemail": "UserOverride", "allowCallGroups": true, "allowDelegation": true, "allowCallForwardingToUser": true, "allowCallForwardingToPhone": true, "busyOnBusyEnabledType": "Disabled", "musicOnHoldEnabledType": "Enabled", "liveCaptionsEnabledTypeForCalling": "DisabledUserOverride", "autoAnswerEnabledType": "Disabled", "callRecordingExpirationDays": 60, "popoutForIncomingPstnCalls": "Enabled", "popoutAppPathForIncomingPstnCalls": "https://www.msxfaq.de/newcall.php/{phone}" } }, ...
Anzeige auf dem Client
Die Anzeige auf dem Client ist relativ unspektakulär: Der Anruf kommt an, der Anwender nimmt den Anruf entgegen und je nach Geschwindigkeit des PCs öffnet sich mehr oder minder schnell der Default Browser mit der konfigurierten URL.
Interessanterweise wird die URL nicht encoded und das "+" erscheint direkt. Sie können natürlich in der Konfiguration das "{phone}" auch als Parameter übergeben, z.B. mit
"popoutAppPathForIncomingPstnCalls": "https://www.msxfaq.de/newcall.php?pone={phone}"
Die aufgerufene URL sollte dann der Webserver nutzen, um entsprechende Stammdaten, Zusatzinformationen und ggfls. Eingabemasken für den Call liefern. Die Authentifizierung obliegt dem Browser. Wenn sie ihren Standardbrowser auch für die Anmeldung per Kerberos oder OAUTH nutzen, kann der Webserver die Anmeldedaten gleich mit beziehen.
Öffentlicher Reverse-Suche
Ansonsten sind theoretisch beliebige andere Webseiten möglich, die auch anonym Daten liefern. Es gibt ja durchaus einige Anbieter, die auch mit einer Rufnummer in der URL zurecht kommen. Allerdings müssen Sie natürlich eine E.164-Nummer prüfen. Am 23.11.2022 konnte ich das über 11880.com nutzen.
# Beispiel für die Nutzung von 118800 https://www.11880.com/rueckwaertssuche/{phone}
Achtung: Datenschutz.
Wenn jeder eingehende Anruf einen HTTPS-Request zu einem
dieser Dienste erstellt, dann kann der Anbieter anhand der
Quell-IP Adresse und anderer Daten ihres Browsers mitsamt
der Rufnummer ein lückenloses Angerufen-Protokoll einer
Firma anfertigen. Daher sollten sie den Einsatz solcher
Quellen genau überlegen.
Nachdem dann die Richtlinie auf meinem Client angekommen ist, bekam ich bei entsprechend rückwärts auflösbaren Rufnummern auch eine Anzeige:
Ich habe noch ein paar andere Dienste geprüft aber noch keine passende URL gefunden bzw. die Dienste konnte mit "+49" einer E.164-Nummer (noch) nichts anfangen
# Scheint nicht zu gehen, da sie mit dem + nicht zurecht kommen https://www.dasoertliche.de/rueckwaertssuche/?ph={phone}&pa=&address= # Tellows kommt wohl auch nicht mit dem + zurecht https://www.tellows.de/search/?number={phone}
Alternativen
Sie müssen nicht die Teams Funktion nutzen. Es gibt durchaus Alternativen.
- SBC-Abgriff
Wenn Sie die Telefonie mit Rufnummern über Direct Routing selbst bereitstellen, könnten Sie einen eingehenden Anruf auch serverseitig an ihr CRM melden lassen und der CRM-Service könnte auf dem Client eine entsprechende Aktion komplett losgelöst von Teams auslösen. Das funktioniert allerdings nicht mehr mit Call Queues, da der SBC selbst nicht weiß, welcher Agent den Ruf angenommen hat - Parallel-Call
Eine andere Variante besteht daraus, dass der Anwender einen Parallelanruf in Teams auf eine besondere Rufnummer einstellt. Dort wartet dann einfach ein SIP-Client, der über einen INVITE sowohl die Rufnummer des Anrufers als auch des angerufenen Teilnehmers erfährt. Dieser Bot sollte natürlich den Anruf nicht annehmen sondern nur beim Anwender die CRM-Applikation aufwecken. - Subscription/BOT
Natürlich könnten sie auch einen BOT schreiben, der sich bei allen Benutzern anmeldet, um so über eingehende Rufe informiert zu werden und wiederrum dem CRM-System einen Trigger zu geben.
Alle drei Optionen beruhen aber darauf, dass es eine Schnittstelle zu CRM-System gibt, welches dann initiiert durch den Server auf dem Client eine Aktion durchführt. Es gibt aber noch eine weitere Option.
- Teams Client API
Es gibt tatsächlich eine Client-API, über die eine 3rd Party Software mit dem Teams Desktop Client interagieren kann.
Ein Beispiel ist dazu die Freeware "LyncWizard", die auf dem Arbeitsplatz-PC sich in den Teams-Client einklinkt und auf eingehende Anrufe die entsprechenden Aktionen auslösen kann.
https://www.lyncwizard.com/products.html#TeamsWizard_Action
Auch andere Produkte können sich mit Teams integriere. Microsoft Dynamics nutzr aber nicht den Call Handler, welcher auf dieser Seite beschrieben ist
- Dynamics 365: Configure outbound and
inbound profiles : Create outbound profiles
https://learn.microsoft.com/en-us/dynamics365/customer-service/configure-outbound-inbound-profiles#create-inbound-profiles - Unable to Receive Incoming Teams Calls
via Direct Routing in Dynamics 365
https://community.dynamics.com/365/sales/f/dynamics-365-for-sales-forum/458680/unable-to-receive-incoming-teams-calls-via-direct-routing-in-dynamics-365
Einschätzung
Es hat leider mehrere Jahre gedauert, bis Microsoft in Teams eine so häufig nachgefragte und auf jeden Fall erforderliche Funktion eingebaut hat. Sie müssen diese nicht nutzen aber wenn sie eine Kontaktnachverfolgung haben, die per Browser mit einer URL gestartet werden kann, dann sollten Sie die Funktion für einige Pilotbenutzer mit einer eigenen Calling-Policy bereitstellen und nach ausführlichen Tests für alle Anwender ausrollen. Wenn ein Anwender die Funktion wirklich nicht möchte, können Sie dies serverseitig unterbinden oder dem Anwender die Wahl lassen.
Weitere Links
- CTI mit SAP C4C
- Calling and call-forwarding in Teams
https://learn.microsoft.com/en-us/microsoftteams/teams-calling-policy - Set-CsTeamsCallingPolicy
https://learn.microsoft.com/en-us/powershell/module/skype/set-csteamscallingpolicy?view=skype-ps - M365 Changelog: (Updated) Microsoft Teams – Browser Screen Pop for Incoming
PSTN Calls
https://petri.com/m365-changelog-microsoft-teams-browser-screen-pop-for-incoming-pstn-calls/ - Configure phoneuri format in WebAgent
for SAP C4C
https://golive.anywhere365.io/platform_elements/webagent_for_sap_c4c/additionalconfiguration/webagent_for_sap_c4c_configure_phoneuri_format.html
Anywhere365 nutzt die URL https://webagent.anywhere365.io/?phoneformat=(nnn)%20nnn-nnnn - LyncWizard
https://www.lyncwizard.com/products.html#TeamsWizard
https://www.lyncwizard.com/products.html#TeamsWizard_Action
3rd Party Freeware um eingehende Aktionen bei eingehenden Teams Calls zu starten - Ringcentral: Launching an application or
URL on an incoming call using the
RingCentral app desktop and web |
RingCentral MVP
https://support.ringcentral.com/phone/phone-in-ringcentral-app/launching-application-url-incoming-call-using-ringcentral-app-desktop-web.html - SAP C4C Contact Center - Abwicklung
eingehender Anrufe einrichten
https://help.sap.com/docs/SAP_CLOUD_FOR_CUSTOMER/5f35ee8b31e44f2786d7c2696defa2f6/e406d89597064409bec79af3549add78.html - SAP Cloud for Service Telephony
Integration with SAP Contact Center
https://blogs.sap.com/2019/10/16/sap-cloud-for-service-telephony-integration-with-sap-contact-center/ - Zoom:Launching an app or URL during
inbound calls
https://support.zoom.us/hc/en-us/articles/360054844551-Launching-an-app-or-URL-during-inbound-calls