A mailbox move rarely fails with a clear message. Instead you get a status such as Queued or AutoSuspended, a StatusDetail such as StalledDueToTarget_MdbReplication, or an exception name buried in the move report. This quick reference lists 37 of them for moves inside Exchange Server SE and Exchange 2019 and for hybrid moves to and from Exchange Online, with the meaning, the usual cause and the first check: press Ctrl+F, paste what you see and follow the guide link where there is one.
Codes in this quick reference
Queued: the move request is waiting for MRS to pick it upGet-MoveRequest StatusInProgress: MRS is processing the move requestGet-MoveRequest StatusAutoSuspended: initial copy done, request paused before completionGet-MoveRequest StatusSuspended: move request paused by an administratorGet-MoveRequest StatusSynced: initial copy done, waiting for completion (Exchange Online)Get-MoveRequest StatusCompletionInProgress: final sync and switch-over runningGet-MoveRequest StatusCompleted: move finished; remove the request before moving the mailbox againGet-MoveRequest StatusCompletedWithWarning: move finished but something was skipped or not cleaned upGet-MoveRequest Status
+ 29 more codes in the tables below.
How to read these codes#
Every move, whether it starts as New-MoveRequest, a local migration batch or a hybrid remote move batch, is carried out by the Mailbox Replication service (MRS). The same request reports its state in four places:
- Status (
Get-MoveRequest): the overall state, such as Queued, InProgress or Failed. - StatusDetail (
Get-MoveRequestStatistics): what MRS is doing right now, including the stalled states. - FailureType, FailureSide and Message (
Get-MoveRequestStatistics): the exception name, the side that failed (Source or Target) and the error text.-IncludeReportadds the full history. - Batch and user status (
Get-MigrationBatch,Get-MigrationUser): what the EAC migration pages show. The user's ErrorSummary usually repeats the MRS message.
Run the commands where the request lives: local moves in the Exchange Management Shell, hybrid moves in either direction in Exchange Online PowerShell, because Exchange Online's MRS drives them through the MRSProxy endpoint on your servers.
# Every request, sorted by what MRS is doing
Get-MoveRequest -ResultSize Unlimited | Get-MoveRequestStatistics |
Sort-Object StatusDetail | Format-Table DisplayName,Status,StatusDetail,PercentComplete -AutoSize
# One request in detail
$s = Get-MoveRequestStatistics -Identity alex@contoso.com -IncludeReport
$s | Format-List Status,StatusDetail,FailureType,FailureSide,Message,BadItemsEncountered
$s.Report.Failures | Select-Object -Last 3 Timestamp,FailureType,Message
# Hybrid batches (Exchange Online PowerShell)
Get-MigrationUser -BatchId "Wave 1" | Format-Table Identity,Status,ErrorSummary -AutoSizeTip: moves run at a lower priority than client connections and mail flow. Microsoft's hybrid troubleshooter suggests waiting until a move has shown no progress for a long stretch, around eight hours, before you treat a queued or slow move as a fault.
Move request status (Get-MoveRequest)#
| Code | Meaning | Usual cause | First check |
|---|---|---|---|
Queued | Created and waiting for MRS to pick it up | A busy server or tenant; moves yield to client and mail-flow work | Wait; if nothing changes for hours, read StatusDetail and the report |
InProgress | MRS is working on the request | Normal | StatusDetail names the phase; PercentComplete should keep rising |
AutoSuspended | Initial copy done; the request paused itself before completion | Created with -SuspendWhenReadyToComplete | Resume-MoveRequest when you're ready for the switch-over |
Suspended | Paused | An admin ran Suspend-MoveRequest, or the request was created with -Suspend | Resume-MoveRequest |
Synced (Exchange Online) | Initial copy done; incremental syncs keep it current until completion | The batch doesn't complete automatically, or CompleteAfter is still in the future | Complete-MigrationBatch, or check CompleteAfter (read as UTC unless -TimeZone was used) |
CompletionInProgress | Final sync and switch-over running | Normal at the end of a move | Give it time; users restart Outlook once it completes |
Completed | The move finished | Success | Remove-MoveRequest: a mailbox with a request still attached can't be moved again |
CompletedWithWarning | Finished, but something was skipped or not cleaned up | Skipped items or a failed clean-up step | Read the -IncludeReport output before you accept it |
CompletedWithSkippedItems (Exchange Online) | Finished with items left behind | Corrupt, oversized or missing items the service skipped | Get-MigrationUserStatistics -IncludeSkippedItems |
Failed | Stopped by a permanent error | See FailureType and Message (next tables) | Fix the cause, then Resume-MoveRequest, or remove and recreate the request |
StatusDetail: throttled and stalled moves#
A stall isn't a failure. Before MRS writes more data, workload management (WLM) checks the health of the source and target, and Microsoft documents that in Exchange Server 2019 it allows 10 simultaneous moves from the same source or to the same target by default. In a batch of 50 mailboxes going to one database, about 10 show CopyingMessages and the rest stall until a slot frees up.
| Code | Meaning | Usual cause | First check |
|---|---|---|---|
CopyingMessages | Actively copying mailbox content | Normal | Count moves per target database before you suspect a problem |
StalledDueToTarget_MdbReplication | Paused until the target database's DAG copies catch up | The WLM limit, or a passive copy with a growing copy or replay queue | Get-MailboxDatabaseCopyStatus queue lengths; fix replication first. Guide |
StalledDueToTarget_MdbAvailability | Paused by the target database availability check | The WLM limit, or a database that is dismounted or keeps failing over | Get-MailboxDatabase -Status: Mounted and MountedOnServer. Guide |
StalledDueToTarget_DiskLatency | Paused because target disk latency is too high | The WLM limit, slow storage, or a backup running at the same time | Latency on the database and log volumes. Guide |
Relinquishing job because of large delays due to unfavorable server health or budget limitations | A move report line (wording as reported by admins): MRS released the job and picks it up again later | A long WLM stall | The report lines around it for the throttled resource; fix that resource or wait. Guide |
If the stalls are only the concurrency limit, wait, spread the batch over more target databases, or raise the limit with the New-SettingOverride commands in Microsoft's article: start at 25, add 10 at a time while you watch performance, and don't go above 100.
Failure types and MRS exceptions#
These appear in FailureType and Message, or in the migration user's error. Treat every skipped item as lost for good.
| Code | Meaning | Usual cause | First check |
|---|---|---|---|
TooManyBadItemsPermanentException | This mailbox exceeded the maximum number of corrupted items that were specified for this move request. | Corrupt items; a new on-premises request allows zero by default | $s.Report.BadItems, then Set-MoveRequest -BadItemLimit (51 or more also needs -AcceptLargeDataLoss) and resume. Guide |
TooManyLargeItemsPermanentException | This mailbox exceeded the maximum number of large items that were specified for this request. Often paired with MapiExceptionMaxSubmissionExceeded (ec=1242) | Items over Exchange Online's 150 MB message limit | Sort the mailbox by size, export the oversized items, delete them and resume (Microsoft KB) |
SourceMailboxAlreadyBeingMovedPermanentException | Couldn't switch the mailbox into Sync Source mode. | The message lists four: another admin's move, a locked mailbox, missing MRS permissions, or a network drop that leaves the old session open for up to 2 hours (TCP KeepAlive) | Look for another request on the mailbox; wait for the lock to clear, then resume |
UserAlreadyBeingMigratedException | The user 'Name' already has a pending request. The details add Mailbox 'Name' is already being moved to a cloud database | An active or orphaned move request in Exchange Online | Get-MoveRequest in Exchange Online, Remove-MoveRequest, then resume the batch (Microsoft KB) |
MigrationPermanentException: The onboarding move could not be created because user 'Name' is already being moved. | A new onboarding move collides with an earlier one | A leftover move request on-premises, or, when neither side shows one, a move reference left in on-premises AD (msExchMailboxMove* attributes such as msExchMailboxMoveRemoteHostName) | Check both sides; clear an orphaned on-premises reference only as the same KB describes |
MigrationPermanentException: Target user 'User' already has a primary mailbox. | The target object already has a mailbox, so MRS won't create one | Offboarding: homeMDB and homeMTA are populated on the on-premises AD user. Onboarding: admins report it when the cloud user already has its own mailbox, for example from an early licence | Get-ADUser -Properties homeMDB,homeMTA; clear both with Set-ADObject -Clear, then Start-MigrationUser (Microsoft KB) |
You can't use the domain because it's not an accepted domain for your organization. (NotAcceptedDomainException) | A proxy address uses a domain that Exchange Online doesn't accept | Often a .local or other non-routable address on the on-premises mailbox | Compare EmailAddresses with Get-AcceptedDomain in Exchange Online; add and verify the domain, remove the address and sync, or license the user (Microsoft KB) |
MigrationPermanentException: The target mailbox doesn't have an SMTP proxy matching '<tenant>.mail.onmicrosoft.com' | The routing address is missing | EmailAddressPolicyEnabled is False, or the address hasn't synced yet | Add the address, wait for sync, check Get-MailUser in Exchange Online. Guide |
Note: BadItemLimit and LargeItemLimit are deprecated for moves into Exchange Online. The service grades each move with a Data Consistency Score instead (last table).
Migration endpoint and MRSProxy errors#
These stop a hybrid batch before data moves. The first line is generic, so read the error details. MRSProxy and WS-Security must be enabled on every server behind the endpoint name; test with Test-MigrationServerAvailability -ExchangeRemoteMove in Exchange Online PowerShell.
| Code | Meaning | Usual cause | First check |
|---|---|---|---|
The connection to the server 'mail.contoso.com' could not be completed. | Exchange Online's MRS couldn't use the endpoint | A wrapper: the cause follows in the details | Rerun the test and read ErrorDetail. Guide |
The Mailbox Replication Service was unable to connect to the remote server using the credentials provided. | Authentication to MRSProxy failed | Wrong, expired or locked-out endpoint account | Use DOMAIN\user format; update with Set-MigrationEndpoint -Credentials. Guide |
The HTTP request is unauthorized with client authentication scheme 'Negotiate'. | Windows authentication at mrsproxy.svc was refused | Credentials, or a reverse proxy pre-authenticating the path | Publish /EWS/mrsproxy.svc without pre-authentication. Guide |
The remote server returned an error: (401) Unauthorized. | Access denied at mrsproxy.svc | As above, or TLS offload while Extended Protection is on | From outside, a 401 from IIS offering Negotiate and NTLM is good. Guide |
The call to 'https://mail.contoso.com/EWS/mrsproxy.svc' timed out. | No answer in time | Firewall, intrusion-detection flood limits, or the Hybrid Agent in modern hybrid | Allow Microsoft 365 ranges on 443 and exempt them from flood limits. Guide |
Batch, user and data consistency states#
| Code | Meaning | Usual cause | First check |
|---|---|---|---|
Synced with errors / Completed with errors | Some users in the batch failed | Per-user errors from the tables above | Get-MigrationUser -BatchId: read each ErrorSummary, fix, then Start-MigrationUser. Guide |
Completing (stuck) | The batch can't finish | Requests waiting as AutoSuspended, or leftover completed requests | Resume AutoSuspended requests, remove completed ones; Microsoft's troubleshooter then removes the batch |
Queued (migration user) | Waiting for a free migration slot | All of the endpoint's concurrent migrations are busy | Get-MigrationEndpoint | Format-List MaxConcurrentMigrations |
DataConsistencyScore: Investigate | Skipped items need approval before completion | Corrupt, oversized or missing items | Get-MigrationUserStatistics -IncludeSkippedItems, then Set-MigrationUser -ApproveSkippedItems. Guide |
DataConsistencyScore: Poor | Completion is blocked | Significant data loss detected | Can't be approved; open a case with Microsoft Support. Guide |
The operation couldn't be performed because object 'Migration.8f3e7716-2011-43e4-96b1-aba62d229136' couldn't be found | The Migration arbitration mailbox is missing | Deleted, or never created; on-premises batches can't run | Recreate the arbitration mailbox. Guide |
Cannot find a recipient that has mailbox GUID (public folders) | Exchange Online can't see the new public folder mailboxes yet | Directory replication lag | Wait about an hour and retry. Guide |
Request was quarantined because of the following error: The given key was not present in the dictionary. | A public folder migration job was quarantined (wording as reported by admins) | An item the job can't copy | Stop the batch and isolate the folder named in the report. Guide |
550 5.1.1 RESOLVER.ADR.ExRecipNotFound (IMCEAEX) | Replies to older mail bounce after a move | A cached legacy address that no longer resolves | Add it as an X500 proxy address. Guide |
How to verify a fix#
- The request finishes: StatusDetail moves through CopyingMessages to Completed and PercentComplete reaches 100. Read the report of any CompletedWithWarning before you accept it.
- The mailbox is where you expect: for a local move,
Get-Mailboxshows the target database. For onboarding,Get-RemoteMailboxon-premises shows the remote routing address andGet-Mailboxin Exchange Online returns a user mailbox. - The batch is clean: every user Completed, with a Data Consistency Score of Perfect or Good, or skipped items you approved on purpose.
- The endpoint is healthy: after any MRSProxy, certificate or password change,
Test-MigrationServerAvailabilityreturns Success. - Nothing is left behind: completed requests are removed, so the next move of the same mailbox can start.
Get-MoveRequest -ResultSize Unlimited | Get-MoveRequestStatistics |
Format-Table DisplayName,Status,StatusDetail,PercentComplete -AutoSize
Get-MoveRequest -MoveStatus Completed | Remove-MoveRequest -Confirm:$false
# Exchange Online PowerShell
Test-MigrationServerAvailability -ExchangeRemoteMove -RemoteServer mail.contoso.com -Credentials (Get-Credential CONTOSO\svc-migration)References#
- Get-MoveRequest (Microsoft Learn): the Status and MoveStatus values in the first table
- Mailboxes are stalled during a migration (Microsoft Learn): WLM stalls and limits
- Troubleshoot migration issues in Exchange hybrid (Microsoft Learn); the support articles for individual exceptions are linked in the table rows

