In enterprise telecommunications environments utilizing Microsoft Teams Phone (via Direct Routing, Operator Connect, or Microsoft Calling Plans), end users frequently dial phone numbers in legacy shorthand formats. Users expect to dial 4-digit internal branch extensions, 7-digit local municipal numbers without area codes, or 10-digit national numbers without country codes. However, modern telecom carriers, Session Border Controllers (SBCs), and PSTN gateways require telephone numbers formatted strictly according to the international E.164 standard (e.g. +14255550100 or +442079460123).
To bridge user dialing habits with telephony carrier standards, Microsoft Teams provides Tenant Dial Plans managed through CsTenantDialPlan. Dial plans evaluate dialed digit strings through regular expression (regex) normalization rules and translate them into standardized E.164 formats before calls are handed off to voice routing engines. This guide explains how to inspect existing dial plans, create customized tenant dial plans, build regular expression normalization rules, and assign dial plans across Microsoft 365.
Understanding CsTenantDialPlan Components
A Microsoft Teams Tenant Dial Plan consists of several key elements:
- Tenant Dial Plan (Container): The named policy object assigned to specific users, sites, or the global tenant.
- Voice Normalization Rules: Ordered regular expression translation rules that match digit patterns and transform them into E.164 format.
- Service Dial Plans vs Tenant Dial Plans: Microsoft automatically generates regional service dial plans based on the user’s licensing country code. Tenant dial plans augment and override these service defaults.
- SimpleName & Description: Administrative identifiers used to document regional office routing standards.
Connecting to Microsoft Teams PowerShell
Open an elevated PowerShell prompt on your administrative workstation and connect to the Microsoft 365 tenant:
Connect-MicrosoftTeams
Confirm that your session is active with appropriate Teams Administrator credentials:
Get-CsTenant | Select-Object DisplayName, TenantId
Inspecting Existing Tenant Dial Plans
To view all tenant dial plans defined in your organization, execute:
Get-CsTenantDialPlan
To inspect the default Global dial plan and its configured normalization rules:
Get-CsTenantDialPlan -Identity Global | Select-Object -ExpandProperty NormalizationRules | Format-Table Name, Pattern, Translation -AutoSize
If no custom rules have been added, the output will be blank, and users rely strictly on regional service dial plans.
Creating Voice Normalization Rules Using Regular Expressions
Normalization rules are instantiated using the New-CsVoiceNormalizationRule cmdlet. Each rule requires a regex Pattern (to match dialed input) and a Translation string (to construct the E.164 output).
Example 1: Translating 4-Digit Extension Dialing
If users in the Seattle headquarters dial internal extensions ranging from 1000 to 4999, and these correspond to company DID range +1 (206) 555-1000 through +1 (206) 555-4999:
$ruleExtension = New-CsVoiceNormalizationRule -Name "Seattle-4Digit-Extension" -Description "Translates 4-digit internal extensions to Seattle DID range" -Pattern '^([1-4]\d{3})$' -Translation '+1206555$1' -InMemory
Example 2: Translating 7-Digit Local Dialing
To automatically prepend the local Seattle area code (206) and US country code (+1) when a user dials standard 7-digit local numbers:
$rule7Digit = New-CsVoiceNormalizationRule -Name "Seattle-7Digit-Local" -Description "Prepends +1206 to 7-digit local calls" -Pattern '^([2-9]\d{6})$' -Translation '+1206$1' -InMemory
Example 3: Normalizing 10-Digit Domestic Dialing
To prepend +1 to 10-digit national calls:
$rule10Digit = New-CsVoiceNormalizationRule -Name "US-10Digit-National" -Description "Prepends +1 to 10-digit US numbers" -Pattern '^([2-9]\d{2}[2-9]\d{6})$' -Translation '+1$1' -InMemory
Creating a Custom Regional Tenant Dial Plan
Create a dedicated tenant dial plan targeting the Seattle regional office, embedding the normalization rules created above:
New-CsTenantDialPlan -Identity "Seattle-Office-DialPlan" -Description "Dial plan for Seattle branch staff: enables 4-digit extension and 7-digit local dialling" -NormalizationRules @($ruleExtension, $rule7Digit, $rule10Digit)
Confirm that the dial plan was provisioned with its associated rules:
Get-CsTenantDialPlan -Identity "Seattle-Office-DialPlan" | Select-Object -ExpandProperty NormalizationRules
Testing Normalization Rules via PowerShell
Before assigning dial plans to production users, verify that the regular expression patterns translate dialed numbers accurately using Test-CsEffectiveTenantDialPlan:
Test-CsEffectiveTenantDialPlan -Dialplan "Seattle-Office-DialPlan" -DialedNumber "2450"
The command returns the translated output:
TranslatedNumber MatchingRule
---------------- ------------
+12065552450 Seattle-4Digit-Extension
Test with a 7-digit number:
Test-CsEffectiveTenantDialPlan -Dialplan "Seattle-Office-DialPlan" -DialedNumber "5550199"
The output confirms: +12065550199.
Assigning Tenant Dial Plans to Users and Groups
Assign the customized dial plan to an individual user using Grant-CsTenantDialPlan:
Grant-CsTenantDialPlan -Identity "[email protected]" -PolicyName "Seattle-Office-DialPlan"
To assign the dial plan across an entire branch office security group in Microsoft Entra ID:
Grant-CsTenantDialPlan -Group "Seattle-Employees-GroupID" -PolicyName "Seattle-Office-DialPlan" -Rank 1
To remove a custom assignment so a user reverts to the organization Global dial plan, specify $null:
Grant-CsTenantDialPlan -Identity "[email protected]" -PolicyName $null
Verifying User Policy Assignment
Confirm the effective dial plan assigned to a user account:
Get-CsUserPolicyAssignment -Identity "[email protected]" -PolicyType TenantDialPlan
By effectively implementing CsTenantDialPlan normalization rules in PowerShell, organizations simplify dialing for employees, support internal extension shortcuts, and guarantee clean E.164 translation across enterprise Microsoft Teams voice architectures.