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.
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.
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.
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.
- 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.
- 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.
- 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.
- Rehearsal of the environment move on a sandbox copyShows mapping errors and what breaks, without risking production.
- 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.
- 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.
- Connections, environment variables, security groups and trigger addresses fixedNone of these carry over, and imported flows stay off until they are set.
- 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.
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)
- 1
- 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.
Show the detail →Watch out: Environment move: Customer Voice, Omnichannel and component libraries are not supported.
Ways around it
- Plan those separately before you book the move.
- 3
Prepare the target
Show the detailed steps (5) →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
- 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.
- 4
Move Dataverse environments
After the mailbox move, rehearsed on a sandbox firstWatch 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.
Show the detailed steps (9) →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.
- 5
Import apps
Show the detailed steps (6) →Watch out: Solution import: each solution file can be up to 95 MB.
Ways around it
- Split large solutions into smaller ones before export.
- 6
Move flows
Show the detailed steps (6) →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.
- 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) →
- 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.
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.
1What you need before step one
| Need | Details | Where 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, licensed | Every 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 center | Environments, data policies and the environment move. | https://admin.powerplatform.microsoft.com |
| Power Apps and Power Automate makers | Solutions, app packages and flow packages. | https://make.powerapps.com and https://make.powerautomate.com |
| Windows PowerShell 5.x with Microsoft.PowerApps.Administration.PowerShell | Microsoft 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 gateway | Only 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
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-PowerAppsAccountopens 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-PowerAppsAccountYou should see: The version shows Major 5, and Add-PowerAppsAccount returns to the prompt without errors. - 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:\migrationfirst.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 -NoTypeInformationYou should see: Three CSV files in C:\migration, with EnvironmentType showing Default, Production, Sandbox and so on. - 3
List connections
Where: Same Windows PowerShell session (source tenant), once per environment ID from environments.csvRecord 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 -NoTypeInformationYou should see: connections.csv lists each connection with its connector and creator. - 4
Mark each item as solution-aware or not
Where: Power Apps (https://make.powerapps.com) > environment picker (top right) > Solutions, for each environmentPick 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
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 designerFor 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
| Item | Route | Notes |
|---|---|---|
| Production or sandbox environment with Dataverse | Tenant-to-tenant environment move | Default, developer, trial and Teams environments are not supported |
| Solution-aware canvas apps, custom pages, component libraries | Export solution, delete, move environment, import | Microsoft says they will not work after a move if not deleted first |
| Canvas apps not in a solution | Export package, Import canvas app | One package per app |
| Flows in solutions | Move with the solution or environment | Connection references need new connections |
| Flows not in a solution | Add to a solution, or export a Package (.zip) | Packages are for one-off moves of single flows |
| Connections, custom connectors, gateways | Recreate | Never migrated |
| Security groups and application users | Recreate | Not migrated with the environment |
4Prepare the target tenant5 steps
- 1
Create and license users
Where: Microsoft 365 admin center (target) > Users > Active users, and Billing > LicensesCreate 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
Create target environments
Where: Power Platform admin center (target) > Manage > Environments > NewFor 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
Recreate data policies
Where: Power Platform admin center (target) > Security > Data and privacy > Data policy > + New PolicyRecreate 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
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
Move dependent data first
Where: Your migration runbookApps 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
Export and remove solution-aware canvas apps
Where: Power Apps (https://make.powerapps.com, source environment) > SolutionsSelect 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
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
Put flows in solutions
Where: Power Automate (https://make.powerautomate.com) > Solutions > the solution > Add existing > Automation > Cloud flow, or Windows PowerShellFlows 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
Build the user mapping file
Where: A text editor on your admin PC, saved as C:\migration\usermapping.csvName 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.comYou should see: A two-column CSV with one row per user and no duplicate or identical addresses. - 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-ViewMigrationRequestYou should see: The target tenant sees a pending request banner on its Environments page. PowerShell shows the migration ID. - 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
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.csvand 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
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
Fix up the environment
Where: Power Platform admin center (target) > Manage > Environments > the environment > Settings > Users + permissions > UsersSelect 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
Export solutions
Where: Power Apps (https://make.powerapps.com, source environment) > Solutions > the solution > ExportSelect 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
Import solutions
Where: Power Apps (target environment) > Solutions > Import solutionSelect 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
Handle missing dependencies
Where: Power Apps (target environment) > Solutions > import notification > Download Log File, or See historyIf 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
Export canvas apps not in a solution
Where: Power Apps (source environment) > Apps > the app > Export packageSelect 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
Import canvas app packages
Where: Power Apps (target environment) > Apps > Import canvas appSelect 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
Reconnect data and share
Where: Power Apps Studio (target) > Data pane, then Apps > the app > ShareRepoint 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
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
Use connection references
Where: Power Apps or Power Automate (target environment) > Solutions > the solution > Connection referencesFlows 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
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 targetEnvironment 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
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
Turn flows on in the right order
Where: Power Automate (target) > Solutions > the solution > Cloud flows, or My flowsImported 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
Update triggers and endpoints
Where: Power Automate (target) > the flow > EditFlows 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.
8Power BI, Microsoft Forms and Planner
These workloads need their own approach and have their own guides:
- Power BI tenant-to-tenant migration: .pbix downloads, gateways, workspaces, refresh and apps.
- Microsoft Forms migration: duplicate links, moving forms to groups and exporting responses.
- Microsoft 365 Groups and Planner migration: recreating groups and rebuilding plans with Microsoft Graph.
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
Owner testing
Where: Power Apps and Power Automate in the target, and your UAT test scriptsHave 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
Cut over
Where: Power Automate (source) > My flows; Power Apps (source) > Apps > ShareTurn 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
Clean up the source
Where: Power Platform admin center (source) > Manage > Environments > ... next to the environment > DeleteAfter 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.
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 effortBest 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
Export and import solutions
Medium effortBest 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 effortBest 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
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.
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.
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.
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.
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.
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.
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.
Book the target admin's approval and the move window before you submit, and submit no earlier than a week before the planned move.
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.
Schedule the environment move after the mailbox migration for its users, and plan server-side synchronisation checks afterwards.
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.
In the source, open each solution flow and accept the flow checker's Use connection references fix, then export the 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.
For each variable open Current Value > ... > Remove from this solution before exporting, so the import wizard asks for the target value.
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.
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.
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.
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.
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.
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.
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.
Keep target flows off until cutover, then turn source flows off and target flows on in the same window, child flows first.
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.
| Check | How to check | What good looks like |
|---|---|---|
| Every app and flow is in the target | In Windows PowerShell run | Every app and flow you planned to keep is listed in its target environment. |
| Moved environments completed and admins have access | Run | 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 | 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 | 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
Turn source flows back on
Where: Power Automate (https://make.powerautomate.com, source environment) > My flows, or the solution > Cloud flowsTurn 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
Turn target flows off
Where: Power Automate (target environment) > Solutions > the solution > Cloud flows, or My flowsTurn 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
Restore app sharing in the source
Where: Power Apps (https://make.powerapps.com, source environment) > Apps > the app > ShareShare 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
Reimport apps removed before an environment move
Where: Power Apps (the environment you are rolling back to) > Solutions > Import solution, or Apps > Import canvas appImport 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
Move the environment back if needed
Where: Power Platform admin center (the tenant that now holds the environment) > Manage > Environments > the environment > Move environmentSubmit 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
TargetUPNDoesNotExistInAADCause: 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.
ApplicationUserCannotBeMappedCause: 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 invalidCause: 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 moveCause: 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 dependenciesCause: 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 errorCause: 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 flowCause: 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 importCause: 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.
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.
Official sources
13 official pages this guide is based on
Vendors change limits and features, so confirm details on the source before you rely on them. Last checked 4 Nov 2026.