HomeServicesManaged IT ServicesAI DeploymentInsightsAnswersAboutFree Consultation
Google Workspace

How do I migrate Gmail, calendar and contacts from Google Workspace to Exchange Online step by step?

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.

  1. Go to Exchange admin center > Recipients > Contacts.
  2. Select Add a mail user.
  3. 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]).
  4. 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.

  1. Manual: in Chrome, sign in to admin.google.com, then open the Google Cloud Service Accounts page in a new tab.
  2. Select Create project, name it, then Create.
  3. Select + Create service account, enter a name, choose Create, then Done.
  4. Open Actions > Edit and note the Unique ID (the Client ID).
  5. Open Show domain-wide delegation, enable it, enter any product name for the consent screen, then Save.
  6. Open Actions > Create key, choose JSON, then Create. Store the downloaded key securely.
  7. In the API Library for the same project, enable Gmail API, Google Calendar API, Contacts API and People API.
  8. In the Google Admin console, go to Security > API Controls > Manage Domain Wide Delegation > Add new.
  9. 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
  10. Select Authorize. Allow 15 minutes to 24 hours for the settings to propagate.

Step 3: Create the migration batch in Exchange admin center

  1. Exchange admin center > Migration > Add migration batch.
  2. Enter a unique batch name and confirm the path is Migration to Exchange Online. Select Next.
  3. Select Google Workspace (Gmail) migration, then Next.
  4. 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.
  5. 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.
  6. On Gmail migration configuration, enter the Google admin email address and select Import JSON to load the key file.
  7. On Add user mailboxes, select Import CSV file. The CSV needs an EmailAddress column (required) and optionally Username if the Gmail address differs.
  8. 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.
  9. On Schedule batch migration, set start and end options, select Save, then Done.
  10. 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

ItemWhat happens
Mail and Gmail filtersMigrated. Filters become Outlook rules, turned off by default.
CalendarMigrated. Shared calendars and event colors are not.
ContactsMigrated, up to three email addresses per contact. Gmail tags, contact URLs and custom tags are not.
Vacation and automatic repliesNot migrated.
Room bookingsNot migrated.
Message sizeFollows tenant transport limit, default 35 MB.
Mailboxes over 100 GBUse Microsoft's large mailbox method to land data in primary and archive mailboxes.
Contacts and calendar throughputDepends on Google quota limits for your service account.
Google Drive filesNot part of this tool. Use Migration Manager (Microsoft 365 admin center > Setup > Migration resources).

Common errors and fixes

ErrorCauseFix
GooglePermanentWebException: ... Google Calendar API has not been used in project ... before or it is disabled ... (403) ForbiddenCalendar API not enabled in the Google projectEnable Google Calendar API, wait 5 to 10 minutes, then resume the batch.
GmailForwardingAddressRequiresVerificationException has occurredGoogle requires verification of the forwarding routing addressUse 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 authorizationOAuth scopes entered incorrectly, or delegation not yet propagatedRe-enter the exact scope list with no spaces, allow up to 24 hours, then retry.
Batch cannot completeRouting domain not verified or not an accepted domainVerify the subdomain in Google and add it to Microsoft 365 with its MX record.
Forwarding not set in GmailGoogle org blocks users from setting forwardingAllow SMTP forwarding in Google, then complete again.
Items reported as missingMRM or archive policies moved or deleted itemsDisable 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

Use automated when your Google admin has the Project Creator and Create Service Accounts roles. The Exchange admin center wizard then creates the project, service account, key and APIs, and you only paste the Client ID and scope into Google. Use manual when your Google admin must build the project or the automation cannot get those permissions. Both end at the same migration batch.
After the batch starts. Microsoft says users convert from mail users to mailboxes when the batch starts, and the Exchange license must be assigned only after that point. You then have 30 days to assign it. Mail users themselves do not need a license, so you can provision everyone early without paying for mailboxes nobody uses yet.
After. In a staged migration the primary domain MX stays on Google while batches run, and forwarding through the routing subdomains keeps mail flowing to the right mailbox. Once all batches are complete, update the MX record for the primary domain to point to Microsoft 365. Then remove the routing domains and extra aliases.
No. The Exchange Online Google Workspace migration covers mail and rules, calendar and contacts. Move Drive files to OneDrive and SharePoint with Migration Manager, found in the Microsoft 365 admin center under Setup > Migration resources. Migration Manager has its own file size limits and unsupported file types, so review those before you migrate.
Microsoft has a separate procedure for Google or other IMAP mailboxes over 100 GB that lands data in both the primary and archive mailbox in Exchange Online. Identify those users early and put them in their own batch. Also check single messages: the largest message that migrates follows your tenant transport limit, 35 MB by default.

Sources

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