Migration playbook · Business apps

Power Apps and Power Automate tenant-to-tenant migration

Mailbox and file migration tools skip Power Apps and Power Automate. This guide covers both routes Microsoft documents: the self-service Dataverse environment move, and export and import of solutions and packages, with the connection, environment variable and flow fixes each one needs.

Updated 4 Nov 20267 phases34 detailed steps13 official sources
Start here

Your migration plan

This moves Power Apps and Power Automate flows from one Microsoft 365 tenant (your organisation's own Microsoft 365 setup) to another. Production and sandbox environments (containers for apps, flows and data) that use Dataverse (Microsoft's business database) can be moved whole with Microsoft's built-in environment move, which Microsoft calls tenant-to-tenant migration. Everything else is exported as solutions (bundles of apps and flows) or packages and imported. Connections and gateways never move with either method, so you recreate them. For each environment move, the new tenant's admin must approve the request within seven days, you must run the move within seven days of preparing it, and the move itself can take up to 24 hours.

Recommended routeTenant-to-tenant environment move for Dataverse environments, solutions for everything else

The environment move keeps the URL, organisation ID and data. Solutions move apps, flows, connection references and environment variables together.

Other options and when to use them
  • Export packages for single apps and flows: A few one-off apps or flows sit outside solutions, for example in the default environment.
  • Third-party tool such as Apps4.Pro or AvePoint Fly: You have many apps and flows the environment move cannot take, and do not want to package them all into solutions by hand.
Order to migrate in, and why

Apps and flows depend on people, connections and the data they use, so those come first. Rehearse the environment move on a copy, move Dataverse environments, then import everything else, and switch flows over in one window at the end so nothing runs twice.

  1. Inventory of environments, apps, flows, connections and what each one usesConnections, custom connectors and gateways never move, so you need the full list to rebuild them.
  2. Target users created and licensed, and the data apps use moved firstApps and flows are re-owned by target accounts, the environment move fails for an unlicensed admin, and flows must point at SharePoint sites and mailboxes that already exist in the target.
  3. Data policies, gateways and target environments in the new tenantImported apps and flows fail or cannot be turned on if a data policy groups their connectors differently.
  4. Rehearsal of the environment move on a sandbox copyShows mapping errors and what breaks, without risking production.
  5. Canvas apps exported and deleted, then the Dataverse environment movedMicrosoft says canvas apps, custom pages and component libraries left in the environment do not work after the move.
  6. Solutions and packages imported for everything elseDefault, developer, trial and Teams environments cannot use the environment move, so their items travel as solutions or packages.
  7. Connections, environment variables, security groups and trigger addresses fixedNone of these carry over, and imported flows stay off until they are set.
  8. Cutover: source flows off and target flows on in one window, child flows firstTwo copies of a flow on the same mailbox or list both run and send duplicates, and parent flows need their child flows running.
Settings checklist: decide these before you copy

Built-in and third-party tools treat these differently. Tick each one off once you have decided.

Download this checklist (Excel)
  • How each tool handles it
    Built-in methodEnvironment move (Microsoft calls it tenant-to-tenant migration): production and sandbox environments only. Default, developer, trial and Teams environments are not supported, and neither is a move between a government cloud (GCC) and the public cloud.
    Apps4.ProMigrates cloud flows between tenants with environment and user mapping.
    AvePoint FlyMigrates Power Apps and Power Automate flows between environments and tenants. Default environment support: not stated in AvePoint's documentation: test it in your pilot.

    Tip: Put the default environment items people really need into solutions, and let personal experiments go.

    Microsoft Learn: Tenant-to-tenant migrations (Power Platform)
  • How each tool handles it
    Built-in methodEnvironment move: the Dataverse database (Microsoft's business database) is linked to the new tenant rather than copied. The environment URL, organisation ID and name stay the same. Settings that are not copied must be set again, and a managed environment must be turned on again, which needs the licence in the target.

    Tip: Screenshot environment settings before the move so you can compare.

    Microsoft Learn: Tenant-to-tenant migrations (Power Platform)
  • How each tool handles it
    Built-in methodEnvironment move: solution-aware canvas apps, custom pages and component libraries not deleted before the move do not work afterwards. Apps outside solutions are exported as packages and imported again. Component libraries are not supported.
    AvePoint FlyCanvas and model-driven apps: AvePoint's page does not say which app types: test it in your pilot.

    Tip: Check each exported .zip opens before you delete the app, and keep the files until sign-off.

    Microsoft Learn: Tenant-to-tenant migrations (Power Platform)
  • How each tool handles it
    Built-in methodBoth Microsoft routes: connections, custom connectors and gateways are never migrated. With solutions, each connection reference (a shared connection setting inside the solution) asks for a target connection on import.
    Apps4.ProUsers sign in to its End User Portal to set up connections again and restore each flow.

    Tip: Switch flows to connection references before export, so each connection is chosen once per solution.

    Microsoft Learn: Tenant-to-tenant migrations (Power Platform)
  • How each tool handles it
    Built-in methodEnvironment move: one file per environment named usermapping.csv (the name is case sensitive), with exactly two columns, Source and Destination, separated by commas, no duplicates. Users must exist and be active in both tenants. Users left out are not mapped, application users cannot move, and the move fails if a destination admin has no licence.
    Apps4.ProMaps flow creators and owners to target users.

    Tip: Download the validation errors after uploading the file, fix them, and upload again.

    Microsoft Learn: Tenant-to-tenant migrations (Power Platform)
  • How each tool handles it
    Built-in methodEnvironment move: security groups are not migrated. An admin who was not in the mapping file sees an empty environment until given the System Administrator role.

    Tip: Put every admin who will check the move in the mapping file, then reconnect the security group.

    Microsoft Learn: Tenant-to-tenant migrations (Power Platform)
  • How each tool handles it
    Built-in methodImported flows are turned off by default; start child flows before parent flows. Whether run history comes with a solution or environment move: not stated in Microsoft's documentation: test it in your pilot.
    Apps4.ProMigrates each flow's on or off state. Run history and desktop flows are not migrated.

    Tip: Export run history you must keep for records from the source before it is deleted.

    Microsoft Learn: Tenant-to-tenant migrations (Power Platform)
  • How each tool handles it
    Built-in methodHTTP-triggered flows get a new URL after import, so every caller must be updated. Triggers on forms, lists and mailboxes still point at the source until you change them.
    Apps4.ProIts inventory does not include trigger and action details. How triggers are repointed: not stated in Apps4.Pro's documentation: test it in your pilot.

    Tip: Record every HTTP trigger URL and its callers in the inventory.

    Microsoft Learn: Tenant-to-tenant migrations (Power Platform)
  • How each tool handles it
    Built-in methodSolution import: remove current values from the solution before export, so the import asks for target values. For Copilot Studio agents, Microsoft says environment variables are set again after an environment move.

    Tip: Keep a table of every variable with its source and target value.

    Microsoft Learn: Tenant-to-tenant migrations (Power Platform)
  • How each tool handles it
    Built-in methodData policies are set per tenant in the Power Platform admin center, so you create them again in the target. If a target policy groups a connector differently, imported apps and flows fail or cannot be turned on.
    Microsoft.PowerApps.Administration.PowerShellGet-DlpPolicy reads source policies and New-DlpPolicy creates them in the target. New connectors left in the default group are not returned, so check that group by hand.

    Tip: Copy each source policy into the target admin center before the first import.

  • How each tool handles it
    Built-in methodSolution import: a solution file can be up to 95 MB. An import lists missing dependencies, which must be installed before it succeeds.

    Tip: Split large solutions before export, and import dependencies first.

  • How each tool handles it
    Built-in methodEnvironment move: the target admin must approve within seven days, and you must run the move within seven days of a successful prepare step, or start the prepare again. Allow up to 24 hours. Background operations do not run during the move. You can cancel any time before it completes; Microsoft documents no undo afterwards.

    Tip: Book the move outside business hours, and keep your solution exports in case you must rebuild.

    Microsoft Learn: Tenant-to-tenant migrations (Power Platform)
  • How each tool handles it
    Built-in methodEnvironment move: Dynamics 365 Customer Voice and Omnichannel for Customer Service are not supported. Power Pages sites are deleted before the move and provisioned again after it. Mailboxes are set up automatically only for mapped users who already have a mailbox in the target.

    Tip: Plan these separately before you book the environment move.

    Microsoft Learn: Tenant-to-tenant migrations (Power Platform)
The plan, phase by phase
  1. 1

    Take stock

    Before you start
    Show the detailed steps (5) →
  2. 2

    Choose a route

    Watch out: Environment move: default, developer, trial and Teams environments cannot use it.

    Ways around it

    • Add the items you need to a solution and import it into a target production environment.

    Tools that can do it

    • Apps4.ProMigrates cloud flows between tenants with environment and user mapping. Run history and desktop flows are not migrated, and users fix connections in the target.
    • AvePoint FlyMigrates Power Apps and Power Automate flows between environments and tenants, with an inventory scan and automatic mapping. Confirm default environment support with a pilot.

    Watch out: Environment move: Customer Voice, Omnichannel and component libraries are not supported.

    Ways around it

    • Plan those separately before you book the move.
    Show the detail →
  3. 3

    Prepare the target

    Watch out: If a target data policy groups a connector differently, imported apps and flows fail or cannot be turned on.

    Ways around it

    • Copy each source policy's connector groups into the target admin center before importing.

    Tools that can do it

    Show the detailed steps (5) →
  4. 4

    Move Dataverse environments

    After the mailbox move, rehearsed on a sandbox first

    Watch out: Environment move: canvas apps, custom pages and component libraries not deleted before the move will not work afterwards.

    Ways around it

    • Export them, delete them, and import them again after the move. Keep the .zip files until sign-off.

    Watch out: Environment move: users left out of the mapping file are not mapped, and an admin left out sees an empty environment.

    Ways around it

    • Use commas, no duplicates and exactly two columns. Download the errors after validation and fix them.
    Show the detailed steps (9) →
  5. 5

    Import apps

    Watch out: Solution import: each solution file can be up to 95 MB.

    Ways around it

    • Split large solutions into smaller ones before export.
    Show the detailed steps (6) →
  6. 6

    Move flows

    Watch out: Package import: if the target has Create in Dataverse solutions turned on, flow packages outside a solution cannot be imported.

    Ways around it

    • Add the flow to a solution in the source and use solution import.
    Show the detailed steps (6) →
  7. 7

    Test and cut over

    Watch out: Source and target flows on the same mailbox or list both run, sending duplicate emails or writing twice.

    Ways around it

    • Keep target flows off until the cutover window, then switch both in one go.

    Watch out: Environment move: you can cancel it until it completes, but Microsoft documents no undo afterwards. Deleting the source environment is permanent.

    Ways around it

    • The way back is a second move in the opposite direction, so rehearse first and keep your exports.

    Turn this phase into dated tasks with the cutover planner

    Show the detailed steps (3) →
You are finished when
  • Every app and flow you kept is listed in its target environment, and each moved environment shows Succeeded.
  • Every connection reference is connected and no environment variable points at the source tenant.
  • Each flow is On with a successful test run, and each app has a signed test script.
  • No migrated flow is still On in the source.

Tools named in this plan are independent third-party products, not endorsed by the platform vendor and not paid placements. Check the tool's own documentation and run a pilot first.

Click by click

Detailed steps

Open a part when you reach it in the plan. Each step says where to go, what to do and what you should see.

About this migrationWhat it covers, limits at a glance

Cross-tenant mailbox, OneDrive and SharePoint migrations do not touch Power Apps or Power Automate. Microsoft documents two routes. A production or sandbox environment with Dataverse can be linked to the target tenant with the self-service tenant-to-tenant move, which keeps its URL, organisation ID and data. Everything else, including apps and flows in the default environment, is exported as solutions or packages and imported in the target.

In both routes, connections, custom connectors, gateways and security groups are rebuilt in the target. Run this work alongside the Microsoft 365 tenant-to-tenant migration. Target users must exist and be licensed first, because apps and flows are re-owned by target accounts and the environment move fails for unmapped administrators.

Dataverse environmentsSelf-service tenant-to-tenant move (production and sandbox only)
Apps and flows outside DataverseExport as solutions or packages and import
Solution file limit95 MB per solution file
Connections and gatewaysNever migrated; recreate in the target
Move timingApprove within 7 days; migrate within 7 days of prepare; allow up to 24 hours
1What you need before step one
NeedDetailsWhere to get it
Power Platform administrator (or Dynamics 365 administrator)In both tenants, for inventory, the environment move and approvals.Microsoft 365 admin center, https://admin.microsoft.com, Roles > Role assignments
Target users, licensedEvery app owner, flow owner and environment user created and licensed in the target before any move.Bulk create users and assign licences
Power Platform admin centerEnvironments, data policies and the environment move.https://admin.powerplatform.microsoft.com
Power Apps and Power Automate makersSolutions, app packages and flow packages.https://make.powerapps.com and https://make.powerautomate.com
Windows PowerShell 5.x with Microsoft.PowerApps.Administration.PowerShellMicrosoft says this module needs Windows PowerShell 5.x and does not work in PowerShell 6 or later. Run PowerShell as administrator to install it.https://learn.microsoft.com/en-us/power-platform/admin/powershell-installation
Azure PowerShell (Az)Microsoft lists it as a prerequisite for both admins when you move an environment with PowerShell.Install Azure PowerShell
On-premises data gatewayOnly if apps or flows use on-premises data. Register a new one in the target.Power BI guide, Step 4
2Inventory environments, apps, flows and connections5 steps
  1. 1

    Install the admin module and sign in

    Where: Windows PowerShell 5.x on a Windows admin PC, run as administrator (Start > type Windows PowerShell > right-click > Run as administrator)

    Microsoft recommends the PowerShell for Power Platform Administrators module for the tenant-to-tenant move, and it also gives you the inventory cmdlets. Check the version first: it must be 5.x. If prompted to change the repository InstallationPolicy, type A and press Enter. Add-PowerAppsAccount opens a sign-in window: sign in as a Power Platform administrator of the source.

    $PSVersionTable.PSVersion
    Install-Module -Name Microsoft.PowerApps.Administration.PowerShell
    Update-Module -Name Microsoft.PowerApps.Administration.PowerShell
    Add-PowerAppsAccount
    You should see: The version shows Major 5, and Add-PowerAppsAccount returns to the prompt without errors.
  2. 2

    List environments, apps and flows

    Where: Same Windows PowerShell session (source tenant)

    Export every environment with its type, then every app and flow with its owner. Create C:\migration first.

    Get-AdminPowerAppEnvironment | Select-Object DisplayName,EnvironmentName,EnvironmentType,Location |
      Export-Csv C:\migration\environments.csv -NoTypeInformation
    Get-AdminPowerApp | Select-Object DisplayName,AppName,EnvironmentName,@{n="Owner";e={$_.Owner.email}} |
      Export-Csv C:\migration\apps.csv -NoTypeInformation
    Get-AdminFlow | Select-Object DisplayName,FlowName,EnvironmentName,CreatedBy,Enabled |
      Export-Csv C:\migration\flows.csv -NoTypeInformation
    You should see: Three CSV files in C:\migration, with EnvironmentType showing Default, Production, Sandbox and so on.
  3. 3

    List connections

    Where: Same Windows PowerShell session (source tenant), once per environment ID from environments.csv

    Record every connection per environment, including custom connectors and on-premises data gateways. None of them move.

    Get-AdminPowerAppConnection -EnvironmentName <EnvironmentId> |
      Select-Object DisplayName,ConnectorName,CreatedBy,CreatedTime |
      Export-Csv C:\migration\connections.csv -NoTypeInformation
    You should see: connections.csv lists each connection with its connector and creator.
  4. 4

    Mark each item as solution-aware or not

    Where: Power Apps (https://make.powerapps.com) > environment picker (top right) > Solutions, for each environment

    Pick each environment, open Solutions and open each unmanaged solution to see which apps and flows it contains. Add a "Solution" column to apps.csv and flows.csv. That decides the route in Step 2.

    You should see: Every app and flow row says which solution it is in, or "none".
  5. 5

    Note hard-coded references

    Where: Your dependency map (Application inventory and dependency map), filled from each app in Power Apps Studio and each flow in the flow designer

    For each app and flow, record SharePoint site URLs, list names, mailbox addresses, Teams channels, HTTP trigger URLs and any Microsoft Forms used as triggers. These all change in the target.

    You should see: Every app and flow has its external references listed.
3Choose a route for each item
ItemRouteNotes
Production or sandbox environment with DataverseTenant-to-tenant environment moveDefault, developer, trial and Teams environments are not supported
Solution-aware canvas apps, custom pages, component librariesExport solution, delete, move environment, importMicrosoft says they will not work after a move if not deleted first
Canvas apps not in a solutionExport package, Import canvas appOne package per app
Flows in solutionsMove with the solution or environmentConnection references need new connections
Flows not in a solutionAdd to a solution, or export a Package (.zip)Packages are for one-off moves of single flows
Connections, custom connectors, gatewaysRecreateNever migrated
Security groups and application usersRecreateNot migrated with the environment
Unsupported with the environment move. Microsoft lists Dynamics 365 Customer Voice, Omnichannel for Customer Service and component libraries as unsupported, and does not support moves between GCC and the public cloud.
4Prepare the target tenant5 steps
  1. 1

    Create and license users

    Where: Microsoft 365 admin center (target) > Users > Active users, and Billing > Licenses

    Create every app owner, flow owner and environment user in the target Microsoft Entra ID and assign licences (bulk create users, assign licences). Users not in the mapping file see an empty environment after a move.

    You should see: Every owner in apps.csv and flows.csv has an active, licensed target account.
  2. 2

    Create target environments

    Where: Power Platform admin center (target) > Manage > Environments > New

    For the export and import route, select New, enter the Name, Region and Type, set Add a Dataverse data store to Yes where needed (this cannot be undone) and select Next. Choose Language, URL, Currency and a Security group, then select Save.

    You should see: The environment appears on the Environments page and its state changes to Ready.
  3. 3

    Recreate data policies

    Where: Power Platform admin center (target) > Security > Data and privacy > Data policy > + New Policy

    Recreate data loss prevention policies so imported apps and flows are allowed to use their connectors. Name the policy, move the connectors your apps use into Business as in the source policy, choose custom connectors and the environments in scope, and create it.

    You should see: The policy is listed under Data policy with the same Business connectors as the source.
  4. 4

    Install gateways in the target

    Where: The always-on gateway machine (see the Power BI guide, Step 4)

    Install and register on-premises data gateways in the target before importing anything that uses them. The steps are the same as in the Power BI guide.

    You should see: The gateway appears in the target under Power Apps or Power Automate gateways.
  5. 5

    Move dependent data first

    Where: Your migration runbook

    Apps and flows that read SharePoint lists or files should be imported after those sites have moved. See SharePoint cross-tenant migration.

    You should see: The runbook schedules each app and flow after the sites it depends on.
5Move Dataverse environments with the tenant-to-tenant move9 steps

The move links the environment to the destination tenant. Microsoft says the URL, organisation ID and name stay the same, and the source keeps an environment shell without its Dataverse organisation. Test on a sandbox copy of production first. You can run it in the Power Platform admin center or with PowerShell; both are shown.

  1. 1

    Export and remove solution-aware canvas apps

    Where: Power Apps (https://make.powerapps.com, source environment) > Solutions

    Select each unmanaged solution, select Export, choose Publish all changes and Next, pick Managed or Unmanaged and select Export. Then delete solution-aware canvas apps, custom pages and component libraries: delete managed solutions to remove their apps; use Delete from this environment for apps in unmanaged solutions. Export Copilot Studio agent solutions the same way, and delete Power Pages websites, which you reprovision afterwards.

    You should see: A .zip per solution in your Downloads folder, and no canvas apps left in the source environment's Solutions.
  2. 2

    Export and remove apps that are not in a solution

    Where: Power Apps (source environment) > Apps > the app > More Commands > Export package (preview)

    For each app select More Commands, then Export package (preview), enter the details and select Export. Then delete the app. Admins can also view and delete canvas apps in the Power Platform admin center: Manage > the environment > Resources > Power Apps.

    You should see: One package .zip per app, and the apps no longer listed in the source environment.
  3. 3

    Put flows in solutions

    Where: Power Automate (https://make.powerautomate.com) > Solutions > the solution > Add existing > Automation > Cloud flow, or Windows PowerShell

    Flows already in Dataverse solutions move with the environment. Add the rest from the Outside Dataverse tab and select Add, or add them in bulk with PowerShell.

    Add-AdminFlowsToSolution -EnvironmentName <EnvironmentId> -SolutionId <SolutionId>
    You should see: The flows appear under Cloud flows in the solution.
  4. 4

    Build the user mapping file

    Where: A text editor on your admin PC, saved as C:\migration\usermapping.csv

    Name it usermapping.csv (case-sensitive) with exactly two comma-separated columns, Source and Destination, and no spaces around the header. Every user must exist and be active in both tenants. Each environment needs its own file. If you include administrative access users, the destination users must be licensed or the move fails.

    Source,Destination
    user1@contoso.com,user1@fabrikam.com
    user2@contoso.com,user2@fabrikam.com
    You should see: A two-column CSV with one row per user and no duplicate or identical addresses.
  5. 5

    Submit the request

    Where: Power Platform admin center (source) > Manage > Environments > the environment > Move environment, or Windows PowerShell (source admin)

    Select the environment, then Move environment on the command bar. Enter the destination tenant ID in Target tenant ID and select Submit request. With PowerShell, submit and record the migration ID.

    TenantToTenant-SubmitMigrationRequest -EnvironmentName <EnvironmentId> -TargetTenantID <TargetTenantId>
    TenantToTenant-ViewMigrationRequest
    You should see: The target tenant sees a pending request banner on its Environments page. PowerShell shows the migration ID.
  6. 6

    Approve the request in the target

    Where: Power Platform admin center (target) > Manage > Environments > Review moves banner, or Windows PowerShell (target admin)

    Select Review moves on the banner, select the environment ID, review and approve. Requests expire after seven days if not approved.

    Add-PowerAppsAccount
    TenantToTenant-ViewApprovalRequest
    TenantToTenant-ManageMigrationRequest -MigrationId <MigrationId>
    You should see: The source environment's details page shows a Begin move banner.
  7. 7

    Upload the mapping file and validate

    Where: Power Platform admin center (source) > the environment > Begin move, or Windows PowerShell (source admin)

    Select Begin move, upload usermapping.csv and select Validate. With PowerShell, upload the file, copy the read-only container URI from the output, then run prepare and check the status. If validation fails, select Download errors (or open the SAS URL from the status), fix the file and upload it again.

    TenantToTenant-UploadUserMappingFile -EnvironmentName <EnvironmentId> -UserMappingFilePath C:\migration\usermapping.csv
    TenantToTenant-PrepareMigration -MigrationId <MigrationId> -TargetTenantId <TargetTenantId> -ReadOnlyUserMappingFileContainerUri <SasUri>
    TenantToTenant-GetMigrationStatus -MigrationId <MigrationId>
    You should see: A Move environment banner appears in the admin center, or the status shows "Validate Tenant To Tenant Migration: Succeeded".
  8. 8

    Run the migration

    Where: Power Platform admin center (source) > the environment > Move environment, or Windows PowerShell (source admin)

    Select Move environment, review the pre-move steps, tick the confirmation and select Move environment. Run the move within seven days of a successful prepare, or prepare again. Microsoft says to allow up to 24 hours and that a lack of visible progress does not mean failure. You can cancel with Cancel move before it completes.

    TenantToTenant-MigratePowerAppEnvironment -MigrationId <MigrationId> -TargetTenantId <TargetTenantId>
    TenantToTenant-GetMigrationStatus -MigrationId <MigrationId>
    You should see: The status shows "Migrate Environment: Succeeded", and the environment appears in the target with the same name and URL.
  9. 9

    Fix up the environment

    Where: Power Platform admin center (target) > Manage > Environments > the environment > Settings > Users + permissions > Users

    Select each validating admin, Manage security roles, tick System Administrator and Save. Then update security groups, re-enable Managed Environments (with the required licence), update environment settings that were not copied, and reconfigure connections, custom connectors and gateways. Generative AI settings reset to environment defaults.

    You should see: The admins see the environment's data, and the environment settings match your inventory.
6Export and import Power Apps6 steps

Use this route for apps in environments that cannot use the environment move, and to reimport the apps you exported before a move. Microsoft recommends solutions for application lifecycle management.

  1. 1

    Export solutions

    Where: Power Apps (https://make.powerapps.com, source environment) > Solutions > the solution > Export

    Select the unmanaged solution and Export. In Before you export select Publish all changes and Next. In Export this solution choose Export as Managed for production targets or Unmanaged if development continues in the target, then select Export. A solution file can be up to 95 MB.

    You should see: The solution .zip downloads to your browser's download folder after a few minutes.
  2. 2

    Import solutions

    Where: Power Apps (target environment) > Solutions > Import solution

    Select Import solution, choose Browse, pick the .zip and select Next. Pick or create a connection for each connection reference and select Next, enter environment variable values that are not already set, then select Import. Unmanaged imports arrive as drafts and must be published.

    You should see: A notification on the Solutions page says the import succeeded, and the solution is listed.
  3. 3

    Handle missing dependencies

    Where: Power Apps (target environment) > Solutions > import notification > Download Log File, or See history

    If the import lists missing dependencies, install them (the import screen links to available updates) and restart the import. If it fails, select Download Log File; Microsoft says the most common cause is missing required components.

    You should see: The re-run import succeeds without dependency warnings.
  4. 4

    Export canvas apps not in a solution

    Where: Power Apps (source environment) > Apps > the app > Export package

    Select the app and Export package. Enter a Name and Description, set each resource's import action to Update or Create as new, and select Export. Microsoft says you can only import the exported package; edits to the package file are not supported.

    You should see: A package .zip downloads.
  5. 5

    Import canvas app packages

    Where: Power Apps (target environment) > Apps > Import canvas app

    Select Import canvas app, then Upload and the package. Select Import Setup (the wrench) for each resource and choose Create as new or Update. For connections choose Select during import and pick or create the target connection. Select Import. Choosing Update on an existing app saves a draft that you must publish.

    You should see: The import page reports success and the app appears under Apps.
  6. 6

    Reconnect data and share

    Where: Power Apps Studio (target) > Data pane, then Apps > the app > Share

    Repoint SharePoint, Dataverse and SQL data sources to target locations, re-add gateway connections, reconfigure any flows associated with the app, publish, and share the app again with target users and groups.

    You should see: The app runs without data source errors for a target test user.
7Move Power Automate flows, connections and environment variables6 steps
  1. 1

    Prefer solutions

    Where: Power Automate > Solutions > the solution > Add existing > Automation > Cloud flow, or Windows PowerShell (source)

    Solution-aware flows move with their solution or with an environment move. Add existing flows from the Outside Dataverse tab, or use Add-AdminFlowsToSolution, all at once or by flow ID.

    Add-AdminFlowsToSolution -EnvironmentName <EnvironmentId> -FlowNames <flowId1>,<flowId2> -SolutionId <SolutionId>
    You should see: The flows are listed under Cloud flows in the solution.
  2. 2

    Use connection references

    Where: Power Apps or Power Automate (target environment) > Solutions > the solution > Connection references

    Flows in solutions should use connection references rather than direct connections. After import, open the solution, go to the connection references and reauthenticate or link each one to a target connection. If a flow will be turned on by another user, share the connection with them (Connections > the connection > Share > Can use).

    You should see: Every connection reference shows a connected target connection.
  3. 3

    Set environment variables for the target

    Where: Power Apps (source environment) > Solutions > the solution > the environment variable > Current Value > ... > Remove from this solution; then the import wizard in the target

    Environment variables hold values such as SharePoint site URLs and list names. Remove the current value from the solution before export so it stays in the source, then enter the target value on import. Values are limited to 2,000 characters. For SharePoint data source variables, column display names and logical names must match between source and target.

    You should see: The import wizard asks for each variable and the target values show in the solution afterwards.
  4. 4

    Export single flows as packages

    Where: Power Automate (source) > My flows > Cloud flows > the flow > Export > Package (.zip); target > My flows > Import > Import Package (Legacy)

    For a one-off move of a flow outside a solution, select the down arrow next to Export, choose Package (.zip), enter a name and select Export. In the target select Import > Import Package (Legacy), Upload the .zip, set Create as New or Update under IMPORT SETUP, choose connections under Related Resources and select Import. Only the owner or a co-owner can export, and the importer needs the Environment Maker role. If the target has Create in Dataverse solutions turned on, you cannot import packages with non-solution flows and must use solution import.

    You should see: The flow appears under My flows in the target, turned off.
  5. 5

    Turn flows on in the right order

    Where: Power Automate (target) > Solutions > the solution > Cloud flows, or My flows

    Imported flows are off. Turn on child flows before the parent flows that call them.

    You should see: Each flow shows On and a test run succeeds in its run history.
  6. 6

    Update triggers and endpoints

    Where: Power Automate (target) > the flow > Edit

    Flows triggered by HTTP requests get new URLs after import; copy the new URL from the trigger and update every caller. Flows triggered by Microsoft Forms, SharePoint lists or shared mailboxes must be edited to use the target resources.

    You should see: Each trigger points at a target resource, and callers use the new HTTP URLs.
Avoid double runs. Turn off source flows at cutover so they do not run alongside the target copies, for example sending duplicate emails or writing to the same list twice.
8Power BI, Microsoft Forms and Planner

These workloads need their own approach and have their own guides:

Move Forms before rebuilding flows that use Forms triggers, and Power BI after the SharePoint data its models read from.

9Test with owners and decommission the source3 steps
  1. 1

    Owner testing

    Where: Power Apps and Power Automate in the target, and your UAT test scripts

    Have each app and flow owner test in the target with real accounts. Check sharing, connections, run history of a test run, and that data lands in the target locations.

    You should see: Every app and flow has a signed UAT script.
  2. 2

    Cut over

    Where: Power Automate (source) > My flows; Power Apps (source) > Apps > Share

    Turn off source flows, remove source app sharing or set a message in the app pointing to the new one, and send users the new links.

    You should see: Source flows show Off and users open the target apps.
  3. 3

    Clean up the source

    Where: Power Platform admin center (source) > Manage > Environments > ... next to the environment > Delete

    After validation, select the ellipsis next to the orphaned source environment, select Delete, provide the confirmation and select Confirm. Microsoft says to do this only once you have confirmed the data is no longer needed in the source tenant.

    You should see: The environment no longer appears on the source Environments page.
Worth knowing

Expert notes

The detail behind the plan: options compared, and what experienced engineers check first. Tap any item.

Compare all the ways to do this3 options

Tenant-to-tenant environment move

High effort

Best for: Production or sandbox environments with Dataverse

  • Keeps the environment URL, organisation ID and data
  • Self-service from the Power Platform admin tools
  • Default, developer, trial and Teams environments are not supported
  • Solution-aware canvas apps must be exported and deleted first
  • Connections, gateways, security groups and application users are recreated
Read more →

Export and import solutions

Medium effort

Best for: Apps and flows that are, or can be added to, solutions

  • Moves apps, flows, connection references and environment variables together
  • Repeatable between test and production
  • 95 MB limit per solution file
  • Connections must be created again in the target

Export packages for single apps and flows

Low effort

Best for: One-off canvas apps and flows outside solutions, such as those in the default environment

  • Quick for a small number of items
  • No need to restructure into solutions
  • One package per app
  • Meant for one-off moves, not ongoing promotion
Our advice

Choose a route per item, not per tenant. Move Dataverse production and sandbox environments with the tenant-to-tenant move, put everything else you can into solutions, and keep packages for the few single apps and flows left over. Plan to recreate every connection and gateway whichever route you use.

Rehearse on a sandbox copy of productionReduces risk

The environment move changes the source environment itself and Microsoft recommends a test migration first. Problems with the mapping file or canvas apps are cheaper to find on a copy.

What to do

Copy production to a new sandbox in the Power Platform admin center, move the sandbox to the target, and validate apps, flows and security roles before scheduling production.

Microsoft Learn: Tenant-to-tenant migrations (Power Platform)
Delete canvas apps before the move, not afterReduces risk

Microsoft says solution-aware canvas apps, custom pages and component libraries that are not deleted before the move will not work afterwards.

What to do

Export every solution and app package, check each export opens, then delete the apps in the source as part of the change window. Keep the .zip files until the target import is signed off.

Microsoft Learn: Tenant-to-tenant migrations (Power Platform)
Get the mapping file right first timeSaves time

Users not in usermapping.csv are not mapped, and an admin left out sees an empty environment. Semicolons, extra columns, duplicates and identical source and destination addresses all fail validation.

What to do

Build the file from Advanced Find exports of full access and administrative access users, save it as a CSV separated by commas, and include every admin who will validate the move.

Microsoft Learn: Tenant-to-tenant migrations (Power Platform)
Watch the seven-day clocksSaves time

A move request expires after seven days without approval, and the move must run within seven days of a successful prepare, or you prepare again.

What to do

Book the target admin's approval and the move window before you submit, and submit no earlier than a week before the planned move.

Microsoft Learn: Tenant-to-tenant migrations (Power Platform)
Move mailboxes before the environmentSaves time

Microsoft says if a mapped user has a mailbox in the destination tenant with the same address, the migration configures it automatically; otherwise mailboxes need reconfiguring after the move.

What to do

Schedule the environment move after the mailbox migration for its users, and plan server-side synchronisation checks afterwards.

Microsoft Learn: Tenant-to-tenant migrations (Power Platform)
Convert flows to connection references before exportSaves time

Flows that use direct connections need editing one by one in the target. Connection references are mapped once in the import wizard.

What to do

In the source, open each solution flow and accept the flow checker's Use connection references fix, then export the solution.

Microsoft Learn: Use a connection reference in a solution
Strip environment variable values before exportReduces risk

If the source value travels in the solution, the import does not prompt for a new one, and apps and flows keep pointing at source SharePoint sites.

What to do

For each variable open Current Value > ... > Remove from this solution before exporting, so the import wizard asks for the target value.

Microsoft Learn: Environment variables overview
The default environment cannot use the environment moveSaves time

Default, developer, trial and Teams environments are not supported by the tenant-to-tenant move, and many personal apps and flows live in the default environment.

What to do

Ask owners which default-environment items are business critical, put those in solutions and import them into a target production environment. Let personal experiments go.

Tools that can get around this

Instead of moving a whole environment, these tools migrate individual apps and cloud flows into a target environment you choose, with user and environment mapping, so items the environment move cannot take do not all need to be packaged into solutions by hand. Neither vendor page names the default environment specifically, so confirm with a pilot.

  • Apps4.ProMigrates cloud flows tenant to tenant with environment, user and creator mapping, auto-maps SharePoint site URLs and lists, and keeps each flow on or off. Run history, desktop flows and environment creation are not migrated, and users fix connections in the target.
  • AvePoint FlyMigrates Power Apps and Power Automate flows between environments and tenants, with an inventory scan and automatic mapping before the migration.
Third-party tools, not endorsed by the platform vendor. Confirm in the tool's documentation and run a pilot first.
Microsoft Learn: Tenant-to-tenant migrations (Power Platform)
Recreate data policies before importingReduces risk

If the target data policy puts a connector in a different group, imported apps and flows using it fail or cannot be turned on.

What to do

Export the source data policies' connector groupings and recreate them in the target admin center under Security > Data and privacy > Data policy before the first import.

Tools that can get around this

The admin center builds each policy by hand. Microsoft's Power Apps administration PowerShell module reads source policies with their connector groups and creates policies in the target, so the groupings can be scripted from the source rather than retyped.

  • Microsoft.PowerApps.Administration.PowerShellGet-DlpPolicy reads policy objects and New-DlpPolicy creates a policy in the signed-in tenant. Microsoft notes that new connectors left in the default group are not returned, so check the default group by hand.
Third-party tools, not endorsed by the platform vendor. Confirm in the tool's documentation and run a pilot first.
Microsoft Learn: Create a data policy
Prevent double runs at cutoverUser impact

Source and target flows triggered by the same mailbox or list both run, sending duplicate emails or writing records twice.

What to do

Keep target flows off until cutover, then turn source flows off and target flows on in the same window, child flows first.

Microsoft Learn: Tenant-to-tenant migrations (Power Platform)
Finish safely

Check it worked, or roll back

Full validation checklist8 checks

Run these before you declare the migration complete. Record the results in the data validation report.

CheckHow to checkWhat good looks like
Every app and flow is in the target

In Windows PowerShell run Add-PowerAppsAccount signed in to the target, then Get-AdminPowerApp | Select-Object DisplayName,EnvironmentName and Get-AdminFlow | Select-Object DisplayName,EnvironmentName,Enabled, and compare with C:\migration\apps.csv and flows.csv.

Every app and flow you planned to keep is listed in its target environment.
Moved environments completed and admins have access

Run TenantToTenant-GetMigrationStatus -MigrationId <MigrationId>, then open the environment in the target Power Platform admin center > Manage > Environments and check its users and security roles.

The status shows Migrate Environment: Succeeded, the URL and name are unchanged, and target admins hold System Administrator.
Connections and connection references are connected

In Power Apps (target environment) > Solutions > each solution > Connection references, and in Windows PowerShell run Get-AdminPowerAppConnection -EnvironmentName <EnvironmentId> for the target.

Every connection reference shows a connected target connection, and no connection shows an error status.
Environment variables hold target values

Open each solution in the target > Environment variables and compare current values with the target sites, lists and mailboxes in your dependency map.

No variable still points at a source tenant URL or address.
Flows run successfully in the target

In Power Automate (target) > the flow > Run history, after a test trigger. For HTTP-triggered flows, call the new URL from each caller.

Each flow shows On with a Succeeded run, child flows were turned on before parents, and callers use the new HTTP URLs.
Apps run for real users

Each owner runs their UAT test script in the target with a target test user, checking data sources, gateway connections and sharing.

Every app has a signed UAT script and runs without data source errors.
Data policies allow the connectors in use

In the target Power Platform admin center > Security > Data and privacy > Data policy, compare each policy with the source.

Target policies list the same Business connectors, and no imported app or flow is blocked by a policy.
Source flows are off

In Power Automate (source) > My flows and each solution's Cloud flows, check the status column; in Windows PowerShell signed in to the source run Get-AdminFlow | Where-Object Enabled.

No migrated flow is still On in the source, so nothing runs twice.
Rollback planIf it goes wrong

Roll back if

  • The environment move fails or the target environment is missing data or users after the move
  • Imported solutions fail on missing dependencies that cannot be installed in the target
  • Flows fail in the target because connectors, gateways or data policies are not ready
  • A business-critical app cannot reach its data in the target before the cutover deadline

Point of no return

For apps and flows moved by export and import, the source copies keep working until you delete them, so rollback is turning the source back on. For a Dataverse environment move, the point of no return is running the migration: the environment is linked to the destination tenant, and the canvas apps you deleted from the source before the move only come back if you reimport the exported packages. The way back is a second tenant-to-tenant move in the opposite direction, with its own request, approval and mapping file. Deleting the source environment cannot be undone.

  1. 1

    Turn source flows back on

    Where: Power Automate (https://make.powerautomate.com, source environment) > My flows, or the solution > Cloud flows

    Turn on child flows first, then the parent flows, in the reverse order of the cutover. Trigger a test run for each.

    You should see: Each source flow shows On and a Succeeded run.
  2. 2

    Turn target flows off

    Where: Power Automate (target environment) > Solutions > the solution > Cloud flows, or My flows

    Turn off every imported flow so nothing runs twice, and point HTTP callers back to the source trigger URLs you recorded.

    You should see: Target flows show Off and callers reach the source flows again.
  3. 3

    Restore app sharing in the source

    Where: Power Apps (https://make.powerapps.com, source environment) > Apps > the app > Share

    Share each app again with the users and groups from your inventory, or remove the message that points to the new app, and tell users which link to use.

    You should see: Users open the source apps without errors.
  4. 4

    Reimport apps removed before an environment move

    Where: Power Apps (the environment you are rolling back to) > Solutions > Import solution, or Apps > Import canvas app

    Import the solution .zip files or canvas app packages you exported before the move, choosing connections for each connector during import.

    You should see: The import reports success and the apps are listed again.
  5. 5

    Move the environment back if needed

    Where: Power Platform admin center (the tenant that now holds the environment) > Manage > Environments > the environment > Move environment

    Submit a new tenant-to-tenant request with the original tenant ID as the target, a mapping file with Source and Destination swapped, and approval in the original tenant. Follow the same validate and migrate steps.

    You should see: TenantToTenant-GetMigrationStatus shows Migrate Environment: Succeeded and the environment is back in the original tenant.

Agree the triggers and who decides before the go / no-go meeting. Use the rollback plan template.

Common problems and fixes8 errors
TargetUPNDoesNotExistInAAD

Cause: A destination user in usermapping.csv does not exist in the target Entra ID.

Fix: Create the user or fix the UPN, or remove the line, then upload the mapping file again.

ApplicationUserCannotBeMapped

Cause: Application users cannot be migrated with the environment.

Fix: Remove them from the mapping and recreate the application users in the target.

The User mapping file provided for Tenant To Tenant migration is invalid

Cause: The file is not named usermapping.csv, uses semicolons, has duplicates, has rows without exactly two columns, or maps a user to the same address.

Fix: Fix the file and reupload it using the same SAS URI.

Environment looks empty after the move

Cause: The signed-in admin is not in the mapping file or does not have a security role in the destination environment.

Fix: Assign System Administrator to the validating admins in the destination environment before raising a support request.

Solution import fails with missing dependencies

Cause: The solution depends on components or managed solutions that are not in the target.

Fix: Install the listed dependencies and restart the import, or download the log file to see what is missing.

Flow fails after import with a connection error

Cause: The connection reference points to a connection that does not exist or belongs to a user without access.

Fix: Edit the connection reference in the target solution and select a working connection.

Import Package (Legacy) is blocked for a flow

Cause: The target has Create in Dataverse solutions turned on, which blocks packages that contain non-solution flows.

Fix: Add the flow to a solution in the source, export the solution and import it in the target.

Canvas app shows data source errors after import

Cause: The app still points at a source SharePoint site or a source gateway.

Fix: Remove and re-add the connections with the target site and gateway, then publish.

Search the full error library →

FAQ

Frequently asked questions

Can I move a whole Power Platform environment to another tenant?

Yes for production and sandbox environments with Dataverse, using the self-service tenant-to-tenant move. Default, developer, trial and Teams environments are not supported.

Do connections move with my apps and flows?

No. Connections, custom connectors and gateways are never migrated. Recreate them in the target and map connection references on import.

Why do I have to delete canvas apps before the environment move?

Microsoft says solution-aware canvas apps, custom pages and component libraries that are not deleted before the move will not work afterwards. Export them, delete them, then import them after the move.

How do I move flows from the default environment?

The default environment cannot use the tenant-to-tenant move. Add the flows to a solution and import it into a target environment, or export single flows as packages.

Does the environment URL change after a tenant move?

No. Microsoft says the environment URL, organisation ID and name stay the same.

How long does the environment move take?

Microsoft says to allow up to 24 hours, depending on the number of users.

Sources

Official sources

13 official pages this guide is based on