10 Contact-Center-KPIs, die Sie messen sollten (mit fertigen DAX-Formeln)
KPI-Design / Von Giacomo Ialenti / / 8 Min. Lesezeit
Fragen Sie drei Teamleiter, wie sie die Average Handle Time berechnen, und Sie können drei verschiedene Antworten bekommen. Einer rechnet die Nachbearbeitung ein, einer lässt weitergeleitete Anrufe weg, einer übernimmt die Zahl aus dem Telefonie-Report. Alle drei Varianten sind vertretbar, und keine davon passt im gemeinsamen Dashboard zu den anderen.
Im Contact-Center-Reporting, das ich baue, bekommt jede Kennzahl eine schriftliche Definition, bevor sie ein Measure bekommt. Dieser Beitrag ist dieses Definitionsblatt für zehn KPIs, mit dem passenden DAX für alle zehn. Kopieren Sie ein Measure, passen Sie Tabellen und Spalten an Ihr Modell an und prüfen Sie das Ergebnis dann an einem Zeitraum, den Sie von Hand nachrechnen können.
Das Modell hinter den Measures
Alle folgenden Measures setzen dasselbe einfache Modell voraus. Ändern Sie die Namen bei Bedarf, aber behalten Sie die Struktur bei.
| Tabelle | Eine Zeile pro | Spalten, die die Measures nutzen |
|---|---|---|
| Interactions | angebotenem Kontakt (Anruf, Chat oder E-Mail) | InteractionID, InteractionDate, AgentKey, Answered (True/False), Abandoned (True/False), WaitSeconds, TalkSeconds, HoldSeconds, ACWSeconds, IsRepeatContact7d (True/False), SurveyScore (1 bis 5, leer, wenn es keine Befragung gibt) |
| Cases | Fall, der über Stunden oder Tage bearbeitet wird | CaseID, ResolvedDate, ResolvedDateTime, MetTarget (True/False), IsEscalated (True/False) |
| AgentStaffing | Agent und Tag | Date, AgentKey, LoggedInSeconds, ScheduledSeconds, AdherentSeconds |
| Agents | Agent | AgentKey, HireDate, TerminationDate |
| Costs | Tag | Date, Amount |
| Dates | Tag | Date (als Datumstabelle markiert) |
Dates[Date] ist mit Interactions[InteractionDate], Cases[ResolvedDate], AgentStaffing[Date] und Costs[Date] verknüpft. Agents[AgentKey] ist mit Interactions[AgentKey] und AgentStaffing[AgentKey] verknüpft, sodass Sie beide nach Agent, Team oder Betriebszugehörigkeit filtern können. Agents hat keine Beziehung zu Dates, weil die Fluktuations-Measures die Datumslogik selbst übernehmen.
Kennzeichen wie IsRepeatContact7d und MetTarget gehören in Power Query, wo Sie sie Zeile für Zeile prüfen können. Sorgen Sie dafür, dass sie nie leer sind: In DAX ist ein leerer Wert gleich FALSE, ein leeres Kennzeichen würde also als falsch gezählt. DAX bleibt der Aggregation vorbehalten.
Drei Basis-Measures
Offered Contacts = DISTINCTCOUNT ( Interactions[InteractionID] )
Answered Contacts =
CALCULATE ( [Offered Contacts], Interactions[Answered] = TRUE )
Abandoned Contacts =
CALCULATE ( [Offered Contacts], Interactions[Abandoned] = TRUE )
Die meisten übrigen Measures bauen auf diesen dreien auf. Ändert sich die Definition von „beantwortet“, ändert sie sich an einer einzigen Stelle.
Manche Betriebe ignorieren sehr kurze Abbrüche, zum Beispiel Anrufer, die innerhalb von 5 Sekunden auflegen. Wenn das bei Ihnen so ist, legen Sie diese Regel einmal in Offered Contacts fest, und Answered, Abandoned, Service Level und Abbruchquote übernehmen sie automatisch. Nutzen Sie diesen Rumpf statt des ersten Measures oben (5 Sekunden sind ein Beispiel, ändern Sie den Wert nur hier):
Offered Contacts =
VAR AllContacts = DISTINCTCOUNT ( Interactions[InteractionID] )
VAR ShortAbandons =
CALCULATE (
DISTINCTCOUNT ( Interactions[InteractionID] ),
Interactions[Abandoned] = TRUE,
Interactions[WaitSeconds] < 5
)
RETURN
AllContacts - ShortAbandons
1. Durchschnittliche Bearbeitungszeit (AHT)
Definition: Gesprächszeit plus Haltezeit plus Nachbearbeitung, geteilt durch die Zahl der beantworteten Kontakte.
Handle Seconds =
CALCULATE (
SUM ( Interactions[TalkSeconds] )
+ SUM ( Interactions[HoldSeconds] )
+ SUM ( Interactions[ACWSeconds] ),
Interactions[Answered] = TRUE
)
AHT (seconds) = DIVIDE ( [Handle Seconds], [Answered Contacts] )
AHT (mm:ss) =
VAR Total = ROUND ( [AHT (seconds)], 0 )
RETURN
IF (
ISBLANK ( [AHT (seconds)] ),
BLANK (),
INT ( Total / 60 ) & ":" & FORMAT ( MOD ( Total, 60 ), "00" )
)
Die Stolperfalle: ob die Nachbearbeitung in der AHT steckt. Legen Sie das einmal fest und schreiben Sie es auf, denn das ist der häufigste Grund, warum zwei Reports voneinander abweichen. Das Measure addiert zuerst die Sekunden und teilt einmal. Würden Sie die AHT jedes Agenten mitteln, hätte eine Teilzeitkraft dasselbe Gewicht wie eine Vollzeitkraft.
2. Erstlösungsquote (FCR)
Definition: der Anteil beantworteter Kontakte ohne erneuten Kontakt desselben Kunden zum selben Anliegen innerhalb von 7 Tagen.
FCR % =
DIVIDE (
CALCULATE ( [Answered Contacts], Interactions[IsRepeatContact7d] = FALSE ),
[Answered Contacts]
)
Die Stolperfalle: Ein erneuter Kontakt braucht 7 Tage, um sichtbar zu werden. Deshalb sehen die jüngsten 7 Tage in jedem Report besser aus, als sie sind. Zeigen Sie die Erstlösungsquote nur für Zeiträume, die mindestens 7 Tage zurückliegen, oder kennzeichnen Sie die letzten Wochen als vorläufig. Das Kennzeichen hängt außerdem davon ab, wie Sie „dasselbe Anliegen“ zuordnen. Kunden-ID plus Anliegenkategorie ist ein vernünftiger Anfang.
3. Case Resolution Time (CRT%)
Definition: der Anteil gelöster Fälle, die innerhalb der Zielzeit gelöst wurden. Das gilt für Teams, die Fälle statt Live-Kontakte bearbeiten.
CRT % =
VAR ResolvedCases =
CALCULATE ( COUNTROWS ( Cases ), Cases[ResolvedDateTime] <> BLANK () )
VAR ResolvedInTarget =
CALCULATE (
COUNTROWS ( Cases ),
Cases[ResolvedDateTime] <> BLANK (),
Cases[MetTarget] = TRUE
)
RETURN
DIVIDE ( ResolvedInTarget, ResolvedCases )
CRT % Escalated =
CALCULATE ( [CRT %], Cases[IsEscalated] = TRUE )
CRT % Non-escalated =
CALCULATE ( [CRT %], Cases[IsEscalated] = FALSE )
Die Stolperfalle: Zu welchem Datum gehört ein Fall? Verknüpfen Sie Cases über ResolvedDate mit Dates, wird ein Fall in dem Zeitraum berichtet, in dem er geschlossen wurde. Bei Verknüpfung über das Eröffnungsdatum wird er berichtet, wenn er eingegangen ist. Beide Varianten liefern unterschiedliche Zahlen, also wählen Sie eine und halten Sie sie fest. Berichten Sie eskalierte und nicht eskalierte Fälle getrennt, denn sie bewegen sich selten gemeinsam.
4. CSAT
Definition: der Anteil der Befragungsantworten mit 4 oder 5 auf einer 5-Punkte-Skala.
Survey Responses = COUNT ( Interactions[SurveyScore] )
CSAT % =
DIVIDE (
CALCULATE ( COUNT ( Interactions[SurveyScore] ), Interactions[SurveyScore] >= 4 ),
[Survey Responses]
)
Survey Response Rate % = DIVIDE ( [Survey Responses], [Answered Contacts] )
Die Stolperfalle: Ein CSAT von 92 % aus 8 Antworten ist Rauschen. Zeigen Sie die Zahl der Antworten immer neben dem Wert und gliedern Sie nach Kanal und Queue, denn ein einziger Mischwert verbirgt, wo das Problem liegt.
5. Service Level
Definition: der Anteil angebotener Kontakte, die innerhalb der Schwelle beantwortet werden, zum Beispiel 80 % innerhalb von 20 Sekunden.
Die Schwelle steht an einer einzigen Stelle, in einer kleinen berechneten Tabelle, die ein Datenschnitt (Slicer) ändern kann:
SL Threshold = GENERATESERIES ( 5, 120, 5 )
SL Threshold Seconds = SELECTEDVALUE ( 'SL Threshold'[Value], 20 )
Service Level % =
VAR Threshold = [SL Threshold Seconds]
VAR AnsweredInTime =
CALCULATE (
[Offered Contacts],
Interactions[Answered] = TRUE,
Interactions[WaitSeconds] <= Threshold
)
RETURN
DIVIDE ( AnsweredInTime, [Offered Contacts] )
Service Level Title =
"Service Level: answered within " & [SL Threshold Seconds] & " seconds"
SELECTEDVALUE fällt auf 20 Sekunden zurück, wenn im Slicer nichts oder mehreres ausgewählt ist. Stellen Sie den Slicer auf Einzelauswahl und zeigen Sie Service Level Title als Titel des Visuals, damit niemand ein 20-Sekunden-Ergebnis liest und glaubt, es gehöre zu einer anderen Schwelle.
Die Stolperfalle: der Nenner. Teilen Sie durch die beantworteten Kontakte, verschwinden alle, die aufgegeben haben, und der Service Level sieht besser aus als das, was Kunden erleben. Wenn Sie sehr kurze Abbrüche aus dem angebotenen Volumen herausnehmen, verwenden Sie die Variante von Offered Contacts aus den Basis-Measures, damit die Abbruchquote derselben Regel folgt.
6. Abbruchquote
Definition: abgebrochene Kontakte geteilt durch angebotene Kontakte.
Abandonment Rate % = DIVIDE ( [Abandoned Contacts], [Offered Contacts] )
Die Stolperfalle: Konsistenz mit dem Service Level. Wenn Sie kurze Abbrüche ausschließen, wendet das Measure Offered Contacts die Regel bereits auf Zähler und Nenner an, hier wie beim Service Level. Wenden Sie sie nicht in jedem Measure einzeln an.
7. Auslastung (Occupancy)
Definition: Bearbeitungszeit geteilt durch angemeldete Zeit.
Occupancy % =
DIVIDE ( [Handle Seconds], SUM ( AgentStaffing[LoggedInSeconds] ) )
Die Stolperfalle: der Umfang. Bearbeitungssekunden und Anmeldesekunden müssen dieselben Agenten und dieselben Kanäle abdecken. Lesen Sie die Auslastung neben AHT und Service Level, denn ein hoher Wert kann genauso gut Personalmangel wie Effizienz bedeuten.
8. Schichtplantreue (Adherence)
Definition: Sekunden in Planeinhaltung geteilt durch geplante Sekunden.
Adherence % =
DIVIDE (
SUM ( AgentStaffing[AdherentSeconds] ),
SUM ( AgentStaffing[ScheduledSeconds] )
)
Die Stolperfalle: das Mitteln von Prozentwerten. Nimmt man den Prozentwert jedes Agenten und mittelt ihn, zählt eine Vierstundenschicht wie eine Achtstundenschicht. Addiert man zuerst die Sekunden, hat jede geplante Minute dasselbe Gewicht.
9. Fluktuationsquote (Attrition)
Definition: die Abgänge im Zeitraum, geteilt durch den durchschnittlichen Personalbestand im Zeitraum.
Leavers =
VAR StartDate = MIN ( Dates[Date] )
VAR EndDate = MAX ( Dates[Date] )
RETURN
COUNTROWS (
FILTER (
Agents,
NOT ISBLANK ( Agents[TerminationDate] )
&& Agents[TerminationDate] >= StartDate
&& Agents[TerminationDate] <= EndDate
)
)
Average Headcount =
VAR StartDate = MIN ( Dates[Date] )
VAR EndDate = MAX ( Dates[Date] )
VAR HeadcountAtStart =
COUNTROWS (
FILTER (
Agents,
Agents[HireDate] <= StartDate
&& ( ISBLANK ( Agents[TerminationDate] ) || Agents[TerminationDate] >= StartDate )
)
)
VAR HeadcountAtEnd =
COUNTROWS (
FILTER (
Agents,
Agents[HireDate] <= EndDate
&& ( ISBLANK ( Agents[TerminationDate] ) || Agents[TerminationDate] > EndDate )
)
)
RETURN
DIVIDE ( HeadcountAtStart + HeadcountAtEnd, 2 )
Attrition % = DIVIDE ( [Leavers], [Average Headcount] )
Die Stolperfalle: Das ist die Fluktuationsquote für den gewählten Zeitraum. Ein Monatswert ist nicht mit einem Jahresbenchmark vergleichbar, also sagen Sie, welchen Wert Sie zeigen.
10. Kosten pro Kontakt
Definition: Gesamtkosten geteilt durch beantwortete Kontakte.
Cost per Contact =
DIVIDE ( SUM ( Costs[Amount] ), [Answered Contacts] )
Die Stolperfalle: wieder der Umfang. Die Kostentabelle muss denselben Betrieb abdecken wie die Kontakte, und Sie müssen festlegen, was hineingehört: nur Agenten oder auch Führungskräfte, Lizenzen und Räume. Ich teile durch beantwortete Kontakte, weil sie die Kontakte sind, die Agentenzeit verbraucht haben. Wie Sie auch entscheiden, schreiben Sie es neben die Zahl.
Testen, bevor Sie das Dashboard bauen
Wählen Sie eine Woche. Berechnen Sie jede Kennzahl von Hand in Excel aus den Rohzeilen und vergleichen Sie mit den Measures. Weichen sie ab, liegt es meist an der Definition, und das DAX ist meist in Ordnung. Klären Sie zuerst die Definition, dann bauen Sie die Visuals.
Wie diese Measures in einen vollständigen Ablauf passen, zeigt Vom Rohdatenexport zum Management-Dashboard, und die CRT%-Fallstudie zeigt denselben Ansatz an einem echten Reporting-Problem.