M365 Tenant Tools · Deploy

Bulk Provisioning

Create SharePoint sites in bulk, then roll out navigation, branded themes, content types and managed metadata term sets from structured CSV or JSON input. Every run reports a per-row outcome, so you can see exactly what was created and what failed.

What it does

Five operations against SharePoint Online, each on its own tab at app.migrationfox.com/governance/bulk-provisioning (open M365 Tenant Tools → Bulk Provisioning in the app):

TabWhat it writesScope and limit per run
Create SitesNew team sites (Microsoft 365 group, optional Teams team) or communication sitesUp to 200 sites
NavigationTop Nav or Quick Launch nodes with parent/child hierarchyOne site, up to 500 nodes
ThemeA modern theme added to the tenant theme catalog, applied to the sites you listTenant catalog, plus up to 200 sites
Content TypesCustom content types inheriting from Document, Item, Folder, Site Page and so onOne site (or the Content Type Hub), up to 200 types
Term StoreGroups, term sets and terms in the managed metadata serviceGlobal (tenant-wide) or site-level term store, up to 2,000 rows

Access

Bulk Provisioning is one of the M365 Tenant Tools. It comes with Tenant Suite or Consultant Pro; a single report pack covers its own assessment only and doesn’t include it. Without one of those, the tool shows a lock and the Navigation, Theme, Content Types and Term Store actions are refused. See pricing for the current plans.

Every tab works with a SharePoint connection you have already added, chosen from the SharePoint connection dropdown.

Permissions

Each operation has its own permission floor. Bulk Provisioning calls real SharePoint admin endpoints, so the signed-in user needs the right SharePoint role, not just an OAuth permission.

Global Administrator alone may not be enough: if theme catalog or Term Store writes are refused, explicitly assign the SharePoint Administrator role (and Term Store Administrator for terms) to the signed-in account.

Create Sites

Paste a JSON array or upload a CSV. Sites are created one at a time, in order. With Skip sites that already exist (recommended) ticked (the default), each URL slug is checked first and rows whose address already has a site are marked as skipped. A failed row does not stop the run; the results list shows each row as created, skipped or failed, with the reason.

CSV columns

name,urlSlug,siteTemplate,enableTeams,description
Marketing,marketing,communication,false,Marketing collateral and campaigns
Sales Ops,sales-ops,team,true,
HR Resources,hr,communication,false,

Navigation builder

Builds a hierarchical navigation from a flat CSV or a JSON tree, on the site you enter as Target site URL, in the Navigation location you choose (Top Nav or Quick Launch). Parent-child links use the tempId field: rows reference their parent by the parent row’s tempId, not by the SharePoint node ID (which doesn’t exist yet). Parents must appear before their children.

CSV columns

tempId,title,url,parentTempId
resources,Resources,,
res-supporting,Supporting People,,resources
forms,Forms and Tools,,
forms-hr,HR Forms,/sites/intranet/Forms/HR,forms
directory,Employee Directory,/sites/intranet/directory,

Fields

Theme deploy

Uses SharePoint’s modern theme API: /_api/thememanager/AddTenantTheme or UpdateTenantTheme for the tenant catalog, and /_api/thememanager/ApplyTheme per site. The legacy composed-look endpoint is not used.

Enter a Theme name, tick Also add this theme to the tenant catalog and paste a Fluent UI palette JSON object (themePrimary, neutralLight and so on), then list the Sites to apply theme to, one URL per line. The tool tries to add the theme first; if a theme with the same name already exists, it updates it instead, so re-runs during palette tuning don’t error out.

Content Types

Creates content types through Microsoft Graph (POST /sites/{siteId}/contentTypes), which honors the supplied parentId. If parentId is blank, the content type inherits from Document (0x0101).

CSV columns

name,description,group,parentId,columnNames
MigrationFox-Document,"Branded document content type",MigrationFox,0x0101,
MigrationFox-Item,Default item content type for non-document records,MigrationFox,0x01,
MigrationFox-SitePage,"Branded modern page content type",MigrationFox,0x0101009D1CB255DA76424F860D91F20E6C4118,

columnNames is an optional semicolon-separated list of site columns to attach. The columns must already exist on the site; a column that can’t be found or attached is left off without failing the content type.

Common parent IDs

Tenant-wide deploy via the Content Type Hub

Tick Deploy to tenant Content Type Hub. The tool fills in https://<tenant>.sharepoint.com/sites/contentTypeHub from the selected connection. After creation, open each content type in SharePoint and choose Manage publishing → Publish to push it to every site in the tenant. Re-publish to roll out changes.

Term Store

The Term Store tab supports Global (Tenant-wide) and Site-level scopes. Tenant-wide writes use the Microsoft Graph beta endpoint (/beta/termStore), because Graph v1.0 exposes the term store only per site. Site-level writes use /v1.0/sites/{siteId}/termStore. Terms are created under their term set’s children collection.

CSV columns

groupName,setName,termName,description
MigrationFox,Document Types,Contract,Signed legal agreements with customers and vendors
MigrationFox,Document Types,Statement of Work,Engagement-specific scope and deliverables
MigrationFox,Departments,Engineering,Product engineering and platform reliability
MigrationFox,Categories,Confidential,Sensitive customer and financial records

Existing groups and term sets are looked up by name and reused. Terms are always created, so for clean re-runs delete the term set in SharePoint first.

Re-running the same input

Not every operation is safe to repeat. Check this before re-running a file:

Sample downloads

Each section has Download sample and Upload file buttons. Download produces a working CSV or JSON file (sample sites, the MigrationFox term group, three sample content types and so on) you can adapt and re-upload. Files are read locally in the browser; nothing is sent until you click the action button.

Troubleshooting

“Cannot open ‘/sites/X/Y’: no such file or folder”

The navigation node points at a same-site path that doesn’t exist on the target site. Cross-site URLs (anything under /sites/ or /teams/) are marked external automatically so SharePoint doesn’t validate them. For same-site links, double-check the path.

A child navigation node fails because its parent was not created

Its parent row failed or comes later in the file. Fix the parent row, make sure parents are listed before their children, and re-run only the missing rows.

HTTP 403 on ApplyTheme

The signed-in user lacks Site Collection Administrator on the target. The tool tries to grant it via SetSiteAdmin before each call, but that requires the SharePoint Administrator role in Entra ID. Assign the role at Entra ID → Roles and administrators → SharePoint Administrator and retry.

Term Store accessDenied: insufficient permissions

Two requirements:

  1. The connected Entra app must have the TermStore.ReadWrite.All Microsoft Graph delegated permission with admin consent granted.
  2. The signed-in user must be a Term Store Administrator in the SharePoint admin center (More features → Term store → select the root taxonomy node → Admins in the right pane).

Both are required. One without the other still returns 403.

Content type created without some columns

Columns listed in columnNames must already exist as site columns on the target site, using their internal name or title. Create the missing site columns in SharePoint, then add them to the content type.

The tool shows a lock or says it “comes with Tenant Suite”

Your account has no active Tenant Suite or Consultant Pro. See pricing.

← All docs Open Bulk Provisioning →