MigrationFox Docs

Box to SharePoint migration

A setup reference for moving Box Business / Enterprise content into SharePoint Online document libraries. Covers the two supported credential options (OAuth 2.0 user credential and JWT service-account credential), how Box collaborations translate to SharePoint permissions, what happens to Box Notes, how large media files are handled around Box's API timeouts, and the troubleshooting patterns you'll hit along the way.

How the data flows

MigrationFox streams files directly from Box to SharePoint — no intermediate storage. Folder structure, timestamps, and collaboration metadata are read from the Box API and written to the SharePoint target so the destination library mirrors the source shape within SharePoint's constraints.

Credential options

Box supports two different authentication shapes and both work as a MigrationFox source. Pick based on scope: OAuth for a single user's files, JWT service account for the entire enterprise.

Option A — OAuth 2.0 user credential

Sign in as a Box user or co-admin

What it can see: everything the signing-in user has access to — their own files, shared folders they're a collaborator on, and (for Box co-admins or primary admins) content they've been granted admin visibility over.

  1. In MigrationFox, open CredentialsAdd credentialBox.
  2. Choose OAuth. Click Connect with Box.
  3. Sign in as the Box user or admin whose scope you want. Approve the requested scopes.
  4. You're redirected back with the credential stored as an encrypted access + refresh token pair.

Best for: personal / team-scoped migrations, pilots, or enterprises where you want auditable per-user consent.

Option B — JWT service-account credential

App-only access across the Box enterprise

What it can see: every user's content across the Box enterprise, without needing each user to sign in. This is the path for large-scale enterprise migrations.

  1. Go to the Box Developer Console and click Create New App.
  2. Select Custom App, then Server Authentication (with JWT), and name it (e.g. MigrationFox).
  3. On the app's Configuration tab, generate a Public/Private Keypair. Download the resulting JSON config file.
  4. Under App Access Level, choose App + Enterprise Access.
  5. Under Application Scopes, enable Read all files and folders stored in Box and Manage users (for user enumeration).
  6. Submit the app for authorisation by a Box enterprise admin: Admin Console → Integrations → Custom Apps → Authorize, using the Client ID from the app settings.
  7. Back in MigrationFox, choose JWT and upload the config JSON. The credential is validated by minting a test token immediately.

Best for: full enterprise migrations where sign-in-per-user does not scale.

Enterprise-admin approval is required for JWT

Creating the app in the developer console is not enough — until a Box enterprise admin explicitly authorises the app in the Admin Console, every API call will return HTTP 403. This is the most common first-time JWT setup error. If the credential validates but enumerates zero users, the authorisation step is the usual cause.

Collaborations and SharePoint permissions

Box's access model is built on collaborations — per-folder role assignments given to users or groups. SharePoint uses role assignments against libraries and folders. The wizard translates the two models with the following rules:

Box collaboration roleSharePoint role assignmentNotes
OwnerFull ControlUsually collapses to the destination site admin on a cross-tenant move.
Co-ownerFull ControlSame as Owner on the SharePoint side.
EditorEditWrite + edit + delete on the item.
Viewer UploaderContributeCan upload but not modify existing items.
Previewer UploaderContribute (limited)SharePoint has no preview-only equivalent; the closest match is Contribute.
ViewerReadRead-only.
PreviewerReadSharePoint does not distinguish preview from read.
UploaderContribute (upload-only)Approximates the Box role.
External collaboratorGuest invite on destination tenant + equivalent SharePoint roleRequires external sharing enabled on the target site.

Group collaborations. Box groups are resolved to their member list and mapped user-by-user against the destination UPN mapping. Group membership changes in Box after the mapping was generated are not picked up mid-run.

Box shared links. Box's public / company-wide shared link URLs do not survive migration — they are Box-specific URLs that disappear the moment files move off the platform. Generate new SharePoint sharing links for anyone still relying on the old Box URLs.

Permission-inheritance shape. Box folders inherit collaborations downward by default; SharePoint does the same with role inheritance. Where a Box folder has different collaborators from its parent (broken inheritance on the Box side), the wizard breaks inheritance on the SharePoint side too and applies the explicit collaborator set.

Box Notes handling

Box Notes are a proprietary, Box-hosted note format — stored as .boxnote files but only editable inside the Box app. They do not move as regular files.

Media-endpoint timeouts on large files

The known Box API quirk

Box's download endpoint streams files from a CDN-backed host. For large video and audio files the download stream can stall or disconnect under load before the full content lands — typically around the 30-minute single-request mark, or sooner on flaky upstream links. MigrationFox accounts for this with a chunked download + resumable upload loop so the migration does not fail outright when Box drops the connection.

How the worker handles large media:

SharePoint per-file ceiling. SharePoint Online rejects files larger than 250 GB. Box's ceiling is higher for Enterprise Plus plans. Files over the SharePoint ceiling are reported in discovery and skipped during run.

Folder structure and naming

Running the migration

  1. Add credentials. Box (OAuth or JWT) on the source, Microsoft OAuth on the destination.
  2. Provision destination. Create the target SharePoint site and document library in advance, or let the wizard provision them.
  3. Run a discovery scan. Non-destructive enumeration of the Box source — reports counts, total bytes, largest files, Box Notes present, and any names that will need sanitising.
  4. Configure the job. Pick the source root, the destination library, and optional per-subfolder mappings. Enable collaboration migration to carry access levels across. Decide whether to include prior file versions.
  5. Concurrency. For Box, 5–10 parallel transfers is a reasonable default. Box rate-limits aggressively on per-user API calls, less so on app-only JWT.
  6. Run and monitor. Watch the live dashboard. Failed items (including media-endpoint stalls) are retried; anything still failed at the end lands in the retry queue for one-click re-run.

Troubleshooting

SymptomLikely causeFix
JWT credential validates, but discovery returns 0 users / 0 files The custom app was created in the developer console but was never authorised by an enterprise admin. Admin Console → Integrations → Custom Apps → paste the Client ID → Authorize. Rerun discovery.
HTTP 403 on folder enumeration partway through a scan OAuth user lacks access to a specific sub-tree, or Box admin removed them from a shared folder mid-run. Switch to JWT service-account auth for full-enterprise scans; otherwise accept that OAuth scans only see the user's own access surface.
Large video files consistently fail with a download timeout Box media-endpoint stall on a slow upstream link. Happens on multi-gigabyte files. Expected and handled by chunked download + retry. If a single file fails repeatedly past the retry budget, lower concurrency on the job and re-run just the retry queue.
Box Notes arrive as .boxnote files that SharePoint can't open Export-to-DOCX endpoint failed for those specific Notes. Review the run report for failed Note exports. Open each in Box and File → Export to Word manually, then upload.
Collaborators show in the Box source but not as SharePoint permissions on the destination The Box email-to-UPN mapping has unmatched rows, or permission migration was disabled on the job. Export the mapping report, fix unmatched rows, and run the permissions-only re-run. File content stays; only permissions reapply.
Box shared links no longer work after migration Box share URLs are Box-specific and do not carry over to SharePoint. Generate new SharePoint sharing links for the items and communicate the change before cutover.
File names truncated or renamed on the destination SharePoint's 400-character path limit, or illegal characters in the original name. Expected. Review the rename report; original names are preserved in a metadata column on each destination item.
Token renewal fails with “invalid_grant” on a long-running JWT job The app's public key on Box was rotated or revoked while the job was running, or the system clock skew exceeded the JWT assertion window. Regenerate the keypair in the Box developer console, re-download the config JSON, replace the credential in MigrationFox, and resume.

Related