Sanitized case study · design reference

Microsoft Teams Phone — Design Reference

The working reference from a Microsoft Teams Phone implementation for a growing professional-services organization. Client identity, tenant details, telephone numbers and carrier arrangements are withheld. Every number, domain and address on this page is an illustrative placeholder, not customer configuration.

Role · Teams Phone architect and consultant Platform · Microsoft 365 and Microsoft Teams Client · anonymized Assessment → implementation → testing → handover
/

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.

Phase 1

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
Phase 2

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
Phase 3

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
Phase 4

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
On what this page does and does not say. The connectivity model, carrier, SBC vendor, phone numbers, user counts and locations for this engagement are not published. Where a specific value would identify the client or the vendor, the page describes the decision criteria instead. Product behaviour, limits and cmdlet syntax below are referenced to Microsoft Learn and were checked on 29 July 2026 — see Technical references. Microsoft changes this surface often, so verify against current documentation before relying on any value.

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.

Microsoft Teams Phone logical architecture External PSTN callers reach a PSTN carrier. The carrier connects to Microsoft Teams Phone directly under Calling Plans, Operator Connect or Teams Phone Mobile, or through a customer-managed certified session border controller over SIP and TLS when Direct Routing is used. Teams Phone routes inbound calls to an Auto Attendant, which routes to a group of departmental Call Queues, to reception, or to shared voicemail. The queues route to Teams users and overflow or time out to shared voicemail. Microsoft Entra ID supplies identity and the Teams admin center supplies administration, both feeding Teams Phone. Teams Phone feeds Call Analytics and the Call Quality Dashboard. Microsoft Entra ID Teams admin center External PSTN callers PSTN carrier Microsoft Teams Phone cloud calling service direct Certified SBC customer managed Direct Routing, when required SIP over TLS Auto Attendant resource account Reception operator target Shared voicemail after hours, overflow Call Queues Sales queue Support queue Billing queue Teams users representatives overflow / timeout Call Analytics and Call Quality Dashboard per-user diagnostics and tenant-wide quality trend

Inbound call flow, illustrative pattern

This is an illustrative pattern used to explain the design, not the customer’s published telephone configuration.

Main business number ├── Business hours │ ├── Press 1 → Sales queue → overflow / timeout → shared voicemail │ ├── Press 2 → Support queue → overflow / timeout → shared voicemail │ ├── Press 3 → Billing queue → overflow / timeout → shared voicemail │ ├── Press 0 → Reception │ ├── Press 9 → directory-search attendant → dial by name │ └── No input / invalid entry → operator ├── After hours │ ├── Announcement, then shared voicemail │ └── On-call escalation where the business requires it └── Holidays └── Holiday greeting, then shared voicemail
Dial keys are matched before directory search. Microsoft recommends setting directory search to None on an attendant that has dial keys assigned, because a caller spelling a name is transferred the moment their keypresses match a dial key. Where both are wanted, the main attendant links to a dedicated directory-search attendant behind a dial key — which is what the tree above shows.
Why the operator matters. An auto attendant without an operator has no fallback. Microsoft routes to the operator both when the caller makes no selection and when call processing fails — an invalid transfer target, for example. Leaving it unset means the failure case is a disconnected caller.
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

ConstraintLimitWhy it shapes the design
Transitions per call across all voice apps25The real guard against deep nesting and routing loops. A call that exceeds it is disconnected, so chained attendants need counting.
Holiday sets per auto attendant10Group holidays by behaviour rather than one set per date.
Holidays per holiday set50Plenty for several years of a national calendar, which is the right horizon to load.
Directory search per attendant1Dial by name or dial by extension, not both. Wanting both means chaining a dedicated attendant behind a dial key.
Text-to-speech greeting length1,000 charactersLong enough that nobody hits it, short enough to notice if a greeting is being pasted from a script.
Audio greeting file size5 MBWAV, MP3 or WMA. Record at a sane bitrate rather than sending a studio master.
Representatives per call queue200, or 15 as individual usersThe 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 queue200Set the overflow threshold well below this. Reaching the platform limit is not a design.
Maximum wait time per call45 minutesThe timeout should fire long before this, at a duration the business has actually agreed.
Agent alert time15–180 s, default 30Microsoft recommends at least 20 seconds. Too short and calls bounce; too long and serial routing crawls.
Authorized users per voice app15The people allowed to change queue settings without full Teams admin rights. Needs both a voice applications policy and a listing on the queue.
Terminology in transition. Microsoft’s newer documentation has started using “representative” where it previously said “agent”, apparently to disambiguate from the new AI-driven Teams Phone Agent. The PowerShell parameters are unchanged — -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 dialsIllustrative patternIllustrative translationNote
4-digit internal extension^(\d{4})$+1202555$1Ordering only matters where patterns can overlap. An anchored fixed-length rule like this one cannot be shadowed.
10-digit local number^(\d{10})$+1$1The 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$1Catches habitual dialers who prefix everything.
International with access code^011(\d+)$+$1Access 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+)$+$1Pass-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

RoleOutbound callingCaller ID presentedReasoning
General staffDomestic onlyOwn direct numberInternational dialing is a toll-fraud exposure before it is a cost. Grant it where the job needs it.
Queue representativesDomestic onlyDepartmental or main business numberA returned call comes back to the team, not to one person’s handset while they are on leave.
Roles with genuine international needDomestic and internationalOwn direct numberNamed and reviewed, not granted tenant-wide because it was easier.
Common-area and shared devicesRestrictedSite or main numberUnattended endpoints in public space are the classic toll-fraud target.
Reception / operatorDomestic, with transfer rightsMain business numberThe operator is the fallback target for the attendant, so their calling policy has to support transfer.
Caller ID: avoid the deprecated method. Presenting a departmental or main number uses resource-account substitution. The older service-number substitution (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

PrerequisiteRequirementThe failure it prevents
Certified SBCOnly session border controllers on Microsoft’s certified list are supportedAn uncertified device may interoperate today and lose support the moment you need it.
Public FQDN on a verified domainThe 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 domainA user with the SBC’s domain must exist in the tenant with an E3 or E5 license, and the domain must be ManagedAn easily missed prerequisite that produces the same opaque pairing failure.
Public certificateIssued 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 signalingMicrosoft enforces TLS 1.2 on the Direct Routing SIP interface, with a defined cipher listAn SBC pinned to older TLS negotiates nothing at all.
SIP OPTIONS enabledThe SBC sends periodic OPTIONS so the trunk reports its own healthWithout it, the health dashboard cannot distinguish a quiet trunk from a dead one.
Firewall openingsSIP 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 ownerA named owner, a renewal window, and someone watching the dashboardAn 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.

Online voice routing policy assigned to the user └── PSTN usages evaluated in order, first match wins └── Voice routes number pattern + priority └── Online PSTN gateways one or more SBCs; tried in random order within a single route, so deterministic failover needs separate routes with priorities

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
Cmdlets that no longer belong in a runbook. 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:

1. Wireless access point (BSSID) most precise; not supported on Teams phones 2. Ethernet switch port (chassis + port) 3. Ethernet switch (chassis ID) 4. Subnet must be the network address, not the client address
Trusted IP addresses are the gate. The organization’s external egress IPs determine whether a client is treated as inside the corporate network at all. Dynamic policy and location retrieval based on endpoint IP only happens when the client’s external IP matches that list. Switch, port and access-point lookups are the exception — those proceed regardless. A cloud proxy that rewrites the source IP breaks this, and Microsoft does not support that configuration for network lookups.

Two policies that are easy to confuse

Emergency calling policyEmergency call routing policy
Applies toAll PSTN connectivity modelsDirect Routing. Also used to identify emergency numbers where Shared Calling is in use with Calling Plans or Operator Connect
ControlsSecurity-desk notification, remote-user external location lookup, per-number extended notifications, and an optional disclaimerEmergency dial strings and masks, and the PSTN usage that routes the call toward the answering point
Assignable toUsers, groups and network sitesUsers and network sites; the site assignment overrides the user policy while the user is at that site
Notification modesNotify only, conferenced in muted, or conferenced in unmuted — a dial-out number can be set only for the conferenced modesNot 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 typeDSCPClassClient source ports
Audio46Expedited Forwarding50,000–50,019
Video34Assured Forwarding 4150,020–50,039
Application and screen sharing18Assured Forwarding 2150,040–50,059
Calling and meeting signaling40Class Selector 550,070–50,089 — not configurable
Two practical notes. The Teams admin center turns port ranges on but does not apply the DSCP marking itself — that comes from endpoint policy, typically Group Policy on Windows. And if QoS is being implemented, do not leave clients set to use any available port, because the fallback range is 1024–65535 and nothing downstream can classify that. Final DSCP values, port ranges and trust boundaries should be validated against the organization’s own network standards and current Microsoft guidance rather than copied from this table.

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

MetricTreated as poorWhat it usually points at
JitterAbove 30 msCongestion or a queueing device somewhere in the path; often wireless.
Packet loss rateAbove 10 percent averageA saturated link, a duplex mismatch, or wireless interference.
Round-trip timeAbove 500 msA 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 callingTeams-to-Teams call between two enabled users on different networksCall connects with two-way audio; media takes the expected pathCall Analytics session detail showing media path and stream quality
Outbound localUser dials a local number in the format they habitually useDial plan normalizes to E.164; call completes; correct caller ID presentedEffective dial plan test output plus the call record
Outbound long distanceUser dials a domestic long-distance numberCall completes and routes over the intended pathCall record and, for Direct Routing, the SIP ladder
Authorized internationalA user whose role includes international dialing calls an international numberCall completesCall record and the policy assignment for that user
Blocked internationalA user without international authorization attempts the same numberCall is refused; the user gets a clear failure rather than silenceClient error and the policy assignment showing the restriction
Inbound directExternal caller dials a user’s direct numberThe user’s Teams client rings and the call connectsCall record with inbound leg detail
Main number, business hoursExternal caller dials the main number during business hoursBusiness-hours greeting plays and the menu is offeredRecorded test call notes and the attendant configuration export
Menu selectionCaller presses each configured key in turnEach key routes to its intended queue, person or announcementOne test call per key, logged against the signed-off call tree
OperatorCaller presses the operator key, and separately presses nothing at allBoth reach the operator targetTwo test calls; the no-input case timed to confirm the timeout
Invalid entryCaller presses an unmapped keyInvalid-entry handling fires as designed rather than disconnectingTest call notes
Dial by nameCaller uses directory search for a known userCorrect user is found and the call transfersTest call; directory scope configuration exported
After hoursCall placed outside configured business hoursAfter-hours flow runs; caller reaches the after-hours destinationTest call performed outside hours, not simulated by editing the schedule
HolidayCall placed on a date in the holiday setHoliday flow takes precedence over both other flowsTest performed with a temporary dated entry, then removed and reverified
Queue distributionSuccessive calls into a queue with multiple representatives availableCalls distribute according to the configured routing methodSequence of test calls with which representative was alerted each time
VoicemailCall to an unavailable user, and separately to a queue that times outPersonal voicemail and shared voicemail each receive the message and notifyMessage delivery confirmed in the target mailbox
Caller IDOutbound call from a queue representative to an external numberThe departmental or main number is presented, not the individual lineNumber displayed on the receiving device, photographed without personal data
Hold and resumePlace an active external call on hold and retrieve itHold audio plays to the external party; audio resumes both waysTest call notes
Blind transferTransfer an external call without announcingCall arrives at the target with the external party still connectedTest call notes
Consultative transferConsult the target, then complete the transferConsultation is private; completion connects the two partiesTest call notes
Call forwardingForward to another internal user and, where policy allows, to an external numberForwarding behaves as the calling policy permits; disallowed forwarding is refusedTest calls plus the calling policy showing what is permitted
Simultaneous ringEnable simultaneous ring to a second endpointBoth endpoints alert; answering on one clears the otherTest call notes
DelegationA delegate makes and receives calls on behalf of a managerDelegate can answer and place calls; the correct identity is presentedTest calls in both directions
Queue overflowFill the queue past the overflow thresholdThe overflow action fires at the configured count, to the configured destinationTest calls counted deliberately up to the threshold
Queue timeoutLet a queued call exceed the timeout with nobody answeringThe timeout action fires at the configured durationTimed test call
No representativesAll representatives opted out or unavailableThe no-agent action fires rather than the call queueing indefinitelyTest call with the queue deliberately emptied
Common-area deviceInbound and outbound calls from a shared endpointCalls work; the device’s calling restrictions holdTest calls plus the policy assigned to the device account
Remote userA user off the corporate network places and receives callsCalls complete with acceptable media quality; the media path is as expectedCall Analytics session detail from the remote session
Emergency locationControlled verification that the expected location is presentedThe client reflects the intended dispatchable location for its network positionClient-side location display; notification suppressed for the test
Trunk failoverWhere Direct Routing with more than one gateway is in scope, drain the active SBCNew calls route to a surviving gateway; established calls continue. Ordering within a single route is not deterministicHealth 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
  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. 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.
  6. Check the gateway is enabled and not drained.
Tools: Teams admin center user page, Get-CsOnlineUser, Get-CsPhoneNumberAssignment, Test-CsEffectiveTenantDialPlan, Get-CsOnlineVoiceRoutingPolicy, Get-CsOnlinePSTNGateway, SBC logs.
Inbound calls fail or never arrive
  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. 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.
Tools: PSTN and SMS usage report, Direct Routing health dashboard, SIP ladder, SBC logs, carrier portal.
The Auto Attendant does not route the way the design says
  1. 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.
  2. Check the holiday set. Holidays take precedence over both other flows, so a stale entry silently overrides everything on the day it matches.
  3. Verify each menu key maps to the destination on the signed-off call tree, and that the destination object is voice-enabled and licensed.
  4. Check the operator is set. If it is not, the failure path and the no-input path have nowhere to go.
  5. 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.
  6. 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.
Tools: Teams admin center voice applications, configuration export, test calls placed at real times rather than by editing the schedule.
Call Queue representatives are not receiving calls
  1. 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.
  2. 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.
  3. Check who has opted out. Opt-out is enabled by default and people use it.
  4. 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.
  5. 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.
  6. 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.
Tools: Queue configuration, group membership, per-user Call Analytics, Get-CsCallQueue.
The wrong caller ID is presented on outbound calls
  1. Confirm which caller ID policy the user has. A user with no policy assigned gets the global one, which presents their own number.
  2. Check the substitution method. If the policy was written against the deprecated service-number method it needs rebuilding with resource-account substitution.
  3. Confirm the resource account named in the policy still holds the number you expect.
  4. 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.
  5. Check any number translation rules on the gateway. These are easy to forget because they live outside Microsoft 365 entirely.
Tools: Get-CsCallingLineIdentity, policy assignment, SBC translation rules, SIP trace on the outbound leg.
The Direct Routing SBC looks unhealthy
  1. 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.
  2. Check certificate expiry. The dashboard warns at 30 days, and an expired certificate is a total outage rather than a degradation.
  3. Confirm DNS still resolves the SBC FQDN to the expected public address, and that the name matches the certificate subject or a SAN.
  4. 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.
  5. Look at concurrent sessions against the configured maximum. A trunk at its ceiling rejects calls while appearing entirely healthy.
  6. 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.
Tools: Direct Routing health dashboard, SIP ladder, SBC logs, DNS lookup, certificate inspection, firewall logs.
Calls connect but audio only travels one way
  1. This is almost always media path, not signaling — signaling clearly worked, because the call connected.
  2. Check firewall rules in both directions for the media ranges. A rule that permits outbound but not the return flow produces exactly this symptom.
  3. Check NAT behaviour. Symmetric NAT and inconsistent address translation break the media negotiation while leaving signaling intact.
  4. 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.
  5. 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.
  6. Check for a device inspecting or rewriting media in the path.
Tools: Firewall and NAT logs, packet capture at both ends, Call Analytics media path detail, SBC media statistics.
Media is falling back from UDP to TCP
  1. Treat this as a symptom rather than a setting. TCP works and sounds worse; something is blocking UDP.
  2. Check UDP 3478–3481 outbound to the Microsoft 365 Optimize ranges. A firewall permitting only TCP 443 produces exactly this.
  3. 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.
  4. Check VPN routing. Media pulled into a tunnel often loses UDP along the way.
  5. Confirm the client version is recent enough to honour the intended routing in the VPN scenario in use.
Tools: Call Analytics transport detail, firewall logs, packet capture, VPN routing table.
Voice quality is poor but calls complete
  1. Get specifics before touching anything. Which users, which sites, wired or wireless, which times of day, one direction or both.
  2. 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.
  3. 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.
  4. 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.
  5. Check wireless coverage and roaming for the affected area rather than signal strength at one desk.
  6. Rule out the endpoint. Headset firmware and USB power management account for a surprising share of complaints that telemetry says are clean.
Tools: Call Analytics, Call Quality Dashboard, wireless survey, switch and firewall QoS configuration, endpoint inventory.
Voicemail is not being delivered
  1. Separate personal voicemail from shared voicemail — they fail for different reasons.
  2. For personal voicemail, check the user’s voicemail settings and calling policy, and confirm the mailbox itself is healthy.
  3. 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.
  4. Confirm the queue’s overflow and timeout actions actually point at shared voicemail rather than at a destination that was changed during testing.
  5. Check whether transcription is expected and whether the language is supported, because a missing transcript often gets reported as a missing message.
Tools: Queue configuration, group mailbox settings, Exchange message trace, test call.
The emergency location is not being detected
  1. Confirm the address is validated. An unvalidated address cannot be assigned to users or network identifiers at all.
  2. Check the address has geo coordinates. Without them it cannot be used for dynamic location.
  3. 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.
  4. 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.
  5. Check the subnet entry uses the network address rather than a client address — a frequent and easily missed error.
  6. Allow for propagation. Network configuration changes take up to four hours, so a change made this morning may simply not be live yet.
  7. Check the client type. Access-point-based location is not supported on Teams phones, and the remote-user confirmation experience is desktop only.
Tools: Teams admin center Locations, network topology configuration, 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.

Design

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
Configuration

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
Operations

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
Honesty

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.

  1. PSTN connectivity options — the four supported models and Microsoft's guidance on combining them.
  2. Teams Phone licensing and Microsoft Teams Calling Plans.
  3. Microsoft Teams Phone Resource Account licenses — including the requirement regardless of number assignment.
  4. Auto Attendant and Call Queue prerequisites and licensing — including the 1 November 2025 change to outbound calls placed on behalf of a resource account.
  5. Manage resource accounts.
  6. Set up an auto attendant and create and manage holiday schedules.
  7. Set up a call queue and limits and supported configurations.
  8. Dial plans and call routing and create and manage dial plans.
  9. Configure voice routing for Direct Routing.
  10. Caller ID policies — including the deprecation of service-number substitution.
  11. Plan Direct Routing and connect your SBC.
  12. Session border controllers certified for Direct Routing.
  13. Emergency locations, addresses and call routing.
  14. Configure dynamic emergency calling.
  15. Emergency calling policies and emergency call routing policies.
  16. Emergency addresses for remote locations.
  17. Prepare your organization's network for Teams.
  18. Implement Quality of Service in Teams and configure QoS settings in the Teams admin center.
  19. Microsoft Teams call flows and Microsoft 365 URLs and IP address ranges.
  20. Securing Teams media traffic for VPN split tunneling.
  21. Use the Call Quality Dashboard to manage call and meeting quality — source of the poor-stream thresholds quoted above.
  22. Monitor and troubleshoot Teams meetings and calls and health dashboard for Direct Routing.
  23. Set-CsPhoneNumberAssignment, Get-CsPhoneNumberAssignment, Get-CsOnlineUser, Get-CsOnlinePSTNGateway.
Where product behaviour and this page might diverge. Microsoft changes this surface frequently. Two things on this page are worth rechecking before relying on them: the QoS guidance was last refreshed by Microsoft in April 2024 and is the oldest material cited here, and the "agent" to "representative" terminology shift is still partway through Microsoft's own documentation. Neither affects the design; both affect the words.