Solutions are the deployment unit
A solution is a container of components — apps, flows, tables, security roles, connection references, environment variables — that you export from one environment and import into another. It is how you move work from dev to test to prod without rebuilding by hand. Everything serious lives in a solution.
Managed vs unmanaged
| Unmanaged | Managed | |
|---|---|---|
| Editable | Yes — this is your source/dev form | No — locked in the target |
| Where | Development environments | Test and production |
| Deletion | Deleting removes definitions, not artifacts | Uninstalling cleanly removes the components |
| Layering | N/A | Supports managed layers/patches |
The discipline: develop unmanaged, deploy managed. Editing directly in production (an unmanaged change there) is the anti-pattern that destroys any lifecycle — you can no longer tell source from deployed.
Pipelines and connection references / environment variables
Pipelines (in Power Platform, or Azure DevOps / GitHub with the Power Platform Build Tools) automate export→import across dev/test/prod. Two solution components make this clean: connection references (bind to the right connection per environment) and environment variables (parameterise URLs, IDs, settings per environment) — so the same managed solution behaves correctly in each stage without edits.
Failure modes
- Editing in production. Unmanaged changes made directly in prod cannot be reconciled with dev — the source of truth is lost.
- Everything in the default solution. Apps/flows built outside a solution can't be cleanly moved or versioned — the sprawl root.
- Hard-coded environment specifics. URLs/IDs baked into components instead of environment variables break on import.
- No source control. Solutions not exported to git have no history, no review, no rollback.
What to watch (proofs)
- Solutions per environment and managed/unmanaged state:
Get-SolutionList/ the Dataversesolutionstable, orpac solution list— unmanaged solutions in production are the finding. - Assets outside solutions: apps/flows (
Get-AdminPowerApp/Get-AdminFlow) not in any solution — unmanaged sprawl. - Pipeline/deployment history: pipeline run records or Build Tools logs — proof that promotion is governed, not manual.
- Environment variables and connection references bound correctly per stage (solution inspection) — the parameterisation that keeps prod behaving.