01What this engagement covered
Teams Phone is not enabled by assigning a license. A production deployment has to hold together across licensing, identity, voice policy, carrier services, number management, voice applications, dial plans, emergency calling and the network path the media actually takes. The work below is organized the way the project ran.
Discovery and readiness
- Tenant, domain and administrative role review
- Existing voice service and contractual position
- Department-by-department call handling requirements
- Number inventory and porting dependencies
- Working hours, holidays and time zones per group
- Configuration baseline exported before any change
Design
- Full call tree agreed and signed off before configuration
- PSTN connectivity evaluated as an architectural decision
- Number plan separating users from voice applications
- Policy matrix by role, not per user
- Emergency-calling design with assumptions documented
Build
- Licensing, resource accounts, number assignment
- Auto Attendants: business hours, after hours, holidays
- Call Queues per department with agreed exception handling
- Dial plan normalization, tested against the effective plan
- Calling, voice routing and caller ID policies
Validate and hand over
- Structured test plan executed against the design
- Network and QoS validated end to end before go-live
- Defects fixed and retested, not noted and deferred
- Runbook, administrator guide and end-user quick start
02Architecture and call flow
Signaling always traverses the Microsoft cloud. What varies between connectivity models is who owns the PSTN leg and whether an SBC sits in the path at all. The dashed branch below is Direct Routing, which applies only when the architecture calls for it.
Inbound call flow, illustrative pattern
This is an illustrative pattern used to explain the design, not the customer’s published telephone configuration.
Mermaid source for the architecture diagram
For reuse in documentation that renders Mermaid. The SVG above is hand-drawn so this page stays self-contained and needs no renderer.
flowchart LR PSTN[External PSTN callers] --> CAR[PSTN carrier] CAR --> TP[Microsoft Teams Phone] CAR -.Direct Routing, when required.-> SBC[Certified SBC] SBC -.SIP over TLS.-> TP TP --> AA[Auto Attendant] AA --> CQ1[Sales queue] AA --> CQ2[Support queue] AA --> CQ3[Billing queue] AA --> REC[Reception / operator] AA --> VM[Shared voicemail] CQ1 --> U[Teams users] CQ2 --> U CQ3 --> U CQ1 -.overflow / timeout.-> VM CQ2 -.overflow / timeout.-> VM CQ3 -.overflow / timeout.-> VM ENT[Microsoft Entra ID] --> TP TAC[Teams admin center] --> TP TP --> CQD[Call Analytics and Call Quality Dashboard]
Mermaid source for the call-flow diagram
flowchart TD
IN[Call to main business number] --> SCHED{Schedule}
SCHED -->|Business hours| MENU[Auto Attendant menu]
SCHED -->|After hours| AH[Announcement] --> SV[Shared voicemail]
SCHED -->|Holiday| HOL[Holiday greeting] --> SV
MENU -->|1| SALES[Sales queue]
MENU -->|2| SUP[Support queue]
MENU -->|3| BILL[Billing queue]
MENU -->|0| OPR[Reception]
MENU -->|No input or invalid| OPR
SALES -->|Answered| AG[Representative]
SALES -->|Overflow or timeout| SV
SUP -->|Overflow or timeout| SV
BILL -->|Overflow or timeout| SV
03Evaluating PSTN connectivity
Four supported models, and Microsoft allows them to coexist in a single tenant. That matters: the question is not which one wins, it is which one fits each requirement. The model chosen for this engagement is not published — the appropriate PSTN connectivity model was selected based on carrier, geographic, regulatory and integration requirements.
| Connectivity model | Best suited for | Operational ownership | Key benefits | Important considerations |
|---|---|---|---|---|
| Microsoft Teams Calling PlansMicrosoft is the carrier | Organizations in a country where Calling Plans are offered, with no need to keep an existing provider | Microsoft owns the PSTN service end to end. No SBC, no carrier contract to manage | Fastest to stand up. Single vendor for licensing and PSTN. Numbers acquired or ported in the Teams admin center | Country availability is the first gate. Less flexibility where legacy integration or unusual routing is needed. Number porting timelines sit with Microsoft and the losing carrier |
| Operator ConnectCertified landline operator | Organizations whose preferred carrier is in the program, or that need a country Calling Plans does not cover | The operator owns the PSTN service and the infrastructure. No SBC to buy or run | Existing carrier commercials can be retained. Operator manages capacity and the trunk. Provisioning happens through the Teams admin center | Limited to participating operators. Number and capacity changes follow the operator’s process, not yours |
| Teams Phone MobileCertified mobile operator | Workforces that are mobile-first and want one number reachable on the handset and in Teams | Mobile operator owns the SIM and the service | A single number across the mobile handset and Teams. No separate desk number to maintain or publish | Limited to participating mobile operators. Note for scripting: number assignment uses the OperatorConnect number type, not a distinct value |
| Direct RoutingAny carrier, your SBC | Countries the other models do not reach, retained carrier contracts, legacy PBX interoperability, analog devices, paging and other on-premises integration | You, your integrator, or a managed provider. The SBC, its certificate and its carrier trunk are yours to run | Works anywhere. Any carrier. The routing flexibility the other models do not offer, and the only path for most on-premises integration | The largest operational surface. Certified SBC, public FQDN on a verified domain, public certificate, TLS, and the voice routing chain all have to be right and stay right |
What the choice actually turns on
Geography and regulation
- Is the model offered in every country the organization operates in?
- What does the local regulator require of an emergency call, and can the model satisfy it?
- Some countries require the emergency address to match the number’s area code before a number can be activated
Numbers and contracts
- Which numbers carry business value and must be retained?
- What is the notice period on the incumbent carrier contract?
- How long will porting take, and what is the fallback if it slips?
Integration
- Is there a PBX that has to stay, at least for a while?
- Analog devices — lifts, door phones, overhead paging, fax?
- Is a contact-center platform in scope now or later?
Who runs it
- Does the organization want to own an SBC and its certificate lifecycle?
- Who is called at two in the morning when the trunk drops?
- Is a managed Direct Routing service a better fit than doing it in-house?
04Auto Attendants and Call Queues
Both are backed by resource accounts, and both have limits that are easier to design around than to discover halfway through a build. The values below are Microsoft’s published limits, not this engagement’s configuration.
Resource accounts: the part people get wrong
They are service objects, not people
- Created disabled for sign-in, and they must stay that way
- No chat, no presence
- Excluded from lifecycle processes that act on user accounts
Licensing is separate and specific
- Each needs a Microsoft Teams Phone Resource Account license — free, and required whether or not the account holds a number
- Do not assign Teams Phone Standard to a resource account
- Migrating an old one means removing the old license and adding the new one in the same operation, or the voice application breaks
A number is not always needed
- Required only if the auto attendant or queue must be dialable directly
- A nested attendant sitting behind another voice application does not need one
- Fewer published numbers is fewer numbers to govern
Outbound on behalf of the account changed
- From 1 November 2025, where the resource account uses a Calling Plan number, a Calling Plan licence no longer covers PSTN calls placed on behalf of that account
- That includes external transfer and queue callback
- A funded Pay-As-You-Go Calling Plan or Communications Credits is required instead
- Operator Connect has separate requirements set by the operator. There is no change for Direct Routing numbers, which continue to need an online voice routing policy on the resource account
Call Queue routing methods
| Method | Behaviour | When it is the right choice |
|---|---|---|
| Attendant | Rings every available representative at once; first to answer takes the call. The default. | Small teams that want maximum pickup speed and do not care about even distribution. Noisy above a handful of people. |
| Serial | Rings one representative at a time in a defined order, cycling until answered or the queue times out. | Where seniority or escalation order genuinely matters. Slowest to answer, so keep the agent alert time near Microsoft’s recommended 20-second minimum and size the queue timeout to cover the whole rotation. |
| Round robin | Balances so each representative receives roughly the same number of calls. | The safe default for a larger team. Fair without changing how people manage their presence. |
| Longest idle | Routes to whoever has been available longest. Automatically enables presence-based routing. | Fairest distribution — but the presence side effect surprises teams that use Do Not Disturb heavily, because those people stop receiving calls. Decide that deliberately. |
Published limits worth designing against
| Constraint | Limit | Why it shapes the design |
|---|---|---|
| Transitions per call across all voice apps | 25 | The real guard against deep nesting and routing loops. A call that exceeds it is disconnected, so chained attendants need counting. |
| Holiday sets per auto attendant | 10 | Group holidays by behaviour rather than one set per date. |
| Holidays per holiday set | 50 | Plenty for several years of a national calendar, which is the right horizon to load. |
| Directory search per attendant | 1 | Dial by name or dial by extension, not both. Wanting both means chaining a dedicated attendant behind a dial key. |
| Text-to-speech greeting length | 1,000 characters | Long enough that nobody hits it, short enough to notice if a greeting is being pasted from a script. |
| Audio greeting file size | 5 MB | WAV, MP3 or WMA. Record at a sane bitrate rather than sending a studio master. |
| Representatives per call queue | 200, or 15 as individual users | The 200 figure requires team-channel or group membership. Individual assignment caps at 15 and is not supported alongside automatic recording — one reason group-based membership is the better pattern. |
| Calls waiting per queue | 200 | Set the overflow threshold well below this. Reaching the platform limit is not a design. |
| Maximum wait time per call | 45 minutes | The timeout should fire long before this, at a duration the business has actually agreed. |
| Agent alert time | 15–180 s, default 30 | Microsoft recommends at least 20 seconds. Too short and calls bounce; too long and serial routing crawls. |
| Authorized users per voice app | 15 | The people allowed to change queue settings without full Teams admin rights. Needs both a voice applications policy and a listing on the queue. |
-AgentAlertTime, -AllowOptOut and the rest still say agent. Both words appear across current pages, so neither is wrong yet.
05Numbering, dial plans and policies
Three things that look like configuration and behave like architecture. Every example below uses placeholder values.
Dial plan normalization
A dial plan turns what a person types into a routable E.164 number. Rules are evaluated top to bottom and the first match wins, so ordering is part of the design — put the specific patterns above the general ones. The effective dial plan is the service dial plan for the user’s country merged with either the tenant Global dial plan or, where one is assigned, the user’s tenant dial plan — never all three. Only the merged result matters.
| What the user dials | Illustrative pattern | Illustrative translation | Note |
|---|---|---|---|
| 4-digit internal extension | ^(\d{4})$ | +1202555$1 | Ordering only matters where patterns can overlap. An anchored fixed-length rule like this one cannot be shadowed. |
| 10-digit local number | ^(\d{10})$ | +1$1 | The most common rule. Note it overlaps the international row below — a ten-digit string beginning 011 matches both, and this one wins. |
| 11-digit with national prefix | ^1(\d{10})$ | +1$1 | Catches habitual dialers who prefix everything. |
| International with access code | ^011(\d+)$ | +$1 | Access code varies by country. Place above the ten-digit rule where ten-digit strings beginning 011 are realistic; the service dial plan usually already covers this. |
| Already E.164 | ^\+(\d+)$ | +$1 | Pass-through, so a correctly formatted number is never mangled. |
Rules get tested, not assumed. Both the Teams admin center and PowerShell will evaluate a dialed string against the effective plan for a named user:
# Illustrative — placeholder values throughout Test-CsEffectiveTenantDialPlan -Identity user@example.com -DialedNumber 2025550100
Policy assignment by role
| Role | Outbound calling | Caller ID presented | Reasoning |
|---|---|---|---|
| General staff | Domestic only | Own direct number | International dialing is a toll-fraud exposure before it is a cost. Grant it where the job needs it. |
| Queue representatives | Domestic only | Departmental or main business number | A returned call comes back to the team, not to one person’s handset while they are on leave. |
| Roles with genuine international need | Domestic and international | Own direct number | Named and reviewed, not granted tenant-wide because it was easier. |
| Common-area and shared devices | Restricted | Site or main number | Unattended endpoints in public space are the classic toll-fraud target. |
| Reception / operator | Domestic, with transfer rights | Main business number | The operator is the fallback target for the attendant, so their calling policy has to support transfer. |
CallingIDSubstitute = Service) is deprecated — new policies cannot be created with it, and Microsoft directs you to Resource instead. Anything written against the older pattern needs revisiting.
06Direct Routing, when the architecture calls for it
Direct Routing was evaluated as one of four options. It is described here because it is the model with the largest operational surface, and because the prerequisites are where most deployments stall. Nothing on this page states which model this engagement used.
Prerequisites, and why each one bites
| Prerequisite | Requirement | The failure it prevents |
|---|---|---|
| Certified SBC | Only session border controllers on Microsoft’s certified list are supported | An uncertified device may interoperate today and lose support the moment you need it. |
| Public FQDN on a verified domain | The SBC name must sit under a domain registered in the tenant. *.onmicrosoft.com is not supported. Name length is capped at 63 characters. | Pairing simply fails, usually late on a Friday, with an error that does not name the cause. |
| Licensed user on that domain | A user with the SBC’s domain must exist in the tenant with an E3 or E5 license, and the domain must be Managed | An easily missed prerequisite that produces the same opaque pairing failure. |
| Public certificate | Issued by a CA in the Microsoft Trusted Root Program. SBC name as CN or SAN. Server Authentication EKU. Minimum 2048-bit key. Wildcards supported. | A self-signed or internally issued certificate will never establish the TLS session. |
| TLS 1.2 signaling | Microsoft enforces TLS 1.2 on the Direct Routing SIP interface, with a defined cipher list | An SBC pinned to older TLS negotiates nothing at all. |
| SIP OPTIONS enabled | The SBC sends periodic OPTIONS so the trunk reports its own health | Without it, the health dashboard cannot distinguish a quiet trunk from a dead one. |
| Firewall openings | SIP over TLS outbound to port 5061 on Microsoft’s SIP proxies; media to the published UDP ranges. Microsoft recommends at least two ports per concurrent call on the SBC. | Signaling works, media does not. This is the classic one-way audio cause. |
| Certificate lifecycle owner | A named owner, a renewal window, and someone watching the dashboard | An expired certificate takes the trunk down completely. The health dashboard warns at 30 days, which only helps if it is being read. |
The voice routing chain
Four objects, chained in one direction. A call is matched against the policy assigned to the user, then against the PSTN usages inside it in order — and this is the part that catches people out: if a match is found in the first usage, later usages are never evaluated. Usage order is a design decision, not a list.
Sanitized PowerShell
Placeholder domains and numbers throughout. These are reference examples, not commands taken from a customer environment.
# Connect Connect-MicrosoftTeams # Inspect a voice-enabled user Get-CsOnlineUser -Identity user@example.com | Select-Object DisplayName, UserPrincipalName, EnterpriseVoiceEnabled, LineURI, TelephoneNumbers, OnlineVoiceRoutingPolicy, FeatureTypes # Number-centric view: state, type, and what it is assigned to Get-CsPhoneNumberAssignment -AssignedPstnTargetId user@example.com # Assign a number to a user # -NumberType is one of: DirectRouting, CallingPlan, OperatorConnect # Teams Phone Mobile numbers use OperatorConnect Set-CsPhoneNumberAssignment -Identity user@example.com ` -TelephoneNumber +12025550100 -NumberType CallingPlan # Assign a service number to a voice application's resource account Set-CsPhoneNumberAssignment -Identity aa-main@example.com ` -TelephoneNumber +12025550111 -NumberType DirectRouting # Review voice routing policies and what they contain Get-CsOnlineVoiceRoutingPolicy Get-CsOnlineVoiceRoutingPolicy | Where-Object { $_.OnlinePstnUsages -contains "International" } # Review configured PSTN gateways and their health-relevant settings Get-CsOnlinePSTNGateway | Select-Object Identity, SipSignalingPort, Enabled, SendSipOptions, MediaBypass, MaxConcurrentSessions, FailoverTimeSeconds
Set-CsOnlineVoiceUser and Set-CsUser -OnPremLineURI are deprecated for number assignment; Set-CsOnlineApplicationInstance -OnpremPhoneNumber is deprecated for the same purpose; Get-CsOnlineVoiceUser is no longer supported on public and GCC clouds. All of these still appear in older internet guidance. Set-CsPhoneNumberAssignment replaces them — and note that -PhoneNumber / -PhoneNumberType are aliases; the canonical parameter names are -TelephoneNumber and -NumberType.
07Emergency calling and location design
This is the part of a Teams Phone deployment where an undocumented assumption does real harm. Requirements vary by country, by carrier and by regulatory jurisdiction, and a design that is correct in one country is not automatically correct in another. What follows is the structure of the design, not a legal position.
Address
- The civic address — the street address of a place of business
- Must be validated before it can be assigned to users or network identifiers
- Needs geo coordinates to be usable for dynamic location, which the admin center applies when the address is created from map search
Place
- A floor, wing, suite or zone within that address
- Unlimited places per address
- This is what turns “the building” into something a responder can act on
Location
- An address, optionally with a place
- Each combination gets its own location ID
- The location ID is what actually gets assigned
Dispatchable location
- The precise location conveyed when an emergency call is placed
- The whole design exists to make this accurate for a user who moves
How a client gets matched to a location
Network identifiers are mapped to locations, and the first match wins in this order:
Two policies that are easy to confuse
| Emergency calling policy | Emergency call routing policy | |
|---|---|---|
| Applies to | All PSTN connectivity models | Direct Routing. Also used to identify emergency numbers where Shared Calling is in use with Calling Plans or Operator Connect |
| Controls | Security-desk notification, remote-user external location lookup, per-number extended notifications, and an optional disclaimer | Emergency dial strings and masks, and the PSTN usage that routes the call toward the answering point |
| Assignable to | Users, groups and network sites | Users and network sites; the site assignment overrides the user policy while the user is at that site |
| Notification modes | Notify only, conferenced in muted, or conferenced in unmuted — a dial-out number can be set only for the conferenced modes | Not applicable |
Remote and home-based users
- External location lookup lets the client suggest an address the user confirms or edits
- A confirmed address is remembered for that network
- Supported on Teams desktop for Windows and Mac; Teams phones do not offer it, and mobile detects but does not prompt
- Whether a call goes straight to the answering point or is screened first depends on how the address was obtained — admin-provisioned and user-confirmed addresses go direct, manually entered ones are screened
Operational realities
- Network configuration changes take up to four hours to propagate
- Emergency addresses more than a couple of years old cannot be assigned to network identifiers. Microsoft does not publish an exact age, so re-create old records rather than testing the boundary
- Testing has to be coordinated so verification does not page a security desk or reach an emergency service unnecessarily — the extended-notification mechanism exists to suppress notifications for a test number
- Every assumption behind this design belongs in the handover document
08Network readiness and call quality
Voice quality is a property of the entire media path, which is why the whole path gets checked rather than the client configuration alone. In practice the fault sits in whichever segment has no single owner — the handoff between the network team and the security team, or between the office and whoever runs the VPN.
QoS marking, illustrative
| Media type | DSCP | Class | Client source ports |
|---|---|---|---|
| Audio | 46 | Expedited Forwarding | 50,000–50,019 |
| Video | 34 | Assured Forwarding 41 | 50,020–50,039 |
| Application and screen sharing | 18 | Assured Forwarding 21 | 50,040–50,059 |
| Calling and meeting signaling | 40 | Class Selector 5 | 50,070–50,089 — not configurable |
What has to be open, and what has to be left alone
Media path
- UDP 3478–3481 outbound to the Microsoft 365 Optimize ranges
- TCP 443 and 80 for signaling and service traffic
- Media prefers UDP; TCP fallback works and sounds worse, so it is a symptom rather than a solution
Proxy and inspection
- Bypass proxies and TLS inspection for Microsoft 365 media endpoints
- Media is already encrypted with SRTP; inspecting it adds latency and buys nothing
- Media traffic has no URL, so bypass must be expressed by IP subnet
VPN
- Split-tunnel the Optimize ranges so media egresses locally
- A tunnel that hairpins media through a distant concentrator adds latency the network cannot recover from
- If media still enters the tunnel with correct routes in place, block those subnets inside the tunnel explicitly
Wireless and endpoints
- Coverage and roaming behaviour, not just signal strength at the desk
- Channel overlap and interference on the bands in use
- Headset quality and firmware — the most common cause of a complaint that telemetry says is fine
Thresholds used when reviewing quality
| Metric | Treated as poor | What it usually points at |
|---|---|---|
| Jitter | Above 30 ms | Congestion or a queueing device somewhere in the path; often wireless. |
| Packet loss rate | Above 10 percent average | A saturated link, a duplex mismatch, or wireless interference. |
| Round-trip time | Above 500 ms | A hairpin. VPN, a distant proxy, or egress through another region. |
These are the thresholds Microsoft publishes for classifying a poor stream in the Call Quality Dashboard. They are review criteria, not a service guarantee — no design guarantees call quality, and this one does not claim to.
09Test and acceptance matrix
This is the test plan and acceptance methodology used, not a claim that every scenario passed first time. Several did not, which is what the troubleshooting section below came from. Defects were fixed and retested rather than noted and deferred.
| Test area | Scenario | Expected result | Evidence captured |
|---|---|---|---|
| Internal calling | Teams-to-Teams call between two enabled users on different networks | Call connects with two-way audio; media takes the expected path | Call Analytics session detail showing media path and stream quality |
| Outbound local | User dials a local number in the format they habitually use | Dial plan normalizes to E.164; call completes; correct caller ID presented | Effective dial plan test output plus the call record |
| Outbound long distance | User dials a domestic long-distance number | Call completes and routes over the intended path | Call record and, for Direct Routing, the SIP ladder |
| Authorized international | A user whose role includes international dialing calls an international number | Call completes | Call record and the policy assignment for that user |
| Blocked international | A user without international authorization attempts the same number | Call is refused; the user gets a clear failure rather than silence | Client error and the policy assignment showing the restriction |
| Inbound direct | External caller dials a user’s direct number | The user’s Teams client rings and the call connects | Call record with inbound leg detail |
| Main number, business hours | External caller dials the main number during business hours | Business-hours greeting plays and the menu is offered | Recorded test call notes and the attendant configuration export |
| Menu selection | Caller presses each configured key in turn | Each key routes to its intended queue, person or announcement | One test call per key, logged against the signed-off call tree |
| Operator | Caller presses the operator key, and separately presses nothing at all | Both reach the operator target | Two test calls; the no-input case timed to confirm the timeout |
| Invalid entry | Caller presses an unmapped key | Invalid-entry handling fires as designed rather than disconnecting | Test call notes |
| Dial by name | Caller uses directory search for a known user | Correct user is found and the call transfers | Test call; directory scope configuration exported |
| After hours | Call placed outside configured business hours | After-hours flow runs; caller reaches the after-hours destination | Test call performed outside hours, not simulated by editing the schedule |
| Holiday | Call placed on a date in the holiday set | Holiday flow takes precedence over both other flows | Test performed with a temporary dated entry, then removed and reverified |
| Queue distribution | Successive calls into a queue with multiple representatives available | Calls distribute according to the configured routing method | Sequence of test calls with which representative was alerted each time |
| Voicemail | Call to an unavailable user, and separately to a queue that times out | Personal voicemail and shared voicemail each receive the message and notify | Message delivery confirmed in the target mailbox |
| Caller ID | Outbound call from a queue representative to an external number | The departmental or main number is presented, not the individual line | Number displayed on the receiving device, photographed without personal data |
| Hold and resume | Place an active external call on hold and retrieve it | Hold audio plays to the external party; audio resumes both ways | Test call notes |
| Blind transfer | Transfer an external call without announcing | Call arrives at the target with the external party still connected | Test call notes |
| Consultative transfer | Consult the target, then complete the transfer | Consultation is private; completion connects the two parties | Test call notes |
| Call forwarding | Forward to another internal user and, where policy allows, to an external number | Forwarding behaves as the calling policy permits; disallowed forwarding is refused | Test calls plus the calling policy showing what is permitted |
| Simultaneous ring | Enable simultaneous ring to a second endpoint | Both endpoints alert; answering on one clears the other | Test call notes |
| Delegation | A delegate makes and receives calls on behalf of a manager | Delegate can answer and place calls; the correct identity is presented | Test calls in both directions |
| Queue overflow | Fill the queue past the overflow threshold | The overflow action fires at the configured count, to the configured destination | Test calls counted deliberately up to the threshold |
| Queue timeout | Let a queued call exceed the timeout with nobody answering | The timeout action fires at the configured duration | Timed test call |
| No representatives | All representatives opted out or unavailable | The no-agent action fires rather than the call queueing indefinitely | Test call with the queue deliberately emptied |
| Common-area device | Inbound and outbound calls from a shared endpoint | Calls work; the device’s calling restrictions hold | Test calls plus the policy assigned to the device account |
| Remote user | A user off the corporate network places and receives calls | Calls complete with acceptable media quality; the media path is as expected | Call Analytics session detail from the remote session |
| Emergency location | Controlled verification that the expected location is presented | The client reflects the intended dispatchable location for its network position | Client-side location display; notification suppressed for the test |
| Trunk failover | Where Direct Routing with more than one gateway is in scope, drain the active SBC | New calls route to a surviving gateway; established calls continue. Ordering within a single route is not deterministic | Health dashboard state before and after, plus a test call during the drain |
10Troubleshooting runbook, by symptom
Organized the way a problem actually arrives — someone says the phone is not working. Each entry is the sequence I work through, cheapest and most likely first. Every entry here came out of something that actually went wrong during the build or the test pass.
A user cannot make outbound calls
- Confirm the user is actually voice-enabled and holds both a Teams Phone license and, where the model requires one, a PSTN service license. A license assigned an hour ago may not have propagated.
- Check the number assignment exists and is in E.164 with no
tel:prefix. Assigning a number sets enterprise voice enabled automatically, so if that flag is false the assignment probably did not take. - Look at the calling policy. A restriction that blocks the call type is the answer more often than anything technical — and it should be, because that restriction was deliberate.
- Test what the user dialed against the effective dial plan. If normalization produces something other than a valid E.164 number, the routing layer never gets a chance.
- For Direct Routing, confirm a voice routing policy is assigned, then walk the chain: policy to usages, usages to routes, routes to gateways. Remember the first matching usage wins and later usages are never evaluated, so a route that looks correct can be shadowed by one above it.
- Check the gateway is enabled and not drained.
Get-CsOnlineUser, Get-CsPhoneNumberAssignment, Test-CsEffectiveTenantDialPlan, Get-CsOnlineVoiceRoutingPolicy, Get-CsOnlinePSTNGateway, SBC logs.Inbound calls fail or never arrive
- Confirm the number is assigned to the object you think it is. A number that was moved during testing and never moved back is a common cause.
- Establish where the call is dying: at the carrier, at the SBC, or in Teams. The usage report and, for Direct Routing, the SIP ladder will tell you whether the call reached Microsoft at all.
- If the call never reaches Microsoft, it is a carrier or porting question, not a Teams question. Check the port completed and the number is live on the intended trunk.
- For Direct Routing, check the inbound number format the carrier is sending. A carrier presenting a national-format number against a route expecting E.164 fails silently.
- Check the target object’s state — a resource account missing its license, or one that had Teams Phone Standard assigned to it by mistake, will not answer.
The Auto Attendant does not route the way the design says
- Confirm which call flow is actually running. Nine times in ten the answer is a time zone: the schedule is correct in local terms and the attendant is evaluating it somewhere else.
- Check the holiday set. Holidays take precedence over both other flows, so a stale entry silently overrides everything on the day it matches.
- Verify each menu key maps to the destination on the signed-off call tree, and that the destination object is voice-enabled and licensed.
- Check the operator is set. If it is not, the failure path and the no-input path have nowhere to go.
- Count the transitions if attendants are chained. Twenty-five transitions across voice applications is the ceiling, after which the call is disconnected — which presents as a mysterious drop rather than an error.
- For external transfer targets, confirm the licensing that permits an outbound call on behalf of the resource account. This changed on 1 November 2025 and a configuration that worked before then can stop working with no change at your end.
Call Queue representatives are not receiving calls
- Check membership resolved. Group and channel-based membership takes time to become operational after a change — hours, not minutes — so a queue built and tested in the same session can look broken when it is only slow.
- Check whether presence-based routing is on. If the routing method is longest idle it is on whether or not anyone chose it, and anyone on Do Not Disturb is being skipped by design.
- Check who has opted out. Opt-out is enabled by default and people use it.
- Confirm every member is individually voice-enabled and licensed. One unlicensed member in a group does not break the queue, it just quietly never rings.
- Check the agent alert time against the routing method. Serial routing with a long alert time can exhaust the queue timeout before it reaches the third person.
- If conference mode is on, confirm the client estate supports it — and note it is not supported for calls arriving through a gateway enabled for location-based routing.
Get-CsCallQueue.The wrong caller ID is presented on outbound calls
- Confirm which caller ID policy the user has. A user with no policy assigned gets the global one, which presents their own number.
- Check the substitution method. If the policy was written against the deprecated service-number method it needs rebuilding with resource-account substitution.
- Confirm the resource account named in the policy still holds the number you expect.
- For Direct Routing, check whether the SBC or the carrier is rewriting the calling number downstream. Teams can present exactly the right identity and the carrier can replace it.
- Check any number translation rules on the gateway. These are easy to forget because they live outside Microsoft 365 entirely.
Get-CsCallingLineIdentity, policy assignment, SBC translation rules, SIP trace on the outbound leg.The Direct Routing SBC looks unhealthy
- Start at the health dashboard. It reports SIP OPTIONS status, TLS connectivity, network effectiveness ratio and concurrent calls against the configured maximum, which usually names the problem before you touch the SBC.
- Check certificate expiry. The dashboard warns at 30 days, and an expired certificate is a total outage rather than a degradation.
- Confirm DNS still resolves the SBC FQDN to the expected public address, and that the name matches the certificate subject or a SAN.
- Check whether OPTIONS are being sent at all. A trunk configured not to send them cannot report health, and the dashboard says so explicitly rather than showing a fault.
- Look at concurrent sessions against the configured maximum. A trunk at its ceiling rejects calls while appearing entirely healthy.
- Confirm the firewall still permits signaling to Microsoft’s SIP proxies and media on the required ranges. Firewall changes made for other reasons are a recurring cause.
Calls connect but audio only travels one way
- This is almost always media path, not signaling — signaling clearly worked, because the call connected.
- Check firewall rules in both directions for the media ranges. A rule that permits outbound but not the return flow produces exactly this symptom.
- Check NAT behaviour. Symmetric NAT and inconsistent address translation break the media negotiation while leaving signaling intact.
- For Direct Routing, confirm the media ranges are open to the SBC in both directions, and that the SBC has enough ports — Microsoft recommends at least two per concurrent call.
- If media bypass is enabled, confirm the SBC public address is actually reachable from the client. If it is not, the call should fall back rather than fail, so failing here points at a partial reachability problem.
- Check for a device inspecting or rewriting media in the path.
Media is falling back from UDP to TCP
- Treat this as a symptom rather than a setting. TCP works and sounds worse; something is blocking UDP.
- Check UDP 3478–3481 outbound to the Microsoft 365 Optimize ranges. A firewall permitting only TCP 443 produces exactly this.
- Check whether a proxy is in the path. Media has no URL, so a proxy configured by URL will not catch it, and a device forcing all traffic through TCP will.
- Check VPN routing. Media pulled into a tunnel often loses UDP along the way.
- Confirm the client version is recent enough to honour the intended routing in the VPN scenario in use.
Voice quality is poor but calls complete
- Get specifics before touching anything. Which users, which sites, wired or wireless, which times of day, one direction or both.
- Look at Call Analytics for an affected session and read jitter, packet loss and round-trip time on each stream. Poor thresholds are jitter above 30 ms, average loss above 10 percent, round-trip time above 500 ms.
- Use the Call Quality Dashboard to find the shape of the problem — whether it clusters by building, subnet, wireless access point, VPN, or client version. A single bad call tells you little; a cluster names the cause.
- Check whether QoS marking survives the whole path. Marking at the endpoint that a switch or firewall clears is the most common finding, and it is invisible from the Teams side.
- Check wireless coverage and roaming for the affected area rather than signal strength at one desk.
- Rule out the endpoint. Headset firmware and USB power management account for a surprising share of complaints that telemetry says are clean.
Voicemail is not being delivered
- Separate personal voicemail from shared voicemail — they fail for different reasons.
- For personal voicemail, check the user’s voicemail settings and calling policy, and confirm the mailbox itself is healthy.
- For shared voicemail, confirm the target group mailbox exists and that the group is configured to accept mail from outside the organization. This one setting accounts for most shared-voicemail failures.
- Confirm the queue’s overflow and timeout actions actually point at shared voicemail rather than at a destination that was changed during testing.
- Check whether transcription is expected and whether the language is supported, because a missing transcript often gets reported as a missing message.
The emergency location is not being detected
- Confirm the address is validated. An unvalidated address cannot be assigned to users or network identifiers at all.
- Check the address has geo coordinates. Without them it cannot be used for dynamic location.
- Check the address age. Addresses more than a couple of years old cannot be assigned to network identifiers, which turns into a silent failure on a record nobody has touched in a while. Re-create rather than edit.
- Confirm the client’s external IP matches the trusted IP list. If it does not, the client is treated as outside the corporate network and subnet-based lookup will not run. Note that switch, port and access-point lookups proceed regardless.
- Check the subnet entry uses the network address rather than a client address — a frequent and easily missed error.
- Allow for propagation. Network configuration changes take up to four hours, so a change made this morning may simply not be live yet.
- Check the client type. Access-point-based location is not supported on Teams phones, and the remote-user confirmation experience is desktop only.
Get-CsOnlineLisLocation, client-side location display, trusted IP list.11Deliverables and handover
The test of a handover is whether the organization’s own administrators can make a routine change and diagnose a routine fault without calling anyone. Everything below was written during the project rather than assembled at the end of it.
Requirements and architecture
- Discovery and requirements summary
- High-level solution architecture
- Call-flow diagrams, business hours, after hours and holidays
- PSTN connectivity decision with its reasoning recorded
Build documentation
- Telephone-number inventory in E.164 with owner and purpose
- User-to-number and resource-account-to-number mapping
- License review covering users and voice applications
- Auto Attendant and Call Queue configuration records
- Dial plan and normalization rule documentation
- Calling, voice routing and caller ID policy matrix
- Direct Routing configuration summary where applicable
Run and support
- Emergency-calling design with assumptions stated
- Network and QoS recommendations
- Test and acceptance plan with results
- Troubleshooting runbook organized by symptom
- Administrator handover guide
- End-user quick-start instructions
Known limitations
- Operational dependencies that sit outside Microsoft 365
- Assumptions that need revalidating if a new country or site is added
- Items deliberately deferred, with the reason
- What has not been tested, stated plainly rather than implied
12Technical references
Official Microsoft Learn documentation used to verify terminology, limits, cmdlet syntax and product behaviour on this page. Checked 29 July 2026.
- PSTN connectivity options — the four supported models and Microsoft's guidance on combining them.
- Teams Phone licensing and Microsoft Teams Calling Plans.
- Microsoft Teams Phone Resource Account licenses — including the requirement regardless of number assignment.
- Auto Attendant and Call Queue prerequisites and licensing — including the 1 November 2025 change to outbound calls placed on behalf of a resource account.
- Manage resource accounts.
- Set up an auto attendant and create and manage holiday schedules.
- Set up a call queue and limits and supported configurations.
- Dial plans and call routing and create and manage dial plans.
- Configure voice routing for Direct Routing.
- Caller ID policies — including the deprecation of service-number substitution.
- Plan Direct Routing and connect your SBC.
- Session border controllers certified for Direct Routing.
- Emergency locations, addresses and call routing.
- Configure dynamic emergency calling.
- Emergency calling policies and emergency call routing policies.
- Emergency addresses for remote locations.
- Prepare your organization's network for Teams.
- Implement Quality of Service in Teams and configure QoS settings in the Teams admin center.
- Microsoft Teams call flows and Microsoft 365 URLs and IP address ranges.
- Securing Teams media traffic for VPN split tunneling.
- Use the Call Quality Dashboard to manage call and meeting quality — source of the poor-stream thresholds quoted above.
- Monitor and troubleshoot Teams meetings and calls and health dashboard for Direct Routing.
- Set-CsPhoneNumberAssignment, Get-CsPhoneNumberAssignment, Get-CsOnlineUser, Get-CsOnlinePSTNGateway.