How to Configure Teams Tenant Dial Plans and Voice Normalization Rules Using PowerShell CsTenantDialPlan

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.

Get the best tech tips delivered straight to your inbox.

Join thousands of readers mastering Apple, Google, Microsoft, and Linux.