SharePoint Online migration: complete reference
Last updated · By Sean Regan
1. Migration scenarios
| Source | Target | Canonical path |
|---|---|---|
| SharePoint 2013 / 2016 / 2019 | SharePoint Online | SPMT or Migration API[1] |
| File share (SMB) | SharePoint Online / OneDrive | SPMT or Mover |
| SharePoint Online tenant A | SharePoint Online tenant B | Migration API via third-party / custom tool[3] |
| Box / Dropbox / Google Drive | SharePoint Online / OneDrive | Mover (deprecated) or third-party |
Microsoft's free SharePoint Migration Tool (SPMT) supports on-premises and file-share sources but does not support tenant-to-tenant migration[1]. Cross-tenant scenarios require either Microsoft's preview Cross-Tenant SharePoint Migration service or a third-party / open-source tool that calls the Migration API directly.
2. The SharePoint Migration API
The Migration API is the only Microsoft-supported path that preserves full fidelity at production throughput. The flow is asynchronous[3]:
- The client builds a migration package: the source files plus two XML manifests (
ExportSettings.xmlandManifest.xml) describing items, versions, authors, timestamps, and permissions. - The package is uploaded to an Azure Blob Storage container the tenant provisions via
ProvisionMigrationContainers. - The client calls
CreateMigrationJob, which queues a server-side import job and returns a job ID. - SharePoint Online imports the package server-side, writing to the Azure Queue with progress and error events. The client polls the queue, not the API, which is what lets the Migration API sustain throughput where direct uploads would be throttled.
3. Fidelity: what is and is not preserved
| Attribute | Migration API | Graph / drag-and-drop |
|---|---|---|
| File content | Yes | Yes |
| Created / Modified timestamps | Yes | No — set to upload time |
| Created By / Modified By | Yes (with identity mapping) | No — set to uploader |
| Version history | Yes (all major + minor) | No |
| Custom column metadata | Yes | Only if target schema pre-exists |
| Item-level permissions | Yes (with identity mapping) | No |
| Workflows (2010/2013) | No — must be rebuilt in Power Automate | No |
| InfoPath forms | No — rebuild as Lists forms or Power Apps | No |
4. Identity mapping
Source user identities (Windows SIDs, on-premises UPNs, or another tenant's GUIDs) cannot exist in the target tenant. They must be mapped to target principals at migration time[2]. The Migration API consumes a UserAndGroupMapping.xml file with one row per source principal. Unmapped principals are written to the import asi:0#.f|membership|unknown and surface as broken Created By / Modified By fields in the target — they cannot be retroactively fixed without re-running the import.
Build the mapping file from the source by enumerating every distinct principal across all libraries (Created By, Modified By, role assignments on items with unique permissions), then resolve each to a target UPN via Microsoft Graph /users.
5. Throttling and rate limits
SharePoint Online enforces resource units per tenant per minute. Migration API jobs run server-side and do not consume the same quota as direct REST calls, which is why migrations that work for the first 50GB suddenly start failing the moment a script switches to direct upload[4]. Practical rules:
- Always honor
Retry-Afterresponse headers — Microsoft documents that ignoring them results in escalating throttles up to 24h blocks[4]. - Use an app registration with certificate authentication, not delegated user credentials. User-context tokens are throttled aggressively.
- Run migrations off-hours in the target's timezone. The same job that throttles at 9am completes clean at 10pm.
- Cap concurrent migration jobs per site collection to ~4. Server-side import is already parallelized inside each job.
6. Tooling options
| Tool | License | Tenant-to-tenant |
|---|---|---|
| SPMT (Microsoft) | Free | No |
| ShareGate | Paid (per user/yr) | Yes |
| AvePoint Fly | Paid | Yes |
| Quest Migration Manager | Paid | Yes |
| Metalogix Content Matrix | Paid | Yes |
| SharePoint Smart Copy | Free / MIT | No |
See the full comparisons: ShareGate, AvePoint, Quest, Metalogix, SPMT.
Smart Copy does
- Copy files, folders, document libraries, lists and list items between two SharePoint Online sites in the same Microsoft 365 tenant
- Preserve full version history, Created/Modified, Created By/Modified By and custom column metadata
- Copy item-level (unique) permissions
- Copy modern Site Pages with web part URL remapping
- Produce a verification report comparing source and destination after the copy
Smart Copy does not
- Exchange mailbox or Teams chat migration — use ShareGate, AvePoint or Quest (Smart Copy covers SharePoint, OneDrive and Teams files tenant-to-tenant)
- Migrate from on-premises SharePoint Server or file shares — use SPMT
- Migrate from Box, Google Drive or Dropbox — use SPMT
- Migrate Teams, Microsoft 365 Groups or OneDrive at scale
- Identity remapping, coexistence, or scheduled unattended bulk jobs
7. Post-migration verification
Treat verification as a separate engineering pass, not a smoke test. The minimum checklist:
- Counts — source vs target item count per library; flag any delta > 0.
- Checksums — SHA-256 of file content for a 1% random sample.
- Timestamps — source vs target Created/Modified for the same sample.
- Permissions — export a per-scope permissions report on the target and diff against the source. See the permissions inheritance reference for what to expect.
- Version history depth — confirm version counts match per item.
- Identity — query the target for any author resolving to System Account or unknown; these indicate UserAndGroupMapping gaps.
References
- [1] Microsoft Learn — Introducing the SharePoint Migration Tool (SPMT)
- [2] Microsoft Learn — User and group identity mapping for SharePoint migration
- [3] Microsoft Learn — Migration API overview
- [4] Microsoft Learn — Avoid getting throttled or blocked in SharePoint Online
- [5] Microsoft Graph — driveItem resource type
Related
Migrate without the enterprise license
SharePoint Smart Copy is a free, open-source Windows app that drives the Migration API directly — preserves versions, timestamps, authors, and item permissions across tenants.
