route Migration Roadmap

Tenant-to-Tenant Migration Roadmap

The full migration lifecycle from kickoff to final cutover. We are always the target tenant. This roadmap covers both provisioning branches; Branch 1 (the Migration Control Center) is documented step by step below.

flag Migration Kickoff

The engagement starts with a kickoff and requirements discussion, followed by CIT sending the Base Excel to the source company. It covers users, guest users / contractors, ex-employees, shared mailboxes, distribution lists, SharePoint sites, Teams, contacts, resources, tenant applications, service accounts, and licenses.

Once the completed Excel comes back, CIT reviews it for errors, duplicates, and data glitches before any provisioning begins. The workflow then splits into two branches:

alt_route Branch 1 — Migration Control Center (MCC) is the primary, tooling-driven path documented below. Branch 2 — Manual / GitHub is the scripted fallback (see the last section).

badge Branch 1 — Identity Provisioning

With the reviewed Excel in hand, MCC provisions all identities in the target tenant under a temporary domain, then notifies users and tracks adoption.

1 Build the Master CSV
In MCC, open the Excel-to-CSV conversion wizard and map each source column (users, mailboxes, DLs, etc.) to its correct MCC field. Download the resulting Master CSV once mapping is complete.

MCC field-mapping wizard with Excel columns mapped to CSV fields.

MCC field-mapping wizard
2 Create the Project and Import
Open a new project inside MCC and import the Master CSV from Step 1. This becomes the working object list for the entire migration.

MCC "New Project" screen with the CSV import dialog.

MCC New Project + CSV import
3 Check Prerequisites, then Prepare Objects
These are two separate buttons in the project toolbar, run in order:
  • Check Prerequisites — verifies Graph access, the SharePoint lists, the Azure Functions API, and validates the project data (missing Source/Target, duplicates, domain mismatches).
  • Prepare Objects — assigns the missing temp and target domains, fixes mailNickname values, and flags duplicate objects.
Review the pass/fail output in the project's terminal tab before proceeding — this is the validation gate before anything is created in the target tenant.

Left: Check Prerequisites results. Right: Prepare Objects log output.

Check Prerequisites results
Prepare Objects log output
4 Migrate to Temp Domain
Once objects pass validation, click Migrate to Temp Domain. This provisions all eligible objects in the target tenant under the temporary domain (harrisgroup.eu), across four object types: Users, Security Groups, Shared Mailboxes, and Distribution Lists.
info Shared Mailboxes and Distribution Lists are created in Exchange Online via the Automation account's managed identity. If the Exchange connection isn't available, those two types degrade to Skipped (non-fatal) so Users and Security Groups still provision.

MCC "Migrate to Temp Domain" progress screen.

Migrate to Temp Domain progress
5 Send the Greeting Email
Go to Communications → Choose Language → Start Migration Notice. A preview window opens showing every outgoing email live before anything is sent. Once reviewed, either Send to All or select a subset of users and press Send.

MCC Communications live email preview window.

Communications live email preview
6 Monitor the Send
Emails go out from the it-support@harriscomputer.eu shared mailbox with a ~2-second delay between sends (~30 per minute) to stay within Exchange limits, and up to 4 automatic retries per recipient on throttling (honoring the Retry-After header). Status is visible in the terminal tab, but Exchange mail flow gives a clearer real-time view of delivery.

Exchange admin center mail flow report showing delivery status.

Exchange mail flow report
7 Weekly Activity Reporting
Once notices are out, generate a weekly Activity Report in MCC for the project. This shows which users have logged into their new accounts and completed MFA setup — a key adoption checkpoint before workload migration ramps up.

MCC Activity Report showing login / MFA status per user.

MCC Activity Report

flight_takeoff Branch 1 — AvePoint Fly Setup

With identities provisioned, the M365 workload migration (Exchange, Teams, SharePoint, OneDrive) moves to AvePoint Fly.

8 Generate Fly CSVs
In the MCC project, click Fly CSVs. You'll first choose a phase:
  • Phase 1 — Source → Temp (initial migration into the temp domain)
  • Phase 2 — Temp → Target (used after the domain transfer)
MCC then generates three workload CSVs — Exchange, OneDrive, and Teams — and reports how many Fly licenses are required for the object count being migrated.
info MCC does not emit a SharePoint CSV — the SharePoint migration project is set up manually in the Fly Portal.

MCC "Fly CSVs" phase choice + export with license-count summary.

MCC Fly CSVs export
9 Purchase Licenses and Create the Service Account
Confirm Fly licenses are purchased before creating any projects. In parallel, create a service account in the source tenant — this is required to establish the migration connection between tenants.

AvePoint Fly Connections page — source/destination tenant setup.

Fly Connections setup
10 Create Workload Projects in Fly
Using the CSVs from Step 8, create the migration projects in the Fly Portal: Exchange, Teams, and OneDrive from the MCC-generated CSVs, plus a SharePoint project set up manually (no MCC CSV for SharePoint).

AvePoint Fly Projects page showing the workload projects created.

Fly Projects page
11 Pre-Create Teams and Rooms
Before running the Teams migration, manually create the destination Teams (teams and meeting rooms) in the target tenant — Fly does not auto-create these container objects.

Teams admin center showing manually pre-created teams / rooms.

Pre-created Teams/Rooms
12 Note on Teams Chat
Teams chat history does not migrate into live Teams chat; it's exported and saved as an HTML file directly into each user's OneDrive.
13 Monitor the Migration
Track progress directly in the Fly Portal for real-time job status, or use the MCC charts, which refresh three times a day (every 8 hours).

MCC migration progress charts / AvePoint Fly job monitoring dashboard.

Migration monitoring

swap_horiz Branch 1 — Post-Migration & Cutover

After the bulk workload migration, users verify their data, incrementals catch up, the source domain is transferred, and MCC swaps every object onto its final target address.

14 Mid-Migration Update
Once initial workload migration finishes, go to MCC → Project → Communications → Mid-Migration Update. This notifies users that the initial migration is complete and asks them to log into their target address and verify OneDrive, Teams, and SharePoint content.

MCC Mid-Migration Update communication screen.

Mid-Migration Update
15 Begin Weekly Incrementals
Start weekly incremental migrations in Fly, continuing until the migration is fully caught up and confirmed complete.

AvePoint Fly incremental migration job schedule / history.

Fly incremental jobs
16 Domain Transfer
After user confirmation, the source domain is moved into the target tenant — coordinated primarily with Pierre and Martin S. — by transferring the DNS records. The moment the domain appears in the target tenant, it's time to cut everything over.

Entra ID / M365 admin center showing the domain verified in the target tenant.

Domain verified in target tenant
17 Run the Post-Migration Script
In MCC, click Post-Migration Script. For each object it sets the UPN and primary SMTP address to the Target value that was prepared back in Step 3 (the Target field on each object), then marks the object Completed.
info The script also looks up the object's company in the OnBoard CompanyDomains list to enrich address metadata only (company name, street, city, postal code, country, office). This is purely additive — if there's no matching company, it simply skips the address enrichment. CompanyDomains does not drive the target domain, and there is no "fall back to a Harris address" behaviour.

MCC Post-Migration Script execution / results screen.

Post-Migration Script results
18 Final Migration Notice
Send the Final Migration Notice via MCC → Communications, closing out the project for end users.

MCC Final Migration Notice communication screen.

Final Migration Notice
check_circle That completes the Branch 1 lifecycle — identities provisioned, workloads migrated, domain cut over, and users notified.

terminal Branch 2 — Manual / GitHub Path

This branch is used when MCC isn't the tool of choice, relying instead on two standalone PowerShell scripts from the GitHub repo (branch2/) that are downloaded and run locally by a Global Admin (interactive sign-in — no Azure Automation, no SharePoint dependency), plus a Power Automate-driven mailer. Domain transfer is identical to Branch 1. Full setup + per-step instructions: branch2/README.md.

terminal Prerequisites (once per machine): Install-Module Microsoft.Graph -Scope CurrentUser and Install-Module ExchangeOnlineManagement -Scope CurrentUser; sign in as a Global Administrator when prompted.
# Action Location
1 Fill templates/Provisioning_Template.csv, then run the provisioning script. It creates Users, Security Groups, Shared Mailboxes and Distribution Lists under the temp domain (harrisgroup.eu), generates unique passwords, and outputs a Provisioning_Results_<timestamp>.csv. GitHub → branch2/Provision-Objects.ps1
2 Update the CIT SharePoint Mailer's recipient list from the results CSV (temp UPN + password per user), then send the greeting template. CIT Mailer SharePoint list/site
3 Download AvePoint Fly CSV templates and populate them manually with the existing migration data Local / shared drive template storage
4 Create Fly projects (Exchange, Teams, OneDrive; SharePoint set up manually) and upload the completed CSVs. Pre-create destination Teams/Rooms. AvePoint Fly Portal
5 Send migration communications via the Mailer Power Automate → Flows shared with me → Migration Mailer Flow
6 After initial migration completes, send the mid-migration notice via the PA Flow Mailer and request data confirmation Same PA Flow
7 Begin weekly incremental migrations until complete AvePoint Fly Portal
8 Execute domain transfer (same process as Branch 1) Entra ID / M365 admin center
9 Fill templates/PostMigration_Template.csv (or reuse the provisioning results CSV), then run the post-migration swap to set each object's UPN + primary SMTP to the Target. Optional address enrichment via a local CompanyDomains CSV. GitHub → branch2/Set-PostMigrationDomain.ps1
10 Send the Final Migration Notice via the PA Flow Mailer Same PA Flow
lightbulb Onboarding tip: a good first task for a new PM is walking through Branch 1 end-to-end in a test/sandbox project while capturing the actual screen states above — turning the placeholders into a real visual runbook.