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):
| Tab | What it writes | Scope and limit per run |
|---|---|---|
| Create Sites | New team sites (Microsoft 365 group, optional Teams team) or communication sites | Up to 200 sites |
| Navigation | Top Nav or Quick Launch nodes with parent/child hierarchy | One site, up to 500 nodes |
| Theme | A modern theme added to the tenant theme catalog, applied to the sites you list | Tenant catalog, plus up to 200 sites |
| Content Types | Custom content types inheriting from Document, Item, Folder, Site Page and so on | One site (or the Content Type Hub), up to 200 types |
| Term Store | Groups, term sets and terms in the managed metadata service | Global (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.
- Create Sites: the same requirements as single-site provisioning (Microsoft 365 group creation allowed for team sites; site-creation rights and a Sign in with Microsoft connection for communication sites).
- Navigation: Site Collection Administrator on the target site.
- Theme: SharePoint Administrator role in Entra ID for tenant catalog writes. Before each per-site apply, the tool tries to make the signed-in user a Site Collection Administrator of that site through the tenant admin
SetSiteAdmincall, so site-level apply works for SharePoint Administrators. - Content Types: Site Collection Administrator on the target site (or on
/sites/contentTypeHubfor tenant-wide deploy). - Term Store: Term Store Administrator in the SharePoint admin center (More features → Term store → Admins) AND the
TermStore.ReadWrite.AllMicrosoft Graph delegated permission with admin consent on the connected app registration.
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,
name: required. The site’s display name.siteTemplate: required.teamorcommunication.urlSlug: optional. The site becomes/sites/<urlSlug>. If blank, the slug is derived from the name (lowercased, other characters replaced with hyphens).enableTeams: optional, team sites only.truealso creates a Microsoft Teams team on the site’s group. Blank means no Team.description: optional.
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
tempId: required. Stable string used to reference this node from children.title: required. The label shown in the navigation.url: optional. Server-relative (/sites/x/y) or absolute (https://...). Absolute URLs, cross-site paths (anything starting/sites/or/teams/) and blank URLs are marked as external links so SharePoint skips path validation.parentTempId: optional. Match an earlier row’stempIdto nest this node under it.
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
0x01: Item0x0101: Document0x0120: Folder0x010109: Page0x0101009D1CB255DA76424F860D91F20E6C4118: Site Page (modern)0x010108: Wiki Page0x0107: Comment
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:
- Create Sites: safe with Skip sites that already exist ticked; existing sites are skipped.
- Theme: safe. An existing theme with the same name is updated, and applying a theme again just re-applies it.
- Term Store: groups and term sets are reused, but terms are inserted again, so a re-run creates duplicate terms inside the same set.
- Navigation: nodes are always added, so a re-run adds a second copy of each node. Remove the earlier nodes in SharePoint first.
- Content Types: existing content types are not updated. A row whose name already exists on the site is normally rejected by SharePoint and shows as failed.
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:
- The connected Entra app must have the TermStore.ReadWrite.All Microsoft Graph delegated permission with admin consent granted.
- 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.