# Setting up Teams voice routing policies and dial plans

Systems: Microsoft Teams Phone

For Teams Phone administrators configuring dial plans, voice routes, and routing policies for Direct Routing.

Canonical: https://warmtransfer.net/guides/teams-voice-routing-setup

Last verified: 2026-09-30

Teams Phone call routing for Direct Routing relies on dial plans, PSTN usages, voice routes, and voice routing policies to normalize and deliver outbound calls[^52]. For Calling Plan, Operator Connect, and Teams Phone Mobile, these dial plans and routing policies are preconfigured at the service level, leaving custom routing configuration to Direct Routing and extension dialing environments[^13].

## Before you start

Before building routing policies and dial plans:
- Confirm each pilot user has a Teams Phone application license and an associated PSTN solution[^73].
- Assign each pilot user a Direct Routing phone number using `Set-CsPhoneNumberAssignment -Identity <user> -PhoneNumber <number> -PhoneNumberType DirectRouting`, which automatically enables the account for Enterprise Voice[^23].
- Confirm each user is set to Teams Only mode (`UpgradeToTeams` instance of `TeamsUpgradePolicy`) so calls land in the Teams client, noting that Direct Routing is unsupported in Islands coexistence mode[^62][^74].
- Direct Routing infrastructure must already be deployed, including a certified SBC, paired FQDN in a verified tenant domain, public IP, and trusted TLS certificate[^75][^76]. Note that emergency dialing requires separate emergency call routing policies[^77].
- Export current configuration baseline data:[^43][^42][^28]
  - Run `(Get-CsOnlinePSTNUsage).Usage` to retrieve the complete list of tenant PSTN usages, as standard cmdlet output may truncate values[^43].
  - Run `Get-CsOnlineVoiceRoute` to list existing routes[^42].
  - Run `Get-CsEffectiveTenantDialPlan -Identity <user>` to review normalization rules already applied by the service country dial plan[^28].

## What changes by situation

- How should online voice routing policies be scoped and assigned? Edit the Global (Org-wide default) voice routing policy directly for all users; Create one custom voice routing policy and assign it to Direct Routing users; Create distinct custom voice routing policies per site or user group.
- Where do dial plan normalization rules need to be configured? Rely on built-in service country dial plans without custom tenant rules; Add normalization rules to the tenant Global dial plan; Create and assign custom tenant dial plans per site or user group.
- What number format does your SBC or carrier require from Teams? Standard E.164 format with a leading plus sign; Stripped or national format without a leading plus sign.
- What outbound caller ID should be presented on PSTN calls? The user's assigned direct inward dial number; A substitute number assigned to an auto attendant or call queue resource account; Anonymous.

## Step 1: Establish baseline dial plan normalization

### Do
Evaluate how dialed numbers normalize for pilot users before applying any custom tenant rules by running `Test-CsEffectiveTenantDialPlan -DialedNumber <digits> -Identity <user>`[^63]. Pipe `Get-CsEffectiveTenantDialPlan -Identity <user>` into `Test-CsEffectiveTenantDialPlan` or supply `-CallerNumber` with the user's assigned phone number if preferred[^64]. Use the `-TenantScopeOnly` parameter to evaluate tenant-scoped rules in isolation from the service plan[^65].

### Verify
Confirm the returned normalized number matches the baseline output from the service dial plan[^63].

### Rollback
Suggested rollback: retain the recorded baseline output for subsequent comparison.

## Step 2: Configure normalization rules

**Rely on built-in service country dial plans without custom tenant rules**

### Do
Do not create tenant dial plan normalization rules[^19]. If no tenant normalization rule matches a dialed number, the service dial plan prepends the country code of the user's usage location[^58].

### Verify
Run `Test-CsEffectiveTenantDialPlan -DialedNumber <digits> -Identity <user>` to verify that standard national and international dialing converts to E.164 via the service dial plan[^63][^58].

### Rollback
Suggested rollback: no configuration changes were made to roll back.

**Add normalization rules to the tenant Global dial plan**

### Do
Add normalization rules to the tenant Global dial plan for non-E.164 patterns, such as extensions or short dialing, that are not present in the service plan[^19]. Build each rule in memory using `New-CsVoiceNormalizationRule -Parent Global -Name <name> -Pattern <regex> -Translation <translation> -InMemory` and append it with `Set-CsTenantDialPlan -Identity Global -NormalizationRules @{add=$rule}`[^44]. Rules can also be created in the Teams admin center under Voice > Dial plans[^60]. Observe these constraints:
- Ensure rules output numbers starting with a leading plus sign, as numbers normalized without a leading plus are normalized again by the calling service[^53].
- Construct patterns using valid.NET regular expressions to avoid client or service faults[^21].
- Arrange rules with more restrictive patterns above less restrictive patterns, because evaluation stops at the first match[^54].
- Microsoft enforces a maximum of 50 normalization rules in a single dial plan[^35].
- Handle external access prefixes using normalization rules, as the `ExternalAccessPrefix` and `OptimizeDeviceDialing` parameters have been removed[^26].
- If supporting 3PIP devices like the Polycom VVX 601, split rules with optional leading tokens (such as `^0?(999)$`) into two distinct rules[^1].
- For 4-digit extension dialing, follow Microsoft's pattern format `^(\d{4})$` translating to `+1425555$1`[^55].

### Verify
Run `(Get-CsTenantDialPlan -Identity Global).NormalizationRules` to verify the rule ordering and regex definitions[^44].

### Rollback
Remove created rules by passing the rule reference into `Set-CsTenantDialPlan -Identity Global -NormalizationRules @{remove=$rule}`[^44].

**Create and assign custom tenant dial plans per site or user group**

### Do
Create a user-scoped tenant dial plan for each site using `New-CsTenantDialPlan -Identity <SiteName> -SimpleName <unique_name> -NormalizationRules <rules>`[^44]. Alternatively, create the plan in the Teams admin center under Voice > Dial plans[^60]. Adhere to these constraints:
- Ensure the `SimpleName` is unique and non-empty, following a consistent organizational naming convention[^17].
- Ensure each dial plan contains at least 1 normalization rule[^18].
- Ensure all normalization rules output numbers starting with a plus sign[^53].
- Use valid.NET regular expressions and place restrictive rules ahead of broad rules[^21][^54].
- Keep the number of normalization rules within each dial plan at or below 50, and ensure total tenant dial plans do not exceed the tenant limit of 1,000[^35][^16].
- Split optional leading tokens into two rules if 3PIP devices are used[^1].

### Verify
Run `Get-CsTenantDialPlan -Identity <SiteName>` to inspect the rules and configuration properties[^44].

### Rollback
Delete the custom tenant dial plan using `Remove-CsTenantDialPlan -Identity <SiteName> -Force`[^44].

## Step 3: Assign tenant dial plans

**Rely on built-in service country dial plans without custom tenant rules**

### Do
Do not assign tenant dial plans[^20]. Users automatically inherit the service dial plan corresponding to their assigned usage location[^20].

### Verify
Run `Get-CsUserPolicyAssignment -Identity <user> -PolicyType TenantDialPlan` and confirm that no per-user tenant dial plan is assigned[^14].

### Rollback
Suggested rollback: no assignments were made to reverse.

**Add normalization rules to the tenant Global dial plan**

### Do
Do not make user-level dial plan assignments[^24]. Users without an explicit user dial plan automatically receive the tenant Global dial plan merged with their service dial plan[^24].

### Verify
Run `Get-CsUserPolicyAssignment -Identity <user> -PolicyType TenantDialPlan` to confirm no user-level policy is overriding the tenant Global dial plan[^14].

### Rollback
Suggested rollback: reverse changes by removing normalization rules from the Global dial plan.

**Create and assign custom tenant dial plans per site or user group**

### Do
Assign the site dial plan to a pilot user with `Grant-CsTenantDialPlan -Identity <user> -PolicyName <SiteName>`[^15]. For broad deployment, assign the plan to user groups using `Grant-CsTenantDialPlan -Group <group_id> -Rank <number> -PolicyName <SiteName>`[^15]. Note that direct user assignments take precedence over group assignments, and higher group rank takes precedence over lower group rank[^39].

### Verify
Verify the assigned policy using `Get-CsUserPolicyAssignment -Identity <user> -PolicyType TenantDialPlan`[^14]. For group assignments, review operation status in the Teams admin center Activity log, which records group operations for 30 days[^2].

### Rollback
Remove the user assignment using `Grant-CsTenantDialPlan -Identity <user> -PolicyName $null` to return the user to the Global dial plan fallback[^15].

## Step 4: Validate dial plan normalization

### Do
Test dialing patterns across all user scopes by running `Test-CsEffectiveTenantDialPlan -DialedNumber <digits> -Identity <user>` for pilot accounts[^63]. Alternatively, test rules within the Teams admin center using the Test dial plan tool under Voice > Dial plans[^60]. The effective dial plan resolves by checking user dial plan rules first, tenant Global dial plan rules second, and service dial plan rules last, with user and Global plans never merging together directly[^24].

### Verify
Confirm each dialed format resolves to a normalized string starting with a leading plus sign[^53]. Note that Teams clients use this effective dial plan across all outbound calls, including numbers selected from call history or web telephone links[^11].

### Rollback
Suggested rollback: if normalization fails or matches an incorrect rule, reorder the rules or adjust regex match patterns in the dial plan.

## Step 5: Configure PSTN usages

**Edit the Global (Org-wide default) voice routing policy directly for all users**

### Do
Add required PSTN usages to the global usage list using `Set-CsOnlinePstnUsage -Identity Global -Usage @{Add="<usage_name>"}`[^43]. In the Teams admin center, usages are managed under Voice > Direct Routing > Manage PSTN usage records[^61]. Do not use `@{replace=...}`, as replacing the usage list removes all other existing usages across the tenant[^69].

### Verify
Run `(Get-CsOnlinePSTNUsage).Usage` to confirm the full usage name appears without truncation[^43].

### Rollback
Remove the created usage entry using `Set-CsOnlinePstnUsage -Identity Global -Usage @{Remove="<usage_name>"}`[^69].

**Create one custom voice routing policy and assign it to Direct Routing users**

### Do
Define the PSTN usages needed for the custom Direct Routing policy using `Set-CsOnlinePstnUsage -Identity Global -Usage @{Add="<usage_name>"}`[^43]. Ensure unique naming across the tenant, as usages exist strictly as a single tenant-wide global collection[^69]. Do not use `@{replace=...}` to avoid clearing pre-existing usages[^69].

### Verify
Run `(Get-CsOnlinePSTNUsage).Usage` to confirm the new usages are registered[^43].

### Rollback
Remove the added usage entry using `Set-CsOnlinePstnUsage -Identity Global -Usage @{Remove="<usage_name>"}`[^69].

**Create distinct custom voice routing policies per site or user group**

### Do
Create site-specific and shared PSTN usages using `Set-CsOnlinePstnUsage -Identity Global -Usage @{Add="<site_usage_name>"}`[^43]. Usages can be shared across multiple policies or isolated to specific sites[^52]. Avoid using `@{replace=...}` to prevent removing existing tenant usages[^69].

### Verify
Run `(Get-CsOnlinePSTNUsage).Usage` to confirm all site and shared usage records appear[^43].

### Rollback
Remove each created site usage using `Set-CsOnlinePstnUsage -Identity Global -Usage @{Remove="<site_usage_name>"}`[^69].

## Step 6: Create voice routes

### Do
Create voice routes pairing normalized number patterns with PSTN usages and SBC gateways using `New-CsOnlineVoiceRoute -Identity <route_name> -NumberPattern <regex> -OnlinePstnGatewayList <sbc_fqdns> -Priority <integer> -OnlinePstnUsages <usage_name>`[^42]. In the Teams admin center, create routes under Voice > Direct Routing > Voice routes[^61]. Follow these routing rules:
- Ensure referenced PSTN usages already exist, as routes created with empty usage or gateway lists trigger warnings[^50].
- All voice routes are created at Global scope and require unique names across the tenant[^51].
- Explicitly define `-NumberPattern` with a valid regular expression, noting that the cmdlet default is `[0-9]{10}` and `.*` routes all calls to the SBC[^49][^72].
- When a dialed number includes an extension (such as `+1425XXXXXXX;ext=YYY`), Teams strips the extension and applies the voice route pattern solely against the primary number[^27].
- Explicitly assign `-Priority` rather than allowing automatic assignment[^46]. When a number matches multiple routes, the route with the lowest Priority integer is evaluated first[^40].
- Gateways listed within a single route are tried in random order; do not place non-interchangeable SBCs in the same route[^56].
- For trunk failover, create a secondary voice route using the same number pattern but a higher Priority integer pointing to backup SBC gateways[^3].

### Verify
Run `Get-CsOnlineVoiceRoute` to verify route names, number patterns, priority values, gateway lists, and associated PSTN usages[^42].

### Rollback
Delete the voice routes using `Remove-CsOnlineVoiceRoute -Identity <route_name>`[^48].

## Step 7: Configure online voice routing policies

**Edit the Global (Org-wide default) voice routing policy directly for all users**

### Do
Update the Global voice routing policy to include the required PSTN usages using `Set-CsOnlineVoiceRoutingPolicy -Identity Global -OnlinePstnUsages @{Replace="<usage_1>","<usage_2>"}`[^71]. Alternatively, create a custom policy and assign it globally using `Grant-CsOnlineVoiceRoutingPolicy -PolicyName <policy_name> -Global`[^31]. Arrange usages in order from most specific to least specific, as matching terminates at the first matching usage and catch-all usages placed earlier prevent evaluation of later usages[^70]. Note that the Global policy cannot be deleted or renamed[^30].

### Verify
Run `Get-CsOnlineVoiceRoutingPolicy -Identity Global` and verify that the `OnlinePstnUsages` array shows usages in the required order[^48][^70].

### Rollback
Restore the initial PSTN usage order recorded earlier using `Set-CsOnlineVoiceRoutingPolicy -Identity Global -OnlinePstnUsages @{Replace=<recorded_list>}`[^71].

**Create one custom voice routing policy and assign it to Direct Routing users**

### Do
Create a new voice routing policy with ordered usages using `New-CsOnlineVoiceRoutingPolicy -Identity "<policy_name>" -OnlinePstnUsages "<usage_1>","<usage_2>"`[^41]. Alternatively, add the policy in the Teams admin center under Voice > Voice routing policies > Add[^61]. List specific usages ahead of general or catch-all usages to ensure correct route evaluation[^70].

### Verify
Run `Get-CsOnlineVoiceRoutingPolicy -Identity "<policy_name>"` to confirm policy existence and usage order[^48].

### Rollback
Unassign the policy from any test accounts, then delete it using `Remove-CsOnlineVoiceRoutingPolicy -Identity "<policy_name>"`[^48].

**Create distinct custom voice routing policies per site or user group**

### Do
Create custom voice routing policies for each site using `New-CsOnlineVoiceRoutingPolicy -Identity "<site_policy_name>" -OnlinePstnUsages "<site_usage>","<shared_usage>"`[^41]. In the Teams admin center, add them under Voice > Voice routing policies[^61]. Always place site-specific usages ahead of broad national or international catch-all usages[^70].

### Verify
Run `Get-CsOnlineVoiceRoutingPolicy` and confirm each site policy is created with its proper ordered usages[^48].

### Rollback
Unassign site policies from all accounts, then remove them using `Remove-CsOnlineVoiceRoutingPolicy -Identity "<site_policy_name>"`[^48].

## Step 8: Assign online voice routing policies

**Edit the Global (Org-wide default) voice routing policy directly for all users**

### Do
Do not assign per-user voice routing policies[^30]. Users automatically inherit the Global policy unless a custom policy is explicitly assigned[^30]. Microsoft cautions that configuring the Global policy causes all voice-enabled users across the organization to inherit it, which can unintentionally direct Calling Plan or Operator Connect users to Direct Routing trunks[^29]. Assigning a voice routing policy does not by itself enable a user for PSTN calling; Direct Routing enablement is also required[^38].

### Verify
Run `Get-CsOnlineUser -Identity <user> | Select-Object OnlineVoiceRoutingPolicy` and verify the property is empty, indicating inheritance of Global[^41][^39].

### Rollback
Suggested rollback: reverse the usage assignments on the Global policy in Step 7.

**Create one custom voice routing policy and assign it to Direct Routing users**

### Do
Assign the custom policy to Direct Routing users individually using `Grant-CsOnlineVoiceRoutingPolicy -Identity <user> -PolicyName "<policy_name>"` or in the Teams admin center under Users > Manage users > Policies[^41][^61]. To assign to a group, run `Grant-CsOnlineVoiceRoutingPolicy -Group <group_id> -Rank <number> -PolicyName "<policy_name>"` (supported in Teams PowerShell Module 4.5.1-preview or later)[^32]. Note that if a Calling Plan user is assigned a voice routing policy, matching numbers exit via Direct Routing and non-matching numbers route over Calling Plan[^4].

### Verify
Run `Get-CsOnlineUser -Identity <user> | Select-Object OnlineVoiceRoutingPolicy` to confirm the assignment[^41].

### Rollback
Remove the custom policy assignment using `Grant-CsOnlineVoiceRoutingPolicy -Identity <user> -PolicyName $null` to return the user to the Global policy[^33].

**Create distinct custom voice routing policies per site or user group**

### Do
Assign the site policy to individual pilot users using `Grant-CsOnlineVoiceRoutingPolicy -Identity <user> -PolicyName "<site_policy_name>"`[^41]. Assign site groups using `Grant-CsOnlineVoiceRoutingPolicy -Group <group_id> -Rank <number> -PolicyName "<site_policy_name>"` (Teams PowerShell Module 4.5.1-preview or later)[^32]. In the event of overlapping group memberships, the policy with the highest rank applies; direct per-user assignments override all group policies[^39].

### Verify
Run `Get-CsOnlineUser -Identity <user> | Select-Object OnlineVoiceRoutingPolicy` to confirm the assigned site policy[^41]. Monitor group assignment processing using the Teams admin center Activity log[^2].

### Rollback
Revert user assignments using `Grant-CsOnlineVoiceRoutingPolicy -Identity <user> -PolicyName $null`[^33].

## Step 9: Configure SBC number translation rules

**Standard E.164 format with a leading plus sign**

### Do
Do not configure translation rules on the Teams online PSTN gateway[^53]. Dial plans already emit numbers in standard E.164 format with a leading plus sign[^53].

### Verify
Suggested check: verify that test SIP INVITE messages arriving at the SBC retain the leading plus sign and full E.164 string.

### Rollback
Suggested rollback: no translation rules were created to remove.

**Stripped or national format without a leading plus sign**

### Do
Create number translation rules to convert normalized E.164 numbers into the required format before sending them to the SBC[^66]. Create the rule using `New-CsTeamsTranslationRule -Identity "<rule_name>" -Pattern '<regex>' -Translation '<translation>'`[^68]. For example, stripping `+1` from a 10-digit number uses pattern `^\+1(\d{10})$` and translation `$1`[^59]. Attach translation rules to the SBC configuration using `Set-CsOnlinePSTNGateway -Identity <sbc_fqdn> -OutboundPSTNNumberTranslationRules <rule_name>` for called numbers and `-OutboundTeamsNumberTranslationRules <rule_name>` for calling numbers[^68]. Follow these constraints:
- Direct Routing customers should normalize to a leading plus sign in dial plans and strip the plus using route-based translation rules to prevent double normalization[^58].
- Translation rules on an SBC execute in the order listed[^68].
- Adhere to translation limits: a maximum of 400 translation rules total, rule names up to 100 symbols, pattern expressions up to 1024 symbols, and translation strings up to 256 symbols[^67].
- For inbound calls, inbound translation rules (`InboundPSTNNumberTranslationRules` and `InboundTeamsNumberTranslationRules`) must yield numbers that match user phone number assignments exactly (from 3 to 38 digits, including any extension) so Reverse Number Lookup succeeds[^68][^45].

### Verify
Run `Get-CsTeamsTranslationRule -Identity "<rule_name>"` to confirm rule properties, and inspect `Get-CsOnlinePSTNGateway -Identity <sbc_fqdn>` to confirm attached outbound rules[^68].

### Rollback
Remove the translation rule from the gateway using `Set-CsOnlinePSTNGateway -Identity <sbc_fqdn> -OutboundPSTNNumberTranslationRules @{Remove="<rule_name>"}` and delete the rule with `Remove-CsTeamsTranslationRule -Identity "<rule_name>"`[^68].

## Step 10: Configure outbound caller ID policies

**The user's assigned direct inward dial number**

### Do
Do not create custom caller ID policies[^7]. The default caller ID behavior in Teams presents the user's assigned telephone number on outbound calls[^7].

### Verify
Suggested check: place an outbound PSTN call from a pilot user and confirm the dialed device displays the user's assigned phone number.

### Rollback
Suggested rollback: no custom caller ID policy was assigned.

**A substitute number assigned to an auto attendant or call queue resource account**

### Do
Create a custom caller ID policy substituting the caller ID with a resource account number using `New-CsCallingLineIdentity -Identity "<policy_name>" -CallingIDSubstitute Resource -ResourceAccount <resource_account_object_id> -CompanyName "<company_name>" -EnableUserOverride $false` (requires Teams PowerShell module 2.3.1 or later)[^5]. Assign the policy using `Grant-CsCallingLineIdentity -Identity <user> -PolicyName "<policy_name>"`[^5]. Alternatively, create and assign the policy in the Teams admin center under Voice > Caller ID policies[^9]. Follow these operational rules:
- Do not use `-CallingIDSubstitute Service`, which is deprecated and ignored[^8].
- The selected resource account must have an assigned telephone number; Direct Routing numbers assigned directly to individual users cannot be used as substitute caller IDs[^6][^9].
- Setting `-EnableUserOverride $false` prevents end users from overriding caller ID presentation via client settings[^10].
- For Direct Routing, the substitute caller ID appears in the SIP `From` header; setting `-ForwardPai $true` on the SBC gateway configuration populates the real calling user in the `P-Asserted-Identity` header[^22].
- Calling party name strings can contain up to 200 characters, though delivery depends on carrier support[^12].

### Verify
Run `Get-CsCallingLineIdentity -Identity "<policy_name>"` to confirm policy attributes[^5]. Place a test outbound call and confirm the recipient device displays the resource account phone number[^7]. Emergency calls always present the calling user's individual calling line ID regardless of caller ID policy configuration[^25].

### Rollback
Unassign the policy using `Grant-CsCallingLineIdentity -Identity <user> -PolicyName $null` and remove it using `Remove-CsCallingLineIdentity -Identity "<policy_name>"`[^5].

**Anonymous**

### Do
Create an anonymous caller ID policy using `New-CsCallingLineIdentity -Identity "<policy_name>" -CallingIDSubstitute Anonymous -EnableUserOverride $false` (Teams PowerShell module 2.3.1 or later)[^5]. Assign the policy using `Grant-CsCallingLineIdentity -Identity <user> -PolicyName "<policy_name>"`[^5]. Ensure `-EnableUserOverride $false` is set, because client-level user override settings take precedence and could expose the caller's number[^10].

### Verify
Run `Get-CsCallingLineIdentity -Identity "<policy_name>"` to verify the policy[^5]. Place an outbound call and confirm the receiving device displays Anonymous[^7]. Note that emergency calls continue to transmit the user's actual phone number[^25].

### Rollback
Unassign the policy with `Grant-CsCallingLineIdentity -Identity <user> -PolicyName $null` and delete it with `Remove-CsCallingLineIdentity -Identity "<policy_name>"`[^5].

## Step 11: Perform end-to-end routing validation

### Do
Validate end-to-end call paths across pilot users before broader assignment:
- Run `Test-CsEffectiveTenantDialPlan -DialedNumber <digits> -Identity <user>` across dialed patterns (local, national, international, extension) to verify normalization rules[^63].
- Place outbound test calls to numbers matching each configured voice route[^42]. Call routing directs traffic based on the called number pattern, or a combination of the pattern and calling user[^47].
- Place a test call to a non-matching number; for users licensed for Teams Phone without Calling Plan, non-matching numbers are dropped, while users with an additional Calling Plan license fall back to Calling Plan infrastructure[^36].
- Verify failover routes by disabling the primary SBC; confirm calls successfully advance to the higher priority number backup route[^3]. If all SBCs across matching routes are unavailable, calls drop[^3].
- For forwarded or transferred inbound calls where the ingress SBC is listed among egress SBCs, verify outbound traffic prefers that ingress SBC regardless of route priority[^34].
- Microsoft 365 admins can run a Direct Routing self-diagnostic from the Microsoft 365 admin center to verify a user is correctly configured for Direct Routing, noting this tool is unavailable in Microsoft 365 Government, Microsoft 365 operated by 21Vianet, and Microsoft 365 Germany[^57].

### Verify
Suggested check: verify that test calls egress the correct SBCs, display expected caller ID details, and establish two-way audio.

### Rollback
Suggested rollback: if routing errors occur, review voice route priority orders, PSTN usage sequences in voice routing policies, and regex patterns.

## Applicability

Applies to: Microsoft Teams Phone and Microsoft Teams. Deployments: multi-tenant. Sources checked 2026-09-30. Specific features carry defined prerequisites and exclusions:
- Direct Routing group policy assignments with `-Group` and `-Rank` require Teams PowerShell Module 4.5.1-preview or later[^32].
- Managing caller ID policies with `CsCallingLineIdentity` cmdlets requires Teams PowerShell Module 2.3.1 or later[^5].
- The Direct Routing self-diagnostic tool is excluded from Microsoft 365 Government, Microsoft 365 operated by 21Vianet, and Microsoft 365 Germany[^57].
- Dial plan normalization rules with optional leading tokens are unsupported on 3PIP devices like the Polycom VVX 601[^1].

## What remains uncertain

- Client-side policy propagation latency for newly assigned dial plans and voice routing policies is not covered by the sources below.
- The behavior and error handling when deleting a PSTN usage record that remains referenced by an active voice route or routing policy is not covered by the sources below.
- Specific PowerShell cmdlets for unassigning or clearing group-based voice routing policy assignments are not covered by the sources below.
- Specific manufacturer SBC configuration interfaces and SIP trace inspection procedures are not covered by the sources below.

## Sources

[^1]: Normalization rules whose first token is optional (for example ^0?(999)$) are not supported on 3PIP devices such as the Polycom VVX 601, and Microsoft advises splitting such a rule into two rules. Source: [Normalization rules for Microsoft Teams dial plans](https://learn.microsoft.com/en-us/microsoftteams/phone-normalization-rules), Creating normalization rules, Note. Checked 2026-09-30.
[^2]: The Teams admin center Activity log shows group policy operations and batch policy operations (more than 20 users) for the last 30 days, with statuses including In progress, Rolling out to users and Completed. Source: [Assign policies in Teams](https://learn.microsoft.com/en-us/microsoftteams/policy-assignment-overview), View your policy assignments in the Activity log. Checked 2026-09-30.
[^3]: A second voice route with the same number pattern and a lower priority (higher priority number) acts as a backup: it is tried only when none of the SBCs in the higher-priority route are available, and if no SBC in any matching route is available the call is dropped. Source: [Configure call routing for Direct Routing](https://learn.microsoft.com/en-us/microsoftteams/direct-routing-voice-routing), Example 1, Call Flow 2 description and summary table (Redmond 1 / Redmond 2). Checked 2026-09-30.
[^4]: If a user with a Calling Plan license is also assigned an online voice routing policy, a dialed number matching a pattern in that policy is routed over Direct Routing and a non-matching number is routed through the Calling Plan PSTN infrastructure. Source: [Configure call routing for Direct Routing](https://learn.microsoft.com/en-us/microsoftteams/direct-routing-voice-routing), Voice routing policy considerations (first paragraph). Checked 2026-09-30.
[^5]: Caller ID policies are managed with New-, Set-, Remove-, Get- and Grant-CsCallingLineIdentity in Teams PowerShell module 2.3.1 or later; a resource-account policy uses -CallingIDSubstitute Resource with -ResourceAccount set to the resource account's ObjectId and optional -CompanyName, and an anonymous policy uses -CallingIDSubstitute Anonymous. Source: [Manage caller ID for users - Microsoft Teams](https://learn.microsoft.com/en-us/microsoftteams/caller-id-policies), Use PowerShell; New custom caller ID policy. Checked 2026-09-30.
[^6]: Numbers that cannot be used as a substitute outbound caller ID include Calling Plan or Operator Connect numbers with usage type User, any Direct Routing number assigned to a user, and Skype for Business Server on-premises numbers. Source: [Manage caller ID for users - Microsoft Teams](https://learn.microsoft.com/en-us/microsoftteams/caller-id-policies), Outbound caller ID behavior, list after 'You can't assign the following types of phone numbers'. Checked 2026-09-30.
[^7]: A Teams caller ID policy can send the user's assigned number (the default), Anonymous, or a substitute number assigned to a resource account used by an auto attendant or call queue (Calling Plan service or toll-free, Operator Connect or Direct Routing). Source: [Manage caller ID for users - Microsoft Teams](https://learn.microsoft.com/en-us/microsoftteams/caller-id-policies), Outbound caller ID behavior, Outbound calling line ID; Configure caller ID policies table. Checked 2026-09-30.
[^8]: CallingIDSubstitute = Service is deprecated: new caller ID policies can no longer use it and existing policies that use it are not honored; Resource should be used instead. Source: [Manage caller ID for users - Microsoft Teams](https://learn.microsoft.com/en-us/microsoftteams/caller-id-policies), Use PowerShell, Grant a caller ID policy, Note. Checked 2026-09-30.
[^9]: Caller ID policies are managed in the Teams admin center under Voice > Caller ID policies; users get the global policy unless a custom one is assigned, and when choosing Resource account only resource accounts with an assigned phone number are listed, possibly after a delay of a few minutes. Source: [Manage caller ID for users - Microsoft Teams](https://learn.microsoft.com/en-us/microsoftteams/caller-id-policies), Use the Teams admin center; Create a custom caller ID policy, step 6. Checked 2026-09-30.
[^10]: The caller ID policy setting Override the caller ID policy (-EnableUserOverride) takes precedence over the policy's other settings and lets users choose in client settings whether their number is shown, so it can make a resource-account policy send Anonymous or an Anonymous policy send the user's number. Source: [Manage caller ID for users - Microsoft Teams](https://learn.microsoft.com/en-us/microsoftteams/caller-id-policies), End user control that overrides the caller ID policy. Checked 2026-09-30.
[^11]: The Teams client normalizes numbers for all outbound calls, including calls placed from call history or from telephone-number links, using the user's effective dial plan. Source: [Microsoft Teams Dial plans for phone call routing](https://learn.microsoft.com/en-us/microsoftteams/what-are-dial-plans), Dial plans and routing considerations, bullet. Checked 2026-09-30.
[^12]: The calling party name in a caller ID policy can be up to 200 characters, downstream systems may support fewer, and delivery of the name to the called party depends on PSTN operators. Source: [Manage caller ID for users - Microsoft Teams](https://learn.microsoft.com/en-us/microsoftteams/caller-id-policies), Outbound calling party name, bullet and Note. Checked 2026-09-30.
[^13]: For Calling Plan, Operator Connect and Teams Phone Mobile, dial plans and voice routing policies are preconfigured at the service level and administration is not necessary, whereas Direct Routing or extension dialing requires the admin to configure voice routes and assign voice routing policies. Source: [Microsoft Teams Dial plans for phone call routing](https://learn.microsoft.com/en-us/microsoftteams/what-are-dial-plans), User dial plans with Calling Plans and Operator Connect; User dial plans with Direct Routing or extension dialing. Checked 2026-09-30.
[^14]: Whether a user has a per-user tenant dial plan can be checked with Get-CsUserPolicyAssignment -Identity <user> -PolicyType TenantDialPlan. Source: [Grant-CsTenantDialPlan (MicrosoftTeams)](https://learn.microsoft.com/en-us/powershell/module/microsoftteams/grant-cstenantdialplan), Description, last paragraph. Checked 2026-09-30.
[^15]: Grant-CsTenantDialPlan assigns a tenant dial plan to a user (-Identity), to a group (-Group with -Rank), or sets the Global instance (-Global); -PolicyName $null removes a user's dial plan so the user falls back to the global dial plan. Source: [Grant-CsTenantDialPlan (MicrosoftTeams)](https://learn.microsoft.com/en-us/powershell/module/microsoftteams/grant-cstenantdialplan), Description; Syntax; Examples 1-3. Checked 2026-09-30.
[^16]: A tenant can have at most 1,000 tenant dial plans. Source: [Microsoft Teams Dial plans for phone call routing](https://learn.microsoft.com/en-us/microsoftteams/what-are-dial-plans), Dial plans and routing considerations, first sentence. Checked 2026-09-30.
[^17]: Microsoft recommends naming user dial plans after the geographic location or group of users they apply to and applying one naming convention across all sites; the dial plan SimpleName cannot be empty and must be unique. Source: [Create and manage dial plans](https://learn.microsoft.com/en-us/microsoftteams/create-and-manage-dial-plans), Name and simple name. Checked 2026-09-30.
[^18]: Each dial plan must have at least one normalization rule associated with it. Source: [Create and manage dial plans](https://learn.microsoft.com/en-us/microsoftteams/create-and-manage-dial-plans), Using the Microsoft Teams admin center, Create a dial plan, step 3. Checked 2026-09-30.
[^19]: Microsoft's dial plan planning steps are: decide whether a custom dial plan is needed (typically to support non-E.164 dialing such as extensions or abbreviated national dialing); use user-scoped dial plans if users have different local dialing requirements; define only patterns not already in the service country dial plan; and adopt an organization-wide naming scheme. Source: [Microsoft Teams Dial plans for phone call routing](https://learn.microsoft.com/en-us/microsoftteams/what-are-dial-plans), Planning for tenant dial plans, Steps 1-4. Checked 2026-09-30.
[^20]: Teams has three dial plan scopes: a Microsoft-managed service dial plan (not configurable, assigned automatically from the user's usage location), the tenant Global dial plan, and user dial plans that an admin creates and assigns. Source: [Microsoft Teams Dial plans for phone call routing](https://learn.microsoft.com/en-us/microsoftteams/what-are-dial-plans), Dial plan scopes and a user's effective dial plan, first table. Checked 2026-09-30.
[^21]: Normalization rules use .NET Framework regular expressions for the match pattern plus a translation, and Microsoft warns that invalid expressions in dial plan normalization rules may cause client or service issues. Source: [Normalization rules for Microsoft Teams dial plans](https://learn.microsoft.com/en-us/microsoftteams/phone-normalization-rules), Creating normalization rules. Checked 2026-09-30.
[^22]: For Direct Routing, the substituted caller ID number and calling party name are sent in the SIP From header, and if the SBC's online PSTN gateway is configured with -ForwardPai $true the P-Asserted-Identity header carries the real calling user. Source: [Manage caller ID for users - Microsoft Teams](https://learn.microsoft.com/en-us/microsoftteams/caller-id-policies), Outbound caller ID behavior, paragraph beginning 'For Direct Routing'. Checked 2026-09-30.
[^23]: Set-CsPhoneNumberAssignment -Identity <user> -PhoneNumber <number> -PhoneNumberType DirectRouting assigns a Direct Routing number and automatically enables the user for Enterprise Voice; Microsoft recommends, but does not require, full E.164 format. Source: [Enable users for Direct Routing](https://learn.microsoft.com/en-us/microsoftteams/direct-routing-enable-users), Configure the phone number and enable enterprise voice, Use PowerShell. Checked 2026-09-30.
[^24]: A user's effective dial plan merges the service country dial plan with either the tenant Global dial plan or an assigned user dial plan (never both), and user dial plan rules take precedence over tenant Global rules, which take precedence over service dial plan rules. Source: [Microsoft Teams Dial plans for phone call routing](https://learn.microsoft.com/en-us/microsoftteams/what-are-dial-plans), Dial plan scopes and a user's effective dial plan, paragraphs after the first table and second table. Checked 2026-09-30.
[^25]: Emergency calls always send the user's own calling line ID to the PSAP regardless of the caller ID policy. Source: [Manage caller ID for users - Microsoft Teams](https://learn.microsoft.com/en-us/microsoftteams/caller-id-policies), Outbound caller ID behavior, Important. Checked 2026-09-30.
[^26]: The ExternalAccessPrefix and OptimizeDeviceDialing parameters have been removed from New-CsTenantDialPlan and Set-CsTenantDialPlan; external access dialing is now handled through normalization rules, and Get-CsTenantDialPlan shows any external access prefix as a normalization rule. Source: [Grant-CsTenantDialPlan (MicrosoftTeams)](https://learn.microsoft.com/en-us/powershell/module/microsoftteams/grant-cstenantdialplan), Notes. Checked 2026-09-30.
[^27]: When a called number contains an extension, the voice route number pattern is applied only to the number without the extension (for +1425XXXXXXX;ext=YYY the pattern is matched against +1425XXXXXXX). Source: [Configure call routing for Direct Routing](https://learn.microsoft.com/en-us/microsoftteams/direct-routing-voice-routing), Voice routing policy considerations, Caution item 2. Checked 2026-09-30.
[^28]: Get-CsEffectiveTenantDialPlan -Identity <user> returns all normalization rules applicable to the user, and Microsoft recommends using it to see which rules the service country dial plan already provides before writing tenant rules. Source: [Normalization rules for Microsoft Teams dial plans](https://learn.microsoft.com/en-us/microsoftteams/phone-normalization-rules), Determining the required normalization rules. Checked 2026-09-30.
[^29]: Microsoft cautions that configuring the global (Org-wide default) online voice routing policy makes every voice-enabled user inherit it, which might inadvertently route PSTN calls from Calling Plan and Operator Connect users to a Direct Routing trunk; to avoid this, create a custom policy and assign it to individual voice-enabled users. Source: [Configure call routing for Direct Routing](https://learn.microsoft.com/en-us/microsoftteams/direct-routing-voice-routing), Voice routing policy considerations, Caution item 1. Checked 2026-09-30.
[^30]: Users automatically get the global (Org-wide default) voice routing policy unless a custom policy is assigned; the global policy can be edited but cannot be renamed or deleted. Source: [Manage call routing policies for Direct Routing](https://learn.microsoft.com/en-us/microsoftteams/manage-voice-routing-policies), Introduction, third paragraph. Checked 2026-09-30.
[^31]: Grant-CsOnlineVoiceRoutingPolicy -PolicyName <name> -Global makes the named policy the global online voice routing policy, affecting all users in the tenant except those with an explicit policy assignment. Source: [Grant-CsOnlineVoiceRoutingPolicy (MicrosoftTeams)](https://learn.microsoft.com/en-us/powershell/module/microsoftteams/grant-csonlinevoiceroutingpolicy), Examples, Example 4; Parameters, -Global. Checked 2026-09-30.
[^32]: Grant-CsOnlineVoiceRoutingPolicy can assign a policy to a group with -Group and -Rank, a syntax supported from Teams PowerShell Module 4.5.1-preview. Source: [Grant-CsOnlineVoiceRoutingPolicy (MicrosoftTeams)](https://learn.microsoft.com/en-us/powershell/module/microsoftteams/grant-csonlinevoiceroutingpolicy), Examples, Example 5; Notes. Checked 2026-09-30.
[^33]: Running Grant-CsOnlineVoiceRoutingPolicy with -PolicyName $null removes a user's per-user voice routing policy so the user falls back to the global policy. Source: [Grant-CsOnlineVoiceRoutingPolicy (MicrosoftTeams)](https://learn.microsoft.com/en-us/powershell/module/microsoftteams/grant-csonlinevoiceroutingpolicy), Examples, Example 2; Parameters, -PolicyName. Checked 2026-09-30.
[^34]: When an inbound PSTN call is forwarded or transferred and its ingress SBC is also listed as a potential egress SBC, that SBC's route priority is ignored and it is tried before other SBCs. Source: [Configure call routing for Direct Routing](https://learn.microsoft.com/en-us/microsoftteams/direct-routing-voice-routing), Example 1, Note below the three-route summary table. Checked 2026-09-30.
[^35]: Microsoft enforces a maximum of 50 normalization rules in a single dial plan. Source: [Normalization rules for Microsoft Teams dial plans](https://learn.microsoft.com/en-us/microsoftteams/phone-normalization-rules), Introduction, Note. Checked 2026-09-30.
[^36]: For a user who has Teams Phone but no Calling Plan, a dialed number that matches no number pattern in the user's voice routing policy is dropped; for a user who also has a Calling Plan, the Calling Plan applies automatically as the last route. Source: [Configure call routing for Direct Routing](https://learn.microsoft.com/en-us/microsoftteams/direct-routing-voice-routing), Example 1, Note after the diagram and paragraph after the third-route diagram. Checked 2026-09-30.
[^37]: Per-site voice routing policies and per-site user dial plans are most likely warranted when sites have different local dialing habits or must egress through different SBCs, while a single policy and the Global dial plan are likely sufficient when all users share one dialing convention and one set of SBCs (inferred). Source: [Microsoft Teams Dial plans for phone call routing](https://learn.microsoft.com/en-us/microsoftteams/what-are-dial-plans), Planning for tenant dial plans, Step 2; combined with ms-learn-dr-voice-routing Call routing overview (routing by pattern plus user). Checked 2026-09-30.
[^38]: Assigning a voice routing policy does not by itself enable a user to make PSTN calls; the user must also be enabled for Direct Routing. Source: [Manage call routing policies for Direct Routing](https://learn.microsoft.com/en-us/microsoftteams/manage-voice-routing-policies), Introduction, fourth paragraph. Checked 2026-09-30.
[^39]: A Teams user's effective policy for a policy type is the directly assigned policy if one exists; otherwise the policy of the highest-ranked group assignment among the user's groups; otherwise the global (Org-wide default) policy. Source: [Assign policies in Teams](https://learn.microsoft.com/en-us/microsoftteams/policy-assignment-overview), Which policy takes precedence?. Checked 2026-09-30.
[^40]: When a number resolves to more than one voice route, the route with the lowest Priority value is applied first and the rest follow in ascending order. Source: [New-CsOnlineVoiceRoute (MicrosoftTeams)](https://learn.microsoft.com/en-us/powershell/module/microsoftteams/new-csonlinevoiceroute), Parameters, -Priority. Checked 2026-09-30.
[^41]: A voice routing policy is created with New-CsOnlineVoiceRoutingPolicy <name> -OnlinePstnUsages <usage list>, assigned with Grant-CsOnlineVoiceRoutingPolicy -Identity <user> -PolicyName <name>, and the assignment is checked with Get-CsOnlineUser <user> | Select OnlineVoiceRoutingPolicy. Source: [Configure call routing for Direct Routing](https://learn.microsoft.com/en-us/microsoftteams/direct-routing-voice-routing), Example 1 configuration steps, Using PowerShell, Steps 3 and 4. Checked 2026-09-30.
[^42]: A voice route is created with New-CsOnlineVoiceRoute -Identity <name> -NumberPattern <regex> -OnlinePstnGatewayList <SBC FQDNs> -Priority <n> -OnlinePstnUsages <usage>, and checked with Get-CsOnlineVoiceRoute. Source: [Configure call routing for Direct Routing](https://learn.microsoft.com/en-us/microsoftteams/direct-routing-voice-routing), Example 1 configuration steps, Using PowerShell, Step 2. Checked 2026-09-30.
[^43]: A PSTN usage is created in PowerShell with Set-CsOnlinePstnUsage -Identity Global -Usage @{Add="name"}, and because Get-CsOnlinePSTNUsage output can be truncated, (Get-CsOnlinePSTNUsage).Usage lists the full usage names. Source: [Configure call routing for Direct Routing](https://learn.microsoft.com/en-us/microsoftteams/direct-routing-voice-routing), Example 1 configuration steps, Using PowerShell, Step 1. Checked 2026-09-30.
[^44]: Tenant dial plans are managed with New-, Set-, Get-, Grant- and Remove-CsTenantDialPlan, and a rule is added by building it with New-CsVoiceNormalizationRule ... -InMemory and passing it to Set-CsTenantDialPlan -NormalizationRules @{add=$rule} (or @{remove=$rule} to take it out). Source: [Create and manage dial plans](https://learn.microsoft.com/en-us/microsoftteams/create-and-manage-dial-plans), Using PowerShell, Using single cmdlets; Using a PowerShell script. Checked 2026-09-30.
[^45]: Inbound calls reach a Teams user or resource account by Reverse Number Lookup on an exactly matching assigned number; for Direct Routing the number value can be 3 to 38 digits, and if an extension is assigned the inbound dialed number must include it, otherwise the call fails or follows unassigned number routing. Source: [Microsoft Teams Dial plans for phone call routing](https://learn.microsoft.com/en-us/microsoftteams/what-are-dial-plans), Number lookup for inbound calls. Checked 2026-09-30.
[^46]: When a voice route is created without -Priority, the service assigns it a priority automatically (Microsoft's example route created without a priority was given priority 4 after routes with priorities 1 and 2). Source: [Configure call routing for Direct Routing](https://learn.microsoft.com/en-us/microsoftteams/direct-routing-voice-routing), Example 1 configuration steps, Using PowerShell, Step 2 ("the route Other +1 was automatically assigned priority 4"). Checked 2026-09-30.
[^47]: Teams Phone routes a Direct Routing call to a specific SBC based on the called number pattern, or on the called number pattern plus the specific user who makes the call. Source: [Configure call routing for Direct Routing](https://learn.microsoft.com/en-us/microsoftteams/direct-routing-voice-routing), Call routing overview (first paragraph and bullets). Checked 2026-09-30.
[^48]: Online voice routes are managed with New-, Get-, Set- and Remove-CsOnlineVoiceRoute, and online voice routing policies with New-, Get-, Set-, Grant- and Remove-CsOnlineVoiceRoutingPolicy. Source: [New-CsOnlineVoiceRoute (MicrosoftTeams)](https://learn.microsoft.com/en-us/powershell/module/microsoftteams/new-csonlinevoiceroute), Related Links. Checked 2026-09-30.
[^49]: The New-CsOnlineVoiceRoute reference gives [0-9]{10} as the default NumberPattern when none is specified. Source: [New-CsOnlineVoiceRoute (MicrosoftTeams)](https://learn.microsoft.com/en-us/powershell/module/microsoftteams/new-csonlinevoiceroute), Parameters, -NumberPattern ("Default: [0-9]{10}"). Checked 2026-09-30.
[^50]: A PSTN usage named on a voice route must already exist (retrievable with Get-CsOnlinePstnUsage), and creating a route with an empty usage list or an empty gateway list produces a warning. Source: [New-CsOnlineVoiceRoute (MicrosoftTeams)](https://learn.microsoft.com/en-us/powershell/module/microsoftteams/new-csonlinevoiceroute), Parameters, -OnlinePstnUsages and -OnlinePstnGatewayList. Checked 2026-09-30.
[^51]: All online voice routes are created at the Global scope and each needs a unique name; voice routes are tied to voice routing policies only through PSTN usages. Source: [New-CsOnlineVoiceRoute (MicrosoftTeams)](https://learn.microsoft.com/en-us/powershell/module/microsoftteams/new-csonlinevoiceroute), Description, paragraphs 1 and 3. Checked 2026-09-30.
[^52]: Teams Direct Routing call routing is made up of voice routing policies (containers for PSTN usages that are assigned to users), PSTN usages (containers for voice routes that can be shared across policies), voice routes (a number pattern plus a set of online PSTN gateways) and online PSTN gateways (pointers to SBCs). Source: [Configure call routing for Direct Routing](https://learn.microsoft.com/en-us/microsoftteams/direct-routing-voice-routing), Call routing overview (element list). Checked 2026-09-30.
[^53]: Microsoft recommends that every normalization rule produce a number starting with +, because a number normalized without + is normalized again by the calling service using tenant and regional rules; Direct Routing customers can remove the + with trunk translation rules if needed. Source: [Create and manage dial plans](https://learn.microsoft.com/en-us/microsoftteams/create-and-manage-dial-plans), Using the Microsoft Teams admin center, Create a dial plan, step 4 Note. Checked 2026-09-30.
[^54]: Normalization rules in a dial plan are evaluated top to bottom and the first matching rule is used with no further rules tried, so more restrictive rules should be placed above less restrictive ones. Source: [Normalization rules for Microsoft Teams dial plans](https://learn.microsoft.com/en-us/microsoftteams/phone-normalization-rules), Introduction, third paragraph. Checked 2026-09-30.
[^55]: Microsoft's sample normalization rule for 4-digit extensions uses pattern ^(\d{4})$ with translation +1425555$1, turning 0100 into +14255550100, and its 7-digit local rule uses ^(\d{7})$ with translation +1425$1. Source: [Normalization rules for Microsoft Teams dial plans](https://learn.microsoft.com/en-us/microsoftteams/phone-normalization-rules), Sample normalization rules, first table (4digitExtension, 7digitcallingRedmond). Checked 2026-09-30.
[^56]: Voice routes are tried in priority order, but the SBCs listed within a single voice route are tried in random order. Source: [Configure call routing for Direct Routing](https://learn.microsoft.com/en-us/microsoftteams/direct-routing-voice-routing), Example 1: Voice routing with one PSTN usage (sentence after the diagram). Checked 2026-09-30.
[^57]: Microsoft 365 admins can run a Direct Routing self-diagnostic from the Microsoft 365 admin center to verify a user is correctly configured for Direct Routing; it is not available for Microsoft 365 Government, Microsoft 365 operated by 21Vianet or Microsoft 365 Germany. Source: [Configure call routing for Direct Routing](https://learn.microsoft.com/en-us/microsoftteams/direct-routing-voice-routing), Run a Self-diagnostics tool. Checked 2026-09-30.
[^58]: If the user's effective dial plan applies no normalization rule to a dialed number, the Teams service dial plan prepends +CC (the country code of the user's usage location); to avoid double normalization Microsoft recommends Direct Routing customers normalize to + in dial plans and remove the + with a route-based translation rule. Source: [Translate phone numbers for Direct Routing](https://learn.microsoft.com/en-us/microsoftteams/direct-routing-translate-numbers), Route-based number translations - for outbound calls, Note. Checked 2026-09-30.
[^59]: Microsoft's example strips +1 for an SBC that expects 10-digit numbers using a rule with pattern ^\+1(\d{10})$ and translation $1, applied as OutboundPSTNNumberTranslationRules (called number) and OutboundTeamsNumberTranslationRules (calling number). Source: [Translate phone numbers for Direct Routing](https://learn.microsoft.com/en-us/microsoftteams/direct-routing-translate-numbers), Example SBC configuration (StripPlus1 rule) and Example 3. Checked 2026-09-30.
[^60]: In the Teams admin center, dial plans are created under Voice > Dial plans, where rules can be added, reordered with Move up and Move down, and a number entered under Test dial plan to test the plan. Source: [Create and manage dial plans](https://learn.microsoft.com/en-us/microsoftteams/create-and-manage-dial-plans), Using the Microsoft Teams admin center, Create a dial plan, steps 1-6. Checked 2026-09-30.
[^61]: In the Teams admin center, PSTN usage records are managed under Voice > Direct Routing > Manage PSTN usage records, voice routes under Voice > Direct Routing > Voice routes, voice routing policies under Voice > Voice routing policies, and a user's voice routing policy under Users > the user > Policies. Source: [Configure call routing for Direct Routing](https://learn.microsoft.com/en-us/microsoftteams/direct-routing-voice-routing), Example 1 configuration steps, Using the Microsoft Teams admin center, Steps 1-4. Checked 2026-09-30.
[^62]: Direct Routing requires users to be in Teams Only mode (the UpgradeToTeams instance of TeamsUpgradePolicy) so that incoming calls land in the Teams client. Source: [Enable users for Direct Routing](https://learn.microsoft.com/en-us/microsoftteams/direct-routing-enable-users), Assign Teams Only mode to users to ensure calls land in Microsoft Teams. Checked 2026-09-30.
[^63]: Test-CsEffectiveTenantDialPlan -DialedNumber <digits> -Identity <user> normalizes the dialed number by applying the normalization rules of the effective tenant dial plan returned for that user. Source: [Test-CsEffectiveTenantDialPlan (MicrosoftTeams)](https://learn.microsoft.com/en-us/powershell/module/teams/test-cseffectivetenantdialplan), Description; Examples 1 and 2. Checked 2026-09-30.
[^64]: Test-CsEffectiveTenantDialPlan accepts piped output of Get-CsEffectiveTenantDialPlan -Identity <user>, and its -CallerNumber parameter takes the user's assigned phone number to identify which effective tenant dial plan to use. Source: [Test-CsEffectiveTenantDialPlan (MicrosoftTeams)](https://learn.microsoft.com/en-us/powershell/module/teams/test-cseffectivetenantdialplan), Examples 1 and 3; Parameters, -CallerNumber. Checked 2026-09-30.
[^65]: The -TenantScopeOnly switch of Test-CsEffectiveTenantDialPlan runs the test against tenant-level dial plans only, ignoring service-level dial plans. Source: [Test-CsEffectiveTenantDialPlan (MicrosoftTeams)](https://learn.microsoft.com/en-us/powershell/module/teams/test-cseffectivetenantdialplan), Parameters, -TenantScopeOnly. Checked 2026-09-30.
[^66]: For outbound Direct Routing calls, the dialed number is first processed by the user's effective dial plan, then matched to a PSTN usage and voice route, and route-based number translation rules applied on the selected SBC's PSTN gateway configuration then change the format the SBC receives. Source: [Translate phone numbers for Direct Routing](https://learn.microsoft.com/en-us/microsoftteams/direct-routing-translate-numbers), Route-based number translations - for outbound calls, paragraphs 2-3. Checked 2026-09-30.
[^67]: Direct Routing number translation rules are limited to 400 rules in total, a 100-symbol name, a 1024-symbol pattern and a 256-symbol translation. Source: [Translate phone numbers for Direct Routing](https://learn.microsoft.com/en-us/microsoftteams/direct-routing-translate-numbers), Considerations, Note. Checked 2026-09-30.
[^68]: Translation rules are created with New-, Set-, Get- and Remove-CsTeamsTranslationRule and attached to an SBC with New- or Set-CsOnlinePSTNGateway through the InboundTeamsNumberTranslationRules, InboundPSTNNumberTranslationRules, OutboundTeamsNumberTranslationRules and OutboundPSTNNumberTranslationRules parameters; rules on an SBC apply in the order listed. Source: [Translate phone numbers for Direct Routing](https://learn.microsoft.com/en-us/microsoftteams/direct-routing-translate-numbers), Considerations; Configuring translation rules with PowerShell. Checked 2026-09-30.
[^69]: Online PSTN usages are a single tenant-wide Global list used by routes and policies; Set-CsOnlinePstnUsage adds or removes entries, and using @{replace=...} replaces the whole list so all previously existing usages are removed. Source: [Set-CsOnlinePstnUsage (MicrosoftTeams)](https://learn.microsoft.com/en-us/powershell/module/microsoftteams/set-csonlinepstnusage), Description; Examples 2 and 4; Parameters, -Identity. Checked 2026-09-30.
[^70]: The order of PSTN usages in a voice routing policy is critical: usages are evaluated in order and, once a match is found in one usage, later usages are never evaluated, so a catch-all usage such as International must be placed after more specific usages. Source: [Configure call routing for Direct Routing](https://learn.microsoft.com/en-us/microsoftteams/direct-routing-voice-routing), Example 2, Note below the No Restrictions table (first bullet). Checked 2026-09-30.
[^71]: The order of PSTN usages in an existing voice routing policy is changed with Set-CsOnlineVoiceRoutingPolicy using -OnlinePstnUsages @{Replace=...} listing the usages in the new order. Source: [Configure call routing for Direct Routing](https://learn.microsoft.com/en-us/microsoftteams/direct-routing-voice-routing), Example 2, Note below the No Restrictions table (Set-CsOnlineVoiceRoutingPolicy example). Checked 2026-09-30.
[^72]: Microsoft cautions that the NumberPattern of a voice route must be a valid regular expression, and a pattern of ".*" can be used to send all calls to the same SBC. Source: [Configure call routing for Direct Routing](https://learn.microsoft.com/en-us/microsoftteams/direct-routing-voice-routing), Example 1 configuration steps, Using PowerShell, Step 2, Caution. Checked 2026-09-30.
[^73]: To use PSTN telephony with Teams Phone, a user account must be licensed with the Teams Phone application and also be equipped with a PSTN solution from a PSTN service provider. Source: [PSTN connectivity options](https://learn.microsoft.com/en-us/microsoftteams/pstn-connectivity), PSTN connectivity options, section 'What is the Public Switched Telephone Network (PSTN)?'. Checked 2026-09-24.
[^74]: Direct Routing is not supported in Islands coexistence mode. Source: [Plan Direct Routing](https://learn.microsoft.com/en-us/microsoftteams/direct-routing-plan), Plan Direct Routing, section 'Licensing requirements', Note. Checked 2026-09-24.
[^75]: Direct Routing requires a Microsoft-certified SBC, PSTN trunks to it, users homed online, a public IP, an SBC FQDN in a verified tenant domain (not *.onmicrosoft.com) with public DNS, and a publicly trusted TLS certificate. Source: [Plan Direct Routing](https://learn.microsoft.com/en-us/microsoftteams/direct-routing-plan), Plan Direct Routing, section 'Infrastructure requirements' table and section 'SBC domain names'. Checked 2026-09-24.
[^76]: Microsoft supports Teams Phone with Direct Routing only when certified SBCs are used, expects the SBC vendor to investigate first and escalate, and may decline support requests involving non-certified SBCs. Source: [Plan Direct Routing](https://learn.microsoft.com/en-us/microsoftteams/direct-routing-plan), Plan Direct Routing, sections 'Supported Session Border Controllers (SBCs)' and 'Support boundaries'. Checked 2026-09-24.
[^77]: Direct Routing requires specific emergency call routing policies, whereas with the other PSTN options the carrier handles much of the emergency call routing configuration. Source: [Plan and manage emergency calling](https://learn.microsoft.com/en-us/microsoftteams/what-are-emergency-locations-addresses-and-call-routing), Plan and manage emergency calling, section 'Emergency call routing'. Checked 2026-09-24.
