Call Queues

Was in Skype for Business On-Premises die "Response Group Service (RGS)" sind, hat in der Office 365 Welt den Namen "Call Queues". Anruf an diese Gegenstelle landen in einer Warteschlange mit Sprachansage und entsprechende Agenten arbeiten die Anrufe ab. Parallel gibt es noch die "Auto Attendant", die dem Anrufer eine Sprachauswahl anbieten, so dass der Anwender erst in einem Fragebogen sein Anliegen genauer spezifiziert und dann in die richtige Call Queue vermittelt wird.

Im Laufe des Jahres 2024 kommt eine neue Call Queue App, die eine Teams Premium Lizenz erfordert aber dann erweiterte Funktionen zur Steuerung und Anzeige bietet. Siehe dazu auch
https://techcommunity.microsoft.com/t5/microsoft-teams-blog/introducing-the-queues-app-enabling-customer-engagement-in/ba-p/4095971

Eckwerte

Ehe Sie nun aber begeistert "hier" rufen, sollten Sie die Randbedingungen kennen und quasi jeden Punkt zustimmen:

Die Entwicklung in Office 365 ist agil und es kann sein, dass Funktionen sehr schnell dazu kommen. Bitte helfen Sie mir, wenn meine Aussagen nicht mehr aktuell sein. Eine kurze formlose Mail an Kontakt genügt.

Kategorie Beschreibung

Status

Rufnummern

Aktuell können Call-Queues nur über Rufnummern erreicht werden, die von Microsoft selbst bereit gestellt werden. Eine lokale Rufnummer kann nicht über eine CCR-Installation, Hybrid-Installation oder SIP-Trunk zu Office 365 verbunden werden.

Sie können versuchen etwas zu basteln, z.B.: indem Sie mit Hybrid eine lokale Response-Group nutzen, die ohne Agenten ist und als "Überlauf" die SIP-Adresse der Call-Queue hat. Das funktioniert leider nicht mit CCE.

Agenten

Die Agenten einer Call Queue müssen in Skype for Business Online arbeiten. Auch im Hybrid Mode können keine Anwender der lokalen Installation als Agent in der Skype for Business Online Call Queue eingetragen werden.

Agentenclient

Für die Nutzung der Call Queues ist es erforderlich, dass die Clients einen der folgenden Clients nutzen:

  • Teams Windows Desktop Client (Windows/Mac/VDI)
  • Teams Mobile Clients (IOS/Android)
  • IP-Telefone mit Cloud PBX Zertifizierung

Mit dem Wegfall von Skyp for Business Online fallen auch die nativen Lync 2013 Client (Windows) und Skype for Business 2015/2016 (Windows) weg. Lync 2010 oder älter oder generische SIP-Telefone gehen nicht, auch Wenn Microsoft diese noch auflistet

Gleichzeitige Anrufe

Standardmäßig sind 50 wartende Anrufe konfiguriert. Sie können einen Wert von 0-200 einstellen

Agenten pro Call Queue

Aktuell können maximal 50 Agenten eine Call Queue bedienen. Sie können einzeln oder über Verteiler konfiguriert werden.

Lizenz

Die Agenten müssen mindestens eine "Phone System" (vormals Cloud-PBX)-Lizenz haben. Sie benötigen selbst keine Rufnummer und auch keinen Calling Plan, solange Sie nur Rufe annehmen.

Call Free

Eine Call Queue kann auch über eine für den Anrufer kostenfreie Nummer bereit gestellt werden. Sie benötigen dann natürlich eine entsprechende Abrechnungslizenz (Consumption Billing). Alternativ können Sie natürlich die Servicenummer auch bei einem anderen Anbieter kaufen und auf ihre Call Queue Nummer weiter leiten.

Workflow

Aus den Response Groups kennen Sie sicher die Workflows, die Sie dort entwerfen können. Bei Call Queues ist dies auch möglich. Es gibt aber Einschränkungen. Der Wert in Klammern steht für die Funktion von lokalen Response Groups.

  • Text to Speech: Nein  (Ja)
    d.h. Sie können aktuell keine Ansagen als "Text" hinterlegen, die dann dem Anrufer vorgelesen werden
  • Speech to Text Nein (Ja)
    Anrufer können noch nicht per Sprache die Auswahl treffen

Music on Hold, eigene Ansagen sind möglich.

Rufverteilung

Im Gegensatz zur Response Group, die mit Attendant Routing, Round Robin, Last Active, Priority, parallel fünf verschiedene Verteilfunktionen für neue Anrufe unterstützt, ist mit Call Queues aktuell nur "Attendant Routing" möglich.

Agenten An/Abmeldung

Mit den Response Groups können Sie selbst entscheiden, ob sich die Agenten ein/austragen dürfen (formal) oder immer als Eingetragen (Informal) gelten.

Das waren aus meiner Sicht die wichtigsten Kriterien, die sich

Call queue feature compatibility
https://docs.microsoft.com/en-us/microsoftteams/create-a-phone-system-call-queue#call-queue-feature-compatibility

Call Queues konfigurieren

Die meisten Call Queues werden vermutlich über das Teams AdminCenter konfiguriert. Dazu gibt es allerdings schon sehr gute Anleitungen von Microsoft zu Planung und Konfiguration. Es fängt alles im Teams AdminCenter unter "https://admin.teams.microsoft.com/call-queues/v2/add" an. Allerdings werden die meisten Administratoren hier schon wieder gestoppt, denn um eine Call Queue anzulegen, benötigen Sie ein "Ressource Konto"

Diese Konten müssen Sie erst einmal kaufen.

Organizations with Teams Phone Standard or Teams Phone with Calling Plan licensed users can assign either a free Microsoft Teams Phone Resource Account license or a paid Teams Phone Standard user license to resource accounts. A Microsoft calling plan isn't always required (see Plan for Teams Auto attendant and call queues for prerequisites when transferring calls to an external phone number). All auto attendants and call queues require an associated resource account. Resource accounts that require a phone number need either a free Microsoft Teams Phone Resource Account license or a paid Teams Phone Standard user license before a phone number can be applied to the resource account.
Quelle: Microsoft Teams Phone Resource Account licenses https://docs.microsoft.com/en-us/microsoftteams/teams-add-on-licensing/virtual-user

Über die URL "https://admin.microsoft.com/Adminportal/Home#/catalog" können Sie im Microsoft 365 Admin Portal die Optionen anzeigen.

Natürlich müssen Sie dann noch ein Konto im AzureAD anlegen, welches dann diese Lizenz bekommt und an dem Sie die Rufnummer hinterlegen. Oder sie besorgen sich "Service Rufnummern" von Microsoft.

Daher beschränke ich mich auf Fragen, die Microsoft nicht beschrieben hat.

Dokumentation

Die verschiedenen Einstellmöglichkeiten von Call Queues können sehr schnell unübersichtlich werden. Es ist noch relativ einfach, per PowerShell oder Microsoft Graph die aktuelle Konfiguration irgendwie in eine Datei zu schreiben. Interessant wird aber eine visuelle Darstellung, die Microsoft zumindest auch im Juni 2022 noch nicht im Admin-Portal eingebaut hat. Solche "grafischen" Workflows sind aktuell die Stärke von alternativen Produkten wie LuWare, Landis Computer oder Tendfour, u.a.

Aber auch für die nativen Teams Call Queues gibt es schon Lösungen, die sogar kostenfrei sind.

Wer sich mit Mermaid-js nicht anfreuden kann, kann vielleicht solche Ausgaben auch in Visio oder zu draw.io senden.

Call Queue mit Teams Kanal

Anfangs waren Call Queues komplett separat von Microsoft Teams und Kanälen. Mittlerweile können Sie aber in einer Call Queue eine Verknüpfung zu einem Kanal herstellen

Damit können Sie einen Kanal oder Office Group als Agenten hinterlegen.

Interessant ist dann die Anzeige im Kanal: Sie haben im Kanal ein Wählpad und sehen die Voice-Mails

Auch meinen eigenen Status als Agent kann ich hier schnell ändern und den Status der anderen Agenten sehen. Bei einem ausgehenden Anruf kann ich auswählen, ob die eigene persönliche Rufnummer oder der Rufnummer der Call Queue beim Ziel angezeigt wird.

Missed Call

Normalerweise haben Sie eine Call-Queue mit mehrere Agenten und Überlauf-Funktionen. Ein Anrufer sollte nach einige Zeit in der Warteschleife daher immer einen Agenten erreichen. Wenn alle Agenten im Gespräch sind, können Sie über "Überlauffunktionen" den Anrufer an eine andere Call Queue oder einen Anrufbeantworter vermitteln. Dennoch kann es natürlich passieren, dass ein Anrufer nicht warten will und auflegt. Solche "verpassten" Anrufe werden aktuell in Teams nicht signalisiert. Verpasste Anrufe sehen Sie nur bei einem direkten Anruf auf ihre persönliche Durchwahl aber nicht als Agent einer Call Queue. Das ist so auch sinnvoll, denn sonst hätten viele Agenten ja diese "Missed Calls" gleich mehrfach.

Ein serviceorientiertes Unternehmen möchte aber auch bei Call Queues diese Anrufe sehen und ggfls. zurückrufen. Nur weil Teams es nicht von Hause aus kann, bedeutet dies nicht, dass es nicht möglich ist. Über entsprechende APIs können Sie diese Funktion nachrüsten, z.B.

  • CDR Auswertung
    Jeder Anruf in Teams wird in der Call-Datenbank erfasst. Per Graph API können Sie z.B. alle PSTN-Calls abrufen und darin die Anrufe auf die CallQueue suchen, die nicht angenommen wurden. Technisch ist das relativ einfach aber ist mit einer merklichen Verzögerung verbunden, denn Microsoft stellt die CDRs deutlich verzögert zu.
  • BOT mit CQ und Parallel-Call
    Agenten in einer CQ müssen nicht immer "Menschen" sein. Sie könnten auch einen Bot entwickelt, der als Agent in der CallQueue mit paralleler Rufverteilung (nur dann) auch alle Anrufe sieht und vermutlich (zu klären) auch unterscheiden kann, ob der Anruf mit einem "Terminated" oder "Accepted Elsewhere" beendet wurde.
  • 3rd Party Call Queue
    Sie müssen nicht die Microsoft Call Queue mit ihren Einschränkungen nutzen. Sie könnten auch gleich einen eigenen Bot einrichten, der die Anruf annimmt und nach einer eigenen Logik intern verteilt. Allerdings schreibt man so einen Bot nicht "mal eben selbst". Aber es gibt mehrere 3rd Party Anbieter, die solche Dienste "as a Service" anbieten.

Seit einer Änderung im Frühjahr 2022 können Sie auf einem eigenen Session Border Controller liefert Teams kein "REFER" mehr mit. Sie sehen also nicht, ob ein von einer Call Queue angenommener Anruf an jemand anderes "weitervermittelt" wurde, ehe dann von einer der beiden Seiten ein BYE kommt. Ohne REFER sehen Sie auf dem Gateway nur die Rufannahme durch die Call Queue aber können nicht mehr z.B. anhand der Dauer oder eines fehlenden REFER auf einen "Missed Call" schließen. Eventuell könnten Sie noch mit einem vorgelagerten SBC ein "Call Forking" auf die verschiedenen Agenten überlegen, aber dies ist keine gute Idee, wenn der SBC keinen Status der Agenten kennt, die Agenten nur statisch konfiguriert sind und jeder Agent einen "Missed Call" sieht, auch wenn ein anderer Agent den Anruf angenommen hat.

Wenn Sie mit der einfachen Auswertefunktion per CDR nicht zufrieden sind, sollten Sie sich die 3rd Party Lösungen anschauen.

Ausgehender Call

Eine immer wieder gestellte Frage bei einer Call Queue ist der ausgehende Anruf eines Agenten beim Kunden. IN dem fall ist eine häufige Anforderung, dass der Agent nicht mit seiner eigenen Rufnummer auftaucht sondern mit der allgemeinen Support-Nummer. Diese Funktion ist so noch nicht realisiert (Stand Okt 2020). Es gibt aber ein "UserVoice" dazu

Sie können natürlich verschiedene Tricks verwenden, um das Thema auf die ein der andere Seite zu umschiffen. Aber alle Optionen haben unterschiedliche Einschränkungen

  • Stellvertreter-Funktion
    Ein Benutzer kann in Teams hinterlegen, wer als Stellvertreter fungiert. Der Stellvertreter kann dann auch einen Ruf mit der Nummer des Benutzers initiieren. Sie könnte also einen Benutzer anlegen, dem die Rufnummer der Call Queue zugewiesen wird. Eingehende Anrufe landen bei dem Benutzer, die aber ebenfalls per Regel auf die Call Queue weiter geleitet werden können. Oder sie geben der Call Queue eine andere (geheime) Nummer und schreiben den eingehenden Ruf auf dem SBC so um, dass der Anruf nicht über den Platzhalter-Benutzer geht.
    Das ganze Konstrukt kostet natürlich einen Office 365 Benutzer mit CloudPBX-Lizenz.
  • Umschreiben auf dem SBC anhand einem Präfix vor der Zielnummer
    Einige Firmen nutzen die Funktion, dass der interne Anrufer einfach eine "besondere Zielrufnummer" verwenden. Gerne genutzt wird +99 als Länderkennzahl, um dem SBC anzuzeigen, dass er die CallerID manipulieren soll. Der Weg steht ihnen natürlich nur beim Einsatz von Direct Routing offen.
  • Umschreiben auf dem SBC mit Quell-Nummer
    Natürlich können Sie auch pauschal auf deinem SBC die rufende Nummer umschreiben. Er etwas mehr Aufwand betreibt, kann dies auch anhand einer LDAP-Abfrage o.ä. dynamisch gestalten und theoretisch sogar dem Benutzer überlassen. Die statische Umschreibung macht für Agenten Sinn, die nie mit ihrer eigenen Nummer sichtbar sein sollen.
  • Umschreiben der Quell-Nummer mit Teams
    Natürlich können Sie auch generell die "Rufende Nummer" des Agenten verbergen oder umschreiben. Das geht sogar mit Teams Bordmitteln (CsCallingLineIdentity) und damit auch mit Microsoft Rufnummern. Allerdings macht dies nur für Personen und damit Nebenstellen Sinn, die niemals mit ihrer persönlichen Nummer irgendwie anrufen.
New-CsCallingLineIdentity `
   -Identity AnonymCall `
   -Description "Anonym Call Policy" `
   -CallingIDSubstitute Anonymous `
   -EnableUserOverride $false
Grant-CsCallingLineIdentity `
   -Identity "user@lync.se" `
   -PolicyName Anonymous
  • Umschreiben über Teams Trunk Policies
    Auch bei der Konfiguration von Direct Routing auf dem SIP-Trunk können Sie mit Normalisierungsregeln auf dem Trunk die CalledID umstellen. Das ist dann aber auch nur etwas für Agenten, die nie mit der eigenen Rufnummer rauswählen dürfen. Sie machen sich das Leben dann einfacher, wenn die Agenten in Nummerblöcken arbeiten und nur wenige Ersetzungsregel erforderlich sind.

Spätestens jetzt wissen Sie aber, dass keine der Lösungen wirklich glücklich macht.

Ich bin nicht sicher ob Microsoft überhaupt plant, eine entsprechende Funktion in Teams zum "Anrufen als Call Queue einzubauen". Ich könnte mir vorstellen, dass solche Lösungen dann über die Call Center API ausgelöst werden.

Reporting

Eine Anforderung, die quasi jede Firma an Warteschlangen stellt, ist ein Echtzeitstatus, wie viele Anrufer gerade in einer Call Queue auf einen Agenten warten und wie lange sie warten. Auch im Juni 2022 habe noch noch keine allgemein erreichbare API gefunden, die diese Daten liefert. Für einen Echtzeit-Status gibt es wohl eine "privilegierte API", die aber nicht öffentlich erreichbar ist. Es gibt aber verschiedene Ansätze, solche Informationen mit etwas Verzögerung als Auswertung zu generieren.

  • Call Data Records
    Teams erfasst alle Audio-Verbindungen in einer Datenbank, die natürlich abgerufen werden kann. Leider sind die Daten mehrere Minuten verzögert und die direkte Abfrage ist auf PSTN-Anrufe beschränkt.
  • CQD-Datenbank
    Zudem gibt es noch eine weitere Datenbank, in der Qualitätsdaten zu Verbindungen gespeichert werden. Microsoft hat für PowerBI entsprechende Reports bereitgestellt

Leistungsfähiger werden die Reports natürlich, wenn sie eine 3rd Party Software einsetzen, die als BOT die Anrufe an eine Durchwahl annimmt und selbst die Logik verwaltet. Das ist dann der Markt von 3rd Party Produkten.

Aber schon die einfache Analyse der Anrufe geht per PowerShell relativ einfach. Sie haben sogar die Wahl, ob Sie die Daten per MGGraph PowerShell abrufen oder native per Invoke-Webrequest.

PS C:\> get-command get-Mg*call*

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Function        Get-MgCommunicationCall                            1.9.5      Microsoft.Graph.CloudCommunications
Function        Get-MgCommunicationCallAudioRoutingGroup           1.9.5      Microsoft.Graph.CloudCommunications
Function        Get-MgCommunicationCallContentSharingSession       1.9.5      Microsoft.Graph.CloudCommunications
Function        Get-MgCommunicationCallOperation                   1.9.5      Microsoft.Graph.CloudCommunications
Function        Get-MgCommunicationCallParticipant                 1.9.5      Microsoft.Graph.CloudCommunications
Function        Get-MgCommunicationCallRecord                      1.9.5      Microsoft.Graph.CloudCommunications
Function        Get-MgCommunicationCallRecordSession               1.9.5      Microsoft.Graph.CloudCommunications

Allerdings ist hier Microsoft noch nicht "fertig" (Stand Jun 2022)

PS C:\> Find-MgGraphCommand -Command Get-MgCommunicationCallRecord  | fl

Command     : Get-MgCommunicationCallRecord
Module      : CloudCommunications
APIVersion  : v1.0
Method      : GET
URI         : /communications/callRecords/{callRecord-id}
OutputType  : IMicrosoftGraphCallRecordsCallRecord
Variants    : {Get1, GetViaIdentity1}
Permissions : {N/A}

Andere laut Graph verfügbare URLs gibt es noch nicht:

Sie brauchen allerdings einen Benutzer oder eine App, die entsprechend berechtigt ist und die CallID

CallRecords.Read.All
CallRecord-PstnCalls.Read.All

Aber wir können diese Daten einfach auf per PowerShell  und MSAL.PS1 generieren. Ich habe eine App im Tenant registriert, welche die Rechte hat und ein Zertifikat angehängt und zuerst hole ich mir ein Access-Token, wie auf Graph und Kennworte beschrieben.

$ClientID = "<guid der App>"
$TenantID = "<gui des Tenant>"
$CertificatePath = "cert:\currentuser\my\<thumbprint des zertifikats>"
$Certificate = Get-Item $certificatePath 
$Token = Get-MsalToken -ClientId $ClientId -TenantId $TenantId -ClientCertificate $Certificate

In der Variable "$Token" steht die Antwort und im Property "$token.Accesstoken" befindet sich wieder das bekannte OAUTH-Token, welches sie auch einfach in https://jwt.io oder https://jwt.ms zur Analyse eingeben können.

$startdate = (get-date).adddays(-1).tostring("yyyy-MM-dd")
$enddate = (get-date).tostring("yyyy-MM-dd")

$pstndetails = Invoke-RestMethod `
                 -Uri "https://graph.microsoft.com/v1.0/communications/callRecords/getDirectRoutingCalls(fromDateTime=$($startdate),toDateTime=$($enddate))" `
                 -Method GET `
                 -Header @{ 'Authorization' = "Bearer $($Token.AccessToken)"}

Über den Weg bekomme ich die Liste der DirectRouting-Calls. Mit der CallID kann ich dann die Details mit dem Streams und Endpunkten auslesen und auswerten.

Microsoft Teams Summit Day 2- Understand Teams Call Quality Dashboard (CQD) & Reporting
https://www.youtube.com/watch?v=PZ_wsgdePM8&ab_channel=MicrosoftHealthcareandLifeBlogVideos

Weitere Links