For most of my consulting career, I’ve worked on middle-market and SMB Dynamics 365 and Power Platform implementations.
ALM was always important. We had separate environments, solutions, deployments, testing, and release processes. I understood the mechanics and why they mattered.
Then I joined my first truly large enterprise implementation.
The fundamentals didn’t change. The scale did.
Suddenly, I was working within a core development environment feeding multiple downstream environments, frequent deployments through pipelines, managed solutions, shared components, overlapping dependencies, solution layers, environment-specific configuration, multiple workstreams, and a go-live where all of those pieces eventually needed to come together.
That experience changed how I think about ALM.
The biggest shift for me is that ALM is not simply the process of promoting changes between environments. At enterprise scale, it becomes part of the control framework for how a solution evolves—how dependencies are managed, how environments stay aligned, and how deployment risk is reduced as you move toward Production.
Here are some of the things enterprise delivery has reinforced for me.
1. ALM Gets More Interesting as the Number of Moving Pieces Grows
On many of the projects I worked on previously, the environment strategy was relatively straightforward.
Something along the lines of:
Dev → QA → UAT → Production
The enterprise model I’ve been working in has considerably more happening around that path.
There is a core environment where development originates, multiple downstream environments, managed solutions moving through pipelines, shared Dataverse components, and different pieces of functionality that have dependencies on one another.
At that scale, ALM becomes less about “How do I get this change into QA?” and more about:
- Which solution owns this component?
- What else depends on it?
- Are multiple solutions touching it?
- What configuration needs to change by environment?
- What happens to its layers when it reaches the target environment?
- How do we keep environments aligned?
- How do we know the deployment produced the state we expected?
Those questions affect much more than the deployment itself.
They affect solution architecture, testing strategy, troubleshooting, release planning, and eventually go-live.
2. Managed Solutions Force You to Think About the Application Differently
In Development, we are actively building in the unmanaged layer.
Downstream, we're deploying managed solutions.
That distinction sounds basic, but its implications become much more important when you're constantly promoting changes.
A managed deployment is not simply a copy of whatever you happen to be looking at in Dev.
It's a packaged artifact moving into an environment that already has its own solution state, existing managed layers, configuration, security, integrations, and potentially other solutions modifying the same components.
That changed one of the questions I ask when troubleshooting.
Instead of only asking:
“Is this configured correctly in Dev?”
I also ask:
“What exactly did we deploy, and what state did it create in the target environment?”
That second question has solved more than a few mysteries.
3. Solution Layers Go From a Concept to Something You Actually Need to Understand
I knew what solution layers were before this project.
I understand them much better now because I've had to troubleshoot them in real deployment scenarios.
That is an important distinction.
On an enterprise implementation, shared components are everywhere.
Account.
Contact.
Lead.
Opportunity.
Common forms.
Common columns.
Relationships.
Business rules.
Multiple solutions or workstreams may interact with those components over the life of the implementation.
Dataverse applies solution layering at the component level. Managed solutions can create multiple managed layers, and depending on the component, runtime behavior can follow top-layer precedence or merge logic.
So when someone says:
“But our solution has the correct configuration.”
That can absolutely be true.
It still doesn't answer the entire question.
Which layers exist in the target environment?
Which solution introduced them?
Is there an unmanaged active layer?
Is the component merged?
What is actually controlling the runtime behavior?
This is why solution layers have become one of the first places I look when Dev and QA disagree.
Ask me how I know.
4. Environment Drift Is a Governance Problem, Not Just an Annoyance
Something breaks in QA.
You know exactly how to fix it.
You're already there.
The change would take 30 seconds.
Tempting.
But if the change belongs in the solution, fixing only QA solves the immediate problem while creating a larger one: your environments are no longer representing the same application lifecycle.
The Dev source doesn't contain the fix.
QA does.
Production eventually won't.
And depending on what was changed, you've potentially introduced an unmanaged active layer above your managed configuration.
The pattern I prefer is:
Identify → Fix upstream → Deploy → Validate downstream
That isn't bureaucracy for the sake of bureaucracy.
It proves that the fix can actually travel through the same mechanism that will eventually deliver it to Production.
5. “It's in the Solution” Isn't the End of the Investigation
One of the better ALM lessons I've had on this project came from something that looked completely correct in Development.
I was working with a Dataverse relationship that included field mappings.
The relationship existed.
The mappings were configured.
The related columns existed.
Everything looked right from the development side.
After deployment, the expected mapping behavior wasn't there downstream.
Initially, the investigation naturally focused on the configuration.
Was the relationship wrong?
Was the mapping wrong?
Was something missing?
Eventually, the more useful question became:
What is actually inside the solution artifact we're deploying?
We started looking beyond what the Maker Portal showed us—at the solution contents, dependencies, layers, and ultimately what was represented in the exported package.
That experience gave me a troubleshooting framework I use much more often now:
Build → Solution → Artifact → Deployment → Layer → Configuration → Runtime
Where did the expected behavior stop matching reality?
That's a much more effective question than repeatedly reopening the same component in Dev.
6. Dependencies Become an Architecture Concern at Scale
Power Platform makes it very easy to build quickly.
That can also make it easy to underestimate how interconnected the application has become.
A flow might depend on a custom column.
That column belongs to a table owned by another solution.
The flow also uses an environment variable and a connection reference.
A business rule references three fields.
A form references the same fields plus a related table.
Now one seemingly small change has a deployment footprint across several components.
On a larger implementation, I think much more about the dependency footprint of a change.
Not just:
What did I modify?
But:
What needs to exist for this modification to work correctly everywhere else?
That is a subtle change in thinking, but it makes a big difference.
7. Pipelines Give You Repeatability—Not Proof
I am a big fan of having deployments run through controlled pipelines.
They make promotion repeatable, traceable, and governed.
But one thing enterprise delivery has reinforced for me is that automation does not eliminate the need to understand what the automation is doing.
A green deployment is evidence that the pipeline completed.
It is not evidence that every business process works correctly.
There is a difference between:
Deployment succeeded
and:
The application is in the expected state.
After the pipeline runs, I still care about things like solution versions, configuration, connections, flow status, security, integrations, mappings, layers, and critical business processes.
The pipeline gives us repeatability.
Validation gives us confidence.
You need both.
8. Environment-Specific Configuration Should Be Designed, Not Remembered
Not everything should be identical between environments.
QA might point to one endpoint.
Production points somewhere else.
Service accounts differ.
URLs differ.
Integration configuration differs.
Sometimes notification recipients differ.
That is expected.
What shouldn't happen is relying on someone's memory to manually hunt down every environment-specific value after every deployment.
This is where environment variables and connection references become much more than Power Platform features you know exist.
They become part of designing a solution that is actually portable.
The principle I keep coming back to is:
Move the logic. Configure the environment.
The more you can intentionally separate application logic from environment-specific configuration, the cleaner your deployments become.
And the fewer “Wait, did anyone update that URL?” conversations you have before go-live.
9. QA Isn't Only Testing the Application
This might be my favorite takeaway.
Every time we deploy from Dev into QA, we're obviously testing functionality.
But we're also testing our release process.
Did the right solution version arrive?
Did dependencies behave as expected?
Did the pipeline handle the deployment correctly?
Did the managed layers look right?
Did something require a manual configuration step?
Did security behave differently?
Did an integration need attention?
Did a relationship or mapping survive the move?
Every issue discovered in QA is information about what could happen later in UAT or Production.
Once I started thinking about QA this way, deployment issues stopped being isolated annoyances.
They became inputs into improving the release process.
10. Your Production Checklist Should Be Written by Your Earlier Deployments
This naturally led to another practice I value much more now: post-deployment validation.
Not because I particularly enjoy making checklists.
Because every deployment issue you've already solved is one you shouldn't have to solve again during go-live.
If a flow needs verification after deployment, add it.
If a relationship mapping caused trouble, add it.
If a connection reference required validation, add it.
If a specific component has had layering issues, add it.
If an integration needs an environment-specific check, add it.
If security behaves differently for a certain user group, add it.
Your Production checklist should be built throughout the project from actual deployment history, not from a generic template someone creates the week before go-live.
Consultant Law #12: If you find a deployment issue in QA and don't add it to the Production checklist, it will patiently wait until go-live to introduce itself again.
By the time Production arrives, the deployment should feel familiar.
Preferably boring.
Boring go-lives are underrated.
11. Component Validation Isn't Enough
Enterprise implementations make this especially obvious because so many pieces are connected.
A flow being enabled doesn't mean the process works.
A business rule being active doesn't mean it produces the expected result.
A relationship existing doesn't mean the mappings behave correctly.
A form loading doesn't mean a real user can complete the process.
This is why post-deployment testing eventually has to move beyond component checks into end-to-end scenarios.
If your process is:
Lead → Qualification → Opportunity → Quote → Contract
run the process.
Did the values map?
Did the expected records get created?
Did the automation fire?
Did the correct users get notified?
Did security behave correctly?
Did the downstream records update?
That is the state you're ultimately trying to protect through ALM.
Not whether every component happens to exist.
12. ALM Knowledge Makes You a Better Functional Consultant Too
One of my biggest takeaways from this project is that ALM shouldn't live exclusively in the developer or DevOps bucket.
As a functional/technical consultant, understanding ALM has made me much better at troubleshooting.
You don't necessarily need to be the person who built the pipeline.
But you should understand:
- Solution architecture
- Managed vs. unmanaged solutions
- Component ownership
- Dependencies
- Solution layers
- Environment variables
- Connection references
- Environment drift
- Deployment sequencing
- Post-deployment validation
Because the minute something behaves differently downstream, all of those concepts become relevant.
And being able to trace an issue across configuration, solution packaging, deployment, layering, and runtime behavior is much more valuable than only being able to confirm that the original configuration was correct.
What Working at Enterprise Scale Changed for Me
The interesting thing is that none of these concepts were completely new to me.
I had worked with solutions.
I had deployed between environments.
I understood managed versus unmanaged.
I knew what solution layers were.
I had worked with Power Automate, Dataverse, dependencies, and environment configuration.
What changed was seeing all of those concepts operating together, repeatedly, and at scale.
That's what enterprise delivery added.
It made the relationships between those concepts much clearer.
My biggest takeaways have been:
Treat ALM as part of the architecture, not the final step after development.
Know which solution owns a component and understand its dependency footprint.
Use managed deployments to protect the integrity of downstream environments.
Understand solution layers well enough to troubleshoot runtime behavior—not just define them.
Use pipelines for repeatability and governance, but don't confuse automation with validation.
Design environment-specific configuration intentionally.
Treat every lower-environment deployment as a rehearsal for Production.
Turn deployment failures into controls for the next release.
Validate business processes, not just components.
And maybe most importantly:
Good ALM reduces uncertainty.
As the number of environments, solutions, integrations, workstreams, and releases grows, you don't want deployment success to depend on tribal knowledge or someone remembering the right sequence of manual steps.
You want a process that is controlled, repeatable, observable, and increasingly predictable every time you run it.
That is the part of enterprise Power Platform ALM that I understand much differently now than I did before this project.
The concepts are the same.
The consequences of getting them wrong are just much bigger.