Get-TenantPrivateChannelMigrationStatus
You use the Get-TenantPrivateChannelMigrationStatus cmdlet to check the status of private channel migration for your tenant.
Syntax
Default (Default)
Get-TenantPrivateChannelMigrationStatus
Description
The Get-TenantPrivateChannelMigrationStatus cmdlet allows tenant administrators to track the status of the private channel migration for their Microsoft Teams organization. More details about the migration can be found here
Note: This cmdlet requires tenant administrator permissions to execute.
Examples
Example 1
Get-TenantPrivateChannelMigrationStatus
This example gets the migration status for a tenant where all channels have been migrated.
TenantId : 12345678-1234-1234-1234-123456789abc
MigrationStatus : Completed
MigrationStartTimeStamp : 2025-10-09T10:15:00.456Z
MigrationCompletionTimeStamp : 2025-10-09T12:45:00.789Z
Details : {"totalChannels":10,"migratedChannels":10,"failedChannels":0,"ownerlessChannels":0,"remainingChannels":0}
Example 2
Get-TenantPrivateChannelMigrationStatus
This example gets the migration status for a tenant where some channels require admin attention.
TenantId : 94d200e4-2df1-45b9-bc3e-53cfa7cf4997
MigrationStatus : RequiresAdminAttention
MigrationStartTimeStamp : 2026-02-10T06:48:20.000Z
MigrationCompletionTimeStamp :
Details : {"totalChannels":10,"migratedChannels":6,"failedChannels":1,"ownerlessChannels":2,"remainingChannels":1,"ownerlessChannelsDetails":[{"channelThreadId":"19:70c903e82053408790c3941f614a4d36@thread.tacv2","teamId":"12025f7b-4e7d-4d4c-b597-10f52de1c198"},{"channelThreadId":"19:a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6@thread.tacv2","teamId":"b94ac03c-ba25-4e79-89ab-d23f707863f7"}]}
Example 3
$result = Get-TenantPrivateChannelMigrationStatus
$details = $result.Details | ConvertFrom-Json
Write-Host "Total: $($details.totalChannels), Migrated: $($details.migratedChannels), Failed: $($details.failedChannels), Ownerless: $($details.ownerlessChannels)"
if ($details.ownerlessChannelsDetails) { $details.ownerlessChannelsDetails | Format-Table channelThreadId, teamId }
This example parses the Details JSON and lists ownerless channels in a table.
Inputs
None
This cmdlet does not accept pipeline input.
Outputs
System.Object
Returns a PrivateChannelMigrationStatusResponse object with the following properties:
| Property | Type | Description |
|---|---|---|
TenantId |
String | The Microsoft Entra tenant identifier. |
MigrationStatus |
String | Overall migration status for the tenant. Possible values: NotStarted, InProgress, Completed, RequiresAdminAttention. |
MigrationStartTimeStamp |
DateTime | When migration started for this tenant. Empty if migration has not started. |
MigrationCompletionTimeStamp |
DateTime | When migration completed. Only populated when all channels are done. |
Details |
String | JSON string containing channel counts and per-channel detail arrays. |
Migration status values
| Value | Description |
|---|---|
NotStarted |
No private channels have been processed for this tenant. |
InProgress |
Migration is underway. |
Completed |
All private channels have been successfully migrated. |
RequiresAdminAttention |
One or more channels were skipped because they have no owners. If these channels are still in use, a tenant admin or Teams service admin can add an owner to unblock migration. Failed channels do not require admin action and are retried automatically. |
Details JSON fields
| Field | Type | Description |
|---|---|---|
totalChannels |
Integer | Total number of private channels for this tenant. |
migratedChannels |
Integer | Number of channels migrated successfully. |
failedChannels |
Integer | Number of channels where migration failed. No admin action is needed. |
ownerlessChannels |
Integer | Number of channels skipped because they have no owners. |
remainingChannels |
Integer | Number of channels still in progress or not yet started. |
ownerlessChannelsDetails |
Array | Per-channel details for ownerless channels. Each entry contains channelThreadId and teamId. |
Channel detail object
| Field | Type | Description |
|---|---|---|
channelThreadId |
String | The unique identifier of the private channel. |
teamId |
String | The unique identifier (GroupId) of the parent team. This is the same value used by the -GroupId parameter in Get-Team, Get-TeamChannel, and Microsoft Graph team resource. |
Notes
- This cmdlet requires tenant administrator permissions.
- Private channels remain functional throughout the migration process.
- The
Detailsproperty is returned as a JSON string. UseConvertFrom-Jsonto parse it. - When no ownerless channels exist, the
ownerlessChannelsDetailsarray may be empty or omitted from the JSON. - Ownerless channels were skipped because they have no owners. If these channels are still in use, a tenant admin or Teams service admin can add an owner using Add-TeamUser and Add-TeamChannelUser.