The building blocks
- Resource account: a special user object that fronts each AA and each CQ. It needs a (free) Teams Phone Resource Account licence, and a service number if reachable from PSTN. Disabled/licence-stripped resource accounts are the #1 silent killer of voice trees.
- Auto attendant: menus, business hours, holidays, dial-by-name, operator fallback; routes to people, queues, other AAs, voicemail, external numbers.
- Call queue: hold music + agents. Routing methods (attendant = ring all, serial, round robin, longest-idle), presence-based routing, agent opt-in, conference mode; overflow/timeout/no-agents exception routes each with a destination.
Trees compose: AA → CQ → escalate-AA → shared voicemail. Draw the tree BEFORE building; TAC shows nodes, never the forest.
Where they silently break
| Symptom | Cause |
|---|---|
| Callers hear nothing / disconnect at the tree's front door | Resource account disabled, licence removed, or number unassigned |
| Queue rings nobody, then overflow | All agents signed out/opted out/presence-DND with presence-based routing on |
| Agent's phone never rings | Not opted in; or their client/policy blocks queue calls |
| Holiday menu on a Tuesday | Holiday set overlaps; time zone of the AA vs reality |
| Transfers to external fail | Resource account lacks routing capability for outbound (needs appropriate licensing/policy for external transfer) |
| Shared voicemail unread forever | It lands in a group mailbox nobody watches — assign owners |
The Queues app (Teams Premium)
The agent/supervisor front-end has grown into a real console: agent opt-in/out per queue, live queue stats, and supervisor monitor / whisper / barge / takeover, with shared call history (rolling out early 2026) and shared voicemail management (from Apr 2026) — Premium-licensed, admin-enabled. For sub-contact-centre needs it removes the third-party bolt-on; for real contact centres, certified CCaaS integrations remain the path.
What to watch (proofs)
- Tree inventory as data:
Get-CsAutoAttendantandGet-CsCallQueue(full objects: menus, agents, overflow targets) — export both; that's the forest map TAC won't draw. Resource accounts:Get-CsOnlineApplicationInstance. - The front-door health check:
Get-CsOnlineApplicationInstanceaccounts joined to Entra sign-in state + licence — disabled/unlicensed = your outage-in-waiting list. - Live behaviour: call the tree from a mobile at 08:59 and 09:01 — business-hours boundary behaviour is the two-minute acceptance test after every change.
- Queue analytics: TAC AA/CQ analytics (waits, abandons, per-agent) and the Queues app's real-time view — abandon-rate trend is the metric execs actually feel.