Short answer
Use the built-in Google Workspace migration in Exchange Online. Add two routing subdomains (one pointing to Microsoft 365, one to Google), create a Google Cloud service account with domain-wide delegation, and provision every user as a mail user. Then create a batch in Exchange admin center > Migration > Add migration batch, wait for Synced, complete it, and switch your MX record after the last batch. It moves mail, rules, calendar and contacts.
Key facts
- The native tool migrates mail and rules, calendar and contacts from Google Workspace; Drive files need Migration Manager instead.
- Users must exist as mail users before the batch starts; they convert to mailboxes when it starts, and you then have 30 days to assign an Exchange Online license.
- The minimum Exchange permission for running the migration is the Recipient Management role group.
- The largest single message that migrates follows your tenant transport limit, which defaults to 35 MB.
- Migrated Gmail filters arrive as Outlook rules that stay turned off by default.
- Google Workspace migration is not available for Office 365 US Government GCC High or DoD.
Prerequisites and licensing
Plan the routing first. During a staged Google Workspace migration your primary domain MX record keeps pointing to Google until the last batch is done. Two routing subdomains carry mail between the systems while users move in batches. Microsoft's examples use o365.fabrikaminc.net (routes to Microsoft 365) and gsuite.fabrikaminc.net (routes to Google). Use subdomains of your primary domain so Google verifies them automatically.
Microsoft also warns that the migration tool does not understand messaging records management (MRM) or archive policies. Items those policies move or delete get flagged as missing. Turn off MRM and archive policies for these users until their migration completes.
- Microsoft 365: your primary domain is verified in the tenant, and you hold at least the Recipient Management role group in Exchange Online.
- Microsoft 365: add the Microsoft 365 routing subdomain (for example o365.contoso.com) as a domain in the tenant, with its MX record pointing to Microsoft 365, so it is an accepted domain.
- Google: in the Google Admin console, select Add a domain, choose User alias domain, and add the Microsoft 365 routing subdomain. Repeat for the Google routing subdomain (for example gws.contoso.com) and set up Google MX records for it.
- Google Cloud: the migration admin needs the Project Creator and Create Service Accounts roles (permissions resourcemanager.projects.create and iam.ServiceAccounts.create).
- Google: users must be allowed to set a forwarding address. If forwarding is blocked, the tool cannot set forwarding during the migration.
- Licensing: mail users do not need a license. Assign an Exchange Online license only after the batch starts and the mail user becomes a mailbox, within 30 days.
- Tools: Install-Module ExchangeOnlineManagement, then Connect-ExchangeOnline. Microsoft's Google steps assume a Chrome browser.
Step 1: Provision mail users in Microsoft 365
Every user who will migrate, now or later, needs a mail user object. The primary address should match the Google address ([email protected]). Set ExternalEmailAddress to the user's address at the Google routing domain, and add a proxy address at the Microsoft 365 routing domain. Microsoft notes that creating mail users in PowerShell can hit throttling, so build them in groups in larger tenants.
- Go to Exchange admin center > Recipients > Contacts.
- Select Add a mail user.
- Enter display name, alias, User ID and domain. Set External email address to the user's address at the Google routing domain (for example [email protected]).
- Set a password, select Next, review, then select Create.
# Create a mail user and add the Microsoft 365 routing alias
Connect-ExchangeOnline
New-MailUser -Name "Will Smith" -Alias will -FirstName Will -LastName Smith `
-ExternalEmailAddress [email protected] `
-MicrosoftOnlineServicesID [email protected] `
-Password (Read-Host "Enter password" -AsSecureString)
Set-MailUser -Identity will -EmailAddresses @{Add="[email protected]"}
Step 2: Configure Google Workspace (automated or manual)
Exchange admin center can automate the four Google prerequisites: create a project, create a service account, create a service key, and enable the APIs. The automated wizard downloads a JSON key (projectid-*.json) and shows the Client ID and scopes you paste into Google. Choose the manual method if your Google admin wants to build the project themselves or the automation lacks Google Cloud permissions.
- Manual: in Chrome, sign in to admin.google.com, then open the Google Cloud Service Accounts page in a new tab.
- Select Create project, name it, then Create.
- Select + Create service account, enter a name, choose Create, then Done.
- Open Actions > Edit and note the Unique ID (the Client ID).
- Open Show domain-wide delegation, enable it, enter any product name for the consent screen, then Save.
- Open Actions > Create key, choose JSON, then Create. Store the downloaded key securely.
- In the API Library for the same project, enable Gmail API, Google Calendar API, Contacts API and People API.
- In the Google Admin console, go to Security > API Controls > Manage Domain Wide Delegation > Add new.
- Paste the Client ID. In OAuth Scopes enter, comma separated with no spaces: https://mail.google.com/,https://www.googleapis.com/auth/calendar,https://www.google.com/m8/feeds/,https://www.googleapis.com/auth/gmail.settings.sharing,https://www.googleapis.com/auth/contacts
- Select Authorize. Allow 15 minutes to 24 hours for the settings to propagate.
Step 3: Create the migration batch in Exchange admin center
- Exchange admin center > Migration > Add migration batch.
- Enter a unique batch name and confirm the path is Migration to Exchange Online. Select Next.
- Select Google Workspace (Gmail) migration, then Next.
- On Prerequisites for Google Workspace migration, either select Start under Automate the configuration of your Google Workspace for migration and sign in to Google, or confirm you finished the manual steps. For automated setup, follow the API access link, select Add new, paste the Client ID and scope, then Authorize.
- On Set a migration endpoint, pick an existing endpoint or Create a new migration endpoint. Defaults are 20 maximum concurrent migrations and 10 maximum concurrent incremental syncs.
- On Gmail migration configuration, enter the Google admin email address and select Import JSON to load the key file.
- On Add user mailboxes, select Import CSV file. The CSV needs an EmailAddress column (required) and optionally Username if the Gmail address differs.
- On Move configuration, choose the Target delivery domain (your Microsoft 365 routing subdomain, for example o365.contoso.com). Leave Mail, Calendar, Contacts and Rules selected unless you want to filter.
- On Schedule batch migration, set start and end options, select Save, then Done.
- When the batch moves from Syncing to Synced, complete it.
PowerShell method
The same flow works in Exchange Online PowerShell. Test with a Google super admin address first. New-MigrationBatch also supports -ExcludeFolder to skip folders or Gmail labels, and -SkipRules to skip Gmail filters.
# Test, create the endpoint, then create, start and complete a batch
Connect-ExchangeOnline
$key = [System.IO.File]::ReadAllBytes("C:\Migration\gws-key.json")
Test-MigrationServerAvailability -Gmail -ServiceAccountKeyFileData $key -EmailAddress [email protected]
New-MigrationEndpoint -Gmail -ServiceAccountKeyFileData $key -EmailAddress [email protected] -Name gmailEndpoint
# CSV header: EmailAddress (Username optional)
New-MigrationBatch -SourceEndpoint gmailEndpoint -Name gmailBatch1 `
-CSVData ([System.IO.File]::ReadAllBytes("C:\Migration\batch1.csv")) `
-TargetDeliveryDomain "o365.contoso.com"
Start-MigrationBatch -Identity gmailBatch1
# After the batch reaches Synced
Complete-MigrationBatch -Identity gmailBatch1
Step 4: Mail routing and MX cutover
When a batch starts, each user becomes a mailbox and their ExternalEmailAddress moves to a forwarding address, so new mail still lands in Gmail while data syncs. At completion, Exchange runs a final incremental sync, removes the Microsoft 365 to Google forwarding, and adds forwarding in Gmail to the user's Microsoft 365 routing address. Migrated users then work in Outlook.
After every batch is complete, update the MX record for your primary domain to point to Microsoft 365. Then remove the routing domains and extra aliases. If you use non-default transport settings, make sure your default remote domain, or a remote domain for the Google routing domain, has automatic forwarding enabled. For a single cutover with no staged batches, Microsoft notes forwarding addresses are not needed.
What migrates and the limits
| Item | What happens |
|---|---|
| Mail and Gmail filters | Migrated. Filters become Outlook rules, turned off by default. |
| Calendar | Migrated. Shared calendars and event colors are not. |
| Contacts | Migrated, up to three email addresses per contact. Gmail tags, contact URLs and custom tags are not. |
| Vacation and automatic replies | Not migrated. |
| Room bookings | Not migrated. |
| Message size | Follows tenant transport limit, default 35 MB. |
| Mailboxes over 100 GB | Use Microsoft's large mailbox method to land data in primary and archive mailboxes. |
| Contacts and calendar throughput | Depends on Google quota limits for your service account. |
| Google Drive files | Not part of this tool. Use Migration Manager (Microsoft 365 admin center > Setup > Migration resources). |
Common errors and fixes
| Error | Cause | Fix |
|---|---|---|
| GooglePermanentWebException: ... Google Calendar API has not been used in project ... before or it is disabled ... (403) Forbidden | Calendar API not enabled in the Google project | Enable Google Calendar API, wait 5 to 10 minutes, then resume the batch. |
| GmailForwardingAddressRequiresVerificationException has occurred | Google requires verification of the forwarding routing address | Use a subdomain of your primary domain that Google verifies automatically, and follow Microsoft's prerequisites note for this error. |
| Batch fails after it starts on Google authorization | OAuth scopes entered incorrectly, or delegation not yet propagated | Re-enter the exact scope list with no spaces, allow up to 24 hours, then retry. |
| Batch cannot complete | Routing domain not verified or not an accepted domain | Verify the subdomain in Google and add it to Microsoft 365 with its MX record. |
| Forwarding not set in Gmail | Google org blocks users from setting forwarding | Allow SMTP forwarding in Google, then complete again. |
| Items reported as missing | MRM or archive policies moved or deleted items | Disable MRM and archive policies until migration completes. |
How to verify it worked
In Exchange admin center > Migration, open the batch and check each user shows Synced, then Completed. Confirm users appear under Recipients > Mailboxes, assign licenses within 30 days, and send a test message to a migrated user. Have a pilot user check calendar, contacts and rules in Outlook, then turn the rules back on.
# Check batch and per-user status, errors and skipped items
Get-MigrationBatch -Identity gmailBatch1 -IncludeReport | Format-List Status,Report
Get-MigrationUser -BatchId gmailBatch1 | Get-MigrationUserStatistics |
Format-Table Identity,Status,ItemsSynced,ItemsSkipped
Get-MigrationUserStatistics -Identity [email protected] -IncludeReport |
Format-List Status,Error,Report
Get-MigrationUserStatistics -Identity [email protected] -IncludeSkippedItems |
Select-Object -ExpandProperty SkippedItems | Format-List DateReceived,Subject
When to call a consultant
Tell us your user count and timeline. We will map the routing, batches and cutover with you in a short call.
Take the 2-min fit check Talk to a specialist
How Accred Consulting approaches it
Accred is a US-based team that runs Google Workspace to Microsoft 365 moves for small and mid-size businesses. After a free call we scope the work as fixed-fee or hourly and hand you a written plan: routing subdomains, mail user provisioning, batch order, MX cutover date and rollback steps. We set up the Google project and delegation with your Google admin, then run a pilot batch first so a few users confirm mail, calendar, contacts and rules before everyone moves. Drive content runs in parallel with Migration Manager.
Track record: 475+ client projects, 2,000+ migration workstreams and 210,000+ users migrated by a US-based team. Company facts · Case studies
Related questions
Sources
- Microsoft Learn: Google Workspace migration prerequisites in Exchange Online
- Microsoft Learn: Perform an automated Google Workspace migration in EAC
- Microsoft Learn: Migrate mail from Google Workspace to Microsoft 365 (manual method)
- Microsoft Learn: Perform Google Workspace migration using Exchange Online PowerShell
Want this scoped for your environment?
Book a free consultation. After discovery you get a written plan with scope, pricing (fixed fee, hourly, retainer or block of hours) and a timeline.
Book a free consultation