Cutover Migration: Exchange to Exchange Online¶
Status: Authored 2026-04-30 Audience: Exchange administrators migrating organizations with fewer than 2,000 mailboxes using the cutover migration method. Scope: Complete cutover migration from Exchange 2007+ to Exchange Online --- planning, execution, DNS changes, and post-migration validation.
Overview¶
Cutover migration moves all mailboxes from on-premises Exchange to Exchange Online in a single operation. There is no coexistence period --- all mailboxes move at once, and DNS records (MX, Autodiscover) are updated to point to Exchange Online after the migration completes.
When to use cutover migration¶
- Organization has fewer than 2,000 mailboxes (Microsoft's stated limit; practically, fewer than 500 is ideal).
- Exchange 2007, 2010, 2013, 2016, or 2019.
- No need for prolonged coexistence between on-prem and cloud.
- Small enough to migrate over a weekend or maintenance window.
- No complex public folder hierarchy (or public folders will be migrated separately).
When NOT to use cutover migration¶
- More than 2,000 mailboxes (use hybrid migration).
- Need for gradual migration over weeks or months.
- Complex coexistence requirements (shared calendars, delegate access during migration).
- Exchange 2003 (use staged migration).
Prerequisites¶
- Microsoft 365 tenant provisioned with Exchange Online licenses.
- DNS records documented (MX, Autodiscover, SPF, DKIM, DMARC).
- Exchange on-premises accessible from the internet (Outlook Anywhere / EWS endpoint).
- Admin credentials with Organization Management role on-premises.
- Microsoft 365 Global Administrator or Exchange Administrator credentials.
- All users have M365 licenses assigned.
- Outlook Anywhere (RPC over HTTP) enabled on Exchange 2007/2010, or EWS available on Exchange 2013+.
- Maintenance window scheduled (plan for 1--3 days depending on mailbox count and sizes).
Planning¶
Mailbox inventory¶
# On-premises Exchange Management Shell
# Get mailbox count and sizes
Get-Mailbox -ResultSize Unlimited | Get-MailboxStatistics |
Select-Object DisplayName, TotalItemSize, ItemCount |
Sort-Object TotalItemSize -Descending |
Export-Csv C:\Migration\mailbox-inventory.csv -NoTypeInformation
# Get total size
$stats = Get-Mailbox -ResultSize Unlimited | Get-MailboxStatistics
$totalGB = ($stats | ForEach-Object {
[math]::Round(($_.TotalItemSize.ToString().Split("(")[1].Split(" ")[0] -replace ",","") / 1GB, 2)
} | Measure-Object -Sum).Sum
Write-Host "Total mailbox data: $totalGB GB"
# Identify large mailboxes (>10 GB) that will take longer
Get-Mailbox -ResultSize Unlimited | Get-MailboxStatistics |
Where-Object {$_.TotalItemSize -gt 10GB} |
Select-Object DisplayName, TotalItemSize
Estimate migration time¶
| Mailbox data | Estimated time (50 Mbps connection) | Notes |
|---|---|---|
| 1 GB | ~5 minutes | Average mailbox |
| 5 GB | ~25 minutes | Power user |
| 10 GB | ~50 minutes | Heavy user |
| 25 GB | ~2 hours | Executive / long-tenure |
| 50 GB | ~4 hours | Archive-heavy |
Concurrent migrations: Default is 20 concurrent mailbox moves. With 100 mailboxes averaging 2 GB each, expect 3--5 hours for the initial sync.
Communication plan¶
Notify users at least one week in advance:
- Pre-migration notice (T-7 days): Email explaining the migration, expected timeline, and what users should expect.
- Reminder (T-1 day): Confirm maintenance window; ask users to close Outlook and log out of OWA.
- Migration start (T-0): Notify that migration is in progress; users may experience intermittent access.
- Migration complete: Instructions for re-opening Outlook (will auto-reconfigure), testing mobile devices, and reporting issues.
Execution¶
Step 1: Create the migration endpoint¶
# Connect to Exchange Online PowerShell
Connect-ExchangeOnline -UserPrincipalName admin@domain.com
# Create migration endpoint (Exchange 2013+, uses EWS)
New-MigrationEndpoint -ExchangeOutlookAnywhere `
-Name "CutoverEndpoint" `
-ExchangeServer mail.domain.com `
-Credentials (Get-Credential) `
-EmailAddress admin@domain.com
# For Exchange 2013+, use EWS endpoint:
New-MigrationEndpoint -ExchangeRemoteMove `
-Name "CutoverEndpoint" `
-RemoteServer mail.domain.com `
-Credentials (Get-Credential)
Step 2: Create the cutover migration batch¶
# Create cutover migration batch
New-MigrationBatch -Name "CutoverBatch" `
-SourceEndpoint "CutoverEndpoint" `
-TargetDeliveryDomain "domain.mail.onmicrosoft.com" `
-AutoStart
# Monitor initial sync
Get-MigrationBatch "CutoverBatch" | Format-List Status, TotalCount, SyncedCount, FailedCount
Get-MigrationUser | Format-Table Identity, Status, StatusDetail
Step 3: Monitor progress¶
# Check overall batch status
Get-MigrationBatch "CutoverBatch" |
Select-Object Status, TotalCount, SyncedCount, FinalizedCount, FailedCount
# Check individual mailbox status
Get-MigrationUser -BatchId "CutoverBatch" |
Select-Object Identity, Status, ErrorSummary |
Format-Table -AutoSize
# Get detailed statistics for a specific user
Get-MigrationUserStatistics -Identity "user@domain.com" |
Select-Object Identity, Status, EstimatedTotalTransferSize, BytesTransferred
# Check for failures
Get-MigrationUser -BatchId "CutoverBatch" -Status Failed |
Format-Table Identity, ErrorSummary
Step 4: Complete the migration batch¶
# After all mailboxes are synced, complete the batch
# This performs the final delta sync and switches mailboxes to EXO
Complete-MigrationBatch -Identity "CutoverBatch"
# Monitor completion
Get-MigrationBatch "CutoverBatch" | Format-List Status, TotalCount, FinalizedCount
Completing the batch is irreversible
Once Complete-MigrationBatch finishes, mailboxes are in Exchange Online. Users must connect to Exchange Online. Plan the completion for a maintenance window when you can also update DNS records.
Step 5: Update DNS records¶
After the migration batch completes, update DNS records to point to Exchange Online:
# MX record (route mail to Exchange Online Protection)
@ MX 0 domain-com.mail.protection.outlook.com
# Autodiscover (CNAME to Exchange Online)
autodiscover CNAME autodiscover.outlook.com
# SPF (authorize Exchange Online to send on behalf of your domain)
@ TXT "v=spf1 include:spf.protection.outlook.com -all"
# DKIM (configure in Exchange admin center, then add DNS records)
selector1._domainkey CNAME selector1-domain-com._domainkey.domain.onmicrosoft.com
selector2._domainkey CNAME selector2-domain-com._domainkey.domain.onmicrosoft.com
# DMARC
_dmarc TXT "v=DMARC1; p=quarantine; rua=mailto:dmarc@domain.com; pct=100"
Step 6: Post-migration validation¶
# Verify mailboxes are in Exchange Online
Get-Mailbox -ResultSize Unlimited | Format-Table DisplayName, PrimarySmtpAddress, RecipientTypeDetails
# Verify mail flow (send test email from external)
# Check message trace
Get-MessageTrace -SenderAddress external@example.com -RecipientAddress user@domain.com -StartDate (Get-Date).AddHours(-1) -EndDate (Get-Date)
# Verify Autodiscover
# Run Outlook autoconfiguration test (Ctrl+Right-click Outlook icon > Test E-mail AutoConfiguration)
# Verify mobile device connectivity
Get-MobileDeviceStatistics -Mailbox user@domain.com | Format-Table DeviceType, DeviceOS, LastSuccessSync
Post-migration tasks¶
Outlook client reconfiguration¶
Outlook 2016+ automatically reconfigures via Autodiscover when it detects the mailbox has moved. Users may see:
- A brief "Outlook is reconfiguring" notification.
- A prompt to restart Outlook.
- Cached mode re-synchronization (download of email from Exchange Online).
For Outlook 2013 and earlier, manual profile recreation may be required.
Shared mailbox verification¶
# Verify shared mailboxes migrated
Get-Mailbox -RecipientTypeDetails SharedMailbox |
Format-Table DisplayName, PrimarySmtpAddress
# Verify permissions on shared mailboxes
Get-MailboxPermission -Identity "shared@domain.com" |
Where-Object {$_.User -ne "NT AUTHORITY\SELF"} |
Format-Table User, AccessRights
Distribution group verification¶
# Verify distribution groups
Get-DistributionGroup -ResultSize Unlimited |
Format-Table DisplayName, PrimarySmtpAddress, GroupType
# Verify dynamic distribution groups
Get-DynamicDistributionGroup -ResultSize Unlimited |
Format-Table DisplayName, RecipientFilter
Decommission on-premises Exchange¶
After DNS cutover and validation period (2--4 weeks):
- Remove Exchange Server from the domain.
- Clean up Exchange DNS records (internal only).
- Remove the migration batch:
Remove-MigrationBatch "CutoverBatch". - Remove the migration endpoint:
Remove-MigrationEndpoint "CutoverEndpoint".
Keep Entra Connect
If your organization uses Entra Connect for directory synchronization beyond Exchange, keep it running. Entra Connect manages identity sync independent of Exchange.
Troubleshooting¶
| Issue | Cause | Resolution |
|---|---|---|
| Migration batch fails to start | Endpoint connectivity issue | Verify Outlook Anywhere / EWS is accessible from the internet |
| Individual mailbox fails | Corrupted items, oversized items | Increase BadItemLimit: Set-MigrationUser -BadItemLimit 50 |
| Slow migration speed | Network bandwidth, server load | Schedule during off-hours; increase concurrent migrations |
| Outlook prompts for credentials after migration | Autodiscover not updated | Update Autodiscover CNAME; clear Outlook credential cache |
| Mobile devices stop syncing | ActiveSync profile pointing to on-prem | Remove and re-add Exchange account on mobile device |
| Mail flow stops after DNS cutover | MX record TTL not propagated | Reduce MX TTL to 300 before migration; wait for propagation |
Maintainers: csa-inabox core team Last updated: 2026-04-30