Sharepoint

SharePoint Migration Strategies: Moving to SharePoint Online

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

Analyze storage by site


## Customization Assessment

```powershell

![Customization Assessment](/images/articles/sharepoint/2025-12-08-sharepoint-migration-strategies-moving-to-online-sec2-implementation.jpg)

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

![Find farm solutions](/images/articles/sharepoint/2025-12-08-sharepoint-migration-strategies-moving-to-online-sec3-generic.jpg)


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

![Find sandbox solutions](/images/articles/sharepoint/2025-12-08-sharepoint-migration-strategies-moving-to-online-sec4-implementation.jpg)


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
    }
}```
}

![Find customized master pages](/images/articles/sharepoint/2025-12-08-sharepoint-migration-strategies-moving-to-online-sec5-implementation.jpg)

Migration Tools

SharePoint Migration Tool (SPMT)

Migration Tools

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

![Download from Microsoft](/images/articles/sharepoint/2025-12-08-sharepoint-migration-strategies-moving-to-online-sec7-generic.jpg)

## https://aka.ms/spmt


![https://aka.ms/spmt](/images/articles/sharepoint/2025-12-08-sharepoint-migration-strategies-moving-to-online-sec8-generic.jpg)

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

![Or install via PowerShell](/images/articles/sharepoint/2025-12-08-sharepoint-migration-strategies-moving-to-online-sec9-implementation.jpg)

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

Migration Using SPMT GUI

  1. Start migration
  2. Monitor progress
  3. Review reports

Migration Using SPMT PowerShell

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

![Import module](/images/articles/sharepoint/2025-12-08-sharepoint-migration-strategies-moving-to-online-sec11-generic.jpg)


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

![Register source](/images/articles/sharepoint/2025-12-08-sharepoint-migration-strategies-moving-to-online-sec12-generic.jpg)


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

## Start migration
Start-SPMTMigration

![Start migration](/images/articles/sharepoint/2025-12-08-sharepoint-migration-strategies-moving-to-online-sec13-database.jpg)


## Check status
Get-SPMTMigration

![Check status](/images/articles/sharepoint/2025-12-08-sharepoint-migration-strategies-moving-to-online-sec14-generic.jpg)


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

![Generate report](/images/articles/sharepoint/2025-12-08-sharepoint-migration-strategies-moving-to-online-sec15-chart.jpg)

Bulk Migration Script

Bulk Migration Script

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


![Bulk Migration Script](/images/articles/sharepoint/2025-12-08-sharepoint-migration-strategies-moving-to-online-sec16-database.jpg)

## CSV format: SourceUrl,TargetUrl

![CSV format: SourceUrl,TargetUrl](/images/articles/sharepoint/2025-12-08-sharepoint-migration-strategies-moving-to-online-sec17-form.jpg)

## Example:

![Example:](/images/articles/sharepoint/2025-12-08-sharepoint-migration-strategies-moving-to-online-sec18-generic.jpg)

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

![http://sp2016/sites/team1,https://contoso.sharepoint.com/sites/team1](/images/articles/sharepoint/2025-12-08-sharepoint-migration-strategies-moving-to-online-sec19-generic.jpg)

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

$mappings = Import-Csv "SiteMappings.csv"

![http://sp2016/sites/team2,https://contoso.sharepoint.com/sites/team2](/images/articles/sharepoint/2025-12-08-sharepoint-migration-strategies-moving-to-online-sec20-generic.jpg)


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")

![Wait for completion](/images/articles/sharepoint/2025-12-08-sharepoint-migration-strategies-moving-to-online-sec21-implementation.jpg)


Write-Host "Migration completed!"

Third-Party Migration Tools

ShareGate:

Third-Party Migration Tools

  • 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

Migration Waves Planning

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

![Group by migration date](/images/articles/sharepoint/2025-12-08-sharepoint-migration-strategies-moving-to-online-sec24-database.jpg)


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

Content Remediation

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

![Add index to column](/images/articles/sharepoint/2025-12-08-sharepoint-migration-strategies-moving-to-online-sec26-database.jpg)

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.


![Broken Permissions](/images/articles/sharepoint/2025-12-08-sharepoint-migration-strategies-moving-to-online-sec27-implementation.jpg)

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

![Find sites with broken inheritance](/images/articles/sharepoint/2025-12-08-sharepoint-migration-strategies-moving-to-online-sec28-implementation.jpg)


$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.


![Custom Content Types](/images/articles/sharepoint/2025-12-08-sharepoint-migration-strategies-moving-to-online-sec29-implementation.jpg)

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

![Export content types for migration](/images/articles/sharepoint/2025-12-08-sharepoint-migration-strategies-moving-to-online-sec30-database.jpg)


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"

![Import to destination](/images/articles/sharepoint/2025-12-08-sharepoint-migration-strategies-moving-to-online-sec31-generic.jpg)

Expected output:

Connected to https://contoso.sharepoint.com

Terminal output for Connect-PnPOnline

Workflow Migration

SharePoint Designer 2013 Workflows:

Workflow Migration

  • 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

Hybrid Scenarios

Connect on-premises SharePoint with SharePoint Online:

## Configure hybrid

![Configure hybrid](/images/articles/sharepoint/2025-12-08-sharepoint-migration-strategies-moving-to-online-sec34-implementation.jpg)

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


![Prerequisites: Azure AD Connect, SharePoint 2016/2019](/images/articles/sharepoint/2025-12-08-sharepoint-migration-strategies-moving-to-online-sec35-form.jpg)

## Run Hybrid Configuration Wizard

![Run Hybrid Configuration Wizard](/images/articles/sharepoint/2025-12-08-sharepoint-migration-strategies-moving-to-online-sec36-implementation.jpg)

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


![https://www.microsoft.com/download/details.aspx?id=51885](/images/articles/sharepoint/2025-12-08-sharepoint-migration-strategies-moving-to-online-sec37-generic.jpg)

## Configure hybrid features:

![Configure hybrid features:](/images/articles/sharepoint/2025-12-08-sharepoint-migration-strategies-moving-to-online-sec38-implementation.jpg)

## - Hybrid search

![- Hybrid search](/images/articles/sharepoint/2025-12-08-sharepoint-migration-strategies-moving-to-online-sec39-generic.jpg)

## - Hybrid OneDrive

![- Hybrid OneDrive](/images/articles/sharepoint/2025-12-08-sharepoint-migration-strategies-moving-to-online-sec40-generic.jpg)

## - Hybrid sites features

- Hybrid sites features

Hybrid Search

Inbound (Cloud to On-Prem):

Hybrid Search

## Configure cloud SSA to crawl on-prem content

![Configure cloud SSA to crawl on-prem content](/images/articles/sharepoint/2025-12-08-sharepoint-migration-strategies-moving-to-online-sec43-implementation.jpg)

## Displays on-prem results in SharePoint Online search

Displays on-prem results in SharePoint Online search

Outbound (On-Prem to Cloud):

## Configure on-prem SSA to display cloud results

![Configure on-prem SSA to display cloud results](/images/articles/sharepoint/2025-12-08-sharepoint-migration-strategies-moving-to-online-sec45-implementation.jpg)

## Unified search experience from on-prem

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

Phased Migration with Hybrid

Post-Migration Tasks

Validation Checklist

Post-Migration Tasks

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

![Verify site accessibility](/images/articles/sharepoint/2025-12-08-sharepoint-migration-strategies-moving-to-online-sec49-implementation.jpg)


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.


![Permission Verification](/images/articles/sharepoint/2025-12-08-sharepoint-migration-strategies-moving-to-online-sec50-implementation.jpg)

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

![Compare permissions before and after](/images/articles/sharepoint/2025-12-08-sharepoint-migration-strategies-moving-to-online-sec51-prereq.jpg)


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.


![Search Reindexing](/images/articles/sharepoint/2025-12-08-sharepoint-migration-strategies-moving-to-online-sec52-database.jpg)

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

![Request full crawl of migrated content](/images/articles/sharepoint/2025-12-08-sharepoint-migration-strategies-moving-to-online-sec53-migration.jpg)


Request-PnPReIndexWeb
Request-PnPReIndexList -Identity "Documents"

Expected output:

Connected to https://contoso.sharepoint.com

Terminal output for Connect-PnPOnline

User Training

Training Topics:

User Training

  • 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

Best Practices

  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

![Migration Timeline Example](/images/articles/sharepoint/2025-12-08-sharepoint-migration-strategies-moving-to-online-sec56-database.jpg)


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

Troubleshooting

"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

![Check migration performance](/images/articles/sharepoint/2025-12-08-sharepoint-migration-strategies-moving-to-online-sec58-performance.jpg)


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

![Optimize settings](/images/articles/sharepoint/2025-12-08-sharepoint-migration-strategies-moving-to-online-sec59-performance.jpg)

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

Public Examples from Official Sources

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

Key Takeaways

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.

AI Assistant
AI Assistant

Article Assistant

Ask me about this article

AI
Hi! I'm here to help you understand this article. Ask me anything about the content, concepts, or implementation details.