Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
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. |
Related metrics
- 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. |
Related metrics
- 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 |
Related metrics
- 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.
Related metrics
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. |
Related information
Customize visual display
Calculate conversation metrics
Calculate session metrics