Tenant migrations rarely fail loudly. They fail at 3% completion on a Saturday night, with a log full of 429 responses and users who can’t open anything on Monday.
Almost all of it traces to one fact: every permission in Microsoft 365 is bound to an identity object in Entra ID, and those objects don’t move with your data. They’re recreated in the target with new object IDs, so without an explicit source-to-target mapping, the permissions that referenced them can’t be reapplied. Most errors below are that fact surfacing in a different workload.
How to Use This Guide
If you’re seeing… | Go to |
|---|---|
| |
Mailbox.Migration missing, admin consent errors | |
CrossTenantMigrationWithoutLicensePermanentException | |
429, 503, batches crawling | |
“no mapping exists for this user” | |
Users locked out of migrated files | |
Storage limit errors mid-wave | |
Files skipped, “path too long” errors | |
Channels flattened, chats duplicated | |
Plans missing comments or broken attachments | |
Bounced mail at cutover | |
Free/busy blank, cross-tenant availability broken | |
Empty metadata columns, broken flows | |
Users can’t access content post-cutover |
Why Migrations Fail: The Three Root Causes
When migrations stall, the culprit is rarely a single technical glitch. It’s identity misalignment, dependency gaps, or incomplete discovery — recognizable patterns that show up across projects, environments, and tools.
Incomplete inventory. Scoping by storage size alone is one of the most reliable ways to build a plan that falls apart. Migrating a single 50 GB file is nothing like moving 50 GB of emails, attachments, and list items spread across dozens of mailboxes, sites, and channels — same storage number, vastly more API calls, and each workload has its own limits.
Identity misalignment. Users locked out of migrated content, unresolved group memberships, lost guest access, and Conditional Access gaps all trace back to identity objects that weren’t mapped before execution.
Undiscovered dependencies. Broken SharePoint permission inheritance, connected services like Power BI reports and Power Automate flows, and tenant-specific managed metadata term stores. The volume of that work usually isn’t visible until the migration is already running.
Authentication and Credential Errors
Symptom: The migration endpoint won’t create. New-MigrationEndpoint fails with an authentication error, or you see AADSTS codes when the tool tries to connect to either tenant.
Why it happens: Cross-tenant migration runs on a multi-tenant Entra ID app registration that must be consented to in both tenants. The target creates the app and grants admin consent; the source administrator then has to accept it via a consent URL. If the source hasn’t consented, endpoint creation fails — and the error text points at authentication rather than the missing consent, which is why this one burns time.
How to fix it manually:
- In the target tenant, register the app with Accounts in any organizational directory (Multi-tenant) and a redirect URI of https://office.com.
- Copy the Application (client) ID and create a client secret — the secret is visible only at creation, so store it immediately or you’ll be resetting it.
- Grant admin consent in the target, then send the source admin a consent URL in the form https://login.microsoftonline.com/<source>.onmicrosoft.com/adminconsent?client_id=<appid>&redirect_uri=https://office.com.
- Have the source admin accept it, and confirm the app appears under Enterprise applications in the source tenant.
- Only then run New-MigrationEndpoint in the target. If it still fails, re-verify source consent before touching anything else.
- Validate end to end with Test-MigrationServerAvailability -EndPoint “<endpoint>” -TestMailbox “<target SMTP>”.
How Apps4.Pro handles it: Migration Manager authenticates against both tenants during setup and surfaces a consent or credential failure at configuration time — before you’ve scheduled a wave around an endpoint that was never going to work.
API Permission Errors
Symptom: The endpoint authenticates, but mailbox moves fail, or Graph calls return 403 Forbidden on specific workloads.
Why it happens: The app registration has the wrong API permissions. Cross-tenant mailbox migration needs the Office 365 Exchange Online → Application permissions → Mailbox.Migration scope, not delegated Graph permissions. The default User.Read that Entra ID assigns is useless for migration and can be removed. Application permissions also require explicit admin consent — adding the scope without consenting leaves it inactive.
How to fix it manually:
- In the app registration, open API permissions and remove the default User.Read.
- Add a permission, choose APIs my organization uses, search Office 365 Exchange Online, and select Application permissions.
- Expand Mailbox and select Mailbox.Migration.
- Grant admin consent in the target and re-send the consent URL to the source if you added scopes after the original consent.
- For RBAC: setting -MailboxMoveCapability on the organization relationship requires Organization Management-level rights (to modify the organization relationship); running the moves themselves only needs the Move Mailboxes role. Delegate the second without handing out the first.
How Apps4.Pro handles it: Apps4.Pro checks required permissions and RBAC roles during connection setup, so a missing scope surfaces as a clear prerequisite failure instead of a mid-batch 403 on a subset of users.
Licensing Failures
Symptom: Moves fail with CrossTenantMigrationWithoutLicensePermanentException: No license was found for the source recipient … or the target recipient. A Cross-tenant User Data Migration license is required to move a mailbox between tenants.
Why it happens: Cross-tenant migration requires a per-user, one-time-fee Cross Tenant User Data Migration license, assignable on either the source or target object. Microsoft is explicit that migrations fail without it and that no exceptions are made. The same license also covers OneDrive migration.
How to fix it manually:
- Purchase Cross Tenant User Data Migration licenses as an add-on before the first batch — Business Basic/Standard/Premium, F1/F3/E3/E5, Office 365 F3/E1/E3/E5, Exchange Online, SharePoint, OneDrive, and EDU all support it.
- Assign the license to either the source or the target user, wait a short period, then restart the move.
- Confirm every user in both organizations also holds an appropriate Exchange Online subscription.
- Critical sequencing: apply the Exchange licence to a target MailUser only after ExchangeGUID and proxy addresses are stamped. Licensing first provisions a brand-new mailbox in the target and breaks the move.
How Apps4.Pro handles it: Migration Manager’s pre-flight check flags unlicensed users in the batch before it starts, so licensing gaps appear as a list to fix rather than a permanent exception per user.
Throttling and Service Unavailable Errors
Symptom: Batches slow to a crawl. Logs show 429 Too Many Requests or 503 Server Too Busy. Jobs keep reporting success while actual data movement drops as retries pile up.
Why it happens: Your app has exhausted one of Graph’s request budgets. Limits are layered — per-app-per-tenant, per-tenant, per-user, per-resource — so tripping any single one returns 429, and several tools hitting the same tenant can blow the aggregate ceiling even when each is individually within budget.
This almost never appears in a pilot; it surfaces hours into heavy activity. It concentrates in Graph calls during mailbox, Teams and user data transfers, high-volume SharePoint and OneDrive file operations, attempts to reach unprovisioned OneDrive sites, and large Teams message retrieval. 503 is the same story from the service side — capacity refusal rather than a per-app quota — and is handled the same way.
How to fix it manually:
- Read the Retry-After header and honour it exactly. Backing off for the stated delay is the fastest route to recovery, because Graph keeps logging your usage while you’re throttled.
- Build an exponential-backoff fallback for the resources that return 429 with no Retry-After header at all — without it, your retry logic throws on a null value.
- Schedule migrations off-peak, when Microsoft 365 services see lower demand.
- Distribute workloads across multiple machines, service accounts, or batch groups so requests aren’t concentrated.
- Migrate in controlled waves by department or workload so throttling in one wave doesn’t cascade into a project-wide delay.
How Apps4.Pro handles it: When a migration task encounters errors or warnings, Apps4.Pro provides a Retry option to reattempt the affected task after the underlying issue is addressed. This gives administrators a practical way to recover from failed migration tasks without recreating the migration job.
Deeper breakdown: Microsoft 365 API Throttling: Why Migrations Slow Down
User Mapping Failures
Symptom: A user fails immediately with a message along the lines of “no mapping exists for this user on the target tenant.”
Why it happens: Identity objects don’t migrate. Each source user, group, guest, and service principal has to exist as a new object in the target with a new object ID, and the migration engine needs an explicit source-to-target pairing to reattach content and permissions. No pairing, no migration — and a partially built mapping table is worse than none, because it fails selectively and looks like a random error.
How to fix it manually:
- Inventory every in-scope identity object: user accounts, guest accounts, security groups, Microsoft 365 groups, devices, and applications.
- Build an explicit source-to-target mapping and run a gap analysis for objects that don’t exist in the target yet.
- Pre-create users and activate licenses in the target before triggering anything.
- Provision guest accounts deliberately — they’re source-tenant Entra ID objects and any guest access not re-established is simply lost.
- Recreate Conditional Access policies in the target before the move, or users hit authentication failures and lockouts on Day 1.
- Create the missing mapping and restart the migration for the affected users.
How Apps4.Pro handles it: Auto-mapping matches source and target identities up front and reports unmapped objects as a gap list, so you resolve identity before a wave runs rather than reconciling access complaints afterwards.
SharePoint and OneDrive Permission Errors
Symptom: Content arrives intact but users can’t open it. Group memberships resolve incorrectly — some users are excluded from resources they should reach, others gain access they shouldn’t have.
Why it happens: SharePoint permissions and Teams membership depend on Microsoft 365 group and security group objects recreated in the target with new object IDs. Broken permission inheritance makes it worse: permissions that break from parent to child at library, folder, or item level require every individual assignment to be read, mapped, and reapplied. That volume usually isn’t visible until migration is underway.
How to fix it manually:
- Report on unique permissions before migrating so you know how many individual assignments exist, not just how many sites.
- Remediate broken inheritance at the source where possible — fewer unique assignments means less to reapply.
- Map security groups and Microsoft 365 groups explicitly, not just user accounts.
- After the move, audit whether users can actually reach their SharePoint and OneDrive content rather than assuming success from a green batch report.
- Re-establish external sharing settings and guest permissions, which don’t carry across.
How Apps4.Pro handles it: Apps4.Pro Migration Manager supports user and group mapping and can migrate SharePoint and OneDrive permissions, including file- and folder-level permissions when the required mappings are configured correctly. This helps preserve users’ intended access after migration.
SharePoint Storage Quota Errors
Symptom: Migration halts partway with a storage limit error — after you verified content sizes, confirmed admin roles, and set up destination site collections correctly.
Why it happens: Beyond the platform ceilings below, the usual culprit is pre-configured policy on the target site capping available capacity, so incoming content can’t be accommodated. This is why the error feels wrong: your tenant has plenty of free space and the migration still stops.
Limit | Value | Applies to |
|---|---|---|
Max storage per site collection | 25 TB | All SharePoint Online plans |
Cross-tenant move ceiling (per site / OneDrive) | 5 TB or 1 million items | Moves fail above this |
Users per site collection | 2 million | All plans |
Hub sites per organization | 2,000 | Tenant-wide |
How to fix it manually:
- Before planning migration waves, check tenant-level and per-site storage consumption in the SharePoint Admin Center.
- In Active sites, review the target site’s storage limit and increase it when necessary. Configure available-storage notifications or alerts where supported so site owners are warned before capacity becomes a problem.
- If a site exceeds a service-level migration limit imposed by the migration method you’re using, split the workload into smaller migration scopes or destinations. Increasing the site’s storage quota does not override a service-level migration limit.
- If storage is managed using site-level limits, review the target site’s configured storage quota before starting the migration and make sure it can accommodate the incoming content.
How Apps4.Pro handles it: Enable “Migrate site collection storage quota” in advanced settings and Migration Manager measures the source site’s storage during migration, then expands the target to match — no PowerShell, no manual quota edits, no halted wave. This is the setting that resolved the customer case linked below.
Real customer walkthrough: How to Fix SharePoint Storage Quota Error in Migration
Path-Length and Character-Limit Errors
Symptom: Individual files fail while the rest of the site completes. Logs show “path too long,” invalid path, or invalid character errors, and the failures cluster in deeply nested folders or under long target site and user names.
Why it happens: Microsoft enforces a 400-character limit on the combined URL — site URL plus folder path plus file name. Cross-tenant moves recompute every destination URL against the new tenant name, and for OneDrive against a new UPN, so a path that sat comfortably within range in the source can cross 400 characters in the target.
Native cross-tenant SharePoint and OneDrive migration treats this as a hard cap: files over the limit fail individually while sites under it continue to completion. A leading apostrophe in source usernames or URLs, and certain invalid characters in file and folder names, break native moves the same way.
How to fix it manually:
- Report on path lengths at the source before migrating, and surface anything approaching 400 characters combined so it’s fixed before the wave, not discovered in the failure report.
- Shorten target site URLs and destination user/OneDrive names — a shorter target root buys headroom for the deep folder structures that would otherwise overflow.
- Flatten or restructure deeply nested folders at the source where the business allows it.
- Remove leading apostrophes from usernames and URLs, and strip invalid characters ( ” * : < > ? | ) from file and folder names before the move.
- Re-run only the failed items after remediation rather than re-migrating the whole site.
How Apps4.Pro handles it: Apps4.Pro Migration Manager provides detailed migration reports that identify failed items, including files that cannot be migrated because of path or naming restrictions. After the underlying issue is corrected, administrators can retry the affected migration tasks instead of restarting the entire migration.
Teams Migration Failures
Symptom: Channel structure arrives flattened, 1:1 chats appear as new group threads with two members, duplicate threads show up in both tenants, and migrated Teams meeting links no longer work.
Why it happens: This is a platform limitation, not a tool defect. There is no native Microsoft software designed to move Teams conversations — content can be transferred but the original channel structure isn’t preserved. Native cross-tenant user data migration is scoped to user chats and meetings only; Teams and channels, including shared data, stay in the source.
For 1:1 chats where both users migrate, a temporary chat is created after the first user moves and a final one after the second — and the temporary thread isn’t deleted. Teams meetings do migrate, but the meeting URL isn’t updated, so it’s invalid in the target. Teams’ chat folder content in the mailbox doesn’t migrate at all.
How to fix it manually:
- Set expectations in writing before the project starts — treat 1:1 chat history as non-portable and plan accordingly.
- Remove and recreate Teams meetings in the target, since migrated URLs are dead.
- For chat history that must be retained, export via Purview content search from the source rather than attempting a chat migration. Source tenant admins can still search and export the Teams chat folder after a mailbox moves.
- Map Teams and Microsoft 365 Groups as a web of dependencies — SharePoint sites, group mailboxes, and chat histories — not as folders.
- Recreate third-party Teams apps, embedded Power BI reports, and custom Power Automate flows; all have tenant-specific dependencies that break.
- Keep the source tenant read-only for a defined period so users can reference old conversations.
- After cutover, test Teams and group memberships, shared channels, and connected functionality explicitly.
How Apps4.Pro handles it: Migration Manager moves teams, channels, files, and membership under one workflow with mapped identities, and reports what transferred versus what needs recreating. What no tool can do is preserve 1:1 chat threads as native 1:1 chats in the target — anyone claiming otherwise is overselling a Microsoft limitation.
Planner Migration Issues
Symptom: Plans arrive missing comments, attachments point back at source SharePoint URLs, task assignments are unassigned, and re-running a migration duplicates plans rather than merging them.
Why it happens: Planner has no native cross-tenant migration path and is excluded from FastTrack cross-tenant services. The data is scattered across services: tasks, plans and buckets in the Planner API, attachments in SharePoint Online, and comments stored as conversations in the associated Microsoft 365 Group mailbox in Exchange Online.
No single export-import command preserves those relationships. Graph was designed for app interaction, not migration — there’s no batch endpoint, so you fetch and rebuild each plan and task individually, and Planner endpoints throttle aggressively — a practical ceiling of around 120 requests per minute, though Microsoft doesn’t publish a specific Planner limit.
How to fix it manually:
- Enumerate plans, then export buckets, tasks, and task details through Graph, then rebuild in the target with new IDs and destination user accounts.
- Add retry and backoff logic before you start — Planner endpoints return 429 quickly under load and scripts without backoff simply stop.
- Handle comments separately; they live in the group mailbox and have limited Graph coverage, so they’re commonly lost or flattened.
- Rewrite attachment links to target SharePoint locations, or they arrive orphaned.
- Map users before rebuilding, or task assignments fail silently.
- Never re-run a script against a plan already migrated — tasks don’t merge, and plan display names can exist in unlimited duplicate instances.
How Apps4.Pro handles it: Apps4.Pro Migration Manager supports cross-tenant migration of Planner plans, buckets, tasks, assignments, attachments, and comments. Attachments can be migrated to the SharePoint location associated with the target plan, while Planner comments can be migrated with their original posted username and timestamp, subject to Microsoft API limitations.
Full explanation: Why Microsoft Planner Has No Native Migration Tool
Domain, DNS and Cutover Issues
Symptom: Mail bounces during the cutover window. The domain won’t release from the source tenant. Outlook won’t connect for migrated users on Day 1 even though their mailbox moved successfully.
Why it happens: Only one tenant can own a domain, and source and target domains must be unique — there’s no overlap period and no native queue bridging the gap. Domain removal requires clearing the domain from every source object: users, shared mailboxes, distribution groups, mail-enabled security groups, contacts, and proxy addresses. One missed dependency blocks the transfer. Outlook connectivity can be a separate Day 1 issue: after a cross-tenant mailbox move, users may need their Outlook profile refreshed or recreated if the profile, UPN, SMTP/proxy addresses, or Autodiscover configuration no longer matches the target mailbox.
How to fix it manually:
- Lower DNS TTL to around 300 seconds 24–48 hours before cutover, and schedule the switch off-hours.
- Use a mail routing service to queue messages through the window if loss is unacceptable.
- Audit and clear the domain from every source object type before attempting release.
- Have users rebuild their Outlook profile with the new UPN and primary SMTP address, then resync OST content.
- Batch users with network capacity in mind — simultaneous OST and OAB downloads across a large wave will saturate your link.
- Keep the source MailUser with a correct targetAddress so inbound mail forwards to the target during coexistence.
- In hybrid targets, enable on-premises remote mailboxes with Enable-RemoteMailbox -Identity <user> -RemoteRoutingAddress <user@target.mail.onmicrosoft.com> where users need them.
How Apps4.Pro handles it: Sequencing is the key here. Apps4.Pro Migration Manager provides a structured migration sequence that helps handle workload dependencies in the right order and complete migration activities before the final cutover. This lets the DNS change be treated primarily as a routing/cutover step rather than combining it with unfinished data migration.
Coexistence and Free/Busy Errors
Symptom: During the coexistence window — after some users have moved but before full cutover — migrated and not-yet-migrated users can’t see each other’s calendar availability. Free/busy lookups return hash marks or “no information,” and scheduling across the two tenants breaks.
Why it happens: Free/busy and calendar availability don’t cross a tenant boundary on their own. Each tenant is a separate Exchange Online organization, and availability sharing between them requires an explicit organization relationship — plus the matching sharing policy and availability address space — configured on both sides. Cross-tenant mailbox and calendar permissions aren’t supported natively, so the moment a batch splits a collaborating group across two tenants, the migrated and unmigrated halves lose visibility of each other until that relationship is in place. Because it only appears once users are split, it surfaces mid-project during coexistence rather than at the final cutover.
How to fix it manually:
- Configure an organization relationship between the source and target tenants before the first mixed wave, so both halves of a split population can resolve each other’s free/busy.
- Set the matching sharing policy and availability address space so availability lookups route to the correct target mailboxes.
- Sequence waves to keep tightly-collaborating groups — teams that share calendars and delegate access heavily — inside the same batch, minimizing the window where a principal and delegate sit on opposite tenants.
- Set expectations that some coexistence gaps (delegate access, shared calendars, mailbox permissions) can’t be fully bridged cross-tenant, and are best handled by keeping the split window short.
- Validate free/busy in both directions — source-to-target and target-to-source — before cutover rather than assuming it works.
How Apps4.Pro handles it: Sequencing is the lever. Apps4.Pro Migration Manager’s structured migration sequence helps keep interdependent users together and complete workloads in dependency order, shrinking the coexistence window in which free/busy and delegation gaps are visible.
Deeper breakdown: Managing Cross-Tenant Free/Busy and Coexistence
Missing Data After Migration
Symptom: The batch reported success, but metadata columns are empty, Power Automate flows are dead, embedded reports don’t load, sensitivity labels are gone, and Outbox items never arrived.
Why it happens: Several categories of content are tenant-specific and either can’t move or aren’t in scope. Managed metadata term stores are tenant-bound, so content that relied on them arrives with empty or unmapped fields. Connected services — third-party Teams apps, embedded Power BI, custom flows — hold tenant-specific dependencies that break. Cross-tenant mailbox migration moves only user-visible content: email, contacts, calendar, tasks, notes, and Recoverable Items. Outbox items are client-side and never sync to the cloud. Sensitivity labels aren’t exported and can’t be shared between tenants. Most migration tools don’t carry compliance state at all.
How to fix it manually:
- Recreate managed metadata term stores in the target and remap columns before migrating dependent content.
- Inventory connected services during discovery and rebuild them in the target — flows, apps, and report connections.
- Recreate sensitivity labels in the destination; there’s no export path.
- Review and rebuild compliance configuration after the move: permissions, policies, labels, and eDiscovery holds. Skipping this risks exposing sensitive data or regulatory penalties.
- Tell users to send or clear their Outbox before cutover.
- If Microsoft Purview Customer Key is used, review the Customer Key requirements and encryption configuration in the target tenant before migration.
- Reconcile item counts by workload rather than trusting an aggregate success figure.
How Apps4.Pro handles it: Reporting at workload level with per-item success and failure detail means you reconcile what actually landed instead of inferring completeness from a green summary — and you catch gaps while the source is still live.
Post-Migration Access Issues
Symptom: Migration is done, but users report they can’t reach content, aren’t in the right teams, lost delegate access to a manager’s mailbox, or external partners can no longer open shared files.
Why it happens: Identity mapping that wasn’t fully resolved during execution surfaces here as access failure. Delegation is a specific trap: mailbox permissions move only when both principal and delegate migrate together, and Send-on-Behalf-Of is stored in the directory and doesn’t transition at all. Cross-tenant mailbox and calendar permissions aren’t supported, so split batches permanently break delegation pairs.
How to fix it manually:
- Audit access and ownership across SharePoint and OneDrive rather than waiting for tickets.
- Restamp Send-on-Behalf-Of with Set-Mailbox <principal> -GrantSendOnBehalfTo <delegate> after MailUser-to-Mailbox conversion completes.
- Verify Teams and Microsoft 365 group memberships, shared channels, mailboxes, and external sharing all function.
- Re-provision guest accounts and reconfirm external sharing settings.
- Confirm Conditional Access policies exist and behave as expected in the target.
- Remove migration endpoints and organization relationships with Remove-MigrationEndpoint and Remove-OrganizationRelationship once you’re finished — but only after collecting item-level reports.
- Don’t decommission the source until everything is validated in the target. Premature decommissioning turns an incomplete transfer into permanent data loss.
How Apps4.Pro handles it: Because mapping is validated before execution rather than inferred during it, most post-migration access work disappears — and the reporting gives you the audit trail to prove content and permissions landed before you retire the source tenant.
Conclusion
Tenant migration errors are usually caused by identity mismatches, missing dependencies, or incomplete discovery. The key is to identify these issues before they become migration failures.
With Apps4.Pro Migration Manager, you can validate prerequisites, map identities, migrate permissions, monitor per-item results, and retry failed tasks. This helps ensure a smoother migration with fewer surprises and gives you confidence that users can access their data after cutover.









