Moving a list from one SharePoint Online site to another looks like a copy-and-paste job. But a list is several things at once: its structure (columns, views and formatting), its items and attachments, values that point somewhere else (people, lookups, managed metadata terms) and its permissions. Microsoft offers several ways to move a list, and each one carries a different part of that. This guide covers the methods Microsoft documents on Microsoft Learn today: what each one keeps, where it falls short and who can run it.
Moving a single list is often one step in a larger move to the cloud. For the full picture, see our Office 365 migration guide, which covers the migration stages and tools.
Pick a method by what has to move
| Method | What it copies | Main limit | Who runs it |
|---|---|---|---|
| Save list as template | The list’s structure; items if you select Include Content | Needs custom script on the site; people, lookup and managed metadata columns break on another site | A site owner, after a SharePoint Administrator allows custom script |
| List design | The list’s structure | No items; a design can’t be edited, only replaced | A SharePoint Administrator |
| PnP provisioning template | Structure, plus items and attachments when you configure it | Open source with no Microsoft SLA; the target site must already exist | Someone who runs PnP PowerShell against both sites |
| Power Automate flow | The item values you map; attachments through extra actions | Generic lists only; one-way; at most 12 lookup columns | A flow author with access to both lists |
| Cross-tenant SharePoint migration | Whole sites, not single lists | Enterprise Agreement customers only; the target site must not exist | A SharePoint Administrator |
Save the list as a template
This is the classic route. In the list settings, select Save list as template, and select Include Content if the items should come along. SharePoint saves the template as an .stp file in the site’s list template gallery (_catalogs/lt), and new lists can be created from it.
Three limits decide whether it works for you:
- Custom script has to be allowed. When custom script is blocked, Save list as template is no longer available in the list settings. By default SharePoint blocks custom script on modern team and communication sites, on sites that users create themselves and on most sites that admins create. A SharePoint Administrator can allow it on one site with
Set-SPOSite <SiteURL> -DenyAddAndCustomizePages 0, and the setting returns to blocked within 24 hours. Microsoft asks admins to review the security implications before they do this. Lists can still be created from templates that were saved before custom script was blocked. - People, lookup and managed metadata columns don’t travel. Microsoft supports list templates with Lookup, Managed Metadata or Person or Group columns only on the site where the template was created. On another site collection or subsite, those columns come up blank or show the wrong data. Microsoft’s workaround is to save the template without those columns and add them after the new list exists.
- Include Content stops at ten managed metadata columns. Saving with Include Content fails when the list has 10 or more managed metadata columns; the error names
_catalogs/lt/<list name>.stp. Save the template without content, or keep the list under 10 such columns.
Best for: a list without people, lookup or managed metadata columns, on a site where an admin can briefly allow custom script.
Reuse the structure with a list design
If the goal is the same list layout on many sites, a SharePoint Administrator can turn an existing list into an organization template with SharePoint Online Management Shell:
$extracted = Get-SPOSiteScriptFromList -ListUrl "https://contoso.sharepoint.com/sites/source/Lists/Projects"
Add-SPOSiteScript -Title "Projects list" -Description "Creates the project tracking list" -Content $extracted
Add-SPOListDesign -Title "Projects" -Description "Project tracking list" -SiteScripts "<ID returned by Add-SPOSiteScript>"
People who create a list in SharePoint, Teams or the Lists app then see the design on the From your organization tab. Everyone in the organization sees it by default; Grant-SPOSiteDesignRights limits it to specific users or a security group.
What it doesn’t do:
- No items. Get-SPOSiteScriptFromList turns the list into a site script, and the actions a site script can run create lists, columns, content types and views. None of them adds list items, so every list created from the design starts empty.
- No edits. A list design can’t be updated after you add it. To change it, remove it and add the new version.
Best for: a standard list layout that teams create again and again. When the data has to follow, pair it with a flow or a PnP template.
Copy structure and items with PnP PowerShell
The PnP provisioning engine, used through the PnP PowerShell module, extracts a list into a template file and applies it to another site. Microsoft documents it on Learn, but it’s an open-source community project, and Microsoft offers no SLA for it.
To take one list with its items and attachments, describe it in a configuration file. includeItems exports the items, includeAttachments adds their attachments, and persistAssetFiles makes the engine actually download those attachments:
{
"$schema": "https://aka.ms/sppnp-extract-configuration-schema",
"persistAssetFiles": true,
"handlers": ["Lists"],
"lists": {
"lists": [
{
"title": "Projects",
"includeItems": true,
"query": { "includeAttachments": true }
}
]
}
}
Then extract the template from the source site and apply it to the target site:
Connect-PnPOnline -Url "https://contoso.sharepoint.com/sites/source"
Get-PnPSiteTemplate -Configuration ".\config.json" -Out ".\projects.xml"
Connect-PnPOnline -Url "https://contoso.sharepoint.com/sites/target"
Invoke-PnPSiteTemplate -Path ".\projects.xml"
Set up sign-in for Connect-PnPOnline as the PnP PowerShell documentation describes. A few things to know:
- The target site has to exist and work before you apply the template.
- The source and the target can be in different Microsoft 365 tenants, and the engine also exports custom column and view formatting.
- Learn’s PnP articles don’t describe how people, lookup and managed metadata values are matched on the new site, so check those columns before anyone relies on the copy.
Best for: a one-off copy of a list with its items, within a tenant or between tenants, by someone comfortable with PowerShell.
Copy items with Power Automate
A flow can copy items from a list on one site to a list on another. Microsoft’s pattern:
- Start the flow with the SharePoint trigger When an item is created or modified on the source list.
- Add Get items for the destination list, with a Filter Query that looks for the same item, for example
Title eq '<Title from the trigger>'. - Add a condition that checks whether Get items found anything:
length(body('Get_items')?['value'])is equal to 0. - If nothing was found, Create item in the destination with values from the trigger. Otherwise, Update item.
Know the limits before you build it:
- It’s one-way. Changes made in the destination aren’t copied back, and an attempt to sync both ways creates an endless loop.
- It needs a matching column. At least one column must identify an item in both lists. If its value changes, the flow creates a new item; Microsoft suggests storing the source item’s ID in the destination list and matching on that.
- It reacts to changes. The flow runs when an item is created or modified, so items that nobody touches after you turn the flow on stay behind. Deleting an item in the source doesn’t trigger the flow.
- It works with generic lists only. Flows for lists support generic lists (template 100), not lists such as Announcements, Contacts or Tasks. Get items fails on a list with more than 12 lookup columns.
- Large lists need pagination. Get items returns 100 items by default. On a destination list with more than 5,000 items, turn on pagination, or the filter query can miss items that aren’t among the first 5,000.
- Attachments and people take extra steps. Attachments need their own actions: Get attachments, Get attachment content and Add attachment. For a person column, Resolve person returns a single matching user that the column accepts, and it fails when it finds no match or several.
The flow’s author needs access to both lists.
Best for: keeping a second list fed with new and changed items, or a gradual move during which both lists stay live.
Move a whole site to another tenant
When the list has to leave the tenant together with its site, cross-tenant SharePoint migration moves whole sites, not single lists:
- SharePoint Administrators run it with SharePoint Online PowerShell. It’s available only to Enterprise Agreement customers, with licenses sold per 100 GB of data moved.
- It’s a one-time move. The content leaves the source, a redirect stays behind, and incremental passes aren’t possible.
- The target site must not exist yet; you can’t overwrite or merge into an existing site.
- Each site can hold at most 5 TB or 1 million items, and that count includes file versions, folders and list items.
- Users and groups must exist in the target tenant first, and an identity mapping connects them. Access to the site carries over only for the users and groups included in that mapping.
- Power Apps and Power Automate flows must be recreated and reconnected on the target, and so must SharePoint 2010 and 2013 workflows.
Tools that don’t move lists between SharePoint Online sites
Three other Microsoft options come up often but don’t do this job:
- SharePoint Migration Tool (SPMT) moves content into Microsoft 365 from SharePoint Server 2010, 2013, 2016 and 2019, SharePoint Foundation 2010 and 2013, and file shares. Its FAQ says it can’t migrate from another SharePoint tenant in Microsoft 365. If your list still lives on SharePoint Server, SPMT is the right tool: it supports lists, permissions, file version history and managed metadata.
- Migration Manager brings file shares and content from other cloud storage services into Microsoft 365; SharePoint Online isn’t among the sources Microsoft lists for it.
- Export to Excel is documented as a way to archive a list, not to move it. The export saves the list entries but not the attachments, and properties, permissions and relationships aren’t preserved. Text beyond Excel’s limit of 32,767 characters per cell is lost. It still makes a useful snapshot before you start.
Before you switch people over
Whichever method you use, check the new list before you send people to it:
- Compare the item counts in the old and the new list.
- Open items with people, lookup and managed metadata values, and confirm they point to the right users, items and terms.
- Check that attachments arrived.
- Set the permissions on the new list and test them with a non-admin account.
- Repoint links, flows and apps that still use the old list.
Microsoft Learn sources
- Allow or prevent custom script
- Template-generated list doesn’t display correct data for a column in SharePoint Online
- Error when you save a list or library as a template in SharePoint Online
- Creating custom list templates
- Get-SPOSiteScriptFromList
- Site template JSON schema
- Introducing the PnP provisioning engine
- Configuring the PnP Provisioning Engine
- Upgrading from XSLT views rendering to List Formatting
- How to use Flow to copy items between two data sources
- Filter and copy data with Power Automate
- Microsoft SharePoint Connector in Power Automate
- In-depth analysis into Get items and Get files SharePoint actions
- Cross-tenant SharePoint migration
- Overview of the SharePoint Migration Tool (SPMT)
- SPMT-supported features
- Frequently asked questions: SharePoint Migration Tool
- Migrate your content to Microsoft 365
- Information about manual migration of SharePoint Online content





