Nimbus gathers KPI (Key Performance Indicators) based on service sessions and user sessions. Their calculation is explained on this page.
🤔 Why gather service and user KPI?
- Service KPI are relevant for managers to determine which services are (in)efficient.
- User KPI are interesting for supervisors and service owners to determine how well their team performs.
🔎 The difference between service and user sessions on a technical level is explained on page Nimbus Reporting Model.
How to read this chapter
This chapter describes DAX* measures available in the Nimbus Power BI model, as used in our Power BI Template.
*Also see: https://docs.microsoft.com/en-us/dax/
HOW TO READ
Some of the KPI measures described below contain name parts put in brackets. They are added help to locate all measures which sum up to a full set (total) or are build using similar filtering criteria.
For example:
- (OG) = Outcome Group, or (Outcome) for short
- There are 4 measures. Each of them are calculated as subset of TotalSessions ended with a certain outcome group.
Here is an example with the "Handled by User" Outcome group:
ΣHandledByUser(OG) =
CALCULATE (
[ΣTotalSessions],
FILTER (
VALUES ( ServiceSessionOutcomeGroups[OutcomeGroup] ),
ServiceSessionOutcomeGroups[OutcomeGroup] = "Handled By User"
)
)
Service Session KPI
Service KPI are used by call center managers to view and analyze general service performance, help to adjust service settings and traits.
Typical Service KPI questions answered are:
- How many tasks accepted by my Service?
- How many tasks were Handled?
- How many tasks were hang-up in queue?
- What is quality of service? Do I keep SLA?
- How many tasks are handled by first accepted agent?
- Average time customers spend in queue?
- Average time needed to handle customer call?
- Compare Services between each other.
- Compare Service performance between multiple time periods.
- What are possible issues diminishing service performance?
KPI | Description | DAX |
---|---|---|
%AcceptanceSLA | Percentage of calls handled by users in SLA against all calls handled by users | DIVIDE([ Σ HandledByUserSLA],[ Σ HandledByUser]) * 100 |
%Handled Rate | Percentage of handled calls to total calls | DIVIDE([ Σ HandledSessions],[ Σ TotalSessions])*100 |
%HangupSLA | Percentage of calls customer hang up in SLA against all hang up calls | DIVIDE([ Σ HangupInQueueSLA],[ Σ HangupInQueue]) * 100 |
%Inbound Reachability | Percentage of calls handled by users towards all queued calls | DIVIDE([ Σ HandledByUser],[ Σ QueuedSessions])*100 |
ØAverageAcwExtendedTime_HHMMSS | Average after call extended work time (measure: ØAverageAcwExtendedTimeS) formatted as HH:MM:SS | IF (NOT ISBLANK ([ØAverageAcwExtendedTimeS]), //show blank instead of empty string IF(INT([ØAverageAcwExtendedTimeS])>=86400, FORMAT (QUOTIENT(INT([ØAverageAcwExtendedTimeS]),86400), "00" ) & "d ") //[DAYS] & FORMAT(QUOTIENT(MOD(INT([ØAverageAcwExtendedTimeS]), 86400),3600), "00" ) & ":" //HOURS & FORMAT(QUOTIENT(MOD(INT([ØAverageAcwExtendedTimeS]), 3600),60), "00") & ":" //MINUTES & FORMAT(MOD(INT([ØAverageAcwExtendedTimeS]), 60), "00") //SECONDS ) |
ØAverageAcwExtendedTimeS | Average after call extended work time | INT(CALCULATE(AVERAGE(ServiceSessions[AcwExtendedTime]), ServiceSessions[AcwExtendedTime]>0)) |
ØIvrTimeS | Average Ivr time in seconds | INT(CALCULATE(AVERAGE(ServiceSessions[TotalIvrTime]), ServiceSessions[TotalIvrTime]>0)) |
ØQueueTimeS | Average Queue time in seconds | INT(CALCULATE(AVERAGE(ServiceSessions[TotalQueueTime]), ServiceSessions[TotalQueueTime]>0)) |
ØTotalConnectedTimeS | Average connected time per session | INT(CALCULATE(AVERAGE(ServiceSessions[TotalConnectedTime]), ServiceSessions[TotalConnectedTime]>0)) |
ØHoldTimeS | Average hold time | INT(CALCULATE(AVERAGE(ServiceSessions[HoldTime]), ServiceSessions[HoldTime]>0)) |
Σ HandledByUser | Summary of calls handled by users |
CALCULATE ( [ Σ TotalSessions], FILTER ( VALUES (ServiceSessionOutcomeGroups[OutcomeGroup]), ServiceSessionOutcomeGroups[OutcomeGroup] = "Handled By User" ) ) |
Σ HandledByUserSLA | Summary of calls handled by users in SLA |
CALCULATE ( [ Σ HandledByUser], FILTER ( VALUES ( ServiceSessions[IsUnderSla] ), ServiceSessions[IsUnderSla] = TRUE() ) ) |
Σ HangupInQueue | Summary of queued calls customer hang up |
CALCULATE ( [ Σ QueuedSessions], FILTER ( VALUES ( ServiceSessionOutcomeGroups[OutcomeGroup]), ServiceSessionOutcomeGroups[OutcomeGroup] = "Hangup By Customer" ) ) |
Σ HangupInQueueSLA | Summary of queued calls customer hang up in SLA |
CALCULATE ( [ Σ HangupInQueue], FILTER ( VALUES ( ServiceSessions[IsUnderSla] ), ServiceSessions[IsUnderSla] = TRUE() ) ) |
ΣIvrTime | Summary of Ivr time | SUM(ServiceSessions[TotalIvrTime]) |
Σ NotHandledSessions | Summary on not handled sessions (ServiceSessionOutcome.MeansHandled = 1) |
CALCULATE ( [ΣTotalSessions], FILTER ( VALUES ( ServiceSessionOutcomes[MeansHandled] ), ServiceSessionOutcomes[MeansHandled] = FALSE() ) ) |
Σ QueuedSessions | Summary of queued sessions (QueueTime >0) |
CALCULATE ( [ΣTotalSessions], FILTER ( VALUES ( ServiceSessions[TotalQueueTime] ), ServiceSessions[TotalQueueTime] > 0 ) ) |
ΣQueueTime | Summary Of Queue time | SUM(ServiceSessions[TotalQueueTime]) |
ΣHoldTimeS | Summary of hold time | SUM(ServiceSessions[HoldTime]) |
ΣTotalAcwExtendedTime | Total after call extended work time | SUM(ServiceSessions[AcwExtendedTime]) |
ΣTotalAcwExtendedTime_HHMMSS | Total after call extended work time formatted as HH:MM:SS | IF (NOT ISBLANK ([ΣTotalAcwExtendedTime]), //show blank instead of empty string IF(INT([ΣTotalAcwExtendedTime])>=86400, FORMAT (QUOTIENT(INT([ΣTotalAcwExtendedTime]),86400), "00" ) & "d ") //[DAYS] & FORMAT(QUOTIENT(MOD(INT([ΣTotalAcwExtendedTime]), 86400),3600), "00" ) & ":" //HOURS & FORMAT(QUOTIENT(MOD(INT([ΣTotalAcwExtendedTime]), 3600),60), "00") & ":" //MINUTES & FORMAT(MOD(INT([ΣTotalAcwExtendedTime]), 60), "00") //SECONDS ) |
ΣTotalConnectedTime | Summary of connected time | SUM(ServiceSessions[TotalConnectedTime]) |
ΣTotalSessions | Total count of calls | (ServiceSession[ID]) |
ΣHandledBySystem(OG) | Summary of sessions "Handled By System" outcome group | CALCULATE ( [ΣTotalSessions] , FILTER ( VALUES ( ServiceSessionOutcomes [OutcomeGroup] ), ServiceSessionOutcomes [OutcomeGroup] = "Handled By System" ) ) |
ΣHangupByCustomer(OG | Summary of sessions "Hangup By Customer " outcome group | CALCULATE ( [ΣTotalSessions], FILTER ( VALUES ( ServiceSessionOutcomes[OutcomeGroup]), ServiceSessionOutcomes[OutcomeGroup] = "Hangup By Customer" ) ) |
ΣNotHandled(OG) | Summary of sessions "Not Handled" outcome group | CALCULATE ( [ΣTotalSessions] , FILTER ( VALUES ( ServiceSessionOutcomes [OutcomeGroup] ), ServiceSessionOutcomes [OutcomeGroup] = "Not Handled" ) ) |
ΣCustomerHangupBeforeAccept(Outcome) | Summary of sessions "Customer Hangup Before Accept" outcome | CALCULATE ( [ΣTotalSessions] , FILTER ( VALUES ( ServiceSessionOutcomes [Outcome] ), ServiceSessionOutcomes [Outcome] = "Customer Hangup Before Accept" ) ) |
ΣCustomerHangupInIvr(Outcome) | Summary of sessions "Customer Hangup In Ivr" outcome | CALCULATE ( [ΣTotalSessions] , FILTER ( VALUES ( ServiceSessionOutcomes [Outcome] ), ServiceSessionOutcomes [Outcome] = "Customer Hangup In Ivr" ) ) |
ΣCustomerHangupInQueue(Outcome) | Summary of sessions "Customer Hangup In Queue", "Customer Hangup In Ivr After Queue" outcome | CALCULATE ( [ΣTotalSessions] , FILTER ( VALUES ( ServiceSessionOutcomes [Outcome] ), ServiceSessionOutcomes [Outcome] IN { "Customer Hangup In Queue" , "Customer Hangup In Ivr After Queue" } ) ) |
ΣFirstCallResolution(Outcome) |
Summary of sessions "User Accepted" outcome |
CALCULATE ( [ΣTotalSessions] , FILTER ( VALUES ( ServiceSessionOutcomes [Outcome] ), ServiceSessionOutcomes [Outcome] = "User Accepted" ) ) |
ΣVoicemail(Outcome) | Summary of sessions "Workflow Conversation Recorded" outcome | CALCULATE ( [ΣTotalSessions] , FILTER ( VALUES ( ServiceSessionOutcomes [Outcome] ), ServiceSessionOutcomes [Outcome] = "Workflow Conversation Recorded" ) ) |
ΣWorkflowExternalTransfer(Outcome) | Summary of sessions "Workflow External Transfer Successful" outcome | CALCULATE ( [ΣTotalSessions] , FILTER ( VALUES ( ServiceSessionOutcomes [Outcome] ), ServiceSessionOutcomes [Outcome] = "Workflow External Transfer Successful" ) ) |
ΣWorkflowInternalTransfer(Outcome) |
Summary of sessions "Workflow Internal Transfer Successful" outcome |
CALCULATE ( [ΣTotalSessions], FILTER ( VALUES ( ServiceSessionOutcomes[Outcome] ), ServiceSessionOutcomes[Outcome] = "Workflow Internal Transfer Successful" ) ) |
ΣTotalDialOutTime | Summary of Dialout time for outgoing sessions | SUM ( ServiceSessions [DialOutTime] ) |
ΣDestinationAccepted | Summary of outgoing sessions with "Destination Accepted" outcome | CALCULATE ( [ΣTotalSessions], FILTER ( VALUES (ServiceSessionOutcomes[Outcome]), ServiceSessionOutcomes[Outcome] = "Destination Accepted" ) ) |
%DestinationAccpeted | Percentage of outbound calls accepted at destination | DIVIDE ([ΣDestinationAccepted],[ΣTotalSessions]) * 100 |
ΣDestinationDeclined | Summary of outgoing sessions with "Destination Declined" outcome | CALCULATE ( [ΣTotalSessions] , FILTER ( VALUES ( ServiceSessionOutcomes [Outcome] ), ServiceSessionOutcomes [Outcome] = "Destination Declined" ) ) |
ΣUserAborted | Summary of outgoing sessions with "User Aborted" outcome | CALCULATE ( [ΣTotalSessions] , FILTER ( VALUES ( ServiceSessionOutcomes [Outcome] ), ServiceSessionOutcomes [Outcome] = "User Aborted" ) ) |
ΣDestinationNotReached | Summary of outgoing sessions with "Destination Not Reached" outcome | CALCULATE ( [ΣTotalSessions], FILTER ( VALUES (ServiceSessionOutcomes[Outcome]), ServiceSessionOutcomes[Outcome] = "Destination Not Reached" ) ) |
ΣTotalOutboundSessions | Summary of outgoing sessions | CALCULATE ( [ΣTotalSessions] , FILTER ( VALUES ( TaskDirections [Name] ), TaskDirections [Name] = "Outbound" ) ) |
ΣTotalInboundSessions | Summary of incoming sessions | CALCULATE ( [ΣTotalSessions], FILTER ( VALUES (TaskDirections[Name]), TaskDirections[Name] = "Inbound" ) ) |
ΣTotalExternalSessions | Summary of External sessions | CALCULATE ( [ΣTotalSessions], FILTER ( VALUES (TaskDirections[Name]), TaskDirections[Name] = "External" ) ) |
TotalTime | Summary time for service session | ServiceSessions [TotalConnectedTime] + ServiceSessions [TotalIvrTime] + ServiceSessions [TotalQueueTime] + ServiceSessions [HoldTime] + ServiceSessions [AcwTime] + ServiceSessions [DialoutTime] |
User Session KPI
User KPI are used by call center supervisors to view and analyze User performance.
Typical questions answered are:
- How many tasks were user-handled?
- How many tasks were not handled (missed or decline)?
- What is our acceptance rate (compared to total calls)?
- What is our transfer rate (to other services or specialist)?
- What are our usual times for user distribution? → Time for Ring/Connected/ACW/Consultation.
KPI | Description | DAX |
---|---|---|
%Acceptance Rate | Ratio of accepted user sessions, to the total number of user sessions for this Nimbus user, for the selected period | DIVIDE([ Σ AcceptedUserSessions],[ Σ TotalUserSessions])*100 |
%Consulted Rate | Ratio of user sessions with consultations, to the total number of user sessions, for this Nimbus user, for the selected period | DIVIDE([ΣConsultedUserSessions],[ΣAcceptedUserSessions])*100 |
%Transfer Rate | Ratio of user sessions ended by transfer, to the total number of user sessions for this Nimbus user, for the selected period | DIVIDE([ΣTransferredUserSessions],[ΣAcceptedUserSessions])*100 |
ØAcwExtendedTime_HHMMSS | Average after call extended work time formatted as HH:MM:SS | IF (NOT ISBLANK ([ØAcwExtendedTimeS]), //show blank instead of empty string IF(INT([ØAcwExtendedTimeS])>=86400, FORMAT (QUOTIENT(INT([ØAcwExtendedTimeS]),86400), "00" ) & "d ") //[DAYS] & FORMAT(QUOTIENT(MOD(INT([ØAcwExtendedTimeS]), 86400),3600), "00" ) & ":" //HOURS & FORMAT(QUOTIENT(MOD(INT([ØAcwExtendedTimeS]), 3600),60), "00") & ":" //MINUTES & FORMAT(MOD(INT([ØAcwExtendedTimeS]), 60), "00") //SECONDS ) |
ØAcwExtendedTimeS | Average after call extended work time | INT(CALCULATE(AVERAGE(UserSessions[AcwExtendedTime]), UserSessions[AcwExtendedTime]>0)) |
ØConnectedTimeS | Average connected time | INT(CALCULATE(AVERAGE(UserSessions[ConnectedTime]), UserSessions[ConnectedTime]>0)) |
ØRingTimeS | Average ring time | INT(CALCULATE(AVERAGE(UserSessions[RingTime]), UserSessions[RingTime]>0)) |
ØConferencedTimeS | Average conference time | INT(CALCULATE(AVERAGE(UserSessions[ConferencedTime]), UserSessions[ConferencedTime]>0)) |
ØConsultationTimeS | Average consultation time | INT(CALCULATE(AVERAGE(UserSessions[ConsultationTime]), UserSessions[ConsultationTime]>0)) |
ØAcwTimeS | Average after call work time | INT(CALCULATE(AVERAGE(UserSessions[AcwTime]), UserSessions[AcwTime]>0)) |
ΣAcwExtendedTime | Total after call extended work time | SUM(UserSessions[AcwExtendedTime]) |
ΣAcwExtendedTime_HHMMSS | Total after call extended work time formatted as HH:MM:SS | IF (NOT ISBLANK ([ΣAcwExtendedTime]), //show blank instead of empty string IF(INT([ΣAcwExtendedTime])>=86400, FORMAT (QUOTIENT(INT([ΣAcwExtendedTime]),86400), "00" ) & "d ") //[DAYS] & FORMAT(QUOTIENT(MOD(INT([ΣAcwExtendedTime]), 86400),3600), "00" ) & ":" //HOURS & FORMAT(QUOTIENT(MOD(INT([ΣAcwExtendedTime]), 3600),60), "00") & ":" //MINUTES & FORMAT(MOD(INT([ΣAcwExtendedTime]), 60), "00") //SECONDS ) |
Σ AcceptedUserSessions | Summary of accepted user sessions. UserSessionOutcomes[UserOutcome] = "Accepted" |
CALCULATE ( [ Σ TotalUserSessions], FILTER (VALUES ( UserSessionOutcomes[UserOutcome]),UserSessionOutcomes[UserOutcome] = "Accepted")) |
ΣTransferredUserSessions | Summary count of user sessions ended by transfer | CALCULATE ( [ΣTotalUserSessions], FILTER ( VALUES ( UserSessionOutcomes[ActionGroup]), UserSessionOutcomes[ActionGroup] = "Transferred")) |
ΣConsultedUserSessions | Summary count of user sessions with consultations | CALCULATE ( [ΣTotalUserSessions], FILTER ( VALUES ( UserSessions[ConsultationCount]), UserSessions[ConsultationCount]>0)) |
ΣTotalUserSessions | Total number of all user sessions | COUNT(UserSessions[Id]) |
Σ UserSessions30d | Total number of all calls grouped by handled (isHandled = 1) and not handled (isHandled = 0) from the caller to the service line for the last 30 days |
VAR CurrentDate = TODAY() RETURN CALCULATE( [ Σ TotalUserSessions], DATESBETWEEN(UserSessionDates[Date], CurrentDate - 30, CurrentDate - 1) ) + 0 |
Σ UserSessions30d | Number of user sessions in last 30 days |
VAR CurrentDate = TODAY() RETURN CALCULATE( [ Σ TotalUserSessions], DATESBETWEEN(UserSessionDates[Date], CurrentDate - 30, CurrentDate - 1) ) + 0 |
Transfer Session KPI
Transfer KPI are used by call center supervisors to view and analyze transferred sessions performance.
KPI | Description | DAX |
---|---|---|
TotalTransfers | Count of transfers | COUNT(TransferSessions[Id]) |
ΣDurationSeconds(TR) | Duration of transfer in seconds | SUM(TransferSessions[DurationSeconds]) |
ΣDurationTime(TR)_HHMMSS | Formated duration in seconds as HH:MM:SS | IF (NOT ISBLANK ([ΣDurationSeconds(TR)]), //show blank instead of empty string IF(INT([ΣDurationSeconds(TR)])>=86400, FORMAT (QUOTIENT(INT([ΣDurationSeconds(TR)]),86400), "00" ) & "d ") //[DAYS] & FORMAT(QUOTIENT(MOD(INT([ΣDurationSeconds(TR)]), 86400),3600), "00" ) & ":" //HOURS & FORMAT(QUOTIENT(MOD(INT([ΣDurationSeconds(TR)]), 3600),60), "00") & ":" //MINUTES & FORMAT(MOD(INT([ΣDurationSeconds(TR)]), 60), "00") //SECONDS ) |