Migration required: Microsoft is retiring the Azure-backed Whiteboard service

Microsoft is ending the transition from Azure-backed Whiteboards to OneDrive-backed Whiteboards. Enterprise users must migrate any remaining legacy Whiteboards before the Whiteboard migration tool is retired. Users with personal Microsoft accounts must export any content they want to keep before permanent deletion.

This retirement affects…

  • Users from organizations with non-migrated Whiteboards (created before January 2022).
  • Users with personal Microsoft accounts who use Microsoft Whiteboard. The new OneDrive-backed Whiteboard is not available to personal accounts.
  • Users who use the standalone Whiteboard app on Windows and Mobile.

Whiteboards already migrated to OneDrive-backed storage are not affected by this retirement and deletion process.


Timeline

  • The Whiteboard migration tool will be retired on 22 August 2026.
  • All non-migrated Whiteboards will be permanently deleted on 5 September 2026 with no recovery option.
  • The standalone Whiteboard apps (Windows and Mobile) will be deprecated on 14 September 2026. Enterprise users should access Whiteboard through the web or the Whiteboard Teams app instead.


How does this affect your users?

Since January 2022, all new Whiteboards are stored in OneDrive. Previously created Whiteboards were stored in Azure. Microsoft has been informing organizations since 2022 to migrate their Whiteboards. You should read the page about Whiteboard migration (the information about PowerShell is outdated).

The migration process is simple:
The user has to open Microsoft Whiteboard at whiteboard.cloud.microsoft, via the Whiteboard Teams app, or the Windows desktop app. If the user is not migrated, the migration starts and takes a few minutes.

Migration starts automatically
Migration starts automatically

Users should wait until the migration is completed. There is a migration status bar.

Wait until the migration is completed
Wait until the migration is completed

That’s it. Whiteboard will redirect the user to the OneDrive folder when the migration is finished. Migrated Azure-backed Whiteboards are in the new folder “Migration”.

Whiteboard migration has been completed
Whiteboard migration has been completed

The catch?
Users MUST actively open Whiteboard to start the migration. If a user has never opened one of the supported Whiteboard apps since January 2022, the migration tool has no start trigger, and the legacy Whiteboards remain in Azure. These Whiteboards will be deleted on 5 September 2026.

Important:
The migration tool for legacy enterprise Whiteboards will be retired on 22 August 2026. Any remaining legacy Whiteboards can no longer be migrated after that date. On the same date, users with personal Microsoft accounts lose the ability to create or edit Whiteboards.


How to find non-migrated Azure-backed Whiteboards?

Microsoft does not directly provide a migration tool for admins, but Microsoft has a Whiteboard PowerShell module that SharePoint administrators can use to report missing users.

In general, you should check whether Whiteboards are still stored in Azure. The Whiteboard migration tool deletes migrated Whiteboards from Azure once the migration to OneDrive is complete. If you don’t find Whiteboards in Azure, all users are migrated, and your task is done.

  • Your account needs the SharePoint Administrator role for the first step.
  • For step two, I am using an Azure app with Microsoft Graph – User.Read.All (application permissions) to report the user details.
  • I recommend running the samples in a local migration folder. The cmdlets will download data and store it in this directory.


Step 1 – Export all Azure-backed Whiteboards

Export all Whiteboards stored in Azure with Get-WhiteboardsForTenant. This gives you a list of Azure-backed Whiteboards and who created them (the owner). The owner has to start the migration process. Depending on the number of Azure-backed Whiteboards, this export can take a few minutes. If this process takes a long time, you already know that you still have a lot of Azure-backed Whiteboards.

Note 1:
You can select Europe, Australia, or Worldwide as the geographical region. You should run this for each region (my sample does it). Until 2020, Microsoft stored new Whiteboards in the US, even for organizations with tenants in the EU region. Therefore, you should check whether you have legacy Whiteboards stored in the US.

PowerShell
# Prepare the environment for the Whiteboard migration report
$TenantId = "<Your Tenant ID>" 
$ClientId = "<Your Client ID>" 
$CertThumbprint = "<Your Certificate Thumbprint>" 
$LocalFolderPath = "C:\Temp\WhiteboardMigration" # Change this to your preferred local folder path for storing whiteboard migration data.

$NonMigratedWhiteboardsFilePath_EU = "$LocalFolderPath\Whiteboards-NonMigrated-EU.txt"
$NonMigratedRunName_EU = [IO.Path]::GetFileNameWithoutExtension($NonMigratedWhiteboardsFilePath_EU) -replace '^Whiteboards-'

$NonMigratedWhiteboardsFilePath_WW = "$LocalFolderPath\Whiteboards-NonMigrated-WW.txt"
$NonMigratedRunName_WW = [IO.Path]::GetFileNameWithoutExtension($NonMigratedWhiteboardsFilePath_WW) -replace '^Whiteboards-'

$NonMigratedWhiteboardsFilePath_AU = "$LocalFolderPath\Whiteboards-NonMigrated-AU.txt"
$NonMigratedRunName_AU = [IO.Path]::GetFileNameWithoutExtension($NonMigratedWhiteboardsFilePath_AU) -replace '^Whiteboards-'


# Get the list of non-migrated whiteboards for all geographies. Force an authentication prompt for the first request.
# The account needs at least the SharePoint Administrator role to access the whiteboard data.
if (-not (Test-Path -Path $LocalFolderPath)) {
    New-Item -Path $LocalFolderPath -ItemType Directory | Out-Null
}
Set-Location -Path $LocalFolderPath
Get-WhiteboardsForTenant -Geography Europe -IncrementalRunName $NonMigratedRunName_EU -ForceAuthPrompt
Get-WhiteboardsForTenant -Geography Worldwide -IncrementalRunName $NonMigratedRunName_WW 
Get-WhiteboardsForTenant -Geography Australia -IncrementalRunName $NonMigratedRunName_AU 


# Combine the non-migrated whiteboard data from all geographies into a single collection for further processing.
$FileContentNonMigrated_All = Get-Content -Path $NonMigratedWhiteboardsFilePath_EU, $NonMigratedWhiteboardsFilePath_WW, $NonMigratedWhiteboardsFilePath_AU | ForEach-Object {
    $_ | ConvertFrom-Json
}

if (@($FileContentNonMigrated_All).Count -eq 0) {
    Write-Host "No non-migrated Whiteboards found." -foregroundcolor Green
} 


Note 2:
If the results are empty: Congratulations, you have no legacy Whiteboards in your tenant. The work is done for you. 🎉

Azure returns a result like this for each non-migrated Whiteboard.
Some values are redacted for privacy reasons.

Plaintext
baseApi                  : eu.whiteboard.microsoft.com
id                       : 50eed9f1-eb2a-4cb2-9e60-f3cdea5e720a
userId                   : 00000000-0000-0000-0000-000000000000
folioId                  : 9e1f6272-9473-4842-a8ad-3cfeee24a829
title                    : Demo Whiteboard
createdBy                : 00000000-0000-0000-0000-000000000000
ownerId                  : 00000000-0000-0000-0000-000000000000
ownerTenantId            : 00000000-0000-0000-0000-000000000000
previousOwnerId          : 
isShared                 : True
createdTime              : 14.03.2021 15:29:16
invitedTime              : 
personalLastModifiedTime : 03.12.2025 20:49:42
lastModifiedTime         : 03.12.2025 20:49:42
globalLastViewedTime     : 03.12.2025 20:39:29
lastViewedTime           : 03.12.2025 20:39:29
meetingId                : 
eTag                     : W/"datetime'2025-12-03T20%3A49%3A42.8567239Z'"
fluidFileId              : 
fluidShareLink           : 
fluidMigrationTime       : 
fluidEncryptionVersion   : 
fluidVersion             : 
fluidClientVersion       : 
fluidRecoveryTime        : 


Step 2 – Report non-migrated user accounts

You can now report which users have non-migrated Whiteboards in Azure. These Whiteboards will be deleted on 5 September 2026.
In my report, I combined the Azure export with the user information provided via the ownerId property using an app registration with Microsoft Graph – User.Read.All (application permissions).

My report returns the following information:

  • Whiteboard ID
  • Whiteboard title > in some cases, this title is empty. I do not miss these Whiteboards, and they are also not on the web. It seems Azure sometimes created empty Whiteboards or never deleted such a file, but I don’t know why they have no title.
  • When the Whiteboard was created
  • Whether the Whiteboard was shared with someone
  • When the Whiteboard was last viewed by someone in the organization
  • The Whiteboard region, provided by the API endpoint.
  • Who is the owner > it is the object ID of the Entra ID account
  • The owner state > whether the owner is available in Entra ID, not available, or the Whiteboard has no owner.
    If a Whiteboard has no owner, you can transfer it to a new owner with Set-WhiteboardOwner (for a single Whiteboard), or with Invoke-TransferAllWhiteboards (for all Whiteboards).

The result is an export like this. It should help to find non-migrated users.
And don’t forget, the owner must start the migration before 22 August 2026. Microsoft does not yet provide a cmdlet to start the migration as an admin.

Export sample
Export sample

You can find the Whiteboard sample in my GitHub Repo, if you want to extend or update it.

PowerShell
# Connect to Microsoft Graph using the provided client ID, certificate thumbprint, and tenant ID for authentication.
Connect-MgGraph -ClientId $ClientId -CertificateThumbprint $CertThumbprint -TenantId $TenantId -NoWelcome

# Resolve owner IDs to a readable identity via Microsoft Graph, caching lookups since many boards share the same owner.
# Also flags owners who no longer exist in Entra (orphaned whiteboards) and whether their account is enabled.

$OwnerAccountInfo = @{}
function Resolve-WhiteboardOwner {
    param([string]$OwnerId)

    # If the owner ID is null or empty, return a custom object indicating that the whiteboard is orphaned.
    if (-not $OwnerId) {
        return [PSCustomObject]@{
            DisplayName       = $null
            UserPrincipalName = $null
            AccountEnabled    = $null
            Status            = "No owner (orphaned Whiteboard)"
        }
    }
    if (-not $OwnerAccountInfo.ContainsKey($OwnerId)) {
        try {
            # Attempt to retrieve the user information from Microsoft Graph using the provided owner ID.
            $user = Invoke-MgGraphRequest -Method GET -Uri "https://graph.microsoft.com/v1.0/users/$OwnerId`?`$select=displayName,userPrincipalName,accountEnabled" -ErrorAction Stop
            $OwnerAccountInfo[$OwnerId] = [PSCustomObject]@{
                DisplayName       = $user.displayName
                UserPrincipalName = $user.userPrincipalName
                AccountEnabled    = $user.accountEnabled
                Status            = "Found in Entra ID"
            }
        } catch {
            # If the user is not found, cache the result as "Not found in Entra ID" with null values for display name and UPN.
            $OwnerAccountInfo[$OwnerId] = [PSCustomObject]@{
                DisplayName       = $null
                UserPrincipalName = $null
                AccountEnabled    = $null
                Status            = "Not found in Entra ID"
            }
        }
    }
    return $OwnerAccountInfo[$OwnerId]
}

# Report the whiteboards from Azure, with the owner resolved to a readable identity
$Count = 1
$AzureWhiteboardResults = foreach ($Board in $FileContentNonMigrated_All) {
    
    $boardTitle = if ([string]::IsNullOrWhiteSpace($Board.title)) { "No title" } else { $Board.title }
    Write-host ("Board $Count of $($FileContentNonMigrated_All.Count) - $($Board.id) ($boardTitle)")    
    $owner = Resolve-WhiteboardOwner -OwnerId $Board.ownerId

    [PSCustomObject]@{
        WhiteboardId         = $Board.id
        Title                = $Board.title
        Created              = $Board.createdTime        
        isShared             = $Board.isShared
        GlobalLastViewedTime = $Board.globalLastViewedTime
        APIEndpoint          = $Board.baseApi
        OwnerId              = $Board.ownerId
        OwnerUPN             = $owner.UserPrincipalName
        OwnerDisplayName     = $owner.DisplayName       
        OwnerAccountEnabled  = $owner.AccountEnabled
        OwnerStatus          = $owner.Status
    }
    $Count++
}

# Export the whiteboard results to a CSV file
$Date = Get-Date -Format "dd-MM-yyyy"
$ExportPath = "$LocalFolderPath\WhiteboardMigrationStatus-$Date.csv"
$AzureWhiteboardResults | Sort-Object Created | Export-Csv -Path $ExportPath -NoTypeInformation -Force
Write-Host "ExportPath: $ExportPath"

Avatar photo

Tobias Asböck

Tobias is a Senior System Engineer with more than 10 years of professional experience with Microsoft 365 products such as SharePoint Online, SharePoint Premium, OneDrive for Business, Teams Collaboration, Entra ID, Information Protection, Universal Print, and Microsoft 365 Licensing. He also has 15+ years of experience planning, administering, and operating SharePoint Server environments. Tobias is a PowerShell Scripter with certifications for Microsoft 365 products. In his spare time, Tobias is busy with updates in the Microsoft 365 world or on the road with his road bike and other sports activities. If you have additional questions, please contact me via LinkedIn or [email protected].

Leave a Comment