Giving a Teams user a phone number sounds like a one-step job, but it has prerequisites that bite if you skip them. The user needs the right license, you need a number from somewhere, the number’s type has to match where it came from, and you need an emergency address attached so a 911-equivalent call can be located. Miss any of those and the number either won’t assign or won’t route calls.
This guide walks the whole path in order: the license that makes calling possible, getting or porting a number, assigning it in the admin center or with PowerShell, and the number-type detail that trips up most first-time setups. If you haven’t yet decided how Teams connects to the phone network, read the Calling Plan vs Operator Connect vs Direct Routing comparison first — that choice shapes everything below.
Step 1: confirm the license
Open the user in the Microsoft 365 admin center and check their assigned licenses, or verify it in PowerShell. The two things to look for are a Teams Phone license (sometimes bundled in higher-tier suites) and, if you’re using Calling Plan, a Calling Plan license for the minutes.
A number assignment that silently fails or throws a licensing error is nearly always this — the Teams Phone license isn’t applied, or it was applied seconds ago and hasn’t propagated. Give license changes a little time to land before assuming something else is wrong.
# Connect to Teams PowerShell
Connect-MicrosoftTeams
# Check whether the user is enabled for Enterprise Voice and licensed
Get-CsOnlineUser -Identity [email protected] |
Select-Object UserPrincipalName, EnterpriseVoiceEnabled, LineUri, FeatureTypes
Step 2: get or port the numbers
Where the number comes from depends on your PSTN connectivity model, and it determines the number type you’ll use when assigning.
- Calling Plan: acquire new numbers directly from Microsoft in the Teams admin center under Voice > Phone numbers > Add, or port existing ones to Microsoft.
- Operator Connect: your participating carrier provisions numbers that then appear in the Teams admin center, ready to assign.
- Direct Routing: numbers come from your own carrier or SIP trunk terminating on your SBC. They don’t get “acquired” in the portal — you assign them once they exist on your carrier side.
If you’re keeping existing numbers, that’s a port, and it runs on the losing carrier’s timeline, not yours.
Before you assign a number
- User has a Teams Phone license (plus Calling Plan minutes if using Calling Plan)
- You've chosen the PSTN model — Calling Plan, Operator Connect, or Direct Routing
- The number exists: acquired from Microsoft, provisioned by the operator, or live on your SBC
- You know which PhoneNumberType matches the number's source
- You have a civic emergency address ready to attach
Step 3: assign the number
You can assign through the Teams admin center or PowerShell. The admin center is fine for one user; PowerShell is the way to do it at scale or in a script.
In the admin center, go to Voice > Phone numbers, select the number, choose Edit / Assign, and pick the user. For Calling Plan and Operator Connect numbers you also set the emergency location here.
In PowerShell, the current cmdlet is Set-CsPhoneNumberAssignment. It replaced the older Set-CsUser -LineUri and Set-CsOnlineVoiceUser approaches, which you’ll still see in old guides — don’t use them on current tenants.
# Direct Routing number
Set-CsPhoneNumberAssignment -Identity [email protected] `
-PhoneNumber +14255550123 -PhoneNumberType DirectRouting
# Calling Plan number
Set-CsPhoneNumberAssignment -Identity [email protected] `
-PhoneNumber +14255550148 -PhoneNumberType CallingPlan
# Operator Connect number
Set-CsPhoneNumberAssignment -Identity [email protected] `
-PhoneNumber +14255550172 -PhoneNumberType OperatorConnect
The number must be in E.164 format — a leading +, the country code, then the number, no spaces or dashes. +14255550123, not (425) 555-0123.
The three number types, side by side
The PhoneNumberType parameter is the bridge between the number and how it reaches the phone network. Match it to the source, every time.
PhoneNumberType by PSTN model
| CallingPlan | Number acquired from or ported to Microsoft |
|---|---|
| OperatorConnect | Number provisioned by a participating carrier |
| DirectRouting | Number from your own carrier/SBC |
For Direct Routing there’s one extra step the other two don’t need: the user has to have a voice routing policy assigned so Teams knows how to route their calls through the SBC. Assigning the number without a routing policy gives you a number that still can’t call out.
Grant-CsOnlineVoiceRoutingPolicy -Identity [email protected] `
-PolicyName "US-Routing"
Step 4: set the emergency address
Don’t treat this as optional. An emergency address (emergency location) maps the number to a civic address so that when someone dials emergency services, dispatchers can be routed the caller’s location. It’s a safety requirement and, in many regions, a legal one.
How you set it depends on the model:
- Calling Plan / Operator Connect: assign an emergency location to the number, either during assignment in the admin center or with
Set-CsPhoneNumberAssignment -LocationId. Locations are created and validated under Locations > Emergency addresses in the Teams admin center. - Direct Routing: emergency calling is handled through emergency calling policies and network/site location data rather than a single per-number field, because routing of emergency calls goes through your SBC and carrier.
# Get the LocationId of a validated emergency address
Get-CsOnlineLisLocation | Select-Object Description, LocationId
# Assign the number with the emergency location in one step
Set-CsPhoneNumberAssignment -Identity [email protected] `
-PhoneNumber +14255550123 -PhoneNumberType CallingPlan `
-LocationId "<location-guid>"
Verify and troubleshoot
After assigning, confirm the number actually landed on the user and that they’re enabled for calling.
Get-CsPhoneNumberAssignment -AssignedPstnTargetId [email protected]
Get-CsOnlineUser -Identity [email protected] |
Select-Object UserPrincipalName, LineUri, EnterpriseVoiceEnabled
If the number is assigned but calling doesn’t work, check these in order:
- License — Teams Phone applied and propagated.
- PhoneNumberType — matches the number’s actual source.
- Voice routing policy — assigned, for Direct Routing users.
- Propagation — recent changes can take time to take effect; have the user restart Teams.
Common assignment failures
| Number assigns but can't call | PhoneNumberType doesn't match the source, or no voice routing policy (Direct Routing) |
|---|---|
| Assignment throws a license error | Teams Phone license missing or not yet propagated |
| Calls work but emergency calling warns | No validated emergency address assigned |
| Old LineUri command fails | Use Set-CsPhoneNumberAssignment instead of Set-CsUser -LineUri |
Wrapping up
Assigning a phone number to a Teams user is a chain, not a single step: confirm the Teams Phone license, get or port a number, assign it with Set-CsPhoneNumberAssignment using the right PhoneNumberType, add a voice routing policy if it’s Direct Routing, and attach a validated emergency address. The mismatched-type mistake is the one that bites most often, so when a freshly assigned number won’t route, start there.
If you’re still weighing how Teams should reach the phone network, the Calling Plan vs Operator Connect vs Direct Routing comparison lays out the trade-offs, and the broader Microsoft Teams guides cover the call-routing features you’ll build on top once numbers are flowing.