Home / SharePoint / SharePoint Migration Strategies: Moving to SharePoint Online
SharePoint

SharePoint Migration Strategies: Moving to SharePoint Online

Plan and execute successful SharePoint migrations with assessment tools, SharePoint Migration Tool (SPMT), migration waves, content remediation, and best pra...

What you will learn

Practical execution with concise explanations, real implementation patterns, and production-ready recommendations.

SharePoint Migration Strategies: Moving to SharePoint Online

$storageGB = [math]::Round($site.Usage.Storage / 1GB, 2) $owner = $site.Owner.Email

$inventory += [PSCustomObject]@{ URL = $site.Url Title = $site.RootWeb.Title Owner = $owner StorageGB = $storageGB LastModified = $site.LastContentModifiedDate Template = $site.RootWeb.WebTemplate }``` }

$inventory | Export-Csv "SiteInventory.csv" -NoTypeInformation

Analyze storage by site

$inventory | Sort-Object StorageGB -Descending | Select-Object -First 20 | Format-Table


## Customization Assessment

```powershell




## Find farm solutions
Get-SPSolution | Select-Object Name, Deployed, LastOperationTime





## Find sandbox solutions
Get-SPSite -Limit All | ForEach-Object {
```powershell
$site = $_
$solutions = Get-SPUserSolution -Site $site





foreach ($solution in $solutions) {
    [PSCustomObject]@{
        Site = $site.Url
        Solution = $solution.Name
        Status = $solution.Status
    }
}```
} | Export-Csv "SandboxSolutions.csv" -NoTypeInformation

## Find customized master pages
Get-SPSite -Limit All | ForEach-Object {
```powershell
$web = $_.RootWeb
if ($web.CustomMasterUrl -notlike "*/_catalogs/*") {
    [PSCustomObject]@{
        Site = $web.Url
        MasterPage = $web.CustomMasterUrl
    }
}```
}





Migration Tools

SharePoint Migration Tool (SPMT)

Features:

  • Free Microsoft tool
  • Migrates SharePoint on-prem, file shares, Box, Google Drive
  • Supports large-scale migrations
  • Incremental migration capability
  • Reports and error handling

Install SPMT:

## Download from Microsoft




## https://aka.ms/spmt





## Or install via PowerShell
Install-Module -Name Microsoft.SharePoint.MigrationTool.PowerShell





Expected output:

Package installed successfully.

Terminal output for Install-Module

Migration Using SPMT GUI

  1. Launch SPMT

  2. Sign in to Microsoft 365

  3. Add source:

    • SharePoint Server (on-premises)
    • Enter server URL and credentials
  4. Select content:

    • Entire site collection
    • Specific sites/libraries
    • Individual folders/files
  5. Configure destination:

    • Target site URL
    • Preserve permissions
    • Version history options
  6. Start migration

  7. Monitor progress

  8. Review reports

Migration Using SPMT PowerShell

## Import module
Import-Module Microsoft.SharePoint.MigrationTool.PowerShell





## Register source
$sourceUserName = "domain\admin"
$sourcePassword = ConvertTo-SecureString "password" -AsPlainText -Force
$sourceCred = New-Object System.Management.Automation.PSCredential($sourceUserName, $sourcePassword)





Register-SPMTMigration -SPOCredential $sourceCred `
                       -SourceSiteUrl "http://sharepoint2016/sites/team1" `
                       -TargetSiteUrl "https://contoso.sharepoint.com/sites/team1" `
                       -PreservePermissions `
                       -MigrateAllSiteFieldsAndContentTypes

## Start migration
Start-SPMTMigration





## Check status
Get-SPMTMigration





## Generate report
Export-SPMTReport -Path "C:\MigrationReports"





Bulk Migration Script

Bulk Migration Script

Figure: SharePoint Migration Tool – progress dashboard with status and error log.





## CSV format: SourceUrl,TargetUrl




## Example:




## http://sp2016/sites/team1,https://contoso.sharepoint.com/sites/team1




## http://sp2016/sites/team2,https://contoso.sharepoint.com/sites/team2

$mappings = Import-Csv "SiteMappings.csv"





foreach ($mapping in $mappings) {
```text
Register-SPMTMigration -SPOCredential $sourceCred `
                       -SourceSiteUrl $mapping.SourceUrl `
                       -TargetSiteUrl $mapping.TargetUrl `
                       -PreservePermissions```
}

Start-SPMTMigration -Parallel 5

## Wait for completion
do {
```powershell
$status = Get-SPMTMigration
Write-Host "Migration status: $($status.Status)"
Start-Sleep -Seconds 60```
} while ($status.Status -eq "Running")





Write-Host "Migration completed!"

Third-Party Migration Tools

ShareGate:

  • User-friendly interface
  • Advanced permissions mapping
  • Content remediation
  • Pre-migration validation

AvePoint:

  • Enterprise-scale migrations
  • Automated scheduling
  • Custom workflows
  • Compliance preservation

Metalogix:

  • Incremental migrations
  • Content transformation
  • Security migration
  • Post-migration validation

Migration Waves Planning

Wave Strategy

Wave 1: Pilot (10% of sites)

  • Select representative sites
  • Include various templates and sizes
  • Identify and resolve issues
  • Gather user feedback

Wave 2: Early Adopters (20%)

  • Power users and champions
  • More complex sites
  • Refine processes based on pilot

Wave 3: General Migration (70%)

  • Bulk of organization
  • Optimized processes
  • Established support

Wave Planning Spreadsheet

Wave,SiteName,SourceURL,TargetURL,Owner,StorageGB,Priority,MigrationDate
1,HR Portal,http://sp/hr,https://contoso.sharepoint.com/sites/hr,hr@contoso.com,5.2,High,2025-01-15
1,IT Support,http://sp/it,https://contoso.sharepoint.com/sites/it,it@contoso.com,3.1,High,2025-01-15
2,Sales Team,http://sp/sales,https://contoso.sharepoint.com/sites/sales,sales@contoso.com,12.4,Medium,2025-02-01
2,Marketing,http://sp/marketing,https://contoso.sharepoint.com/sites/marketing,marketing@contoso.com,8.7,Medium,2025-02-01
3,Team Site 1,http://sp/team1,https://contoso.sharepoint.com/sites/team1,team1@contoso.com,2.1,Low,2025-03-01

Scheduling Script

$waves = Import-Csv "MigrationWaves.csv"

## Group by migration date
$schedule = $waves | Group-Object MigrationDate





foreach ($date in $schedule) {
```powershell
$migrationDate = [datetime]$date.Name

if ((Get-Date) -ge $migrationDate) {
    Write-Host "Starting migration for $($date.Name)" -ForegroundColor Green
    
    foreach ($site in $date.Group) {
        Write-Host "  Migrating $($site.SiteName)..."
        
        Register-SPMTMigration -SourceSiteUrl $site.SourceURL `
                               -TargetSiteUrl $site.TargetURL `
                               -PreservePermissions
    }
    
    Start-SPMTMigration
}```
}

Content Remediation

Large Lists

Problem: Lists with >5000 items may have view threshold issues.

Solutions:

  1. Create indexed columns:
## Add index to column
$list = Get-PnPList -Identity "Large List"
$field = Get-PnPField -List $list -Identity "Modified"
$field.Indexed = $true
$field.Update()
Invoke-PnPQuery





Expected output:

Title           ItemCount  Url
-----           ---------  ---
Documents       156        /Shared Documents

Terminal output for Get-PnPList

  1. Break into multiple lists:
    • Archive old items
    • Use retention policies
    • Separate by year/category

Broken Permissions

Broken Permissions

Figure: Site permissions – groups, external sharing, and access request settings.





## Find sites with broken inheritance
$sites = Get-PnPSubWeb -Recurse





$brokenPermissions = @()
foreach ($site in $sites) {
```powershell
Connect-PnPOnline -Url $site.Url -Interactive

$web = Get-PnPWeb
if (-not $web.HasUniqueRoleAssignments) {
    continue
}

$brokenPermissions += [PSCustomObject]@{
    SiteURL = $site.Url
    UniquePermissions = $true
}```
}

$brokenPermissions | Export-Csv "BrokenPermissions.csv" -NoTypeInformation

Expected output:

Connected to https://contoso.sharepoint.com

Terminal output for Connect-PnPOnline

Custom Content Types

Custom Content Types

Figure: Content type hub – term store management and content syndication.





## Export content types for migration
$contentTypes = Get-PnPContentType





foreach ($ct in $contentTypes | Where-Object { $ct.Group -ne "_Hidden" }) {
```powershell
$template = Get-PnPSiteTemplate -Out "$($ct.Name).xml" -Handlers ContentTypes -ContentType $ct.Name```
}

## Import to destination
Connect-PnPOnline -Url "https://contoso.sharepoint.com/sites/target" -Interactive
Invoke-PnPSiteTemplate -Path "CustomContentType.xml"





Expected output:

Connected to https://contoso.sharepoint.com

Terminal output for Connect-PnPOnline

Workflow Migration

SharePoint Designer 2013 Workflows:

  • Document existing workflows
  • Recreate in Power Automate
  • Test thoroughly before migration
  • Run in parallel during transition

Example workflow mapping:

Old Workflow New Power Automate Flow
Document Approval Start and wait for approval
Send Email on New Item When item created → Send email
Update Item on Condition When item modified → Condition → Update item

Hybrid Scenarios

Hybrid SharePoint

Connect on-premises SharePoint with SharePoint Online:

## Configure hybrid




## Prerequisites: Azure AD Connect, SharePoint 2016/2019





## Run Hybrid Configuration Wizard




## https://www.microsoft.com/download/details.aspx?id=51885





## Configure hybrid features:




## - Hybrid search




## - Hybrid OneDrive




## - Hybrid sites features

Hybrid Search

Inbound (Cloud to On-Prem):

## Configure cloud SSA to crawl on-prem content




## Displays on-prem results in SharePoint Online search

Outbound (On-Prem to Cloud):

## Configure on-prem SSA to display cloud results




## Unified search experience from on-prem

Phased Migration with Hybrid

  1. Phase 1: Set up hybrid infrastructure
  2. Phase 2: Migrate OneDrive for Business
  3. Phase 3: Migrate site collections in waves
  4. Phase 4: Retire on-premises infrastructure

Post-Migration Tasks

Validation Checklist

## Verify site accessibility
$targetSites = Import-Csv "MigratedSites.csv"





foreach ($site in $targetSites) {
```powershell
try {
    Connect-PnPOnline -Url $site.TargetURL -Interactive
    $web = Get-PnPWeb
    
    Write-Host "✓ $($web.Title) - Accessible" -ForegroundColor Green
}
catch {
    Write-Host "✗ $($site.TargetURL) - Error: $($_.Exception.Message)" -ForegroundColor Red
}```
}

Expected output:

Connected to https://contoso.sharepoint.com

Terminal output for Connect-PnPOnline

Permission Verification

Permission Verification

Figure: Site permissions – groups, external sharing, and access request settings.





## Compare permissions before and after
$sourcePermissions = Import-Csv "SourcePermissions.csv"
$targetSite = "https://contoso.sharepoint.com/sites/team1"





Connect-PnPOnline -Url $targetSite -Interactive

$targetGroups = Get-PnPGroup

foreach ($sourceGroup in $sourcePermissions) {
```powershell
$targetGroup = $targetGroups | Where-Object { $_.Title -eq $sourceGroup.GroupName }

if ($targetGroup) {
    $members = Get-PnPGroupMember -Identity $targetGroup.Id
    Write-Host "$($sourceGroup.GroupName): $($members.Count) members"
}
else {
    Write-Host "Missing group: $($sourceGroup.GroupName)" -ForegroundColor Red
}```
}

Expected output:

Connected to https://contoso.sharepoint.com

Terminal output for Connect-PnPOnline

Search Reindexing

Search Reindexing

Figure: SharePoint search – refiners, result types, and managed properties.





## Request full crawl of migrated content
Connect-PnPOnline -Url "https://contoso.sharepoint.com/sites/team1" -Interactive





Request-PnPReIndexWeb
Request-PnPReIndexList -Identity "Documents"

Expected output:

Connected to https://contoso.sharepoint.com

Terminal output for Connect-PnPOnline

User Training

Training Topics:

  • Accessing SharePoint Online
  • OneDrive sync client
  • Mobile apps
  • Modern vs. classic experience
  • Sharing and permissions
  • Version history

Resources:

  • Video tutorials
  • Quick reference guides
  • Lunch and learn sessions
  • Champions network

Best Practices

Before Migration

  1. Clean up content - Delete obsolete sites and documents
  2. Document customizations - Inventory all customizations
  3. Test pilot migrations - Validate approach with small sample
  4. Plan communications - Keep users informed
  5. Establish support - Have help desk ready

During Migration

  1. Monitor progress - Watch SPMT logs and errors
  2. Incremental approach - Migrate in manageable batches
  3. Off-hours scheduling - Minimize user impact
  4. Parallel migrations - Use SPMT parallel capability
  5. Backup source - Keep on-prem content until validated

After Migration

  1. Validate content - Spot-check migrated sites
  2. Test permissions - Verify access controls
  3. Reindex search - Ensure content discoverable
  4. Update links - Fix hardcoded URLs
  5. Decommission source - Retire on-premises after validation period

Migration Timeline Example

Migration Timeline Example

Figure: SharePoint Migration Tool – progress dashboard with status and error log.

Month 1: Assessment and Planning
- Run SMAT
- Inventory content
- Identify customizations
- Define wave strategy





Month 2: Pilot Migration
- Migrate 5-10 pilot sites
- Validate results
- Gather feedback
- Refine processes

Month 3-4: Wave 1 & 2
- Migrate 30% of sites
- Monitor and adjust
- Provide user support

Month 5-6: Wave 3 & 4
- Migrate remaining sites
- Complete validation
- Train users

Month 7: Post-Migration
- Decommission on-premises
- Final validation
- Lessons learned

Troubleshooting

Migration Errors

"Access Denied":

  • Verify credentials
  • Check permissions on source and target
  • Ensure migration account has site collection admin

"Item Size Exceeds Maximum":

  • Files >15GB cannot migrate
  • Split large files or use OneDrive sync

"Too Many Requests":

  • Throttled by SharePoint
  • Reduce parallel migrations
  • Retry with backoff

Performance Issues

## Check migration performance
Get-SPMTMigration | Select-Object -Property Status, ItemsScanned, ItemsMigrated, BytesMigrated





## Optimize settings
Set-SPMTSettings -ParallelTaskCount 10 `
                 -UseAzureADLoginForSPO $true `
                 -PreserveUserPermissions $true





Architecture Decision and Tradeoffs

When designing content management and collaboration solutions with SharePoint, consider these key architectural trade-offs:

Approach Best For Tradeoff
Managed / platform service Rapid delivery, reduced ops burden Less customisation, potential vendor lock-in
Custom / self-hosted Full control, advanced tuning Higher operational overhead and cost

Recommendation: Start with the managed approach for most workloads and move to custom only when specific requirements demand it.

Validation and Versioning

  • Last validated: April 2026
  • Validate examples against your tenant, region, and SKU constraints before production rollout.
  • Keep module, CLI, and SDK versions pinned in automation pipelines and review quarterly.

Security and Governance Considerations

  • Apply least-privilege access using RBAC roles and just-in-time elevation for admin tasks.
  • Store secrets in managed secret stores and avoid embedding credentials in scripts or source files.
  • Enable audit logging, data protection policies, and periodic access reviews for regulated workloads.

Cost and Performance Notes

  • Define budgets and alerts, then monitor usage and cost trends continuously after go-live.
  • Baseline performance with synthetic and real-user checks before and after major changes.
  • Scale resources with measured thresholds and revisit sizing after usage pattern changes.

Official Microsoft References

  • https://learn.microsoft.com/sharepoint/
  • https://learn.microsoft.com/microsoft-365/enterprise/
  • https://learn.microsoft.com/purview/

Public Examples from Official Sources

  • These examples are sourced from official public Microsoft documentation and sample repositories.
  • Documentation examples: https://learn.microsoft.com/sharepoint/dev/
  • Sample repositories: https://github.com/SharePoint/sp-dev-docs
  • Prefer adapting these examples to your tenant, subscriptions, and governance requirements before production use.

Key Takeaways

  • Thorough assessment prevents migration issues
  • SPMT is the recommended free migration tool
  • Wave approach reduces risk and user impact
  • Content remediation improves migration success
  • Hybrid enables phased transitions
  • Validation and testing are critical
  • User training ensures adoption

Next Steps

  • Run SharePoint Migration Assessment Tool
  • Create detailed migration plan with waves
  • Pilot migration with representative sites
  • Document lessons learned for full rollout

Additional Resources


Plan carefully. Migrate confidently.

Discussion