D365 Unified Routing: Skills-Based Assignment That Works
Unified Routing in Dynamics 365 Customer Service replaces the legacy queues-and-assignment-rules model with a proper routing engine — one that considers agent skills, capacity, presence, and configurable prioritisation criteria. After rolling this out in two mid-size contact centres, here's what I wish the docs had told me upfront.
What Unified Routing Actually Is
Unified Routing (UR) is a managed service that intercepts every incoming work item — whether it's an email, chat session, voice call (via Azure Communication Services), or a case created by a Dataverse plugin — and routes it through a decision pipeline:
- Intake rules classify the work item and assign it to a queue
- Assignment rules within the queue match the work item to the right agent
The key difference from the old routing-rule-set approach: UR evaluates agent capacity and skills at assignment time. You're not just round-robining into a queue; the engine actively checks who can take the work.
Setting Up Capacity Profiles
Before skills matter, you need capacity profiles. These define how much work an agent can carry simultaneously.
Go to Customer Service admin centre → Workforce management → Capacity profiles. Create one profile per work item type:
Chat Support — max 3 concurrent chats
Email Support — max 10 open cases
Voice — max 1 active call
Profiles stack. An agent with all three can handle up to 3 chats + 10 cases + 1 call simultaneously — the engine enforces each cap independently.
Assign profiles to users under Customer Service admin centre → Users → [user] → Capacity. For bulk onboarding, the supported path is a Dataverse dataflow / Excel import against the capacity-profile and user lookup tables (the exact relationship table varies by release — check the entity reference for your environment before scripting it). The Web API endpoint pattern is the standard /api/data/v9.2/<table> shape; verify the table logical name in the maker portal first rather than copy-pasting names.
Defining Skills and Proficiency
Skills live at Admin centre → Routing → Skills. Create a flat list of skill names — keep them specific:
Language-English, Language-French, Language-Spanish
Product-ERP, Product-CRM, Product-Billing
Level-Tier1, Level-Tier2, Level-Tier3
Avoid over-engineering the taxonomy. Broad categories like "Technical" add no routing value.
For each agent, assign skills with a proficiency rating (1–10). The assignment engine uses proficiency when multiple agents qualify — higher proficiency wins, all else equal.
Proficiency assignment in bulk via dataflow is the sane approach for 50+ agents:
AgentEmail,Skill,Proficiency
alice@contoso.com,Product-ERP,9
alice@contoso.com,Language-English,10
bob@contoso.com,Product-CRM,7
bob@contoso.com,Language-French,8
Import via the Import from Excel option on the Skills assignment page. For programmatic assignment, use a Dataverse dataflow or write directly to the agent-skill characteristic relationship — Microsoft's bookable resource characteristics reference is the entry point for finding the exact tables in your environment.
Building Classification Rules
Classification rules sit on the workstream (the intake layer). They read attributes of the incoming work item and set routing-relevant fields — most importantly, the skills required and the priority.
For a case-routing scenario:
- Navigate to Admin centre → Workstreams → [your workstream] → Routing rules → Create ruleset
- Add rules with conditions:
- Case Subject contains "billing" → Set Skill =
Product-Billing, Priority =High - Customer Tier = "Enterprise" → Set Priority =
Urgent, Required Skills +=Level-Tier2
- Case Subject contains "billing" → Set Skill =
You can also fire classification rules from Power Automate if you need to call external systems (e.g., a sentiment API) before assigning skills. The key is to populate the msdyn_liveworkitem skill requirements before UR picks an agent.
Assignment Rules: Exact Match vs. Closest Match
Inside each queue, you define assignment methods. The two that matter most:
Highest capacity — sends the work item to whoever has the most remaining capacity. Good for email where any qualified agent will do.
Round-robin — rotates evenly within qualified agents. Good for voice when load distribution matters.
Both methods support a skill matching mode:
- Exact match — the agent must have all required skills. No partial matches.
- Closest match — if no agent has all skills, UR falls back to the best partial match. Useful for off-hours routing when your Tier-2 team isn't online.
Set this at the assignment ruleset level. For SLA-sensitive workstreams, start with exact match and set up an overflow rule rather than silently degrading to partial.
Overflow and Escalation Rules
Overflow kicks in when the queue can't find an assignment within a threshold. At the queue level, under Overflow conditions, configure:
- After X minutes in queue → move to another queue
- If queue size exceeds N → redirect to an overflow queue
Example: your primary Billing-English queue uses exact skill matching. If a work item waits more than 8 minutes, overflow to Billing-General where agents have broader billing skills. This gives your SLAs a safety net without permanently degrading routing quality.
Monitoring Routing Effectiveness
The Unified Routing Diagnostics dashboard (Customer Service Historical Analytics → Routing) shows:
- Assignment attempts per work item
- Time in queue before assignment
- Skill match rate (exact vs. closest)
- Capacity utilisation per agent
Watch the "assignment attempt count" metric. If items regularly take 5+ attempts to assign, your skill matrix is too narrow — either you're requiring skills no online agent has, or your capacity profiles are too restrictive.
A useful OData query for programmatic monitoring:
GET /api/data/v9.2/msdyn_ocliveworkitems?
$select=msdyn_assignmentattemptcount,msdyn_createdon,msdyn_queueid
&$filter=msdyn_createdon ge 2026-04-17T00:00:00Z
&$orderby=msdyn_assignmentattemptcount desc
&$top=50
This surfaces your worst-performing work items for the past week.
Practical Gotchas
Agent presence matters. Unified Routing only assigns to agents whose Omnichannel presence is Available or Busy (within capacity). If agents forget to set presence, work items queue up even when agents are sitting idle. Fix this with the Omnichannel Insights "Agent Status" report.
Skills on teams, not just users. You can assign skills to a Dataverse team rather than individual users. Every member of the team inherits those skills — useful for shared queues where all Tier-2 members need the same base skill set.
Workstream channel scope. Each workstream is scoped to a single channel (chat, email, voice). You can't share a workstream between channels. If you try to route email and chat through the same rules, you'll need two workstreams with aligned rulesets.
Hold-for-agent behaviour. Each assignment ruleset has settings governing what happens when no agent currently meets the skill requirements — whether to keep the item queued and re-evaluate, fall back to closest match, or escalate via overflow. Tune these on the ruleset itself; defaults are conservative and you'll often want to override them for SLA-sensitive workstreams. Just don't enable a long hold for chat — users won't wait.
Putting It Together
A production-grade skills-based routing setup looks like this:
Intake (Workstream: Email-Support)
└─ Classification ruleset
├─ Rule: Subject ~ "invoice" → Skill: Product-Billing, Priority: High
├─ Rule: Account Tier = Gold → Required Skill: Level-Tier2
└─ Default → Skill: Product-General, Priority: Normal
Queue: Billing-Tier2 (Exact skill match, Highest capacity)
└─ Overflow → Billing-General (after 10 min)
Queue: Billing-General (Closest match, Round-robin)
└─ Overflow → Supervisor queue (after 15 min)
Test each rule path explicitly using the Route to queue test panel in the admin centre before going live. Unified Routing's routing diagnostics show exactly why a work item went where it did — use it.
Keep reading
MCP Explained: How Claude Connects to Your Dataverse Data
An introduction to the Model Context Protocol and how the Dataverse MCP server lets Claude read and write business data through natural language.
Querying Dataverse from Claude: A Practical MCP Walkthrough
A hands-on example of using the Dataverse MCP server with Claude to query tables, create records, and update data in Dynamics 365 through natural language.
What's New in Dynamics 365 and Power Platform — 2026 Release Wave 1
The standout features from Microsoft's 2026 Release Wave 1 for Dynamics 365 and Power Platform, and what they mean for your projects.
Newsletter
New posts, straight to your inbox
One email per post. No spam, no tracking pixels, unsubscribe anytime.
Comments
No comments yet. Be the first.