The rules that separate a Power Apps estate from a Power Apps mess β app boundaries, delegation, and the solution ALM that makes Monday deployments boring.
3 chapters Β· 8 rules
4 reusable commands β fill the placeholders, copy, done. Values you fill are never stored.
Static analysis before anything travels β catches deprecated APIs and perf traps.
pac solution check --path {{solution_zip}} --outputDirectory {{report_dir}}
The build artifact for test and prod (Rule 7).
pac solution export --name {{solution_name}} --path {{output_path}} --managed --async
Follows Rule 7
The sanctioned door into any environment (Rule 6).
pac solution import --path {{solution_zip}} --environment {{environment_url}} --async --activate-plugins
Careful: Against prod this changes what users run right now β deploy window + rollback zip first.
Follows Rule 6
Sanity-check which tenant/environment pac is pointed at before anything privileged.
pac env list1 repeatable process β read straight through, or run step by step with a private record of what you did.
The boring, repeatable path: checker, managed export, a test-environment rehearsal, then prod β with connection references and environment variables handled deliberately instead of by surprise.
pac env listThirty seconds here has prevented every "imported into the wrong tenant" story we know.
pac solution check --path {{solution_zip}} --outputDirectory {{report_dir}}
pac solution export --name {{solution_name}} --path {{output_path}} --managed --async
Version number bumps automatically on export; note it in the deploy ticket.
Open the solution in the maker portal: every environment variable has a decided prod value (no dev defaults leaking), and every connection reference has a named owner identity per Rule 8.
pac solution import --path {{solution_zip}} --environment {{environment_url}} --async --activate-plugins
Test is where dependency and connection surprises are cheap.
A missing-dependency error here means a component references something outside the solution β see the attached failure note.
β Import fails: missing dependency on a connection reference or table
Import errors citing a missing dependency (a table, connection reference, or component not found in the target)
Likely cause: The component exists in dev outside the solution (created before the solution, or added directly to the environment) so it never traveled
Fix: Add the missing components to the solution in dev, re-export, re-import. For shared base components, split them into a separate base solution imported first.
pac solution import --path {{solution_zip}} --environment {{environment_url}} --async --activate-plugins
Same zip that passed test β never a fresh export between test and prod.
Open each app as a normal user (not admin), run one real flow end-to-end, and confirm it executed as the service account in the flow run history.
β Flow runs as a departed employee
Solution flows start failing with authentication errors; run history shows a former teammate as the running user
Likely cause: Connection references were bound to a personal account at first import and never revisited
Fix: Create service-account connections, re-bind the connection references, and re-save the flows. Then adopt Rule 8: owners decided before import, audited quarterly.
2 notes from the field β observations, discoveries, warnings, and lessons.
When prod behaves differently from dev, check the layers on the component (Solutions β the component β Solution layers). An old unmanaged customization sitting on top of your managed layer wins silently β and it usually got there from a well-meaning portal hotfix months ago.
Published canvas changes only reach users after they close and reopen the app β sessions in flight keep the old version for hours. Ship breaking data-shape changes with that overlap in mind, or force a version check on app start.
3 known failuresβ the approaches that didn't work, preserved so you don't repeat them.
Import errors citing a missing dependency (a table, connection reference, or component not found in the target)
Attempted: Importing a managed solution into a clean test/prod environment
Context: First import into an environment, or after adding a new connector in dev
Likely cause: The component exists in dev outside the solution (created before the solution, or added directly to the environment) so it never traveled
Diagnose: The error lists the missing schema names β search dev for each and check its solution membership
Fix: Add the missing components to the solution in dev, re-export, re-import. For shared base components, split them into a separate base solution imported first.
Gallery or lookup silently caps out β no error, records just absent past a point
Attempted: Same app, bigger table
Context: Any non-delegable query once the table crossed the delegation row limit
Likely cause: A non-delegable operator forced client-side evaluation over only the first N rows
Diagnose: Check the formula bar for blue delegation underlines; count rows in the source vs the gallery
Fix: Rewrite with delegable operators for the connector, or move filtering into a Dataverse view; retest against a seeded table larger than the limit.
Solution flows start failing with authentication errors; run history shows a former teammate as the running user
Attempted: Nothing β it worked for months, then broke on account disablement
Context: Long-lived solution flows in prod, connection references bound at first import
Likely cause: Connection references were bound to a personal account at first import and never revisited
Diagnose: Flow run history β run details shows the connection identity
Fix: Create service-account connections, re-bind the connection references, and re-save the flows. Then adopt Rule 8: owners decided before import, audited quarterly.
Low-code moves fast enough to outrun its own governance. These rules are the guardrails that keep speed: where canvas ends and model-driven begins, why delegation warnings are incidents-in-waiting, and the solution movement process with the classic import failures pre-attached.
Makers shipping to real users, and the admins who inherit what makers ship.
Initial publication.
Readers of this book also keep