FlowLibs
Browse Cloud FlowsConnectorsAI ToolsDev ToolsPricingAboutContact
Dev Tools/Naming & ALM

Naming Conventions & ALM

Consistent names and a clean solution/environment strategy are what let a Power Platform estate scale past one maker. Naming patterns for every component type, plus a practical, source-controlled ALM pipeline — pac CLI, Azure DevOps, GitHub Actions, deployment settings, versioning, and rollback.

Standards18 min read·Updated 2026-06-16
NamingALMSolutionsEnvironmentsPipelinesDevOpspac CLISource control

On this page

  • Why conventions matter
  • Naming conventions
  • Naming — every component type
  • Solution layering
  • Solution strategy
  • Environment strategy
  • Environment strategy — deep dive
  • Source control
  • ALM & pipelines
  • ALM tooling — settings & pipelines
  • Versioning & rollback
  • Tip

Why conventions matter

Names are the cheapest documentation you have. Consistent, predictable names make flows searchable, make support handoffs painless, and make ALM (moving solutions between environments) deterministic. Set the standard once and enforce it in review.

Naming conventions

ObjectPatternExample
Cloud flow<Domain> - <Trigger> - <Outcome>HR - New Hire - Provision Accounts
Child flow<Domain> - CHILD - <Function>HR - CHILD - Send Welcome Email
Scope / actionPascalCase, verb-firstGet_Open_Orders
VariablecamelCase + type prefixvarCustomerEmail, intRetryCount
Solution<Org><Domain> (no spaces)ContosoHrOnboarding
Publisher prefix3–8 lowercase charscontoso → contoso_
Environment variableprefix_PascalCasecontoso_GraphClientId
Connection referenceprefix_Connector_Purposecontoso_Office365_Mailbox
Dataverse tableSingular PascalCasePurchaseRequest
Dataverse columnprefix_PascalCasecontoso_ApprovalStatus
A pragmatic baseline — adapt the domain tokens to your organisation.

The publisher prefix is forever

Your solution publisher’s customization prefix is baked into every schema name and cannot be changed later. Pick a short, organisation-wide prefix before you create the first table — not the default cr xxx.

Naming — every component type

The baseline above covers the components you touch daily. The tables below extend it across the full Dataverse + Power Platform surface so a reviewer never has to guess. The filter box on each table jumps you to a component fast.

Dataverse — relationships, choices, roles & rules

10/10
ComponentPatternExample
1:N relationshipprefix_<Parent>_<Child>contoso_Account_Orders
N:N relationshipprefix_<TableA>_<TableB>contoso_Project_Resource
Lookup columnprefix_<Target>Idcontoso_AccountId
Global choice (option set)prefix_PascalCasecontoso_OrderStatus
Choice value (label)Title Case, human-readableIn Review
Choice value (integer)Publisher-banded, leave gaps693650000, 693650001 …
Security role<App> – <Persona>Onboarding – Approver
Business rule<Table> - <Condition/Action>Account - Require Phone When Active
Business process flow<Domain> - <Process>Sales - Lead To Cash
Web resourceprefix_/<area>/<name>.<ext>contoso_/scripts/Account.Form.js
Schema names always carry the publisher prefix; display names are for humans.

Leave gaps in choice values

Option-set integer values are permanent. Start at your publisher’s option-value prefix (the platform offers a banded default like 693650000) and increment by 1 — but never renumber an existing value, because rows already store the integer, not the label.

Pro-code — plugins, steps & assemblies

6/6
ComponentPatternExample
Plugin assembly<Company>.<Domain>.PluginsContoso.Sales.Plugins
Plugin class<Table><Event>PluginAccountPreCreatePlugin
Registered SDK step<Table>: <Message> <Stage>Account: Create PostOperation
Custom APIprefix_<VerbNoun>contoso_RecalculatePricing
Custom connector<Org> <Service>Contoso Billing API
PCF control<Namespace>.<ControlName>Contoso.RatingStars

Apps & analytics — canvas, model-driven, Power BI

8/8
ComponentPatternExample
Canvas app<Domain> - <Purpose>HR - Onboarding Portal
Model-driven app<Domain> <Hub/App>Sales Hub
App unique nameprefix_PascalCasecontoso_OnboardingPortal
Power BI workspace<Org> <Domain> [Env]Contoso Sales [PROD]
Power BI semantic model<Domain> - <Subject>Sales - Pipeline
Power BI report<Domain> - <Audience> - <Subject>Sales - Exec - Pipeline
Environment variableprefix_PascalCasecontoso_GraphClientId
Connection referenceprefix_Connector_Purposecontoso_Office365_Mailbox

Env vars and connection references belong in the solution

Name them with the same prefix discipline and add them to the solution so each environment binds its own value and credential at import time — that is exactly what the deployment settings file in the ALM section populates.

Solution layering

  • Author unmanaged in DEV; deploy managed to TEST and PROD. Never edit components directly in a downstream environment.
  • Use one publisher across related solutions so prefixes and dependencies stay coherent.
  • Keep solutions focused — segment by application/domain rather than one mega-solution, so deployments are independent.
  • Add environment variables and connection references to the solution so each environment binds its own config and credentials at import.

Solution strategy

How you carve up solutions decides how independently teams can ship. The goal is small, single-purpose managed layers that import in a predictable order, not one monolith that forces every change through one release.

Core vs feature solutions

  • A core (base) solution holds shared tables, global choices, security roles, and connection references that several apps depend on. Version it deliberately and deploy it first.
  • Feature solutions layer app-specific flows, apps, and columns on top of the core. They take a *dependency* on core components rather than redefining them.
  • Put each component in exactly one solution that owns it; reference (don’t re-add) it everywhere else. Two solutions both claiming ownership is the classic source of layering conflicts.

Segmentation & dependencies

  • Segment by adding only the *specific* subcomponents you changed (e.g. three columns of a table) instead of the whole table, so you don’t take ownership of fields another team controls.
  • Managed solutions import in dependency order — the platform blocks an import whose required components are missing. Deploy core before features; never create circular dependencies between solutions.
  • Use Solution → Show dependencies (or pac solution checks) before promoting, so a missing global choice or connection reference fails in review, not in PROD.

Patches, upgrades & holding solutions

MethodWhat it doesWhen to use
UpdateOverwrites the managed layer in placeRoutine changes; fastest, but does not delete removed components
PatchSmall child solution on top of a parent versionHotfix one or two components without re-shipping everything
Upgrade (stage + upgrade)Imports as a holding solution, then merges and deletes removed componentsClean releases where you want removed components actually gone
Three ways to ship a change — pick by blast radius.

Upgrade is the only path that deletes

A plain update leaves orphaned components behind. A staged upgrade imports a *holding* solution (_Upgrade suffix), then applies it — that merge step is what removes components you deleted in DEV. Use upgrades when correctness matters more than speed.

Environment strategy

EnvironmentPurposeSolution state
DEVMakers build and iterateUnmanaged
TEST / UATIntegration + user acceptanceManaged
PRODLive business workloadsManaged, locked

Keep the Default environment clean

Treat the Default environment as personal-productivity only. Provision dedicated, governed environments for any solution that matters, with DLP policies scoped per environment.

Environment strategy — deep dive

Managed environments

  • Turn on Managed Environments for any environment that holds a real workload — it unlocks weekly usage insights, maker onboarding controls, and solution-checker enforcement that can *block* imports that fail security rules.
  • Use sharing limits to cap who a canvas app can be shared with (e.g. no security groups, or a hard ceiling) so a maker can’t accidentally broadcast an app tenant-wide.
  • Enable pipelines and maker onboarding messaging at the environment level so governance travels with the environment, not a wiki page.

DLP & data boundaries

  • Scope DLP policies per environment — production data connectors (Dataverse, SQL, custom APIs) in Business, social/consumer connectors in Blocked, everything else Non-business. Connectors in different groups cannot be combined in one flow or app.
  • Set a tenant-wide default DLP that is restrictive, then relax per environment where a workload genuinely needs a connector — default-deny beats default-allow.
  • Classify custom connectors explicitly; an unclassified custom connector defaults into a group you may not intend.

Default environment hygiene

Everyone in the tenant can create in the Default environment and it can’t be deleted. Apply a strict DLP to it, route serious work into governed environments, and periodically sweep it for orphaned flows. Never let a production process live there.

Source control

Solutions belong in Git as unpacked source, not as opaque zip blobs. Unpacking turns a release into a reviewable diff and gives you history, branching, and PR gates — the same discipline you’d apply to any codebase.

  • Branching: trunk-based with short-lived feature/* branches off main; each branch maps to one work item. Tag main at every PROD release.
  • PR review: export from DEV → pac solution unpack → commit → open a PR. Reviewers read the component XML/YAML diff, not the zip. Require at least one approval before merge.
  • Solution Checker in CI: run the Power Apps Checker (pac solution check, or the build-tool/action equivalent) on every PR and fail the build on high-severity findings — this is enforced automatically in Managed Environments.
  • Conflict handling: unpacked solutions are many small files, so Git can merge most changes. For genuinely conflicting components, resolve in DEV (re-import, fix, re-export) rather than hand-editing solution XML.

Prefer YAML unpack for cleaner diffs

Recent pac CLI can unpack to a YAML source-control format (the solutions/<name>/… layout) that diffs far more cleanly than the legacy Other/Solution.xml form — especially for canvas apps. Native Dataverse Git integration produces the same shape.

ALM & pipelines

  1. Source-control solutions by unpacking them (pac solution unpack) into Git — review diffs, not zip blobs.
  2. Promote with Power Platform Pipelines (in-product) for a low-friction path, or Azure DevOps / GitHub Actions with the Power Platform Build Tools for full CI/CD.
  3. Bind environment variables and connection references per environment at deploy time — never hardcode.
  4. Gate PROD imports behind approval; keep deployments one-way (DEV → TEST → PROD) and reproducible.

Power Platform Pipelines (in-product)

  • Install the Power Platform Pipelines app in a dedicated *host* environment, then define your DEV → TEST → PROD stages once.
  • Makers run a deployment from inside the DEV environment — no YAML, no service principal to manage — and the host orchestrates export, build, and managed import.
  • Attach pre-/post-deployment approvals and a deployment settings record per stage so connection references and env vars bind automatically. Graduate to Azure DevOps/GitHub only when you need custom build steps.

pac CLI cheat sheet

12/12
CommandWhat it doesExample
pac auth createAdd an auth profile for an environmentpac auth create --environment https://contoso-dev.crm.dynamics.com
pac auth list / selectSwitch between saved profilespac auth select --index 2
pac env list / selectList or target an environmentpac env select --environment https://contoso-test.crm.dynamics.com
pac solution listList solutions in the current envpac solution list
pac solution exportPull a solution zip from Dataversepac solution export --name ContosoHrOnboarding --managed --path ./out
pac solution unpackExplode a zip into source filespac solution unpack --zipfile sol.zip --folder ./src --packagetype Both
pac solution packRebuild a zip from sourcepac solution pack --zipfile sol.zip --folder ./src --packagetype Managed
pac solution importPush a solution into an environmentpac solution import --path sol.zip --settings-file settings.json --activate-plugins
pac solution create-settingsGenerate a deployment settings filepac solution create-settings --solution-zip sol.zip --settings-file settings.json
pac solution versionBump build / revision numberpac solution version --solution-name ContosoHrOnboarding --revision
pac solution upgradeStage-and-merge a managed upgradepac solution upgrade --solution-name ContosoHrOnboarding --async
pac solution checkRun Power Apps Checkerpac solution check --path sol.zip
The Power Platform CLI — the engine under every pipeline.
bash
# Authenticate once, then target DEV
pac auth create --environment https://contoso-dev.crm.dynamics.com

# Export the unmanaged solution and explode it into Git-friendly source
pac solution export \
  --name ContosoHrOnboarding \
  --path ./out/ContosoHrOnboarding.zip
pac solution unpack \
  --zipfile ./out/ContosoHrOnboarding.zip \
  --folder ./src/ContosoHrOnboarding \
  --packagetype Both

# Rebuild a managed zip from source for a downstream import
pac solution pack \
  --zipfile ./build/ContosoHrOnboarding_managed.zip \
  --folder ./src/ContosoHrOnboarding \
  --packagetype Managed
Power Platform CLI — export, unpack, and re-pack a solution for source control.

ALM tooling — settings & pipelines

Deployment settings file

Generate it with pac solution create-settings, commit one file per target environment, and pass it at import so connection references and environment variables bind without any interactive prompts.

json
{
  "EnvironmentVariables": [
    {
      "SchemaName": "contoso_GraphClientId",
      "Value": "11111111-2222-3333-4444-555555555555"
    },
    {
      "SchemaName": "contoso_ApiBaseUrl",
      "Value": "https://api.contoso.com"
    }
  ],
  "ConnectionReferences": [
    {
      "LogicalName": "contoso_office365_mailbox",
      "ConnectionId": "9f66d1d455f3474ebf24e4fa2c04cea2",
      "ConnectorId": "/providers/Microsoft.PowerApps/apis/shared_office365"
    }
  ]
}
settings.PROD.json — bind env vars and connection references at import time.

Don’t source-control secrets

Environment variable *values* export with the solution. Keep secrets out of them — reference Azure Key Vault, or inject values from pipeline secret variables / GitHub secrets at deploy time instead of committing them.

Azure DevOps pipeline (Power Platform Build Tools)

yaml
trigger:
  branches:
    include: [ main ]

pool:
  vmImage: 'windows-latest'

steps:
  - task: PowerPlatformToolInstaller@2

  - task: PowerPlatformPackSolution@2
    inputs:
      SolutionSourceFolder: '$(Build.SourcesDirectory)/src/ContosoHrOnboarding'
      SolutionOutputFile: '$(Build.ArtifactStagingDirectory)/ContosoHrOnboarding_managed.zip'
      SolutionType: 'Managed'

  - task: PowerPlatformImportSolution@2
    inputs:
      authenticationType: 'PowerPlatformSPN'
      PowerPlatformSPN: 'Contoso-PROD'           # service connection
      SolutionInputFile: '$(Build.ArtifactStagingDirectory)/ContosoHrOnboarding_managed.zip'
      UseDeploymentSettingsFile: true
      DeploymentSettingsFile: '$(Build.SourcesDirectory)/config/settings.PROD.json'
      AsyncOperation: true
      MaxAsyncWaitTime: '60'
Build a managed solution from source and import it into PROD with a settings file.

GitHub Actions (Power Platform Actions)

yaml
name: deploy-to-prod
on:
  push:
    branches: [ main ]

jobs:
  release:
    runs-on: windows-latest
    steps:
      - uses: actions/checkout@v4

      - name: Install Power Platform tools
        uses: microsoft/powerplatform-actions/actions-install@v1

      - name: Pack managed solution
        uses: microsoft/powerplatform-actions/pack-solution@v1
        with:
          solution-folder: src/ContosoHrOnboarding
          solution-file: out/ContosoHrOnboarding_managed.zip
          solution-type: Managed

      - name: Import to PROD
        uses: microsoft/powerplatform-actions/import-solution@v1
        with:
          environment-url: https://contoso-prod.crm.dynamics.com
          app-id: ${{ secrets.PP_APP_ID }}
          client-secret: ${{ secrets.PP_CLIENT_SECRET }}
          tenant-id: ${{ secrets.PP_TENANT_ID }}
          solution-file: out/ContosoHrOnboarding_managed.zip
          activate-plugins: true
Pack from source and import to PROD using service-principal auth.

Versioning & rollback

A solution version is major.minor.build.revision. Treat it like any release artifact: bump it on every build, tag the commit, and keep the previous managed zip so you always have a known-good artifact to fall back to.

SegmentBump whenDriven by
majorBreaking schema / contract changeManual, deliberate
minorNew feature, backward-compatibleManual per release
buildEach CI buildPipeline build number
revisionHotfix / patch on a buildPatch or pipeline
A version scheme that maps cleanly to your branching model.
  • Stamp the build in CI with pac solution version (or the Set Solution Version task) so the deployed version always traces back to a commit and pipeline run.
  • Roll forward, not back, by default: the cleanest "rollback" is re-importing the previous managed solution artifact you kept from the last green release — never hand-edit PROD.
  • Blue/green-ish promotion: validate the new managed version in TEST/UAT (the "green" slot) against production-like data before you import to PROD; if PROD import fails, the prior managed layer is still intact.
  • Keep artifacts immutable: publish every managed zip as a pipeline/Git artifact so any prior version can be re-imported without rebuilding from source.

Managed delete is your real rollback boundary

Removing a managed solution deletes its components *and their data*. For a true rollback, re-import the previous version rather than uninstalling — reserve uninstall for environments you can afford to rebuild.

Tip

Every cheat table above is searchable

Use the filter box on each table to jump to a component or command fast. This whole guide is generated from one structured dataset, so it stays in sync with the MCP reference.

← All Dev ToolsUse these in your AI assistant →
Spotted an error or have a suggestion? Let us know
FlowLibs

A curated library of production-grade Power Automate cloud flow patterns. Packaged as managed solutions, ready to import into your environment.

Library

  • Browse Cloud Flows
  • Approvals
  • Email & Notifications
  • Reporting
  • Security & Compliance

AI

  • AI Tools
  • MCP Server
  • Generate a Token

Resources

  • About
  • FAQ
  • Support
  • Status
  • Contact
  • Power Automate Docs
  • Connector Reference

© 2026 FlowLibs. All rights reserved.

  • Privacy
  • Terms
  • Refunds
  • Cookies
  • Acceptable Use
  • DMCA
Help