MigrationFox Docs

SharePoint Provisioning

Automated creation of destination SharePoint sites, document libraries, Teams, channels, shared drives, and S3 buckets. Instead of clicking through twenty SharePoint admin-center pages before a migration can begin, describe the destination shape in MigrationFox and let the engine call the right platform API for each resource.

What you can provision

SharePoint sites (communication or team), document libraries inside existing sites, nested folder structures, Microsoft Teams (with their backing SharePoint site auto-created), standard and private Teams channels, Google shared drives, and S3 buckets. Everything happens inside the migration workflow — no separate admin portal to switch to mid-flight.

What triggers provisioning

Provisioning is never implicit. MigrationFox only creates a destination resource when you ask it to, through one of three entry points.

The Restructuring Wizard

If you are moving from a mega-site or a flat Google Drive structure into a proper set of SharePoint site collections, the Restructuring Wizard proposes a target layout (one site per top-level folder, one library per sub-folder, and so on) and provisions every site and library in the plan before any file moves. You can edit the plan before execution — rename, drop, or regroup any proposed site — and the provisioning step honors the edited shape.

The Provisioning tool on any project

Inside any MigrationFox project, open the Provisioning tool and:

  1. Pick the resource type (SharePoint site, Team, document library, shared drive, S3 bucket).
  2. Select the credential to use.
  3. Enter the name and any resource-specific options (site template, channel type, membership).
  4. Click Create. MigrationFox calls the platform API and adds the newly created resource to your project’s resource list.

This is the standalone path — useful when you are pre-staging destinations before any migration job is scoped.

Inline provisioning from the migration wizard

When selecting a destination path inside the migration wizard, if the folder or library you want does not yet exist, you can create it on the spot without leaving the wizard. The new resource appears in the destination picker and the job proceeds.

Site creation via Microsoft Graph

MigrationFox creates SharePoint sites through the Microsoft Graph API. The specific call depends on the template you pick (see Template selection), but the default shape looks like this:

Provisioning a site is asynchronous on the Microsoft side. The Graph call returns immediately with a site ID, but the site itself takes anywhere from a few seconds to about a minute to be fully ready for upload. MigrationFox polls the readiness endpoint before starting uploads against a freshly provisioned site, so you do not need to sequence the steps manually.

Slug-rename handling

SharePoint has a hard constraint: two sites in the same tenant cannot share the same URL slug. If you try to create a site at /sites/marketing when /sites/marketing already exists (even if the existing one was deleted recently and is still in the tenant’s recycle holding period), SharePoint refuses the creation or silently appends a number to the slug.

MigrationFox handles this explicitly so that batch provisioning does not leave you with a mix of expected and auto-renamed URLs:

Slug uniqueness is permanent until purged

A slug you just deleted is not immediately available for a new site. If you need the exact same URL, purge the retained site via SharePoint admin center → Deleted sites before re-running provisioning. Otherwise choose a different slug up front. There is no way to force-reuse a held slug from the Graph API.

Template selection

Three site templates are commonly used for migration destinations. Each has a different Graph provisioning path and a different permissions model.

Default

Teams-backed group site

When to use: the destination is a working team that will collaborate on files, chat, and meetings.

What you get: a SharePoint team site plus an owning Microsoft 365 group plus an optional Microsoft Team on top. Membership is managed through the group — add a person to the group and they get the site, the Team, and shared mailbox access together.

Permissions model: inherited from the group. Changes to group membership flow through within a few minutes.

Created via: Microsoft Graph group + site provisioning. If you also provision a Team on top, the Team creation wires the existing group rather than creating a new one.

Alternative

Communication site

When to use: the destination is a broadcast-style site — policies, handbooks, announcements, reference libraries. Read-for-most, write-for-few.

What you get: a SharePoint communication site without an underlying Microsoft 365 group.

Permissions model: managed through SharePoint site permissions directly. There is no group membership to manage.

Created via: Graph site provisioning with the communication-site template.

Legacy

Classic team site

When to use: you are specifically migrating into a classic SharePoint layout for compatibility with legacy workflows or third-party tools that depend on classic chrome. This is rare in new migrations.

What you get: a classic-template site without group-connection. Most modern SharePoint capabilities (modern pages, Teams integration) work on it, but the site chrome is the classic experience.

Permissions model: SharePoint groups (Owners / Members / Visitors) rather than Microsoft 365 groups.

Prerequisites

Provisioning calls happen under the credential you pick at creation time. The role requirements on the destination side are:

The credential you use for provisioning does not have to be the same credential used for the subsequent migration. A common pattern: provision under a tenant-admin service principal, migrate under a lower-privilege user credential scoped to the specific sites that were just created.

Batch provisioning

For migrations that create dozens of destination sites (typical output of a Restructuring Wizard run on a large mega-site), MigrationFox provisions in sequence rather than all at once. Sequential creation is deliberate:

Known limits

Troubleshooting

SymptomLikely causeFix
Provisioning returns “slug already exists” for a site I am sure I never created The slug was used by a site that was deleted but is still within SharePoint’s 93-day retention hold, or the slug matches an auto-generated vanity URL from the tenant’s early days. Check SharePoint admin center → Deleted sites and purge the held site, or pick a different slug.
Site appears to create successfully but uploads fail immediately after Graph returned the site ID before the underlying provisioning finished. MigrationFox polls readiness on its own creations, but a site created through a different channel (PowerShell, admin center) may not be ready yet. Wait 30–60 seconds and retry, or use MigrationFox’s Provisioning tool which polls readiness automatically.
Group-connected site is created but the Team does not appear The group was created but the Team creation call (a separate Graph operation) failed, commonly because the credential lacks Teams Administrator scope. Grant Teams Administrator to the service principal and run the Teams provisioning step again. The group-connected site remains in place — the Team is added on top of it.
Permissions on the provisioned site do not match expectations Group-site permissions flow from group membership. If you add users to the SharePoint site directly instead of the owning group, membership gets out of sync. Manage membership through the Microsoft 365 group (Entra admin center or Teams), not through SharePoint site settings.
Bulk provisioning stops part-way with 429 Graph throttling during parallel creation. MigrationFox paces creates sequentially by default. If you are seeing this, the job may have been configured with a custom parallelism that exceeds the throttle bucket. Revert to default pacing.
Credential works for read operations but fails at provisioning with 403 Forbidden Read scopes (Sites.Read.All, Group.Read.All) are not enough. Provisioning requires write scopes. Grant Sites.FullControl.All and Group.ReadWrite.All (application permissions) or the delegated equivalents, then reconsent.

Related