Nimbus KPI Calculations

Nimbus gathers KPI (Key Performance Indicators) based on service sessions and user sessions. Their calculation is explained on this page.

Daily service reporting metrics (KPI) gathered in the Nimbus portal

ūü§Ē 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
%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