Nimbus KPI Calculations

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"
		)
	)
💡You can find other measures of this outcome group by using the "Fields" filter in Power BI:

 

 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    
)

Table of Contents