Edit

Share via


Calculate customer service representative metrics

Applies to: Dynamics 365 Contact Center—standalone and Dynamics 365 Customer Service only

Note

Copilot Studio bot is renamed as Copilot agent (agent or AI agent). Human agent is now renamed as customer service representative (service representative or representative). You might come across references to the old and new terms while we update the product UI, documentation, and training content.

This article provides details on how to calculate customer service representative metrics in Dynamics 365 Customer Service. Use these metrics to evaluate performance and efficiency, optimize operations, and enhance customer satisfaction. You can use these metrics to customize the visual display of your reports. Learn more in Customize visual display.

Average first response time

Applies to Omnichannel real-time and Omnichannel historical dashboards.

Average first response time is the average time an agent takes to reply to a customer after the customer starts a conversation.

The system calculates average first response time by dividing the total first response time for all engaged conversations by the number of engaged conversations. The time is adjusted for operating hours. You can view the time in seconds or in hh:mm:ss format.

DAX query and Dataverse reference

The following Data Analysis Expression (DAX) query and corresponding Dataverse entities are used in the Power BI semantic model. Learn more in DAX queries.


Avg. time for first response (min) = ​CALCULATE (AVERAGE (FactConversation[FirstResponseTime] ) / 60.00,FactConversation [IsOutbound] <> "1")

Element Value
Dataverse entities msdyn_ocliveworkitem
Attributes - msdyn_ocliveworkitem.msdyn_channelinstanceid​
- msdyn_ocliveworkitem.msdyn_channel
Filters - Filter the FactConversations table to include only rows where msdyn_channelinstanceid is NULL or msdyn_channel isn't set to 1923500000.
  • Average service representative response time

Service representative response time is the average time that customers who send a message wait to get a response from a service representative. It's calculated by dividing total response time by the number of message exchanges in engaged conversations and is adjusted based on operating hours. Longer response times mean customers wait longer between messages, negatively impacting their experience.

The time can be viewed in seconds or hh:mm:ss format.

Service level (10, 20, 30, 40, 50, 60, 120 secs)

Applies to Omnichannel real-time and Omnichannel historical dashboards.

Service level in 10 seconds is a performance metric for contact centers or customer service teams. It shows the percentage of customer interactions, like calls or chats, answered within 10 seconds.​ Service levels are measured in intervals of 10, 20, 30, 40, 50, 60, 120 seconds. This metric is calculated as​: ​

Service Level (%) = (Number of interactions answered within 10 seconds / Total number of interactions) × 100​

For example, if 800 out of 1,000 calls are answered within 10 seconds, your service level is 80%.

DAX query and Dataverse reference

The following Data Analysis Expression (DAX) query and corresponding Dataverse entities are used in the Power BI semantic model. Learn more in DAX queries.


Service level (10 seconds) = ​DIVIDE(​[Conversations in service level (10 seconds)],​ SUMX(​ FactConversation,​ IF(​    FactConversation[IsAgentAccepted] = "1"​ && FactConversation[IsOutbound] <> "1",​ 1,​ 0​ )​),​ BLANK())

Element Value
Dataverse entities msdyn_ocliveworkitem, msdyn_ocsession
Attributes - msdyn_ocliveworkitem.msdyn_isoutbound​
- msdyn_ocsession.msdyn_agentacceptedon
Filters - msdyn_ocsession.msdyn_agentacceptedon is set to 1.​
- msdyn_ocliveworkitem.msdyn_isoutbound isn't set to 1​.

Conversations in service level (10, 20, 30, 40, 50, 60, 120 secs)

Applies to Omnichannel real-time and Omnichannel historical dashboards.

Conversations in service level (10 seconds) refers to the customer interactions (usually calls or chats) where the representative answered an incoming conversation ​within 10 seconds. Service levels are measured in intervals of 10, 20, 30, 40, 50, 60, 120 seconds. This metric represents the total count of such conversations.

DAX query and Dataverse reference

The following Data Analysis Expression (DAX) query and corresponding Dataverse entities are used in the Power BI semantic model. Learn more in DAX queries.


Conversations in service level (10 seconds) = ​SUMX(​ FactConversation,​ IF(​ FactConversation[FirstWaitTime] <= 10​ && FactConversation[IsAgentAccepted] = "1"​ && FactConversation[IsOutbound] <> "1",​  1,​ 0​))

Element Value
Dataverse entities - msdyn_ocliveworkitem
- msdyn_ocsession
Attributes - msdyn_ocliveworkitem.msdyn_isoutbound​
- msdyn_ocsession.msdyn_agentacceptedon ​
- msdyn_conversationfirstwaittimeinseconds
Filters - msdyn_ocsession.msdyn_agentacceptedon is set to 1​.
- msdyn_ocliveworkitem.msdyn_isoutbound isn't set to 1​.
- msdyn_conversationfirstwaittimeinseconds is set to less than or equal to 10 or 20 or 30 or 40 or 50 or 60 or 120.

Total capacity units

Applies to Omnichannel real-time dashboards.

Total capacity units represent the workload capacity assigned to a representative. These units determine how many concurrent conversations or tasks a representative can handle.

DAX query and Dataverse reference


 Total capacity units = SUM(FactAgentCapacityUnit[DefaultMaxCapacityUnits])

Element Value
Dataverse entities - FactAgentCapacityUnit - msdyn_agentstatus with systemuser
Attributes - systemuser.msdyn_capacity
Filters - systemuser.msdyn_botapplicationid is NULL to exclude AI agents. ​
  • Total available capacity units: The number of capacity units that are available to handle conversations.
  • Total occupied capacity units: The number of capacity units that are currently occupied.

Total representative work item capacity

Applies to Omnichannel real-time dashboards.

The total default maximum capacity units assigned to representatives based on their capacity profile.

DAX query and Dataverse reference


Total agent work item capacity =SUM( FactAgentCapacityProfile[AgentDefaultMaxProfileUnits])

Element Value
Dataverse entities - FactAgentCapacityProfile-msdyn_agentcapacityprofileunit along with - msdyn_capacityprofile
Attributes - msdyn_agentcapacityprofileunit.msdyn_defaultmaxunits
Filters None ​

Assigned capacity profile count

Applies to Omnichannel real-time dashboards.

Assigned capacity profile count is the number of representatives who have an assigned capacity profile and aren't currently in Offline status.

DAX query and Dataverse reference


Assigned capacity profile count = SUMX (FactAgentCapacityProfile,IF ( NOT RELATED ( DimAgentPresence[BasePresenceStatusId] ) == 192360004, 1, 0 ))

Element Value
Dataverse entities - DimAgentPresence - msdyn_presence; FactAgentCapacityProfile -msdyn_agentcapacityprofileunit
Attributes - msdyn_presence.msdyn_basepresencestatus
Filters - msdyn_presence.msdyn_basepresencestatus isn't set to 192360004 (Status isn't set to Offline). ​

Total work item capacity in use

Applies to Omnichannel real-time dashboards.

Total work item capacity in use is the representative's capacity occupied by active work items based on their profile settings.

DAX query and Dataverse reference


Total work item capacity in use = SUM ( FactAgentCapacityProfile[OccupiedProfileUnits] )

Element Value
Dataverse entities - msdyn_agentcapacityprofileunit for representative-specific capacity data along with msdyn_capacityprofile for default capacity values and blocking rules
Attributes - OccupiedProfileUnits : Difference between msdyn_capacityprofile.msdyn_defaultmaxunits and msdyn_agentcapacityprofileunit.msdyn_availablecapacityprofileunits
- msdyn_capacityprofile
- msdyn_agentcapacityprofileunit
  • Total available work item capacity: The maximum number of new work items that can be assigned.
  • Total work item capacity in use: The work items currently handled by a representative.

Logged in service representatives

Applies to Omnichannel real-time dashboards.

Logged in service representatives is the number of representatives who are currently logged in and aren't in Offline status.

DAX query and Dataverse reference


Logged in agents = SUMX ( FactAgentCapacityUnit,IF ( NOT RELATED ( DimAgentPresence[BasePresenceStatusId] ) == 192360004, 1, 0 ))

Element Value
Dataverse entities - DimAgentPresence-msdyn_presence
- FactAgentCapacityUnit-msdyn_agentstatus along with systemuser
Attributes - msdyn_presence.msdyn_basepresencestatus
- mdyn_agentstatus.msdyn_availableunitscapacity
Filters - msdyn_presence.msdyn_basepresencestatus isn't set to 192360004 (Status isn't set to Offline) ​

Total service representatives

Applies to Omnichannel real-time dashboards.

The total number of service representatives with capacity data configured for routing and workload management.

DAX query and Dataverse reference


Total agents = COUNTROWS(FactAgentCapacityUnit )

Element Value
Dataverse entities DimAgentPresence-msdyn_presence; FactAgentCapacityUnit - msdyn_agentstatusmsdyn_agentstatus, along with systemuser
Attributes - msdyn_agentstatus along with systemuser
Filters - systemuser.msdyn_botapplicationid is NULL to exclude AI agents.​

Status duration

Applies to Omnichannel real-time dashboards.

Status duration shows how long representatives remain in a presence status, such as Available, Busy, or Away, during a selected time period. This duration is measured in minutes. For example, a representative in Busy status for 40 minutes shows a duration of 40.

DAX query and Dataverse reference


Status duration (mins) = CALCULATE (SUM ( FactAgentStatusHistory[DuringInSeconds] ) / 60.00,USERELATIONSHIP ( FactAgentStatusHistory[PresenceId], DimAgentPresence[PresenceId] ))

Element Value
Dataverse entities - msdyn_agentstatushistory along with msdyn_presence
Attributes - Calculates the difference between the msdyn_agentstatushistory.msdyn_starttime and msdyn_agentstatushistory.msdyn_endtime. The real-time dashboard shows the current UTC time when a service representative is in their current status. The end time appears only after the status changes.
Filters - msdyn_agentstatushistory.createdon >= DATEADD(MI, -120, GETUTCDATE()). Only include records where the representative status was created within the last 120 minutes (2 hours).​

Consult

This metric represents the service representative in the Consult mode. The related metrics aren't available by default. Select Edit report to find the following metrics in your data model when you search for Consult.

  • Average consult time: The average time that service representatives spend helping other service representatives on consult requests. It's calculated by dividing the total time spent by service representatives on these requests by the total number of consult requests accepted. You can display the average consult time in minutes.

  • Consult acceptance rate: The percentage of sessions accepted by a service representative out of all the consult sessions requested.

  • Consult requests accepted: The total number of consult sessions requested and accepted by a service representative.

  • Consult requests not accepted: The total number of consult sessions requested but not accepted by a service representative. This happens when the representative doesn't join the consult.

  • Consult not acceptance rate: The percentage of consult sessions that a service representative didn't accept, including timed-out and rejected requests out of all the consult sessions requested. This happens when representative doesn't join the conversation.

  • Consult requests rejected: The total number of consult sessions requested but rejected by a service representative.

  • Consult rejection rate: The percentage of consult sessions rejected by a service representative out of all the requested sessions. This happens when representatives reject the consult.

  • Consults requested: The total number of consult sessions requested.

  • Consult requests timed out: The total number of consult sessions requested that timed out because the representative didn't respond.

  • Consult timed out rate: The percentage of consult sessions that timed out because the service representative didn’t respond.

  • Consult time: The time taken by service representatives to help other service representatives on consult requests. This metric can be viewed in minutes format. This metric is available only for the Omnichannel real-time analytics dashboard.

  • Consult sessions: The total number of sessions with an ongoing consult. This metric is available only for the Omnichannel historical analytics dashboard.

Consult acceptance rate

Applies to Omnichannel real-time and Omnichannel historical dashboards.

The total number of sessions accepted by a service representative out of all the requested consult sessions.

DAX query and Dataverse reference

The following Data Analysis Expression (DAX) query and corresponding Dataverse entities are used in the Power BI semantic model. Learn more in DAX queries.


Consult acceptance rate = DIVIDE(SUMX (​FactSessionParticipant,​ IF (​FactSessionParticipant[AgentJoinedDateTime] <> BLANK() && FactSessionParticipant[ModeId] = "192350003",​ 1,​ 0​)),SUMX (FactSessionParticipant, 
IF (​FactSessionParticipant[ModeId] = "192350003",​ 1,​ BLANK()​)​), BLANK())

Element Value
Dataverse entities msdyn_sessionparticipant
Attributes - msdyn_sessionparticipant.msdyn_leftonreason​
- msdyn_sessionparticipant_msdyn_mode
Filters - All conversations where msdyn_sessionparticipant.msdyn_mode is Consult and msdyn_sessionparticipant.msdyn_joinedon isn't blank.

Consults requested

Applies to Omnichannel real-time and Omnichannel historical dashboards.

The total number of consult sessions requested.

DAX query and Dataverse reference

The following Data Analysis Expression (DAX) query and corresponding Dataverse entities are used in the Power BI semantic model. Learn more in DAX queries.


Consult requested = SUMX (​FactSessionParticipant,​ IF (FactSessionParticipant[ModeId] = "192350003", 1, 0  ) )

Element Value
Dataverse entities msdyn_sessionparticipant
Attributes - msdyn_sessionparticipant.msdyn_mode
Filters - All conversations where msdyn_sessionparticipant.msdyn_mode is set to Consult.

Consult requests accepted

Applies to Omnichannel real-time and Omnichannel historical dashboards.

The total number of consult sessions requested and accepted by a service representative.

DAX query and Dataverse reference

The following Data Analysis Expression (DAX) query and corresponding Dataverse entities are used in the Power BI semantic model. Learn more in DAX queries.


Consult requests accepted = SUMX (​FactSessionParticipant,​ IF (FactSessionParticipant[AgentJoinedDateTime] <>
BLANK() && FactSessionParticipant[ModeId] =
"192350003",​ 1, 0) )

Element Value
Dataverse entities msdyn_sessionparticipant
Attributes - msdyn_sessionparticipant.msdyn_joinedon​
- msdyn_sessionparticipant_msdyn_mode
Filters - All conversations where msdyn_sessionparticipant.msdyn_mode is Consult and msdyn_sessionparticipant.msdyn_joinedon isn't blank.

Consult requests not accepted

Applies to Omnichannel real-time and Omnichannel historical dashboards.

The total number of consult sessions requested but not accepted by a service representative.

DAX query and Dataverse reference

The following Data Analysis Expression (DAX) query and corresponding Dataverse entities are used in the Power BI semantic model. Learn more in DAX queries.


Consult requests not accepted = SUMX (​FactSessionParticipant,​ IF (FactSessionParticipant[AgentJoinedDateTime] ==
BLANK() && FactSessionParticipant[ModeId] = "192350003",1, 0 ) )

Element Value
Dataverse entities msdyn_sessionparticipant
Attributes - msdyn_sessionparticipant.msdyn_joinedon​
- msdyn_sessionparticipant_msdyn_mode
Filters - All conversations where msdyn_sessionparticipant.msdyn_mode is Consult and msdyn_sessionparticipant.msdyn_joinedon is equal to blank.

Session participant consult rejection count

Applies to Omnichannel real-time and Omnichannel historical dashboards.

Session participant consult rejection count is the total number of rejected consult sessions where the agent rejected the consult.

DAX query and Dataverse reference

The following Data Analysis Expression (DAX) query and corresponding Dataverse entities are used in the Power BI semantic model. Learn more in DAX queries.


Consult requests rejected = SUMX (​FactSessionParticipant,​ IF (FactSessionParticipant[LeftOnReason] == "AgentReject"
&& FactSessionParticipant[ModeId] = "192350003", 1, 0 ))

Element Value
Dataverse entities msdyn_sessionparticipant
Attributes - msdyn_sessionparticipant.msdyn_leftonreason​
- msdyn_sessionparticipant_msdyn_mode
Filters - All conversations where ​msdyn_sessionparticipant.msdyn_leftonreason is AgentReject and​ msdyn_sessionparticipant.msdyn_mode is Consult.

Session participant consult rejection rate

Applies to Omnichannel real-time and Omnichannel historical dashboards.

The total number of consult sessions rejected by a service representative out of all requested sessions.

DAX query and Dataverse reference

The following Data Analysis Expression (DAX) query and corresponding Dataverse entities are used in the Power BI semantic model. Learn more in DAX queries.


Consult rejection rate = DIVIDE(SUMX (​FactSessionParticipant,​ IF (FactSessionParticipant[LeftOnReason] ==
"AgentReject" && FactSessionParticipant[ModeId] = "192350003", 1, 0)),SUMX (FactSessionParticipant,IF
(FactSessionParticipant[ModeId] = "192350003",​ 1, BLANK() ) ), BLANK())

Element Value
Dataverse entities msdyn_sessionparticipant
Attributes - msdyn_sessionparticipant.msdyn_leftonreason​
- msdyn_sessionparticipant_msdyn_mode
Filters - All conversations where ​msdyn_sessionparticipant.msdyn_leftonreason is AgentReject and​ msdyn_sessionparticipant.msdyn_mode is Consult.

Session participant consult timed out count

Applies to Omnichannel real-time and Omnichannel historical dashboards.

The total number of consult sessions requested that timed out because the representative didn't respond.

DAX query and Dataverse reference

The following Data Analysis Expression (DAX) query and corresponding Dataverse entities are used in the Power BI semantic model. Learn more in DAX queries.


Consult requests timed out = SUMX(​FactSessionParticipant,​ IF (FactSessionParticipant[LeftOnReason] ==
"AgentTimeout" && FactSessionParticipant[ModeId] = "192350003", 1,0 ))

Element Value
Dataverse entities msdyn_sessionparticipant
Attributes - msdyn_sessionparticipant.msdyn_leftonreason​
- msdyn_sessionparticipant_msdyn_mode
Filters - All conversations where ​msdyn_sessionparticipant.msdyn_leftonreason is AgentTimeout and​ msdyn_sessionparticipant.msdyn_mode is Consult.

Session participant consult timed out rate

Applies to Omnichannel real-time and Omnichannel historical dashboards.

The total number of requested consult sessions that timed out because the representative didn't respond.

DAX query and Dataverse reference

The following Data Analysis Expression (DAX) query and corresponding Dataverse entities are used in the Power BI semantic model. Learn more in DAX queries.


Consult timed out rate = DIVIDE(SUMX (​FactSessionParticipant,​ IF (​FactSessionParticipant[LeftOnReason] == "AgentTimeout" &&
FactSessionParticipant[ModeId] = "192350003",​ 1, 0​)​),SUMX (​FactSessionParticipant,​ IF (​FactSessionParticipant[ModeId] = "192350003",​ 1,​ BLANK()​)​ ), BLANK())

Element Value
Dataverse entities msdyn_sessionparticipant
Attributes - msdyn_sessionparticipant.msdyn_leftonreason​
- msdyn_sessionparticipant_msdyn_mode
Filters - All conversations where ​msdyn_sessionparticipant.msdyn_leftonreason is AgentTimeout and​ msdyn_sessionparticipant.msdyn_mode is Consult.

Average consult time (min)​

The average time that service representatives spend helping other service representatives on consult requests. It's calculated by dividing the total time spent by service representatives on these requests by the total number of consult requests accepted. You can display the average consult time in minutes.

DAX query and Dataverse reference

The following Data Analysis Expression (DAX) query and corresponding Dataverse entities are used in the Power BI semantic model. Learn more in DAX queries.


Avg. consult time (min) = ​CALCULATE (​DIVIDE (​IF (​SUM (FactSessionParticipant[TotalParticipantTimeMin] ) = BLANK (), 0, SUM ( FactSessionParticipant[TotalParticipantTimeMin] )​), [Consult requests accepted]))

Element Value
Dataverse entities msdyn_sessionparticipant
Attributes - msdyn_sessionparticipant.msdyn_leftonreason​
- msdyn_sessionparticipant_msdyn_mode
Filters - All conversations where ​msdyn_sessionparticipant.msdyn_leftonreason is AgentTimeout and​ msdyn_sessionparticipant.msdyn_mode is Consult.

Customize visual display
Calculate conversation metrics
Calculate session metrics