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

MethodWhat it copiesMain limitWho runs it
Save list as templateThe list’s structure; items if you select Include ContentNeeds custom script on the site; people, lookup and managed metadata columns break on another siteA site owner, after a SharePoint Administrator allows custom script
List designThe list’s structureNo items; a design can’t be edited, only replacedA SharePoint Administrator
PnP provisioning templateStructure, plus items and attachments when you configure itOpen source with no Microsoft SLA; the target site must already existSomeone who runs PnP PowerShell against both sites
Power Automate flowThe item values you map; attachments through extra actionsGeneric lists only; one-way; at most 12 lookup columnsA flow author with access to both lists
Cross-tenant SharePoint migrationWhole sites, not single listsEnterprise Agreement customers only; the target site must not existA 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:

  1. Start the flow with the SharePoint trigger When an item is created or modified on the source list.
  2. 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>'.
  3. Add a condition that checks whether Get items found anything: length(body('Get_items')?['value']) is equal to 0.
  4. 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:

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