Why Power Platform Is Your Real Automation Layer — Not Custom Code
Why Power Platform Is Your Real Automation Layer — Not Custom Code Every new automation request in Microsoft Dynamics 365 seems to become a development ticket. A new approval path, Teams notification, reminder, document-generation process, or...
Key Takeaways
- Mirko Peters explains why organizations should stop defaulting to custom code for every Microsoft Dynamics 365 automation request and instead utilize the Microsoft Power Platform as the primary automation and orchestration layer.
- Relying heavily on custom plugins, JavaScript, and unmanaged technical code creates hidden long-term costs, developer dependency, and operational delays when business policies change.
- Transactional validation that ensures data integrity must remain within the Dataverse event pipeline using custom code when necessary, while downstream business processes and human approvals belong in Power Automate.
- Using Power Platform for orchestration provides visible execution histories, making it easier for business process owners, administrators, and support teams to inspect, understand, and modify rules.
- Automation requires strong organizational ownership aligned with business roles and support responsibilities rather than depending on a single employee's personal account or technical knowledge.
Why Power Platform Is Your Real Automation Layer — Not Custom Code
Every new automation request in Microsoft Dynamics 365 seems to become a development ticket. A new approval path, Teams notification, reminder, document-generation process, or integration enters a backlog while the business waits for an available developer.
In this episode of M365 FM, Mirko Peters challenges that traditional model and explains why Microsoft Power Platform should become the visible automation layer between Dynamics 365, Dataverse, people, decisions, and connected business systems.
This is not an argument against custom code. It is a practical framework for understanding where Power Automate, Power Apps, Power Fx, Dataverse, solutions, environment variables, security, and governance belong—and where professional development remains the correct architectural choice.
ㅤ
THE AUTOMATION ASSUMPTION IS BROKEN
Many Dynamics environments begin every process request with the same question: where should we write the code?
That question narrows the architecture before the team understands what changed in the business, which decision must be made, who needs to respond, which systems need information, and who owns the process after deployment.
Power Platform should sit between a Dynamics event and the surrounding business outcome. It can interpret signals, apply visible rules, coordinate human decisions, connect services, and record what happened. Custom code remains valuable, but it should not automatically own every process change.
ㅤ
THE OLD DYNAMICS CUSTOMIZATION MODEL
In the traditional model, every difference between the standard Dynamics application and the business process becomes another customization.
A developer creates a Dataverse plug-in, attaches JavaScript to a form, builds a custom workflow activity, adds a scheduled job, or creates another integration service. Each individual feature may work correctly, but the complete process gradually becomes distributed across assemblies, scripts, workflows, APIs, configuration values, and specialist knowledge.
The process owner understands the policy but cannot inspect the technical behavior. The developer understands the implementation but may not own the business decision. Support becomes responsible when something fails, even though it may not know which component triggered the outcome.
This creates delivery control without creating true process ownership.
ㅤ
THE HIDDEN COST OF CUSTOM AUTOMATION
The initial development cost is visible because it appears in estimates, project budgets, and delivery reports. The long-term operating cost is distributed across support tickets, testing cycles, incident investigation, documentation updates, platform upgrades, and the time required to locate old business rules.
A small policy change can become a multi-day development task when a threshold is hidden inside code. Someone must find the relevant implementation, identify the production version, change it, test related behavior, deploy it correctly, and confirm that nothing else relies on the same value.
The business may conclude that Dynamics is slow to change. In reality, the automation model is creating the delay.
ㅤ
WHY DOCUMENTATION AND SUPPORT OFTEN FAIL
Documentation usually describes the process as it existed when the solution launched. The business then changes, developers update the implementation, and the original documents slowly become unreliable.
Eventually, the code describes the current system behavior while the documentation describes an older version of the business. Neither gives process owners a clear and trustworthy answer.
Support teams feel this problem when a record changes unexpectedly or a notification fails. They can see that something happened, but they may not know whether the cause was a plug-in, JavaScript, a classic workflow, Power Automate, or an external integration.
The real escalation path becomes finding the person who remembers the automation. When that person leaves, the organization loses more than technical capacity—it loses the map.
ㅤ
CUSTOM CODE IS NOT THE ENEMY
Custom code still belongs in Dynamics and Power Platform architecture. Some requirements must execute inside the Dataverse transaction before a record is accepted.
A plug-in may be the correct choice when a rule must prevent invalid data from being saved, perform a controlled calculation, support a performance-sensitive operation, or guarantee consistent server-side behavior regardless of how the data enters Dataverse.
Code also remains appropriate for reusable software components, specialist integrations, PCF controls, custom connectors, products, and technical services with their own lifecycle and interface contracts.
The important principle is to keep the code boundary narrow. A plug-in should validate one rule, calculate one result, or perform one controlled operation. It should not quietly become responsible for approvals, reminders, documents, escalations, and several external systems.
Code earns its place through architectural necessity and engineering discipline—not through habit.
ㅤ
THE DIFFERENCE BETWEEN VALIDATION AND ORCHESTRATION
Some rules define what must be true before a record can be saved. These belong close to the Dataverse transaction.
Other rules determine what should happen after the record already meets that standard. These belong in the automation layer.
For example, mandatory legal data may need to block a contract from entering an active state. That is transactional validation. Requesting a legal review, notifying an approver, waiting for a response, and updating the contract afterward are orchestration.
Separating these responsibilities prevents users from waiting while unnecessary background work executes synchronously. It also prevents invalid data from entering the system while a downstream automation attempts to correct it later.
Enforce what must be true now. Orchestrate what needs to happen next.
ㅤ
POWER PLATFORM AS THE REASONING LAYER
An event only tells the system that something changed. It does not automatically explain why work should begin or what should happen next.
An opportunity reaches a stage. A case receives a priority. A customer changes owner. The automation layer must determine whether the business conditions are satisfied, which policy applies, who should respond, and which exception route should be used.
Power Automate conditions, approvals, switches, Dataverse data, and Power Fx formulas can make this reasoning visible. Process owners do not need to become developers, but they should be able to understand and validate the policy they own.
A decision about sales approval may depend on opportunity value, discount, region, account category, payment terms, ownership, or unresolved risk. These conditions should form a clear sequence rather than disappearing into one hidden block of technical logic.
ㅤ
A SALES APPROVAL WITHOUT A PLUGIN
Consider an opportunity that reaches a commercial threshold. The process may need to confirm the current stage, validate required information, determine the applicable approval route, request a decision, record the outcome in Dataverse, notify the seller, and handle delays or rejection.
This process crosses data, policy, people, time, and communication channels. It is orchestration rather than transactional validation.
Power Automate can begin from the Dataverse record, evaluate the relevant business context, route approval to the correct person, send information through Teams or Outlook, wait for a response, update the opportunity, and preserve a visible execution history.
The business can inspect where the process stopped and why. Support can review the run history instead of searching through an assembly. Policy changes can be delivered through a controlled Power Platform lifecycle without turning every adjustment into a new custom-development project.
ㅤ
SPEED MEANS TIME TO CHANGE
Technical teams often define speed as execution time in milliseconds. Business teams experience speed differently. For them, speed includes the time required to understand a request, implement a change, test it, release it, and support it afterward.
A custom plug-in may execute faster than a cloud flow while taking weeks longer to modify and deploy. A flow may take several seconds to complete while allowing the organization to change a business rule safely within days.
The correct architecture depends on the requirement. Transactional and high-volume operations may need code-level performance. Human approvals and cross-system business processes usually care more about visibility, adaptability, and time to change.
ㅤ
AUTOMATION NEEDS ORGANIZATIONAL OWNERSHIP
A personal flow can become business-critical without anyone deliberately making that decision. The creator changes role, leaves the company, loses a license, or has a connection expire, and an important process suddenly has no reliable owner.
Production automation should not depend on a single employee’s personal identity. It needs an ownership model aligned with the business process, data sensitivity, operating team, and support responsibility.
Become a supporter of this podcast: https://www.spreaker.com/podcast/m365-fm-modern-work-security-and-productivity-with-microsoft-365--6704921/support.
🚀 Want to be part of m365.fm?
Then stop just listening… and start showing up.
👉 Connect with me on LinkedIn and let’s make something happen:
- 🎙️ Be a podcast guest and share your story
- 🎧 Host your own episode (yes, seriously)
- 💡 Pitch topics the community actually wants to hear
- 🌍 Build your personal brand in the Microsoft 365 space
This isn’t just a podcast — it’s a platform for people who take action.
🔥 Most people wait. The best ones don’t.
👉 Connect with me on LinkedIn and send me a message:
"I want in"
Let’s build something awesome 👊
Frequently Asked Questions
Why is custom code often a poor choice for business process automation?
Custom code hides business rules inside technical assemblies and scripts, making processes difficult for business owners to inspect and turning simple policy updates into multi-day development tickets.
When should custom code still be used in Dynamics 365 and Power Platform architecture?
Custom code should be used for server-side transactional validation where a record must never exist in an invalid state, for high-performance calculations, or for building reusable software components and technical integrations.
What is the difference between transactional validation and orchestration?
Transactional validation enforces strict rules before a record is saved into Dataverse, whereas orchestration manages downstream processes like routing approvals, sending notifications, and coordinating multi-step workflows.
How does Power Platform improve visibility and support for M365 administrators?
Power Platform provides a visual run history for cloud flows, enabling support teams and process owners to easily inspect triggers, condition branches, and failure points without scouring through custom code assemblies.
1
00:00:00,000 --> 00:00:04,240
Every automation request in Dynamics becomes a development request, a new approval path,
2
00:00:04,240 --> 00:00:08,880
a reminder, a team's notification, a document created when a deal changes stage, it lands
3
00:00:08,880 --> 00:00:09,880
in a backlog.
4
00:00:09,880 --> 00:00:12,400
Then someone asks, which developer can pick it up?
5
00:00:12,400 --> 00:00:14,960
That model looks normal, it has existed for years.
6
00:00:14,960 --> 00:00:19,120
But it starts from the wrong question, not what changed in the process, not who needs
7
00:00:19,120 --> 00:00:22,000
to act, not which system needs to know.
8
00:00:22,000 --> 00:00:24,680
It starts with, where do we write the code?
9
00:00:24,680 --> 00:00:27,960
And that's where the automation decision already narrows too early.
10
00:00:27,960 --> 00:00:30,880
More platform should sit between Dynamics and the work around it.
11
00:00:30,880 --> 00:00:34,560
It should handle the signals, decisions, people and connected systems that turn a record
12
00:00:34,560 --> 00:00:36,400
change into a business outcome.
13
00:00:36,400 --> 00:00:39,320
Custom code still has a place, it just shouldn't become the default answer before anyone
14
00:00:39,320 --> 00:00:40,880
understands the process.
15
00:00:40,880 --> 00:00:44,440
If you work with Dynamics and you're trying to make better automation choices, subscribe
16
00:00:44,440 --> 00:00:46,160
to M365FM.
17
00:00:46,160 --> 00:00:49,480
Because the problem usually isn't the tool, it's the model behind the tool.
18
00:00:49,480 --> 00:00:52,480
The old model, Dynamics as an application to customize.
19
00:00:52,480 --> 00:00:54,960
In the old model, Dynamics arrives as a product.
20
00:00:54,960 --> 00:00:59,280
The business starts using it, then the gaps appear, sales wants another rule on an opportunity,
21
00:00:59,280 --> 00:01:02,600
service wants a different case route, finance wants approval before someone can change a
22
00:01:02,600 --> 00:01:07,240
value, operations wants customer data sent somewhere else when a record reaches a certain
23
00:01:07,240 --> 00:01:08,240
status.
24
00:01:08,240 --> 00:01:10,360
Each request can look small on its own.
25
00:01:10,360 --> 00:01:13,960
But teams often treat the application as fixed, every difference in how the business
26
00:01:13,960 --> 00:01:16,360
works needs custom work around the edges.
27
00:01:16,360 --> 00:01:20,520
So the request goes to a developer, a plug-in gets written, a JavaScript file gets attached
28
00:01:20,520 --> 00:01:25,080
to a form, a custom workflow activity appears, an integration service gets built, maybe
29
00:01:25,080 --> 00:01:29,120
a developer adds a web hook or a schedule job or another API endpoint that only one person
30
00:01:29,120 --> 00:01:30,200
really understands.
31
00:01:30,200 --> 00:01:33,640
The work gets delivered, the ticket closes, everyone moves on.
32
00:01:33,640 --> 00:01:35,200
That feels like progress.
33
00:01:35,200 --> 00:01:37,000
But feature completion is a weak measure.
34
00:01:37,000 --> 00:01:40,520
A feature can work perfectly on release day and still create a problem for the next person
35
00:01:40,520 --> 00:01:41,880
who needs to change it.
36
00:01:41,880 --> 00:01:45,760
Because the completed feature doesn't show the full process, it shows one technical response
37
00:01:45,760 --> 00:01:48,440
to one request, at one moment in time.
38
00:01:48,440 --> 00:01:52,920
The business rule now sits inside a plug-in assembly, or inside a script library, or inside
39
00:01:52,920 --> 00:01:56,440
a workflow that calls a custom activity, or split across all of them.
40
00:01:56,440 --> 00:01:58,840
The person asking for the change may know the policy.
41
00:01:58,840 --> 00:02:02,520
The developer may know the code, neither person may see the whole automation.
42
00:02:02,520 --> 00:02:04,280
That gap matters.
43
00:02:04,280 --> 00:02:07,960
A sales leader might say deals above this amount need approval.
44
00:02:07,960 --> 00:02:12,240
Simple enough, but the actual process could depend on the account type, the discount level,
45
00:02:12,240 --> 00:02:16,000
the country, the owner's business unit, and whether legal terms changed after the first
46
00:02:16,000 --> 00:02:17,000
approval.
47
00:02:17,000 --> 00:02:19,920
The conversation begins with code, the team may implement the first version of the rule
48
00:02:19,920 --> 00:02:23,720
before anyone has mapped who owns the policy, who responds, what happens when nobody responds,
49
00:02:23,720 --> 00:02:25,640
or where the decision needs to appear.
50
00:02:25,640 --> 00:02:29,280
The code solves the visible request, the process stays partly invisible.
51
00:02:29,280 --> 00:02:33,240
And most organizations repeat this pattern because custom development looks controlled.
52
00:02:33,240 --> 00:02:36,640
There's a ticket, there's a sprint, there's a release, there's a developer assigned to
53
00:02:36,640 --> 00:02:40,080
the work, but control over delivery isn't the same as control over automation.
54
00:02:40,080 --> 00:02:42,320
A process has a life after deployment.
55
00:02:42,320 --> 00:02:46,240
Policies change, teams reorganize, thresholds move, new regions appear.
56
00:02:46,240 --> 00:02:49,360
Everyone asks for a different escalation route because the old one no longer matches how
57
00:02:49,360 --> 00:02:50,360
work happens.
58
00:02:50,360 --> 00:02:53,600
Now the original feature isn't just a feature, it's part of the operating system of the
59
00:02:53,600 --> 00:02:56,680
business, yet ownership often stays with the build team.
60
00:02:56,680 --> 00:03:01,160
The sales operations team owns the approval policy, the platform team owns dynamics, a developer
61
00:03:01,160 --> 00:03:02,840
owns the code knowledge.
62
00:03:02,840 --> 00:03:04,520
Support owns the incident when it fails.
63
00:03:04,520 --> 00:03:08,120
No one owns the complete behavior from event to decision to action.
64
00:03:08,120 --> 00:03:11,440
That creates a strange setup, the people closest to the process can describe what needs
65
00:03:11,440 --> 00:03:12,440
to change.
66
00:03:12,440 --> 00:03:14,240
But they can't inspect the automation.
67
00:03:14,240 --> 00:03:18,240
The people who can inspect the automation may not know whether the policy still makes sense,
68
00:03:18,240 --> 00:03:21,200
so every small change becomes a translation exercise.
69
00:03:21,200 --> 00:03:24,440
Business explains the outcome, an analyst turns it into requirements.
70
00:03:24,440 --> 00:03:28,800
A developer turns requirements into code, a tester checks what the developer built, then
71
00:03:28,800 --> 00:03:32,320
production receives another technical artifact that someone must remember exists.
72
00:03:32,320 --> 00:03:36,000
This isn't an argument against developers, it's an argument against using developers as
73
00:03:36,000 --> 00:03:39,160
the routing layer for every business process change.
74
00:03:39,160 --> 00:03:42,160
Dynamics has always supported deep extension for good reasons.
75
00:03:42,160 --> 00:03:45,280
Some rules need to run inside the dataverse event pipeline.
76
00:03:45,280 --> 00:03:49,400
Some calculations need precise technical control, some integrations need code because
77
00:03:49,400 --> 00:03:51,280
the surrounding system demands it.
78
00:03:51,280 --> 00:03:55,560
But when every gap triggers the same response, the platform becomes a collection of custom
79
00:03:55,560 --> 00:03:58,960
answers rather than a clear automation system.
80
00:03:58,960 --> 00:04:03,160
You end up with plugins for validation, scripts for user behavior, workflow activities
81
00:04:03,160 --> 00:04:06,440
for background work, integrations for notifications.
82
00:04:06,440 --> 00:04:10,600
Each piece may behave correctly, together they can become difficult to explain, and if you
83
00:04:10,600 --> 00:04:15,280
can't explain why a record triggered work who approved it, what system changed and who
84
00:04:15,280 --> 00:04:19,720
owns the failure you don't have an automation layer, you have accumulated customization.
85
00:04:19,720 --> 00:04:23,000
The next question is what that accumulation produces over time.
86
00:04:23,000 --> 00:04:25,240
The cost nobody put into the business case.
87
00:04:25,240 --> 00:04:30,240
The build cost is easy to see, a project gets funded, a developer estimates the work, someone
88
00:04:30,240 --> 00:04:32,600
approves the budget, then the plugin goes live.
89
00:04:32,600 --> 00:04:36,240
That number ends up in a report, the operating cost goes somewhere else, it lands in support
90
00:04:36,240 --> 00:04:37,240
tickets.
91
00:04:37,240 --> 00:04:40,560
In test cycles, in meetings where people try to work out why an old rule fired.
92
00:04:40,560 --> 00:04:44,540
It lands in the time a senior developer spends reading code they didn't write, because
93
00:04:44,540 --> 00:04:48,280
a sales manager needs one approval threshold changed before next week.
94
00:04:48,280 --> 00:04:51,200
Nobody calls that a custom code project, but it belongs to the same decision.
95
00:04:51,200 --> 00:04:54,920
This is where the business case usually breaks, not because the first build cost was wrong,
96
00:04:54,920 --> 00:04:56,520
because it treated delivery as the cost.
97
00:04:56,520 --> 00:04:58,680
The real cost begins after delivery.
98
00:04:58,680 --> 00:05:01,480
Dynamics changes over time, Microsoft updates the platform.
99
00:05:01,480 --> 00:05:05,280
Your forms change, your tables change, security rolls change, another integration starts
100
00:05:05,280 --> 00:05:06,720
writing to the same record.
101
00:05:06,720 --> 00:05:10,880
A process that looked isolated suddenly sits inside a wider chain of automation.
102
00:05:10,880 --> 00:05:15,200
Now every platform release, solution deployment or schema update creates a question.
103
00:05:15,200 --> 00:05:17,680
Did the custom logic still behave as expected?
104
00:05:17,680 --> 00:05:19,560
That doesn't mean every update breaks code.
105
00:05:19,560 --> 00:05:22,240
It means responsible teams need to test the possibility.
106
00:05:22,240 --> 00:05:24,440
A plugin may rely on a field being present.
107
00:05:24,440 --> 00:05:26,960
A script may assume a form behaves a certain way.
108
00:05:26,960 --> 00:05:31,200
A custom workflow activity may rely on data arriving in a specific order.
109
00:05:31,200 --> 00:05:35,400
The test effort expands because the behavior isn't always visible from the business process.
110
00:05:35,400 --> 00:05:37,120
You need to know the technical path.
111
00:05:37,120 --> 00:05:40,600
And often that knowledge lives with a person, not with the organization.
112
00:05:40,600 --> 00:05:41,800
Consider a simple request.
113
00:05:41,800 --> 00:05:45,600
A commercial director wants to change an approval limit from one amount to another.
114
00:05:45,600 --> 00:05:48,200
The policy changed, nothing technical changed.
115
00:05:48,200 --> 00:05:52,080
But if that limit sits in code, the request turns into development work.
116
00:05:52,080 --> 00:05:55,400
Someone needs to locate the rule, confirm which version runs in production.
117
00:05:55,400 --> 00:05:59,040
Change it safely, test the result, deploy it through the right path, then confirm that
118
00:05:59,040 --> 00:06:02,120
another part of the code doesn't use the same value for a different reason.
119
00:06:02,120 --> 00:06:03,760
The request could take days.
120
00:06:03,760 --> 00:06:08,080
Just because changing a number takes days, because changing a hidden rule safely takes days.
121
00:06:08,080 --> 00:06:09,400
That's developer dependency.
122
00:06:09,400 --> 00:06:11,120
And it doesn't only affect developers.
123
00:06:11,120 --> 00:06:14,840
The business weights, the support team weights, the process owner either works around the old
124
00:06:14,840 --> 00:06:18,560
rule or sends exceptions through email until the change arrives.
125
00:06:18,560 --> 00:06:21,800
Then somebody asks why dynamics feels slow to change.
126
00:06:21,800 --> 00:06:23,800
Dynamics isn't slow, the automation model is.
127
00:06:23,800 --> 00:06:24,920
Documentation should close that gap.
128
00:06:24,920 --> 00:06:26,600
In practice, it often doesn't.
129
00:06:26,600 --> 00:06:29,720
At go live, teams document the original requirements.
130
00:06:29,720 --> 00:06:31,440
They document the solution design.
131
00:06:31,440 --> 00:06:35,280
Maybe they document the assemblies, scripts, endpoints and configuration values.
132
00:06:35,280 --> 00:06:36,280
Then the business changes.
133
00:06:36,280 --> 00:06:38,120
A manager changes the approval route.
134
00:06:38,120 --> 00:06:39,960
A new region needs a different exception.
135
00:06:39,960 --> 00:06:41,240
A policy gets simplified.
136
00:06:41,240 --> 00:06:42,520
The code gets updated.
137
00:06:42,520 --> 00:06:44,360
But the process document stays behind.
138
00:06:44,360 --> 00:06:48,360
Soon, the documentation explains the version of the business that existed six months ago.
139
00:06:48,360 --> 00:06:50,560
The code explains what the system currently does.
140
00:06:50,560 --> 00:06:52,800
Neither one gives a process owner a reliable answer.
141
00:06:52,800 --> 00:06:55,720
So they ask around, does this rule still apply?
142
00:06:55,720 --> 00:06:57,200
Who owns this integration?
143
00:06:57,200 --> 00:06:58,920
Why did the record update?
144
00:06:58,920 --> 00:07:00,200
Can we turn this off?
145
00:07:00,200 --> 00:07:01,680
It's not a technical failure.
146
00:07:01,680 --> 00:07:05,400
It's an ownership failure created by an automation that people can't inspect.
147
00:07:05,400 --> 00:07:06,640
Support teams feel this first.
148
00:07:06,640 --> 00:07:10,640
A user calls because an opportunity changed status unexpectedly.
149
00:07:10,640 --> 00:07:12,120
Or a notification never arrived.
150
00:07:12,120 --> 00:07:14,960
Or an external system received the wrong value.
151
00:07:14,960 --> 00:07:16,120
Support opens the record.
152
00:07:16,120 --> 00:07:17,480
They check the audit history.
153
00:07:17,480 --> 00:07:18,880
They can see something happened.
154
00:07:18,880 --> 00:07:20,720
But they may not see the rule that decided it.
155
00:07:20,720 --> 00:07:24,680
They may not know whether a plug-in ran, whether JavaScript changed a field, whether a custom
156
00:07:24,680 --> 00:07:29,080
workflow activity triggered an integration, or whether another system wrote directly into
157
00:07:29,080 --> 00:07:30,080
data verse.
158
00:07:30,080 --> 00:07:31,080
So the ticket moves.
159
00:07:31,080 --> 00:07:33,080
First line support sends it to the dynamics team.
160
00:07:33,080 --> 00:07:35,120
The dynamics team sends it to the integration team.
161
00:07:35,120 --> 00:07:37,760
The integration team asks the developer to inspect logs.
162
00:07:37,760 --> 00:07:39,520
Meanwhile, the user still needs an answer.
163
00:07:39,520 --> 00:07:41,400
This creates a hidden support model.
164
00:07:41,400 --> 00:07:43,160
The official support process might look clear.
165
00:07:43,160 --> 00:07:47,280
The actual support process depends on finding the person who remembers the automation.
166
00:07:47,280 --> 00:07:48,560
That person becomes a bottleneck.
167
00:07:48,560 --> 00:07:49,560
They may be busy.
168
00:07:49,560 --> 00:07:50,560
They may have moved to another team.
169
00:07:50,560 --> 00:07:51,560
They may have left.
170
00:07:51,560 --> 00:07:53,560
And when they leave, the business doesn't lose just a developer.
171
00:07:53,560 --> 00:07:54,560
It loses the map.
172
00:07:54,560 --> 00:07:58,280
Power Platform doesn't remove the need for design, testing, or support.
173
00:07:58,280 --> 00:07:59,280
That would be a false promise.
174
00:07:59,280 --> 00:08:02,160
A badly designed flow can create confusion too.
175
00:08:02,160 --> 00:08:06,160
But it can place more of the process in a form that process owners, admins, and support
176
00:08:06,160 --> 00:08:07,320
teams can inspect.
177
00:08:07,320 --> 00:08:08,440
They can see the trigger.
178
00:08:08,440 --> 00:08:09,880
They can see the conditions.
179
00:08:09,880 --> 00:08:11,480
They can see the approval branch.
180
00:08:11,480 --> 00:08:13,360
They can see the action that failed.
181
00:08:13,360 --> 00:08:14,960
That changes the operating cost.
182
00:08:14,960 --> 00:08:19,040
Not because nobody needs technical skill, because fewer routine changes begin with a search
183
00:08:19,040 --> 00:08:20,120
through custom code.
184
00:08:20,120 --> 00:08:21,760
So separate two decisions.
185
00:08:21,760 --> 00:08:24,520
The first is whether code can solve the requirement.
186
00:08:24,520 --> 00:08:25,920
Usually it can.
187
00:08:25,920 --> 00:08:29,960
The second is whether code should own that requirement for the next five years.
188
00:08:29,960 --> 00:08:32,160
That decision needs a different standard.
189
00:08:32,160 --> 00:08:33,480
Custom code isn't the enemy.
190
00:08:33,480 --> 00:08:35,240
Custom code still belongs in dynamics.
191
00:08:35,240 --> 00:08:37,400
Some decisions must happen before a record saves.
192
00:08:37,400 --> 00:08:38,760
A user enters a value.
193
00:08:38,760 --> 00:08:40,280
An integration submits an update.
194
00:08:40,280 --> 00:08:42,400
A data import changes a status.
195
00:08:42,400 --> 00:08:46,040
Before a dataverse accepts that change, a rule may need to inspect the data and stop it.
196
00:08:46,040 --> 00:08:47,280
That's a server side boundary.
197
00:08:47,280 --> 00:08:51,520
If a record must never exist in an invalid state, the rule can't wait for an asynchronous
198
00:08:51,520 --> 00:08:52,760
flow to run later.
199
00:08:52,760 --> 00:08:55,440
It needs to run in the dataverse event pipeline.
200
00:08:55,440 --> 00:08:57,560
This is where a plugin can be the right choice.
201
00:08:57,560 --> 00:09:01,640
Take a rule that checks a regulated identifier across related records before a case can move
202
00:09:01,640 --> 00:09:02,640
forward.
203
00:09:02,640 --> 00:09:06,280
Or a rule that prevents a contract from entering an active state when mandatory legal data
204
00:09:06,280 --> 00:09:07,280
is missing.
205
00:09:07,280 --> 00:09:10,080
The record either passes the rule or doesn't save.
206
00:09:10,080 --> 00:09:11,880
That decision needs controlled execution.
207
00:09:11,880 --> 00:09:13,280
Not a notification after the fact.
208
00:09:13,280 --> 00:09:16,520
Not a cleanup process after bad data already entered the system.
209
00:09:16,520 --> 00:09:19,160
And some calculations need the same level of control.
210
00:09:19,160 --> 00:09:24,120
A calculation may depend on several related records, a defined sequence of operations,
211
00:09:24,120 --> 00:09:25,840
and strict handling of failure.
212
00:09:25,840 --> 00:09:29,800
It may need to run once against the right data with a clear result before the next part
213
00:09:29,800 --> 00:09:31,400
of the transaction continues.
214
00:09:31,400 --> 00:09:34,200
You don't build that as a broad flow because flows can build it.
215
00:09:34,200 --> 00:09:38,200
You use the right execution model because the business outcome depends on it.
216
00:09:38,200 --> 00:09:39,840
Volume changes the decision too.
217
00:09:39,840 --> 00:09:42,800
Imagine an integration processing large numbers of records.
218
00:09:42,800 --> 00:09:44,480
Each record creates related work.
219
00:09:44,480 --> 00:09:45,960
Each update triggers checks.
220
00:09:45,960 --> 00:09:47,480
Each check could call other services.
221
00:09:47,480 --> 00:09:51,240
A slow design can create pressure across the whole process.
222
00:09:51,240 --> 00:09:53,680
The answer isn't always right more code.
223
00:09:53,680 --> 00:09:57,480
And high volume performance sensitive operations need deliberate design.
224
00:09:57,480 --> 00:10:01,200
A focused seabass plugin can sometimes perform a narrow piece of work more efficiently
225
00:10:01,200 --> 00:10:04,240
than a long chain of connector calls and repeated record queries.
226
00:10:04,240 --> 00:10:08,600
It gives developers direct control over queries, execution parts, error handling and resource
227
00:10:08,600 --> 00:10:09,600
use.
228
00:10:09,600 --> 00:10:11,200
That is one proper reason to use code.
229
00:10:11,200 --> 00:10:12,440
There's another case.
230
00:10:12,440 --> 00:10:17,080
You may be building something that extends beyond one internal dynamics process, a reusable
231
00:10:17,080 --> 00:10:22,040
component, a custom connector, a PCF control for a specific user experience, a product
232
00:10:22,040 --> 00:10:24,200
capability used across customers.
233
00:10:24,200 --> 00:10:27,360
An external service with its own life cycle and technical contract.
234
00:10:27,360 --> 00:10:28,800
These are software components.
235
00:10:28,800 --> 00:10:33,440
They need software engineering, version control, tests, clear interfaces, people who understand
236
00:10:33,440 --> 00:10:35,120
the technical boundary they own.
237
00:10:35,120 --> 00:10:39,400
Trying to force those into a cloud flow just to avoid code doesn't create a better architecture.
238
00:10:39,400 --> 00:10:40,840
It creates a harder one to operate.
239
00:10:40,840 --> 00:10:42,400
So the argument isn't low code everywhere.
240
00:10:42,400 --> 00:10:43,960
That becomes its own flawed model.
241
00:10:43,960 --> 00:10:45,200
The question is simpler.
242
00:10:45,200 --> 00:10:47,720
Does this requirement need to run inside the transaction?
243
00:10:47,720 --> 00:10:49,520
Does it need strict performance control?
244
00:10:49,520 --> 00:10:52,800
Does it need a technical component that other systems or products consume?
245
00:10:52,800 --> 00:10:56,280
If the answer is yes, code may be the correct layer, but keep it narrow.
246
00:10:56,280 --> 00:10:58,760
A plug-in should do one defined job.
247
00:10:58,760 --> 00:11:00,080
Validate one rule.
248
00:11:00,080 --> 00:11:01,080
Calculate one result.
249
00:11:01,080 --> 00:11:02,320
Apply one control change.
250
00:11:02,320 --> 00:11:06,240
It shouldn't quietly become the place where an entire business process lives.
251
00:11:06,240 --> 00:11:10,200
Once a plug-in starts sending messages, waiting for people creating documents, calling several
252
00:11:10,200 --> 00:11:14,200
external systems and deciding escalations, it has crossed the boundary.
253
00:11:14,200 --> 00:11:15,880
Now it's carrying orchestration work.
254
00:11:15,880 --> 00:11:20,080
When orchestration has different needs, it needs visibility, it needs retries, it needs human
255
00:11:20,080 --> 00:11:24,520
decisions, it needs a clear record of what happened when another system didn't respond.
256
00:11:24,520 --> 00:11:27,200
A focused plug-in also needs proper failure behavior.
257
00:11:27,200 --> 00:11:31,040
If validation fails, return an error that tells the user what to fix, not a vague message
258
00:11:31,040 --> 00:11:32,880
that sends them to support.
259
00:11:32,880 --> 00:11:37,000
If an unexpected technical error occurs, capture enough detail for the team to investigate
260
00:11:37,000 --> 00:11:39,440
without exposing internal information to the user.
261
00:11:39,440 --> 00:11:43,160
Then test it under realistic load, not just one record in a development environment.
262
00:11:43,160 --> 00:11:45,200
Test the record patterns it will see in production.
263
00:11:45,200 --> 00:11:46,760
Test concurrent updates.
264
00:11:46,760 --> 00:11:48,080
Test failure parts.
265
00:11:48,080 --> 00:11:50,520
Test what happens when related data is missing.
266
00:11:50,520 --> 00:11:53,600
Code earns its place through discipline, not through habit.
267
00:11:53,600 --> 00:11:55,560
And that distinction clears up the architecture.
268
00:11:55,560 --> 00:11:58,680
Use code where the dataverse transaction needs code.
269
00:11:58,680 --> 00:12:03,360
Use power platform where the process needs to move across people, systems, time and decisions.
270
00:12:03,360 --> 00:12:07,040
That's the automation layer dynamics teams need to define next.
271
00:12:07,040 --> 00:12:08,040
Reasoning.
272
00:12:08,040 --> 00:12:09,880
The rules between event and action.
273
00:12:09,880 --> 00:12:13,400
An event tells you something changed, but it doesn't say what happens next.
274
00:12:13,400 --> 00:12:15,440
An opportunity reaches a new stage.
275
00:12:15,440 --> 00:12:16,760
A case gets a priority.
276
00:12:16,760 --> 00:12:18,520
A customer record changes owner.
277
00:12:18,520 --> 00:12:19,960
That change needs a reason.
278
00:12:19,960 --> 00:12:22,240
The system decides whether work should start now.
279
00:12:22,240 --> 00:12:24,320
The record either meets the policy or it doesn't.
280
00:12:24,320 --> 00:12:26,400
The process knows who needs to decide.
281
00:12:26,400 --> 00:12:27,760
And the exception path is clear.
282
00:12:27,760 --> 00:12:30,160
This is the layer between the event and the action.
283
00:12:30,160 --> 00:12:31,600
And it has to stay visible.
284
00:12:31,600 --> 00:12:35,440
In most dynamics environments, rules grow one request at a time.
285
00:12:35,440 --> 00:12:39,080
If the discount exceeds this amount, ask for approval.
286
00:12:39,080 --> 00:12:42,960
Unless the customer belongs to this segment, unless the seller has this role, unless
287
00:12:42,960 --> 00:12:45,320
legal already approved the latest terms.
288
00:12:45,320 --> 00:12:47,040
Each condition makes sense on its own.
289
00:12:47,040 --> 00:12:48,920
Together, they become the actual policy.
290
00:12:48,920 --> 00:12:51,880
The problem starts when the policy only lives in technical logic.
291
00:12:51,880 --> 00:12:55,360
A process owner can explain the intended rule, but they can't check whether the system follows
292
00:12:55,360 --> 00:12:59,640
it without asking someone to inspect an assembly script or a hidden configuration chain.
293
00:12:59,640 --> 00:13:01,400
That slows down every conversation.
294
00:13:01,400 --> 00:13:04,600
The process owner asks, why did this deal root to that person?
295
00:13:04,600 --> 00:13:06,400
The answer shouldn't require a code review.
296
00:13:06,400 --> 00:13:09,920
A well-built automation shows the decision path, it shows the threshold.
297
00:13:09,920 --> 00:13:12,320
The owner checked the approval condition, the exception.
298
00:13:12,320 --> 00:13:15,080
Not because every process owner needs to become a maker.
299
00:13:15,080 --> 00:13:17,760
Because they need to validate the policy they own.
300
00:13:17,760 --> 00:13:21,120
Power automate gives teams a visual place for that reasoning.
301
00:13:21,120 --> 00:13:23,080
Conditions branch the process based on record data.
302
00:13:23,080 --> 00:13:25,560
A switch can send different cases through different routes.
303
00:13:25,560 --> 00:13:28,440
Approvals can pause work until the right person responds.
304
00:13:28,440 --> 00:13:32,760
Exception paths can root work to a queue, create a review task, or notify the right team
305
00:13:32,760 --> 00:13:34,800
when the normal route no longer applies.
306
00:13:34,800 --> 00:13:37,440
That's not just easier to build, it's easier to challenge.
307
00:13:37,440 --> 00:13:39,120
And business rules should be challenged.
308
00:13:39,120 --> 00:13:43,000
A rule nobody questions for three years often stops matching the business long before someone
309
00:13:43,000 --> 00:13:45,120
notices, take commercial approvals.
310
00:13:45,120 --> 00:13:49,200
The decision might depend on the opportunity value, but value alone rarely tells the full
311
00:13:49,200 --> 00:13:50,200
story.
312
00:13:50,200 --> 00:13:54,600
The process may also check the account category, deal stage, region, discount percentage, payment
313
00:13:54,600 --> 00:13:58,440
terms, seller ownership, and whether the customer has an unresolved risk issue.
314
00:13:58,440 --> 00:14:00,880
Those conditions don't need to become one giant piece of logic.
315
00:14:00,880 --> 00:14:02,200
They need a clear sequence.
316
00:14:02,200 --> 00:14:04,960
First, confirm the opportunity reach the right stage.
317
00:14:04,960 --> 00:14:07,560
Then check whether the record includes the required data.
318
00:14:07,560 --> 00:14:11,480
After that determine the policy route based on value, risk, and ownership.
319
00:14:11,480 --> 00:14:14,640
If an exception applies, send it to a defined review path.
320
00:14:14,640 --> 00:14:16,720
Otherwise let the standard route continue.
321
00:14:16,720 --> 00:14:19,600
That sequence gives people a way to understand the decision.
322
00:14:19,600 --> 00:14:21,240
It also gives them a way to change it.
323
00:14:21,240 --> 00:14:24,560
A policy owner can see that a regional threshold needs updating.
324
00:14:24,560 --> 00:14:26,800
They can review the impact with the platform team.
325
00:14:26,800 --> 00:14:31,040
The maker can update the rule inside a managed process, test it, and release it through
326
00:14:31,040 --> 00:14:32,400
the proper path.
327
00:14:32,400 --> 00:14:36,840
The change stays connected to the process, rather than disappearing into a technical request.
328
00:14:36,840 --> 00:14:39,360
Now FX extends this model for focused decisions.
329
00:14:39,360 --> 00:14:43,280
It gives makers a formula language for logic that needs more than a simple condition.
330
00:14:43,280 --> 00:14:47,680
You can calculate a value, check data across related records, set a result based on defined
331
00:14:47,680 --> 00:14:51,680
rules, build a clear expression around a business decision, but keep the scope tight.
332
00:14:51,680 --> 00:14:53,280
A formula should express a decision.
333
00:14:53,280 --> 00:14:57,200
It shouldn't turn into a hidden process engine inside one unreadable expression.
334
00:14:57,200 --> 00:14:59,520
If the logic becomes difficult to read, split it.
335
00:14:59,520 --> 00:15:01,800
Name the decision, store the outcome.
336
00:15:01,800 --> 00:15:02,960
Make the next step clear.
337
00:15:02,960 --> 00:15:07,840
The same principle applies whether you use PowerFX, Flow Conditions, Dataverse, Rules, or Code.
338
00:15:07,840 --> 00:15:10,720
People need to see what the automation decided and why.
339
00:15:10,720 --> 00:15:12,880
Risk often creates the most useful structure for this.
340
00:15:12,880 --> 00:15:15,480
A low-risk request can continue without interruption.
341
00:15:15,480 --> 00:15:18,280
A medium-risk request may need a manager's review.
342
00:15:18,280 --> 00:15:22,280
A high-risk request may require several checks, a documented decision, and a different approval
343
00:15:22,280 --> 00:15:23,280
path.
344
00:15:23,280 --> 00:15:24,840
That isn't an arbitrary technical design.
345
00:15:24,840 --> 00:15:27,200
It's the business policy expressed as automation.
346
00:15:27,200 --> 00:15:28,360
Ownership works the same way.
347
00:15:28,360 --> 00:15:30,280
A record owner may handle a normal case.
348
00:15:30,280 --> 00:15:34,280
A team owner may handle a shared workload, a specific business unit may need authority
349
00:15:34,280 --> 00:15:36,360
over certain customers or regions.
350
00:15:36,360 --> 00:15:40,960
The automation can use that context to root work without treating every record as identical,
351
00:15:40,960 --> 00:15:42,600
context decides the root.
352
00:15:42,600 --> 00:15:44,520
Not the screen someone happened to use.
353
00:15:44,520 --> 00:15:46,120
There is still a boundary to protect.
354
00:15:46,120 --> 00:15:48,400
Some rules enforce data integrity at the point of save.
355
00:15:48,400 --> 00:15:51,160
They belong close to the Dataverse transaction.
356
00:15:51,160 --> 00:15:54,800
Other rules decide what happens after the record already meets that standard.
357
00:15:54,800 --> 00:15:56,560
They belong in the automation layer.
358
00:15:56,560 --> 00:15:57,720
Don't mix those jobs.
359
00:15:57,720 --> 00:16:00,560
A required legal value may need to block a record from saving.
360
00:16:00,560 --> 00:16:03,560
A request for legal review can happen after the record saves.
361
00:16:03,560 --> 00:16:04,840
One protects the data.
362
00:16:04,840 --> 00:16:06,960
The other coordinates work around the data.
363
00:16:06,960 --> 00:16:09,760
Keeping that split clear prevents a common design mistake.
364
00:16:09,760 --> 00:16:14,040
Teams try to force every decision into the synchronous path because it feels immediate.
365
00:16:14,040 --> 00:16:17,680
Then the user waits while the system performs work that doesn't need to block them, or
366
00:16:17,680 --> 00:16:22,000
they push strict validation into downstream automation, then discover bad data can enter
367
00:16:22,000 --> 00:16:24,400
the system before anyone reacts.
368
00:16:24,400 --> 00:16:27,880
The system needs the right boundary, enforce what must be true now, then orchestrate what
369
00:16:27,880 --> 00:16:28,880
needs to happen next.
370
00:16:28,880 --> 00:16:31,760
Once the rules produce a decision, the system has worked to do.
371
00:16:31,760 --> 00:16:35,480
That reasoning is still underway, and we're not that far along.
372
00:16:35,480 --> 00:16:38,280
Example, the sales approval that doesn't need a plug-in.
373
00:16:38,280 --> 00:16:39,520
Take a sales approval.
374
00:16:39,520 --> 00:16:41,880
An opportunity reaches a commercial threshold.
375
00:16:41,880 --> 00:16:43,600
Maybe the total value passes a limit.
376
00:16:43,600 --> 00:16:45,200
Maybe the discount becomes too high.
377
00:16:45,200 --> 00:16:46,400
Maybe the payment terms change.
378
00:16:46,400 --> 00:16:47,960
The seller updates the opportunity.
379
00:16:47,960 --> 00:16:49,120
That update is the event.
380
00:16:49,120 --> 00:16:52,040
It doesn't need to become a plug-in just because it triggers work.
381
00:16:52,040 --> 00:16:53,240
Start with the business condition.
382
00:16:53,240 --> 00:16:55,600
The opportunity needs to reach the correct stage.
383
00:16:55,600 --> 00:16:57,640
The seller needs to complete the required fields.
384
00:16:57,640 --> 00:16:59,160
The account needs a defined category.
385
00:16:59,160 --> 00:17:01,720
The commercial values need to match an approval policy.
386
00:17:01,720 --> 00:17:03,360
A flow can check all of that.
387
00:17:03,360 --> 00:17:05,240
Not after somebody emails a manager.
388
00:17:05,240 --> 00:17:07,760
Not after the seller chases an answer through Teams.
389
00:17:07,760 --> 00:17:10,600
The process starts from the record context already in Dynamics.
390
00:17:10,600 --> 00:17:12,800
First, the flow checks the opportunity stage.
391
00:17:12,800 --> 00:17:16,240
A quote still being drafted shouldn't enter a final approval route.
392
00:17:16,240 --> 00:17:18,400
Next, it checks the fields the approval needs.
393
00:17:18,400 --> 00:17:22,200
Discount percentage contract length payment terms, expected revenue.
394
00:17:22,200 --> 00:17:26,560
Any missing information sends the opportunity back to the seller with a clear request.
395
00:17:26,560 --> 00:17:30,120
That stops an approver from receiving a vague task with no basis for a decision.
396
00:17:30,120 --> 00:17:32,040
Then the flow applies the approval policy.
397
00:17:32,040 --> 00:17:35,040
A standard commercial change may root to the sales manager.
398
00:17:35,040 --> 00:17:37,640
A larger discount may need commercial leadership.
399
00:17:37,640 --> 00:17:40,840
A deal with unusual terms may need finance or legal included.
400
00:17:40,840 --> 00:17:44,680
The policy can use the current owner, the account region, the opportunity value, and the
401
00:17:44,680 --> 00:17:45,880
agreed threshold.
402
00:17:45,880 --> 00:17:47,080
This is not a technical trick.
403
00:17:47,080 --> 00:17:48,920
It's the approval model made visible.
404
00:17:48,920 --> 00:17:51,120
The approver receives the request where they work.
405
00:17:51,120 --> 00:17:53,760
For many Dynamics teams, that means Teams.
406
00:17:53,760 --> 00:17:57,840
The request can include the customer name, the opportunity amount, the discount, the terms
407
00:17:57,840 --> 00:18:02,080
that trigger review, a link back to the opportunity they can approve or reject without hunting
408
00:18:02,080 --> 00:18:03,480
through a list of records.
409
00:18:03,480 --> 00:18:05,680
Email can work too.
410
00:18:05,680 --> 00:18:06,960
The point isn't the channel.
411
00:18:06,960 --> 00:18:12,000
The point is that the request reaches the person responsible with enough context to decide.
412
00:18:12,000 --> 00:18:15,280
If the approver rejects it, the flow writes the outcome back to Dynamics.
413
00:18:15,280 --> 00:18:16,520
It records the decision.
414
00:18:16,520 --> 00:18:17,920
It records the response time.
415
00:18:17,920 --> 00:18:21,520
It can store the comment, the opportunity moves to the appropriate status.
416
00:18:21,520 --> 00:18:23,360
The seller receives a message with the result.
417
00:18:23,360 --> 00:18:24,520
No manual update.
418
00:18:24,520 --> 00:18:26,840
No separate spreadsheet tracking approvals.
419
00:18:26,840 --> 00:18:30,560
No uncertainty about whether the decision made it back into the system of record.
420
00:18:30,560 --> 00:18:33,600
If the approver accepts, the same thing happens.
421
00:18:33,600 --> 00:18:35,320
Dynamics receives the outcome.
422
00:18:35,320 --> 00:18:37,280
The seller knows the deal can move forward.
423
00:18:37,280 --> 00:18:38,880
The record shows what happened.
424
00:18:38,880 --> 00:18:40,840
And the approval doesn't disappear into an inbox.
425
00:18:40,840 --> 00:18:44,520
That matters when someone asks later why the deal used a certain discount or why it moved
426
00:18:44,520 --> 00:18:46,000
forward under different terms.
427
00:18:46,000 --> 00:18:49,040
The decision stays connected to the opportunity.
428
00:18:49,040 --> 00:18:51,160
Now consider the part most teams forget.
429
00:18:51,160 --> 00:18:52,800
No response.
430
00:18:52,800 --> 00:18:54,240
A manager gets busy.
431
00:18:54,240 --> 00:18:55,240
They travel.
432
00:18:55,240 --> 00:18:56,640
They miss the team's notification.
433
00:18:56,640 --> 00:18:58,760
The approval sits there.
434
00:18:58,760 --> 00:19:00,440
The seller waits.
435
00:19:00,440 --> 00:19:02,760
Without automation, somebody starts chasing.
436
00:19:02,760 --> 00:19:05,480
First in teams then by email, then through a manager's manager.
437
00:19:05,480 --> 00:19:06,800
That work doesn't improve the deal.
438
00:19:06,800 --> 00:19:09,640
It only compensates for a process with no follow-up path.
439
00:19:09,640 --> 00:19:11,560
A flow can wait for a defined period.
440
00:19:11,560 --> 00:19:13,840
If no response arrives, it sends a reminder.
441
00:19:13,840 --> 00:19:17,960
If the delay continues, it escalates to another owner, a shared approval group, or a defined
442
00:19:17,960 --> 00:19:19,080
backup approver.
443
00:19:19,080 --> 00:19:20,560
The route follows a policy.
444
00:19:20,560 --> 00:19:22,440
Not whoever the seller happens to know.
445
00:19:22,440 --> 00:19:26,040
That change alone removes a lot of informal work from sales operations.
446
00:19:26,040 --> 00:19:29,000
The seller doesn't need to remember every escalation wrote.
447
00:19:29,000 --> 00:19:32,000
The approver doesn't need to rely on a message getting buried.
448
00:19:32,000 --> 00:19:34,560
And the process owner can see where approval is stalled.
449
00:19:34,560 --> 00:19:36,120
Maybe the threshold is too low.
450
00:19:36,120 --> 00:19:38,320
Maybe one person receives too many requests.
451
00:19:38,320 --> 00:19:40,360
Maybe the approval model needs a different route.
452
00:19:40,360 --> 00:19:41,720
Those are business decisions.
453
00:19:41,720 --> 00:19:43,880
The flow gives the team evidence to make them.
454
00:19:43,880 --> 00:19:46,240
A plug-in could trigger part of this process.
455
00:19:46,240 --> 00:19:47,760
Code can call services.
456
00:19:47,760 --> 00:19:49,720
Code can create records.
457
00:19:49,720 --> 00:19:52,480
But that doesn't mean code should own the approval journey.
458
00:19:52,480 --> 00:19:55,520
This work crosses time, people, channels, and record updates.
459
00:19:55,520 --> 00:19:56,520
It needs a visible route.
460
00:19:56,520 --> 00:19:57,680
It needs a clear outcome.
461
00:19:57,680 --> 00:19:59,280
It needs a way to handle silence.
462
00:19:59,280 --> 00:20:00,960
The event pipeline has a different job.
463
00:20:00,960 --> 00:20:05,360
It should protect the record when the record must not save without a rule being met.
464
00:20:05,360 --> 00:20:06,680
Speed means time to change.
465
00:20:06,680 --> 00:20:08,120
Not only milliseconds.
466
00:20:08,120 --> 00:20:10,720
People talk about speed like it only means execution time.
467
00:20:10,720 --> 00:20:14,920
They ask how fast the plug-in ran, how many milliseconds it added to the save, how quickly
468
00:20:14,920 --> 00:20:16,280
the record updated.
469
00:20:16,280 --> 00:20:19,880
Those questions matter, especially when logic runs during a record operation.
470
00:20:19,880 --> 00:20:21,400
A slow plug-in holds up the user.
471
00:20:21,400 --> 00:20:22,480
It increases load.
472
00:20:22,480 --> 00:20:25,560
It creates a poor experience across a busy dynamics environment.
473
00:20:25,560 --> 00:20:27,680
So yes, execution speed matters.
474
00:20:27,680 --> 00:20:28,920
But that's only one kind of speed.
475
00:20:28,920 --> 00:20:30,880
A business process also has a change speed.
476
00:20:30,880 --> 00:20:32,760
A sales policy changes on Monday.
477
00:20:32,760 --> 00:20:34,760
The team needs the new rule working by Wednesday.
478
00:20:34,760 --> 00:20:37,240
A new manager takes responsibility for a region.
479
00:20:37,240 --> 00:20:40,200
An approval route needs to change before the next large deal arrives.
480
00:20:40,200 --> 00:20:43,400
A compliance team changes the conditions that require review.
481
00:20:43,400 --> 00:20:45,600
How long until the automation reflects that change?
482
00:20:45,600 --> 00:20:46,920
That's the speed the business feels.
483
00:20:46,920 --> 00:20:49,040
And it often has nothing to do with milliseconds.
484
00:20:49,040 --> 00:20:51,800
A plug-in executes quickly during every record update.
485
00:20:51,800 --> 00:20:55,840
But changing one routing rule requires a development request, backlog review, technical
486
00:20:55,840 --> 00:20:59,880
analysis, code changes, testing, release approval, deployment.
487
00:20:59,880 --> 00:21:01,800
The business process still moves slowly.
488
00:21:01,800 --> 00:21:03,000
The record saves quickly.
489
00:21:03,000 --> 00:21:04,680
The organization changes slowly.
490
00:21:04,680 --> 00:21:06,160
Those are different measurements.
491
00:21:06,160 --> 00:21:08,840
This is where visual automation changes the conversation.
492
00:21:08,840 --> 00:21:12,400
A flow gives people a readable representation of the process.
493
00:21:12,400 --> 00:21:13,760
The trigger appears at the top.
494
00:21:13,760 --> 00:21:14,960
The check sit below it.
495
00:21:14,960 --> 00:21:16,680
The decision branches show the routes.
496
00:21:16,680 --> 00:21:18,960
The approval step shows who receives the request.
497
00:21:18,960 --> 00:21:21,680
The follow-up action shows what happens after the decision.
498
00:21:21,680 --> 00:21:25,400
A process owner doesn't need to read CEG to understand the broad behavior.
499
00:21:25,400 --> 00:21:28,720
They can look at the flow with the platform team and ask useful questions.
500
00:21:28,720 --> 00:21:30,200
Why does this route apply here?
501
00:21:30,200 --> 00:21:31,720
Who owns that approval group?
502
00:21:31,720 --> 00:21:33,480
What happens if nobody responds?
503
00:21:33,480 --> 00:21:35,160
Should this threshold still exist?
504
00:21:35,160 --> 00:21:37,400
Those questions become part of the review.
505
00:21:37,400 --> 00:21:41,080
What are separate requirements exercised after the technical design already happened?
506
00:21:41,080 --> 00:21:43,640
That shortens the distance between policy and automation.
507
00:21:43,640 --> 00:21:45,040
It also changes handover.
508
00:21:45,040 --> 00:21:48,560
With custom code, handover depends on documents being current and developers explaining the
509
00:21:48,560 --> 00:21:52,200
intent behind classes, methods, configuration and deployment choices.
510
00:21:52,200 --> 00:21:56,120
That work has a place, but it becomes fragile when the automation contains ordinary business
511
00:21:56,120 --> 00:21:57,920
rules that could have remained visible.
512
00:21:57,920 --> 00:22:00,880
A visual flow doesn't remove the need for documentation.
513
00:22:00,880 --> 00:22:02,840
It gives documentation somewhere to point.
514
00:22:02,840 --> 00:22:04,800
The process owner can see the route.
515
00:22:04,800 --> 00:22:06,320
Support can see the failed action.
516
00:22:06,320 --> 00:22:10,160
A new maker can see the connection between the trigger and the outcome.
517
00:22:10,160 --> 00:22:13,600
The automation becomes easier to review without first reconstructing it.
518
00:22:13,600 --> 00:22:16,000
That reduces the time spent translating.
519
00:22:16,000 --> 00:22:18,720
And translation slows teams down more than most people admit.
520
00:22:18,720 --> 00:22:20,560
A policy owner describes the change.
521
00:22:20,560 --> 00:22:21,840
An analyst interprets it.
522
00:22:21,840 --> 00:22:24,520
A developer converts it into a technical change.
523
00:22:24,520 --> 00:22:27,800
Then the policy owner waits to see whether the result matches what they meant.
524
00:22:27,800 --> 00:22:31,200
With a readable automation layer, more of that discussion can happen around the actual
525
00:22:31,200 --> 00:22:32,200
process design.
526
00:22:32,200 --> 00:22:35,200
The policy owner still shouldn't edit production on a Friday afternoon.
527
00:22:35,200 --> 00:22:38,960
He needs that kind of freedom, but they can validate the route before it reaches production.
528
00:22:38,960 --> 00:22:41,240
They can see whether the logic matches the policy.
529
00:22:41,240 --> 00:22:44,960
They can catch the wrong approver, the missing exception or the outdated threshold, while
530
00:22:44,960 --> 00:22:47,160
the change still costs little to fix.
531
00:22:47,160 --> 00:22:48,160
That is business speed.
532
00:22:48,160 --> 00:22:52,120
It means the organization can correct automation while the context still exists.
533
00:22:52,120 --> 00:22:55,000
A routing change doesn't need to become a technical investigation.
534
00:22:55,000 --> 00:22:57,680
A threshold change doesn't need to become a code search.
535
00:22:57,680 --> 00:23:01,520
A process correction doesn't need to wait until the person who originally built it becomes
536
00:23:01,520 --> 00:23:02,520
available.
537
00:23:02,520 --> 00:23:06,000
This doesn't mean every visual flow is automatically easy to understand.
538
00:23:06,000 --> 00:23:11,200
A badly built flow hides logic behind vague action names, nested conditions, unexplained variables.
539
00:23:11,200 --> 00:23:13,240
It becomes just as hard to operate as code.
540
00:23:13,240 --> 00:23:14,520
The tool doesn't create clarity.
541
00:23:14,520 --> 00:23:15,520
The design does.
542
00:23:15,520 --> 00:23:17,800
So build flows for reading, not only for running.
543
00:23:17,800 --> 00:23:18,880
Name the trigger clearly.
544
00:23:18,880 --> 00:23:20,360
Name the decisions clearly.
545
00:23:20,360 --> 00:23:22,080
Use conditions that describe the rule.
546
00:23:22,080 --> 00:23:23,600
Keep related steps together.
547
00:23:23,600 --> 00:23:24,960
Make exception parts obvious.
548
00:23:24,960 --> 00:23:28,240
When somebody opens the automation six months later, they should understand the process
549
00:23:28,240 --> 00:23:29,920
before they understand the mechanics.
550
00:23:29,920 --> 00:23:32,840
It's standard changes what fast means.
551
00:23:32,840 --> 00:23:35,240
Fast is not only a record saving sooner.
552
00:23:35,240 --> 00:23:37,240
Fast is a policy owner seeing the rule.
553
00:23:37,240 --> 00:23:39,280
Fast is a reviewer understanding the root.
554
00:23:39,280 --> 00:23:42,840
Fast is a team fixing the process before manual work becomes normal again.
555
00:23:42,840 --> 00:23:45,680
But none of this holds if the automation belongs to nobody.
556
00:23:45,680 --> 00:23:51,000
A visible flow with no accountable owner still becomes slow the moment something changes.
557
00:23:51,000 --> 00:23:53,840
Ownership, personal flows, create personal automation.
558
00:23:53,840 --> 00:23:55,120
A flow can look shared.
559
00:23:55,120 --> 00:23:57,080
It can support a whole sales team.
560
00:23:57,080 --> 00:23:58,440
It can update hundreds of records.
561
00:23:58,440 --> 00:24:02,480
It can send approval requests across regions, but it may still belong to one employee.
562
00:24:02,480 --> 00:24:04,120
That's a problem hiding in plain sight.
563
00:24:04,120 --> 00:24:06,120
Many flows begin with good intent.
564
00:24:06,120 --> 00:24:07,560
Someone sees repetitive work.
565
00:24:07,560 --> 00:24:09,240
They build a flow under their own account.
566
00:24:09,240 --> 00:24:10,240
It runs correctly.
567
00:24:10,240 --> 00:24:11,240
The team benefits.
568
00:24:11,240 --> 00:24:13,560
Nobody asks who owns it because the maker still works there.
569
00:24:13,560 --> 00:24:15,680
Then the flow becomes part of daily operations.
570
00:24:15,680 --> 00:24:18,160
A scheduled flow sends a report every Monday.
571
00:24:18,160 --> 00:24:21,120
An automated flow reacts when a dynamics record changes.
572
00:24:21,120 --> 00:24:23,320
An approval flow roots commercial decisions.
573
00:24:23,320 --> 00:24:26,640
The work becomes normal, but the identity behind it remains personal.
574
00:24:26,640 --> 00:24:30,760
A scheduled and automated flows that identity can affect how the flow runs.
575
00:24:30,760 --> 00:24:33,400
The flow runs under its assigned owner's plan.
576
00:24:33,400 --> 00:24:36,480
Its access, connections and licensing arrangement depend on that setup.
577
00:24:36,480 --> 00:24:39,240
So the process hasn't really become organizational automation.
578
00:24:39,240 --> 00:24:41,040
It's still attached to an individual employee.
579
00:24:41,040 --> 00:24:42,600
That employee may change roles.
580
00:24:42,600 --> 00:24:44,320
They may lose access to a system.
581
00:24:44,320 --> 00:24:47,200
Their account may be disabled during an exit process.
582
00:24:47,200 --> 00:24:50,440
Nobody intends to break the automation, but the automation can break anyway.
583
00:24:50,440 --> 00:24:52,120
The business sees the effect later.
584
00:24:52,120 --> 00:24:53,120
The report stops arriving.
585
00:24:53,120 --> 00:24:54,600
A reminder doesn't send.
586
00:24:54,600 --> 00:24:55,920
Approval stop moving.
587
00:24:55,920 --> 00:24:58,960
A database update no longer triggers the work people expected.
588
00:24:58,960 --> 00:25:00,920
Then support starts investigating.
589
00:25:00,920 --> 00:25:03,800
Not because the process changed, because its owner left the company.
590
00:25:03,800 --> 00:25:07,520
This is often automation and it creates a strange kind of operational risk.
591
00:25:07,520 --> 00:25:09,880
The automation exists, the business relies on it.
592
00:25:09,880 --> 00:25:12,160
But nobody has clear authority to maintain it.
593
00:25:12,160 --> 00:25:13,880
Nobody can safely change its connection.
594
00:25:13,880 --> 00:25:15,640
Nobody knows whether it should still run.
595
00:25:15,640 --> 00:25:17,880
Sometimes the flow keeps working for a while.
596
00:25:17,880 --> 00:25:18,880
That can be worse.
597
00:25:18,880 --> 00:25:20,480
The team assumes everything is fine.
598
00:25:20,480 --> 00:25:23,560
Meanwhile, the owner no longer has an active role in the process and the flow still
599
00:25:23,560 --> 00:25:25,720
uses access that nobody has reviewed.
600
00:25:25,720 --> 00:25:27,240
The ownership isn't a name on an asset.
601
00:25:27,240 --> 00:25:29,120
It is an operating responsibility.
602
00:25:29,120 --> 00:25:30,840
Someone needs to own the business outcome.
603
00:25:30,840 --> 00:25:32,840
Someone needs to own the technical operation.
604
00:25:32,840 --> 00:25:35,000
For smaller processes, those may be the same person.
605
00:25:35,000 --> 00:25:37,280
For production automation, they often shouldn't be.
606
00:25:37,280 --> 00:25:41,720
A process owner answers questions like, does this approval route still match the policy?
607
00:25:41,720 --> 00:25:43,240
Who should receive the escalation?
608
00:25:43,240 --> 00:25:44,800
What happens when the process fails?
609
00:25:44,800 --> 00:25:47,040
A platform owner answers different questions.
610
00:25:47,040 --> 00:25:49,000
Which identity runs the automation?
611
00:25:49,000 --> 00:25:50,240
Which connections does it use?
612
00:25:50,240 --> 00:25:51,240
Who can maintain it?
613
00:25:51,240 --> 00:25:53,240
How does the flow move through test and production?
614
00:25:53,240 --> 00:25:55,040
Sharing a flow doesn't solve this by itself.
615
00:25:55,040 --> 00:25:56,720
You can share a flow with colleagues.
616
00:25:56,720 --> 00:25:58,440
You can give them permission to view it.
617
00:25:58,440 --> 00:26:00,600
You can give them permission to edit it.
618
00:26:00,600 --> 00:26:01,800
That helps with collaboration.
619
00:26:01,800 --> 00:26:04,560
But it doesn't automatically change the primary owner.
620
00:26:04,560 --> 00:26:08,040
The original identity can still remain at the center of the automation.
621
00:26:08,040 --> 00:26:10,920
Teams often discover that after the person is already left.
622
00:26:10,920 --> 00:26:12,520
They thought access meant ownership.
623
00:26:12,520 --> 00:26:13,520
It doesn't.
624
00:26:13,520 --> 00:26:14,840
Access lets someone participate.
625
00:26:14,840 --> 00:26:17,480
Ownership defines who carries the operational responsibility.
626
00:26:17,480 --> 00:26:21,760
So don't build business-critical automation under a personal identity and hope sharing
627
00:26:21,760 --> 00:26:23,680
will turn it into a team asset.
628
00:26:23,680 --> 00:26:25,960
Use an identity that matches the process.
629
00:26:25,960 --> 00:26:30,400
For unattended automation, that often means a service account with a defined purpose.
630
00:26:30,400 --> 00:26:33,240
Not a generic account whose password sits in an old document.
631
00:26:33,240 --> 00:26:34,640
Not a shared personal login.
632
00:26:34,640 --> 00:26:38,960
A real account with named operational owners, the right licensing, reviewed permissions,
633
00:26:38,960 --> 00:26:41,120
and a life cycle that survives staff changes.
634
00:26:41,120 --> 00:26:42,800
Its name should explain its role.
635
00:26:42,800 --> 00:26:45,760
Its access should be limited to what the flow needs.
636
00:26:45,760 --> 00:26:47,280
Its ownership should be documented.
637
00:26:47,280 --> 00:26:51,520
When someone reviews the automation, they should know who approves changes to that account,
638
00:26:51,520 --> 00:26:55,080
who checks its connections, and who acts when the flow fails.
639
00:26:55,080 --> 00:26:57,880
Application users also fit some application to application patterns.
640
00:26:57,880 --> 00:26:59,360
The point stays the same.
641
00:26:59,360 --> 00:27:01,760
The identity should represent the process boundary.
642
00:27:01,760 --> 00:27:04,040
Not the person who happened to build the first version.
643
00:27:04,040 --> 00:27:06,200
This is a small design choice at the start.
644
00:27:06,200 --> 00:27:10,840
Later, it becomes the difference between a managed process and a hidden dependency.
645
00:27:10,840 --> 00:27:13,720
Once automation has clear ownership, the next step becomes possible.
646
00:27:13,720 --> 00:27:15,320
You can package the process properly.
647
00:27:15,320 --> 00:27:16,680
You can move it between environments.
648
00:27:16,680 --> 00:27:20,000
You can separate the automation from the person who first created it.
649
00:27:20,000 --> 00:27:22,560
It starts when flows enter solutions.
650
00:27:22,560 --> 00:27:25,480
Environment variables keep environments different without rebuilds.
651
00:27:25,480 --> 00:27:29,240
A solution can move between environments, but the environment should not be identical.
652
00:27:29,240 --> 00:27:31,400
Your test environment uses a test mailbox.
653
00:27:31,400 --> 00:27:34,280
Your production environment uses a shared operations mailbox.
654
00:27:34,280 --> 00:27:37,280
One flow post to a team's channel for sales operations.
655
00:27:37,280 --> 00:27:40,600
Another environment points to a test channel where nobody mistakes a test approval for a
656
00:27:40,600 --> 00:27:41,600
real one.
657
00:27:41,600 --> 00:27:44,160
The flow design stays the same, the values change.
658
00:27:44,160 --> 00:27:45,840
That's what environment variables are for.
659
00:27:45,840 --> 00:27:48,200
They hold configuration outside the flow steps.
660
00:27:48,200 --> 00:27:56,000
A URL dot a mailbox address, a SharePoint site ID, a Q name, an approval threshold, a system
661
00:27:56,000 --> 00:27:58,280
endpoint without them.
662
00:27:58,280 --> 00:28:00,600
Make us type these values directly into the flow.
663
00:28:00,600 --> 00:28:02,760
The flow sends mail to a fixed address.
664
00:28:02,760 --> 00:28:04,000
It links to a fixed site.
665
00:28:04,000 --> 00:28:05,320
It calls a fixed URL.
666
00:28:05,320 --> 00:28:08,000
It uses a threshold buried inside a condition.
667
00:28:08,000 --> 00:28:11,480
Then the flow needs to move from development to test or from test to production.
668
00:28:11,480 --> 00:28:15,000
Now somebody must open the flow and replace each value by hand.
669
00:28:15,000 --> 00:28:16,320
That creates two problems.
670
00:28:16,320 --> 00:28:18,640
First, the package stops being portable.
671
00:28:18,640 --> 00:28:22,800
The process design includes details that only apply in one environment.
672
00:28:22,800 --> 00:28:25,640
Second, every deployment becomes an editing exercise.
673
00:28:25,640 --> 00:28:26,960
Someone can miss an address.
674
00:28:26,960 --> 00:28:29,120
Someone can leave a test URL in production.
675
00:28:29,120 --> 00:28:31,840
Someone can change the wrong threshold during a late release.
676
00:28:31,840 --> 00:28:33,280
Then the process behaves correctly.
677
00:28:33,280 --> 00:28:36,440
But in the wrong place, that kind of failure is frustrating because the logic may look
678
00:28:36,440 --> 00:28:37,280
fine.
679
00:28:37,280 --> 00:28:38,440
The flow triggered.
680
00:28:38,440 --> 00:28:39,600
The approval root worked.
681
00:28:39,600 --> 00:28:41,000
The record updated.
682
00:28:41,000 --> 00:28:43,320
But the notification went to the test mailbox.
683
00:28:43,320 --> 00:28:45,680
Or production wrote to the wrong sharepoint site.
684
00:28:45,680 --> 00:28:49,360
Or the flow sent data to an endpoint that no longer belongs to the active process.
685
00:28:49,360 --> 00:28:51,240
The issue didn't come from the automation logic.
686
00:28:51,240 --> 00:28:53,840
It came from configuration mixed into the logic.
687
00:28:53,840 --> 00:28:55,600
Environment variables separate those concerns.
688
00:28:55,600 --> 00:28:57,240
The flow defines what needs to happen.
689
00:28:57,240 --> 00:28:59,920
The environment variable defines where it happens.
690
00:28:59,920 --> 00:29:00,920
Who receives it?
691
00:29:00,920 --> 00:29:02,480
Or which value controls the root?
692
00:29:02,480 --> 00:29:04,000
Take an opportunity approval process.
693
00:29:04,000 --> 00:29:07,400
The logic says deals above a certain limit need commercial review.
694
00:29:07,400 --> 00:29:08,720
That rule belongs in the process.
695
00:29:08,720 --> 00:29:10,840
But the amount differs between test and production.
696
00:29:10,840 --> 00:29:15,640
In test, the team uses a low threshold to create approval scenarios quickly in production.
697
00:29:15,640 --> 00:29:19,360
The real policy uses the live threshold, the same flow supports both.
698
00:29:19,360 --> 00:29:25,120
No redesign, no copied version, no maker opening each condition and hoping nothing else changes.
699
00:29:25,120 --> 00:29:28,120
During deployment, the target environment receives the right value.
700
00:29:28,120 --> 00:29:30,160
The package stays consistent.
701
00:29:30,160 --> 00:29:33,360
The behavior changes only where the environment needs it to change.
702
00:29:33,360 --> 00:29:35,280
That gives test a real purpose.
703
00:29:35,280 --> 00:29:38,520
Testing should not mean building a near copy of production and manually adapting every
704
00:29:38,520 --> 00:29:43,000
flow it should mean validating the same automation package with controlled configuration.
705
00:29:43,000 --> 00:29:44,680
The test mailbox receives the message.
706
00:29:44,680 --> 00:29:46,400
The test side stores the document.
707
00:29:46,400 --> 00:29:47,960
The test queue receives the task.
708
00:29:47,960 --> 00:29:49,760
The test endpoint receives the request.
709
00:29:49,760 --> 00:29:53,800
Then, when the same package reaches production, the live values take over.
710
00:29:53,800 --> 00:29:55,520
The flow itself doesn't need a new shape.
711
00:29:55,520 --> 00:29:56,880
It needs the right configuration.
712
00:29:56,880 --> 00:29:59,760
This also works when the business changes without changing the whole process.
713
00:29:59,760 --> 00:30:01,600
A shared mailbox changes.
714
00:30:01,600 --> 00:30:03,480
A queue moves to another team.
715
00:30:03,480 --> 00:30:04,680
A site gets replaced.
716
00:30:04,680 --> 00:30:07,880
A threshold changes under an approved policy update.
717
00:30:07,880 --> 00:30:11,680
If the value sits in an environment variable, the team can manage that configuration through
718
00:30:11,680 --> 00:30:14,600
the proper route instead of editing the flow structure.
719
00:30:14,600 --> 00:30:17,480
That keeps process changes and configuration changes separate.
720
00:30:17,480 --> 00:30:19,280
They may need different reviews.
721
00:30:19,280 --> 00:30:22,760
Changing an approval path may need process owner sign off and testing.
722
00:30:22,760 --> 00:30:25,240
Changing a mailbox address may need confirmation from the service owner.
723
00:30:25,240 --> 00:30:26,240
Both changes matter.
724
00:30:26,240 --> 00:30:28,200
But they aren't the same kind of change.
725
00:30:28,200 --> 00:30:29,960
So give configuration a clear owner.
726
00:30:29,960 --> 00:30:31,400
A mailbox should have an owner.
727
00:30:31,400 --> 00:30:32,760
A queue should have an owner.
728
00:30:32,760 --> 00:30:34,720
An external URL should have an owner.
729
00:30:34,720 --> 00:30:36,960
A threshold should have a named policy owner.
730
00:30:36,960 --> 00:30:40,880
Too many teams treat configuration as nobody's job because it seems small.
731
00:30:40,880 --> 00:30:42,400
Then an old mailbox remains in use.
732
00:30:42,400 --> 00:30:44,480
A retired endpoint stays in a variable.
733
00:30:44,480 --> 00:30:47,480
A queue name points to a team that no longer handles the work.
734
00:30:47,480 --> 00:30:50,720
The automation keeps doing exactly what it was configured to do.
735
00:30:50,720 --> 00:30:52,200
Which is the problem.
736
00:30:52,200 --> 00:30:53,200
Configuration needs review dates.
737
00:30:53,200 --> 00:30:54,560
It needs named accountability.
738
00:30:54,560 --> 00:30:57,640
It needs a simple place where people can see what each value controls.
739
00:30:57,640 --> 00:31:01,640
Otherwise, you move hidden dependencies out of code and place them in unmanaged settings.
740
00:31:01,640 --> 00:31:02,800
That isn't progress.
741
00:31:02,800 --> 00:31:05,120
The goal isn't just to make deployment easier.
742
00:31:05,120 --> 00:31:09,160
It's to make the automation honest about what changes by environment and who controls those
743
00:31:09,160 --> 00:31:10,160
changes.
744
00:31:10,160 --> 00:31:13,560
Once flows, connections and configuration can travel as one managed unit.
745
00:31:13,560 --> 00:31:18,440
The next question is how you deploy that unit without turning production into a workshop.
746
00:31:18,440 --> 00:31:21,520
Managed solutions create a boundary around production.
747
00:31:21,520 --> 00:31:22,600
Production needs a boundary.
748
00:31:22,600 --> 00:31:24,360
Not because people can't be trusted.
749
00:31:24,360 --> 00:31:26,200
Because urgent changes feel reasonable at the time.
750
00:31:26,200 --> 00:31:27,200
A flow fails.
751
00:31:27,200 --> 00:31:28,800
A manager needs a root changed.
752
00:31:28,800 --> 00:31:30,760
A mailbox stops working.
753
00:31:30,760 --> 00:31:32,440
Someone opens production and fixes it.
754
00:31:32,440 --> 00:31:33,840
The process starts working again.
755
00:31:33,840 --> 00:31:36,360
Now production differs from the source solution.
756
00:31:36,360 --> 00:31:37,920
And the next deployment doesn't know that.
757
00:31:37,920 --> 00:31:42,800
A managed solution protects against that pattern when you import a managed solution into production.
758
00:31:42,800 --> 00:31:46,240
The package components cannot be directly edited in the normal way.
759
00:31:46,240 --> 00:31:47,240
The flow.
760
00:31:47,240 --> 00:31:48,240
App.
761
00:31:48,240 --> 00:31:49,720
Table changes.
762
00:31:49,720 --> 00:31:52,920
Connection references and other components arrive as a release.
763
00:31:52,920 --> 00:31:54,480
They remain tied to that release.
764
00:31:54,480 --> 00:31:57,160
That creates a clear rule if something needs to change.
765
00:31:57,160 --> 00:31:58,920
Change it where the solution is authored.
766
00:31:58,920 --> 00:31:59,920
Test it.
767
00:31:59,920 --> 00:32:02,200
Then deploy a new version without that boundary.
768
00:32:02,200 --> 00:32:04,120
And it becomes its own branch of the system.
769
00:32:04,120 --> 00:32:05,640
Not an official branch.
770
00:32:05,640 --> 00:32:08,160
A hidden one.
771
00:32:08,160 --> 00:32:11,760
Someone changes a flow in production to solve an urgent issue.
772
00:32:11,760 --> 00:32:14,440
Another person updates the source solution in development.
773
00:32:14,440 --> 00:32:16,280
Then the next managed deployment arrives.
774
00:32:16,280 --> 00:32:18,240
Now the team has two versions of the same process.
775
00:32:18,240 --> 00:32:20,040
One version exists in the source.
776
00:32:20,040 --> 00:32:22,120
Another exists in production.
777
00:32:22,120 --> 00:32:24,400
Neither one fully describes the live behavior.
778
00:32:24,400 --> 00:32:26,840
This is where unmanaged layers create confusion.
779
00:32:26,840 --> 00:32:29,320
A managed solution can exist in production.
780
00:32:29,320 --> 00:32:31,240
Then somebody adds a direct change on top of it.
781
00:32:31,240 --> 00:32:33,200
That change becomes an unmanaged layer.
782
00:32:33,200 --> 00:32:35,960
It may override the behavior shipped in the managed package.
783
00:32:35,960 --> 00:32:37,520
The process still works.
784
00:32:37,520 --> 00:32:39,560
Until another release arrives.
785
00:32:39,560 --> 00:32:42,400
Then the team needs to work out which part came from the package.
786
00:32:42,400 --> 00:32:44,320
Which part came from the production edit?
787
00:32:44,320 --> 00:32:46,240
And whether the new release will replace.
788
00:32:46,240 --> 00:32:47,240
Preserve.
789
00:32:47,240 --> 00:32:48,560
Or conflict with that change.
790
00:32:48,560 --> 00:32:51,520
Nobody wants to investigate solution layers during an incident.
791
00:32:51,520 --> 00:32:53,200
Yet that's where week release habits lead.
792
00:32:53,200 --> 00:32:54,920
The fix may have taken five minutes.
793
00:32:54,920 --> 00:32:58,560
The recovery later can take days because the team now has to reconstruct intent.
794
00:32:58,560 --> 00:33:00,000
Was the production edit temporary?
795
00:33:00,000 --> 00:33:01,000
Did anyone document it?
796
00:33:01,000 --> 00:33:02,800
Did the same change reach development?
797
00:33:02,800 --> 00:33:04,080
Did it reach test?
798
00:33:04,080 --> 00:33:07,560
Does the current source still represent the process the business relies on?
799
00:33:07,560 --> 00:33:09,360
A production patch can feel like speed.
800
00:33:09,360 --> 00:33:11,040
Often it only moves the work forward.
801
00:33:11,040 --> 00:33:13,600
The correct response is to fix the source solution.
802
00:33:13,600 --> 00:33:17,360
If a flow route needs changing, update the unmanaged solution in development.
803
00:33:17,360 --> 00:33:19,360
If a configuration value needs correction.
804
00:33:19,360 --> 00:33:21,200
Update it through the defined process.
805
00:33:21,200 --> 00:33:24,440
If a defect exists, reproduce it in the right environment.
806
00:33:24,440 --> 00:33:28,200
Apply the fix, test the outcome, and release it.
807
00:33:28,200 --> 00:33:30,600
That takes more discipline than opening the live flow.
808
00:33:30,600 --> 00:33:33,400
But it means the source continues to describe the product.
809
00:33:33,400 --> 00:33:36,720
And production continues to run a tested version of that product.
810
00:33:36,720 --> 00:33:39,840
This is where version numbers stop being administrative detail.
811
00:33:39,840 --> 00:33:42,240
A version identifies what the environment received.
812
00:33:42,240 --> 00:33:45,120
When a release enters production, the team should know what changed.
813
00:33:45,120 --> 00:33:46,680
Which process rule changed?
814
00:33:46,680 --> 00:33:48,080
Which defect was fixed?
815
00:33:48,080 --> 00:33:50,040
Which flow version now handles the work?
816
00:33:50,040 --> 00:33:51,640
When an issue appears?
817
00:33:51,640 --> 00:33:53,360
The team can ask a useful question.
818
00:33:53,360 --> 00:33:55,240
Did the start after version 2.4?
819
00:33:55,240 --> 00:33:58,680
That is a better starting point than searching through a live environment for changes nobody
820
00:33:58,680 --> 00:33:59,680
recorded.
821
00:33:59,680 --> 00:34:02,240
The version also creates a rollback conversation.
822
00:34:02,240 --> 00:34:05,880
Not every release needs a full reversal, but teams need to know what they can restore,
823
00:34:05,880 --> 00:34:07,520
what dependencies exist.
824
00:34:07,520 --> 00:34:10,080
And which tested version came before the current one?
825
00:34:10,080 --> 00:34:11,920
That knowledge comes from release discipline.
826
00:34:11,920 --> 00:34:15,240
Not from hoping the last export file still exists somewhere.
827
00:34:15,240 --> 00:34:17,000
Operational pressure exposes every week point.
828
00:34:17,000 --> 00:34:19,000
A senior leader wants an immediate change.
829
00:34:19,000 --> 00:34:20,400
A customer waits.
830
00:34:20,400 --> 00:34:22,320
An approval route fails at the wrong moment.
831
00:34:22,320 --> 00:34:24,200
The temptation is always the same.
832
00:34:24,200 --> 00:34:25,760
Just fix it in production.
833
00:34:25,760 --> 00:34:27,680
Sometimes an emergency response is unavoidable.
834
00:34:27,680 --> 00:34:29,600
But if emergency edits become normal.
835
00:34:29,600 --> 00:34:32,400
And no longer emergencies, they are the operating model.
836
00:34:32,400 --> 00:34:35,160
And that model creates drift, unclear ownership.
837
00:34:35,160 --> 00:34:37,040
And deployments nobody trusts.
838
00:34:37,040 --> 00:34:38,920
A mature team can still respond quickly.
839
00:34:38,920 --> 00:34:40,680
It has a defined emergency path.
840
00:34:40,680 --> 00:34:42,040
It records the change.
841
00:34:42,040 --> 00:34:44,240
It brings the fix back into the source solution.
842
00:34:44,240 --> 00:34:48,640
It tests and deploys the corrected version, so production does not stay different.
843
00:34:48,640 --> 00:34:49,640
That's the discipline.
844
00:34:49,640 --> 00:34:50,800
Not slowness.
845
00:34:50,800 --> 00:34:52,280
Not bureaucracy.
846
00:34:52,280 --> 00:34:54,920
A managed solution doesn't stop the business from changing.
847
00:34:54,920 --> 00:34:58,360
It stops untrag change from becoming permanent system behavior.
848
00:34:58,360 --> 00:35:00,160
And this is the shift people often miss.
849
00:35:00,160 --> 00:35:02,240
Governance isn't a queue that blocks automation.
850
00:35:02,240 --> 00:35:07,560
It defines the choices that let automation change without breaking production.
851
00:35:07,560 --> 00:35:10,400
Governance is the operating model, not the approval queue.
852
00:35:10,400 --> 00:35:11,800
Governance gets treated like a gate.
853
00:35:11,800 --> 00:35:13,040
A maker has an idea.
854
00:35:13,040 --> 00:35:14,520
They submit a request.
855
00:35:14,520 --> 00:35:15,520
It reviews it.
856
00:35:15,520 --> 00:35:16,760
The request waits.
857
00:35:16,760 --> 00:35:19,040
Then people decide governance slows everything down.
858
00:35:19,040 --> 00:35:20,040
But that is not governance.
859
00:35:20,040 --> 00:35:22,800
That is an approval queue pretending to be a strategy.
860
00:35:22,800 --> 00:35:24,120
Here's what governance actually does.
861
00:35:24,120 --> 00:35:26,320
It defines where different kinds of automation belong.
862
00:35:26,320 --> 00:35:30,320
It defines who can build, who can access data, who owns the process,
863
00:35:30,320 --> 00:35:33,840
and how a working idea becomes something the organization can rely on.
864
00:35:33,840 --> 00:35:35,560
The starting point is the environment.
865
00:35:35,560 --> 00:35:37,000
An environment is a container.
866
00:35:37,000 --> 00:35:42,280
It holds the apps, flows, connections, tables, and dataverse resources used for a purpose.
867
00:35:42,280 --> 00:35:44,080
And that purpose might be personal productivity.
868
00:35:44,080 --> 00:35:45,560
It might be a department process.
869
00:35:45,560 --> 00:35:48,600
It might be a production capability used across the company.
870
00:35:48,600 --> 00:35:49,640
Those are not the same thing.
871
00:35:49,640 --> 00:35:52,200
So they should not all follow the same rules.
872
00:35:52,200 --> 00:35:54,560
A personal automation can help one person save time.
873
00:35:54,560 --> 00:35:55,680
Maybe it sorts messages.
874
00:35:55,680 --> 00:35:57,240
Maybe it creates a reminder.
875
00:35:57,240 --> 00:36:00,560
Maybe it moves information between tools that person already uses.
876
00:36:00,560 --> 00:36:02,280
That work needs a safe place to exist.
877
00:36:02,280 --> 00:36:04,960
It should not need a full production release process.
878
00:36:04,960 --> 00:36:08,400
But it also should not quietly become the process that runs a department.
879
00:36:08,400 --> 00:36:09,920
Team automation sits in the middle.
880
00:36:09,920 --> 00:36:10,920
More people rely on it.
881
00:36:10,920 --> 00:36:12,240
It may use shared data.
882
00:36:12,240 --> 00:36:14,440
It may connect to a shared mailbox or a team's channel.
883
00:36:14,440 --> 00:36:18,240
It needs clearer ownership, defined access, and a path to support.
884
00:36:18,240 --> 00:36:20,160
Production automation has a different standard again.
885
00:36:20,160 --> 00:36:23,480
It affects customers, revenue, compliance, or core operations.
886
00:36:23,480 --> 00:36:24,720
It needs named owners.
887
00:36:24,720 --> 00:36:26,120
It needs control deployment.
888
00:36:26,120 --> 00:36:27,240
It needs monitoring.
889
00:36:27,240 --> 00:36:28,880
It needs an identity and access model that
890
00:36:28,880 --> 00:36:30,360
survives staff changes.
891
00:36:30,360 --> 00:36:34,560
A clear path for each type of work helps people choose correctly at the start.
892
00:36:34,560 --> 00:36:36,160
Instead of asking, can I build this?
893
00:36:36,160 --> 00:36:39,160
They ask, what kind of automation is this becoming?
894
00:36:39,160 --> 00:36:41,960
That one question prevents a lot of confusion later.
895
00:36:41,960 --> 00:36:43,560
Roads make the boundary real.
896
00:36:43,560 --> 00:36:47,000
Environment rolls control who can administer or build in an environment.
897
00:36:47,000 --> 00:36:51,120
Resource permissions control who can use edit or share a specific app or flow.
898
00:36:51,120 --> 00:36:54,480
Dataverse security rolls control, what data people can read, create, update,
899
00:36:54,480 --> 00:36:55,480
or delete.
900
00:36:55,480 --> 00:36:56,720
These are separate layers.
901
00:36:56,720 --> 00:36:59,600
And teams get into trouble when they treat them as one thing.
902
00:36:59,600 --> 00:37:04,120
Giving someone access to build a flow does not mean they should access every customer record.
903
00:37:04,120 --> 00:37:08,080
Giving someone a dataverse role does not mean they should edit production automation.
904
00:37:08,080 --> 00:37:11,840
Giving a user permission to run an app does not mean they should administer its environment.
905
00:37:11,840 --> 00:37:13,800
Each permission answers a different question.
906
00:37:13,800 --> 00:37:14,800
Who can build?
907
00:37:14,800 --> 00:37:15,800
Who can operate?
908
00:37:15,800 --> 00:37:16,800
Who can access the data?
909
00:37:16,800 --> 00:37:20,440
When those answers stay distinct, automation remains inside the business boundaries already
910
00:37:20,440 --> 00:37:22,720
defined in dynamics and dataverse.
911
00:37:22,720 --> 00:37:27,360
The power platform admin has a central role here, not as the person who builds every flow,
912
00:37:27,360 --> 00:37:29,960
not as the person who approves every small improvement.
913
00:37:29,960 --> 00:37:32,640
The admin creates the conditions for safe work.
914
00:37:32,640 --> 00:37:36,920
Environment strategy, access rules, support routes, visibility across the platform, a center
915
00:37:36,920 --> 00:37:38,840
of excellence can extend that role.
916
00:37:38,840 --> 00:37:40,760
It can help makers learn the right patterns.
917
00:37:40,760 --> 00:37:42,360
It can identify automation without owners.
918
00:37:42,360 --> 00:37:44,320
It can see which connectors are in use.
919
00:37:44,320 --> 00:37:47,760
It can find inactive or failing assets before users report a problem.
920
00:37:47,760 --> 00:37:50,800
It can guide teams toward the correct environment and delivery path.
921
00:37:50,800 --> 00:37:52,600
That is not central control for its own sake.
922
00:37:52,600 --> 00:37:54,280
It is shared operational awareness.
923
00:37:54,280 --> 00:37:56,920
Without it, every department solves the same problems alone.
924
00:37:56,920 --> 00:37:57,920
Who owns this flow?
925
00:37:57,920 --> 00:37:59,280
Which environment should we use?
926
00:37:59,280 --> 00:38:00,480
How do we deploy it?
927
00:38:00,480 --> 00:38:01,720
What happens if the maker leaves?
928
00:38:01,720 --> 00:38:03,000
Where do we report a failure?
929
00:38:03,000 --> 00:38:06,320
A good operating model answers those questions before they become incidents.
930
00:38:06,320 --> 00:38:08,720
And it also avoids forcing every request into IT.
931
00:38:08,720 --> 00:38:12,960
I should not become the bottleneck for a sales manager changing a rooting rule or a team
932
00:38:12,960 --> 00:38:15,200
improving a low-risk internal process.
933
00:38:15,200 --> 00:38:19,160
But the business should not be left alone with production data, shared identities, and
934
00:38:19,160 --> 00:38:20,720
unrestricted connectors either.
935
00:38:20,720 --> 00:38:23,960
The model gives people room to build within known boundaries.
936
00:38:23,960 --> 00:38:26,520
Personal makers get a safe place to experiment.
937
00:38:26,520 --> 00:38:28,600
Teams get support for shared automation.
938
00:38:28,600 --> 00:38:30,840
Production processes get the discipline their risk requires.
939
00:38:30,840 --> 00:38:34,760
That is how you scale automation without creating a second layer of unmanaged work.
940
00:38:34,760 --> 00:38:38,760
And once those parts are clear, the next decision is not who can use a connector.
941
00:38:38,760 --> 00:38:41,040
It is what data that connector is allowed to move.
942
00:38:41,040 --> 00:38:44,280
DLP policies define which data can travel together.
943
00:38:44,280 --> 00:38:46,480
A connector is not just a technical option.
944
00:38:46,480 --> 00:38:47,720
It is a route for data.
945
00:38:47,720 --> 00:38:49,160
And every route needs a decision.
946
00:38:49,160 --> 00:38:51,600
Every customer data leave data versed through this connector.
947
00:38:51,600 --> 00:38:52,600
Can it move into teams?
948
00:38:52,600 --> 00:38:53,640
Can it go to SharePoint?
949
00:38:53,640 --> 00:38:55,400
Can it reach a third-party service?
950
00:38:55,400 --> 00:38:58,640
The answer should not depend on what a maker happens to select in a flow.
951
00:38:58,640 --> 00:39:00,760
That is what data loss prevention policies control.
952
00:39:00,760 --> 00:39:04,520
DLP policies group connectors by the type of data they can handle together.
953
00:39:04,520 --> 00:39:07,360
One group can contain business data connectors.
954
00:39:07,360 --> 00:39:10,320
Another can contain connectors that should not handle business data.
955
00:39:10,320 --> 00:39:12,680
A third group blocks connectors entirely.
956
00:39:12,680 --> 00:39:13,960
The names are simple.
957
00:39:13,960 --> 00:39:14,960
Business?
958
00:39:14,960 --> 00:39:15,960
It's a non-business?
959
00:39:15,960 --> 00:39:16,960
Blocked.
960
00:39:16,960 --> 00:39:18,520
But the decision underneath is specific.
961
00:39:18,520 --> 00:39:23,760
If data versed holds customer records, account information, case data or commercial details,
962
00:39:23,760 --> 00:39:28,480
an organization may allow that data to work with approved Microsoft 365 services.
963
00:39:28,480 --> 00:39:31,120
Maybe outlook, maybe teams, maybe SharePoint.
964
00:39:31,120 --> 00:39:33,320
Those connectors can sit in the business data group.
965
00:39:33,320 --> 00:39:36,920
A connector placed in the non-business group cannot join that same flow with the business
966
00:39:36,920 --> 00:39:37,920
group.
967
00:39:37,920 --> 00:39:41,160
The policy stops the combination, not after the data already moved.
968
00:39:41,160 --> 00:39:44,320
Before the automation gets built, that is a different model from reviewing every flow
969
00:39:44,320 --> 00:39:45,320
by hand.
970
00:39:45,320 --> 00:39:48,800
The policy defines the allowed routes once, then make us work within those routes.
971
00:39:48,800 --> 00:39:52,360
If a connector is blocked, it cannot be used in power apps or power automate resources
972
00:39:52,360 --> 00:39:53,360
covered by that policy.
973
00:39:53,360 --> 00:39:55,040
That doesn't mean the connector is bad.
974
00:39:55,040 --> 00:39:58,680
It means the organization has decided it does not belong in that environment or with
975
00:39:58,680 --> 00:39:59,840
that class of data.
976
00:39:59,840 --> 00:40:03,080
A social media connector may make sense for a marketing experiment.
977
00:40:03,080 --> 00:40:06,720
It may not belong in an automation that begins with dynamics customer records.
978
00:40:06,720 --> 00:40:10,840
A file storage connector may be acceptable for low-risk productivity work.
979
00:40:10,840 --> 00:40:14,160
It may not be an approved destination for regulated case information.
980
00:40:14,160 --> 00:40:15,520
Here's the real question.
981
00:40:15,520 --> 00:40:17,640
Not can power automate connect to it?
982
00:40:17,640 --> 00:40:19,440
But should this data travel there?
983
00:40:19,440 --> 00:40:20,560
That shift matters.
984
00:40:20,560 --> 00:40:22,640
Connector combinations are data risk decisions.
985
00:40:22,640 --> 00:40:25,760
A flow can look harmless when each action appears separately.
986
00:40:25,760 --> 00:40:30,920
Read an account from dataverse, create a file, post a message, send an HTTP request.
987
00:40:30,920 --> 00:40:33,640
But together, those actions define a data route.
988
00:40:33,640 --> 00:40:34,720
Where did the data start?
989
00:40:34,720 --> 00:40:36,000
Which service received it?
990
00:40:36,000 --> 00:40:37,320
Who can access it there?
991
00:40:37,320 --> 00:40:39,320
What other systems can that service connect to?
992
00:40:39,320 --> 00:40:43,120
DLP policies force the organization to think about that route before a make-up press is
993
00:40:43,120 --> 00:40:44,120
safe.
994
00:40:44,120 --> 00:40:46,240
The environment should have different levels of freedom.
995
00:40:46,240 --> 00:40:50,000
A personal development environment may permit a limited set of low-risk connectors for
996
00:40:50,000 --> 00:40:51,280
learning and testing.
997
00:40:51,280 --> 00:40:54,480
A team environment may allow approved collaboration services.
998
00:40:54,480 --> 00:40:58,560
A production environment containing dynamics data may allow only the connectors needed
999
00:40:58,560 --> 00:41:00,160
for a defined business process.
1000
00:41:00,160 --> 00:41:01,840
That is not inconsistent governance.
1001
00:41:01,840 --> 00:41:04,560
It is governance based on process sensitivity.
1002
00:41:04,560 --> 00:41:08,840
A flow that sends an internal reminder doesn't carry the same risk as a flow that moves
1003
00:41:08,840 --> 00:41:12,160
customer, finance, or case data across systems.
1004
00:41:12,160 --> 00:41:16,760
Creating both the same either creates unnecessary friction or leaves too much open.
1005
00:41:16,760 --> 00:41:18,680
External sharing needs the same deliberate decision.
1006
00:41:18,680 --> 00:41:22,320
A flow can create a connection that crosses tenant boundaries when a user has valid access
1007
00:41:22,320 --> 00:41:26,040
in another tenant unless the organization restricts that path.
1008
00:41:26,040 --> 00:41:29,600
That creates a possible route for business data to leave the tenant through an approved
1009
00:41:29,600 --> 00:41:30,840
looking connection.
1010
00:41:30,840 --> 00:41:33,120
Some organizations need external collaboration.
1011
00:41:33,120 --> 00:41:36,240
Suppliers, partners, and acquired businesses may all require data movement.
1012
00:41:36,240 --> 00:41:38,600
The answer is not always to block every external route.
1013
00:41:38,600 --> 00:41:40,480
It is to define approved routes.
1014
00:41:40,480 --> 00:41:42,000
Which external tenants can connect?
1015
00:41:42,000 --> 00:41:43,000
In which direction?
1016
00:41:43,000 --> 00:41:44,440
For which environments?
1017
00:41:44,440 --> 00:41:45,920
For which business processes?
1018
00:41:45,920 --> 00:41:47,080
A production flow?
1019
00:41:47,080 --> 00:41:49,440
That sends information to an external partner?
1020
00:41:49,440 --> 00:41:51,800
Should use an agreed route with ownership and review?
1021
00:41:51,800 --> 00:41:55,720
It should not depend on a maker signing into another tenant with a personal connection.
1022
00:41:55,720 --> 00:41:58,440
Security works best when it enters the design at the start.
1023
00:41:58,440 --> 00:42:01,880
Not when someone discovers a connector after the process already depends on it.
1024
00:42:01,880 --> 00:42:03,840
The automation layer can move work quickly.
1025
00:42:03,840 --> 00:42:04,840
That is its purpose.
1026
00:42:04,840 --> 00:42:08,920
DLP makes sure it does not move business data without a defined boundary, but DLP only
1027
00:42:08,920 --> 00:42:10,800
governs the route between services.
1028
00:42:10,800 --> 00:42:14,920
It does not decide who can read or change the dynamics records underneath.
1029
00:42:14,920 --> 00:42:18,040
Dataverse security keeps automation inside business boundaries.
1030
00:42:18,040 --> 00:42:20,280
DLP tells data where it can go.
1031
00:42:20,280 --> 00:42:23,880
Dataverse security tells you who can work with that data before it ever moves.
1032
00:42:23,880 --> 00:42:28,160
Power Platform does not let users access records they don't already have permission to see.
1033
00:42:28,160 --> 00:42:29,400
That's the line that matters.
1034
00:42:29,400 --> 00:42:30,920
A flow connects to dynamics.
1035
00:42:30,920 --> 00:42:32,200
A user opens an app.
1036
00:42:32,200 --> 00:42:33,960
A maker builds automation.
1037
00:42:33,960 --> 00:42:36,760
None of that should become a shortcut around the security underneath.
1038
00:42:36,760 --> 00:42:40,720
The record still has rules, who can read it, who can update it, who can assign it, who can
1039
00:42:40,720 --> 00:42:41,720
delete it.
1040
00:42:41,720 --> 00:42:44,240
Those permissions come from Dataverse security roles.
1041
00:42:44,240 --> 00:42:47,000
A sales user may read and update their own opportunities.
1042
00:42:47,000 --> 00:42:49,120
A sales manager sees records across a team.
1043
00:42:49,120 --> 00:42:52,560
A finance user can access commercial fields that sellers cannot touch.
1044
00:42:52,560 --> 00:42:54,640
The automation has to respect those boundaries.
1045
00:42:54,640 --> 00:42:58,320
Otherwise, you get a process that looks controlled on the surface, but actually moves
1046
00:42:58,320 --> 00:43:02,120
data or updates records with more authority than the business intended.
1047
00:43:02,120 --> 00:43:03,760
Field-level security adds another layer.
1048
00:43:03,760 --> 00:43:06,720
Not everyone who sees a record should see every value on it.
1049
00:43:06,720 --> 00:43:09,720
A customer record might contain sensitive financial information.
1050
00:43:09,720 --> 00:43:11,520
A case could include restricted notes.
1051
00:43:11,520 --> 00:43:14,400
A contract may have terms limited to a specific group.
1052
00:43:14,400 --> 00:43:18,400
Field-level security controls, who reads, creates, or updates those fields that matters
1053
00:43:18,400 --> 00:43:19,760
for automation too.
1054
00:43:19,760 --> 00:43:24,320
If a flow uses restricted data, the identity running that flow needs the right permission.
1055
00:43:24,320 --> 00:43:25,320
No more than that.
1056
00:43:25,320 --> 00:43:29,840
A broad automation account with system administrator access might feel convenient during a build.
1057
00:43:29,840 --> 00:43:33,720
But it's also an easy way to hide excessive access inside a process.
1058
00:43:33,720 --> 00:43:34,720
Nobody reviews.
1059
00:43:34,720 --> 00:43:36,480
Give the automation only what it needs.
1060
00:43:36,480 --> 00:43:40,040
If it only reads opportunities and writes approval outcomes, grant that scope.
1061
00:43:40,040 --> 00:43:44,680
If it needs to create tasks, grant task permissions, if it never deletes records do not grant
1062
00:43:44,680 --> 00:43:47,640
delete rights just because the account might need them one day.
1063
00:43:47,640 --> 00:43:49,120
Least privilege is not paperwork.
1064
00:43:49,120 --> 00:43:53,280
It limits the damage when a connection gets misused, a flow behaves unexpectedly, or an
1065
00:43:53,280 --> 00:43:54,840
account gets compromised.
1066
00:43:54,840 --> 00:43:57,360
Auditing gives teams a way to inspect what happened.
1067
00:43:57,360 --> 00:43:58,560
A record changed.
1068
00:43:58,560 --> 00:43:59,800
A field changed.
1069
00:43:59,800 --> 00:44:01,560
And owner changed.
1070
00:44:01,560 --> 00:44:04,200
The audit trail answers who perform the action and when.
1071
00:44:04,200 --> 00:44:07,760
For regulated processes, that record may be part of the control itself.
1072
00:44:07,760 --> 00:44:10,640
For ordinary support work, it separates assumptions from evidence.
1073
00:44:10,640 --> 00:44:12,800
A customer's start is changed after an approval.
1074
00:44:12,800 --> 00:44:14,040
Was that a user action?
1075
00:44:14,040 --> 00:44:15,360
Was it an automation account?
1076
00:44:15,360 --> 00:44:17,360
Was it an integration?
1077
00:44:17,360 --> 00:44:20,000
The record history helps the team trace the path.
1078
00:44:20,000 --> 00:44:22,160
Security also depends on how records are owned.
1079
00:44:22,160 --> 00:44:24,840
Some tables hold organization-owned records.
1080
00:44:24,840 --> 00:44:28,440
Those records belong to the organization rather than a specific user or team.
1081
00:44:28,440 --> 00:44:32,320
They suit shared reference data where personal ownership does not define access.
1082
00:44:32,320 --> 00:44:34,320
Other tables use user or team ownership.
1083
00:44:34,320 --> 00:44:38,600
That model matters because ownership shapes who sees a record and who can act on it.
1084
00:44:38,600 --> 00:44:40,480
An opportunity may belong to a seller.
1085
00:44:40,480 --> 00:44:41,960
A case may belong to a service team.
1086
00:44:41,960 --> 00:44:46,000
A shared queue process moves work between owners as responsibility changes.
1087
00:44:46,000 --> 00:44:49,600
The automation should understand that model before it changes anything.
1088
00:44:49,600 --> 00:44:51,600
Assigning a record is not just an update.
1089
00:44:51,600 --> 00:44:53,920
It can change who accesses the record next.
1090
00:44:53,920 --> 00:44:55,920
It can change who receives follow-up work.
1091
00:44:55,920 --> 00:44:59,400
Defects reporting, workload views and escalation routes.
1092
00:44:59,400 --> 00:45:00,800
Business units add another boundary.
1093
00:45:00,800 --> 00:45:03,360
They structure access around parts of the organization.
1094
00:45:03,360 --> 00:45:07,800
A company might separate sales regions, legal entities, departments or operational groups
1095
00:45:07,800 --> 00:45:09,320
through business units and teams.
1096
00:45:09,320 --> 00:45:12,560
That structure shapes the records people can access through their roles.
1097
00:45:12,560 --> 00:45:16,560
So an automation that routes work across teams or reassigns records needs to follow the
1098
00:45:16,560 --> 00:45:17,760
actual security design.
1099
00:45:17,760 --> 00:45:22,360
It cannot assume every user should see every record just because the flow can find it.
1100
00:45:22,360 --> 00:45:23,480
Contacts decides the route.
1101
00:45:23,480 --> 00:45:25,600
But security decides whether that route is allowed.
1102
00:45:25,600 --> 00:45:28,840
This is where poor automation design often creates silent problems.
1103
00:45:28,840 --> 00:45:30,760
A flow runs under a powerful identity.
1104
00:45:30,760 --> 00:45:32,240
It updates records across teams.
1105
00:45:32,240 --> 00:45:35,240
It bypasses the limits that users experience every day.
1106
00:45:35,240 --> 00:45:36,560
The process works.
1107
00:45:36,560 --> 00:45:38,760
But it creates results nobody can explain.
1108
00:45:38,760 --> 00:45:40,800
A seller sees a record move away from them.
1109
00:45:40,800 --> 00:45:43,200
A manager receives data from another business unit.
1110
00:45:43,200 --> 00:45:45,680
A restricted field appears in a notification.
1111
00:45:45,680 --> 00:45:48,080
The automation did exactly what it's account allowed.
1112
00:45:48,080 --> 00:45:50,520
The account simply had too much authority.
1113
00:45:50,520 --> 00:45:52,920
Designed the automation identity around the process.
1114
00:45:52,920 --> 00:45:56,400
A name-to-count for unattended work where that fits the operating model.
1115
00:45:56,400 --> 00:45:58,160
Give it a defined security role.
1116
00:45:58,160 --> 00:45:59,160
Review its permissions.
1117
00:45:59,160 --> 00:46:02,400
Review where it sits in the business unit and team structure.
1118
00:46:02,400 --> 00:46:06,040
Then test the automation using the permissions it will actually have in production.
1119
00:46:06,040 --> 00:46:09,600
Do not build with administrator access and assume normal access will behave the same way
1120
00:46:09,600 --> 00:46:10,600
later.
1121
00:46:10,600 --> 00:46:12,960
Security changes who can own automation safely.
1122
00:46:12,960 --> 00:46:16,120
A personal maker identity may be suitable for low-risk work.
1123
00:46:16,120 --> 00:46:20,640
A production flow handling shared records, sensitive data or unattended updates needs
1124
00:46:20,640 --> 00:46:24,800
an owner model that matches the process, the data and the responsibility.
1125
00:46:24,800 --> 00:46:27,600
Build fewer flows with clearer process boundaries.
1126
00:46:27,600 --> 00:46:29,640
One business outcome, one primary flow.
1127
00:46:29,640 --> 00:46:30,680
That should be your default.
1128
00:46:30,680 --> 00:46:32,360
Not one flow for every small click.
1129
00:46:32,360 --> 00:46:34,160
Not one flow for every field update.
1130
00:46:34,160 --> 00:46:37,680
Not a collection of tiny automations that nobody can connect into one process.
1131
00:46:37,680 --> 00:46:39,480
Take an opportunity approval.
1132
00:46:39,480 --> 00:46:40,840
The outcome is clear.
1133
00:46:40,840 --> 00:46:45,080
A deal reaches a point where someone must approve, reject or request changes.
1134
00:46:45,080 --> 00:46:46,400
That process may check data.
1135
00:46:46,400 --> 00:46:47,480
It may root approval.
1136
00:46:47,480 --> 00:46:48,600
It may send reminders.
1137
00:46:48,600 --> 00:46:49,920
It may update the record.
1138
00:46:49,920 --> 00:46:51,280
It may notify the seller.
1139
00:46:51,280 --> 00:46:54,480
Those steps belong together because they produce one business outcome.
1140
00:46:54,480 --> 00:46:57,160
Splitting them into separate flows can look tidy at first.
1141
00:46:57,160 --> 00:46:58,760
One flow checks the amount.
1142
00:46:58,760 --> 00:47:00,080
Another sends the approval.
1143
00:47:00,080 --> 00:47:01,520
Another writes the outcome.
1144
00:47:01,520 --> 00:47:02,840
Another sends the reminder.
1145
00:47:02,840 --> 00:47:05,840
Soon, no one knows which flow owns the process.
1146
00:47:05,840 --> 00:47:09,720
A failure in one flow leaves the record halfway through the journey.
1147
00:47:09,720 --> 00:47:13,400
Support has to trace several run histories just to answer a simple question.
1148
00:47:13,400 --> 00:47:14,880
Did the approval start?
1149
00:47:14,880 --> 00:47:15,880
Did it finish?
1150
00:47:15,880 --> 00:47:17,440
Why didn't the seller receive the result?
1151
00:47:17,440 --> 00:47:19,880
The process boundary disappeared.
1152
00:47:19,880 --> 00:47:22,600
That doesn't mean every action belongs in one enormous flow.
1153
00:47:22,600 --> 00:47:27,520
A flow that handles several unrelated outcomes becomes difficult to test and harder to change.
1154
00:47:27,520 --> 00:47:29,440
The boundary should follow the business result.
1155
00:47:29,440 --> 00:47:32,560
A customer onboarding flow should own the onboarding outcome.
1156
00:47:32,560 --> 00:47:35,320
A case escalation flow should own the escalation outcome.
1157
00:47:35,320 --> 00:47:38,680
A sales approval flow should own the approval outcome.
1158
00:47:38,680 --> 00:47:40,800
Give each flow a name that says exactly that.
1159
00:47:40,800 --> 00:47:44,560
Not flow 7, not CRM automation final, not new version.
1160
00:47:44,560 --> 00:47:47,600
Use names people can search for when the business asks the question.
1161
00:47:47,600 --> 00:47:50,280
Sales opportunity commercial approval.
1162
00:47:50,280 --> 00:47:53,440
Customer case, SLA escalation.
1163
00:47:53,440 --> 00:47:55,560
Contract renewal follow up.
1164
00:47:55,560 --> 00:47:58,360
The name should tell support what the flow does before they open it.
1165
00:47:58,360 --> 00:47:59,760
Descriptions matter too.
1166
00:47:59,760 --> 00:48:03,680
A description can state the trigger, the business owner, the operational owner, the systems
1167
00:48:03,680 --> 00:48:06,320
involved and the condition that starts the process.
1168
00:48:06,320 --> 00:48:07,920
It can explain what the flow changes.
1169
00:48:07,920 --> 00:48:10,520
It can point to the process documentation or support route.
1170
00:48:10,520 --> 00:48:11,600
That is not busy work.
1171
00:48:11,600 --> 00:48:16,520
Six months later, it is the difference between an understandable asset and an unexplained dependency.
1172
00:48:16,520 --> 00:48:18,400
Trigger scope needs the same discipline.
1173
00:48:18,400 --> 00:48:22,360
A dataverse flow should not react to every update on a table when it only cares about
1174
00:48:22,360 --> 00:48:23,560
one business change.
1175
00:48:23,560 --> 00:48:27,920
If an approval begins when an opportunity reaches a certain stage, configure the flow around
1176
00:48:27,920 --> 00:48:28,920
that condition.
1177
00:48:28,920 --> 00:48:33,160
Do not wake it up when someone corrects a phone number, add the note or changes in unrelated
1178
00:48:33,160 --> 00:48:34,160
field.
1179
00:48:34,160 --> 00:48:37,760
Broad triggers create noise, they create unnecessary runs, they create hidden cost.
1180
00:48:37,760 --> 00:48:41,680
They also make failures harder to read because the run history fills with work the process
1181
00:48:41,680 --> 00:48:43,120
never needed to do.
1182
00:48:43,120 --> 00:48:47,480
Define the entry condition clearly, what changed, which table matters, which columns matter,
1183
00:48:47,480 --> 00:48:49,760
which status or stage starts the process.
1184
00:48:49,760 --> 00:48:51,480
Who owns the flow once it runs?
1185
00:48:51,480 --> 00:48:54,680
These questions create a boundary before the flow even begins.
1186
00:48:54,680 --> 00:48:58,400
Reusable child flows can help, but only when shared behavior truly exists.
1187
00:48:58,400 --> 00:49:03,160
A common pattern might create a standard notification, log a process outcome or build a consistent
1188
00:49:03,160 --> 00:49:04,160
approval summary.
1189
00:49:04,160 --> 00:49:07,800
If several business processes need that exact behavior, a child flow can keep it in one
1190
00:49:07,800 --> 00:49:08,960
place.
1191
00:49:08,960 --> 00:49:13,680
But reuse should not become an obsession, two flows that both send email do not automatically
1192
00:49:13,680 --> 00:49:15,280
need the same child flow.
1193
00:49:15,280 --> 00:49:18,640
Their messages may have different owners, different data rules, different failure parts,
1194
00:49:18,640 --> 00:49:20,240
and different reasons for existing.
1195
00:49:20,240 --> 00:49:23,960
Fourcing them together creates a shared component nobody can change safely.
1196
00:49:23,960 --> 00:49:26,560
Reuse works when the responsibility is genuinely shared.
1197
00:49:26,560 --> 00:49:31,040
The function has one purpose, its inputs are clear, its output is clear, and the team is
1198
00:49:31,040 --> 00:49:34,920
using it agree on how it should behave, otherwise keep the logic close to the process that
1199
00:49:34,920 --> 00:49:35,920
owns it.
1200
00:49:35,920 --> 00:49:39,200
Design the exception route before the happy path feels complete.
1201
00:49:39,200 --> 00:49:44,200
Most automations look fine when every record contains the right data, every connector response,
1202
00:49:44,200 --> 00:49:46,560
and every approver replies on time.
1203
00:49:46,560 --> 00:49:50,280
Production rarely stays that polite, what happens when the record is incomplete, what happens
1204
00:49:50,280 --> 00:49:54,280
when the approval group has no active members, what happens when the external system rejects
1205
00:49:54,280 --> 00:49:58,960
the request, what happens when the same record changes again while work is already in progress.
1206
00:49:58,960 --> 00:50:03,320
Those are not edge cases after launch, they are part of the process, give them a route,
1207
00:50:03,320 --> 00:50:05,240
notify the right owner.
1208
00:50:05,240 --> 00:50:09,240
Create a review task, set a status that tells the business what stopped, do not leave a record
1209
00:50:09,240 --> 00:50:12,320
in silence because the flow expected a perfect path.
1210
00:50:12,320 --> 00:50:15,800
Circular updates need special attention, a flow triggers on a dataverse update, then it
1211
00:50:15,800 --> 00:50:19,040
updates the same record, that update can trigger the flow again.
1212
00:50:19,040 --> 00:50:22,840
Now the process may loop, create duplicate actions, or consume runs without producing
1213
00:50:22,840 --> 00:50:27,480
useful work, use trigger conditions, update only the fields that need changing.
1214
00:50:27,480 --> 00:50:30,680
Separate automation state from general record updates where appropriate.
1215
00:50:30,680 --> 00:50:35,160
People look for competing automations, one flow updates a status, another flow reacts to
1216
00:50:35,160 --> 00:50:39,520
that status, a plug-in changes the same field, a business rule changes it again, each component
1217
00:50:39,520 --> 00:50:43,760
may look reasonable alone, together they create unpredictable behavior, map the automation
1218
00:50:43,760 --> 00:50:46,160
touching a process before adding another one.
1219
00:50:46,160 --> 00:50:48,360
The question is not can this flow do it?
1220
00:50:48,360 --> 00:50:51,840
The question is which automation already owns this outcome?
1221
00:50:51,840 --> 00:50:56,040
When the answer stays clear, the process stays easier to change, but clear design only helps
1222
00:50:56,040 --> 00:50:59,800
if people can see how the automation behaves after it starts.
1223
00:50:59,800 --> 00:51:02,320
Everyone starts with an inventory, not a rewrite.
1224
00:51:02,320 --> 00:51:06,940
Don't start by rewriting plug-ins, start by finding out what exists, most dynamics environments
1225
00:51:06,940 --> 00:51:08,760
carry years of automation.
1226
00:51:08,760 --> 00:51:12,880
Some of it still runs every day, some of it only fires when a rare case appears, and some
1227
00:51:12,880 --> 00:51:14,640
of it stopped mattering years ago.
1228
00:51:14,640 --> 00:51:19,360
But it still sits there, a migration plan fails when it treats all custom work as one problem,
1229
00:51:19,360 --> 00:51:23,400
it isn't one problem, you need an inventory first, list every plug-in, every JavaScript
1230
00:51:23,400 --> 00:51:28,440
library, every classic workflow, every custom workflow activity, every integration,
1231
00:51:28,440 --> 00:51:32,800
every scheduled job, every flow already touching the same records.
1232
00:51:32,800 --> 00:51:36,920
Then add one detail people often miss, who owns it, not who built it, who owns the business
1233
00:51:36,920 --> 00:51:37,920
rule today.
1234
00:51:37,920 --> 00:51:41,520
A developer may have written a plug-in five years ago that doesn't tell you whether sales,
1235
00:51:41,520 --> 00:51:44,440
finance, service or legal still wants the outcome.
1236
00:51:44,440 --> 00:51:48,400
The code describes behavior, it doesn't prove the behavior still belongs in the process.
1237
00:51:48,400 --> 00:51:53,240
For each item, capture the table it touches, capture the trigger, capture the fields it reads,
1238
00:51:53,240 --> 00:51:57,000
capture the fields it changes, capture every external system it calls.
1239
00:51:57,000 --> 00:52:00,920
Then ask a simpler question, what job does this automation actually perform?
1240
00:52:00,920 --> 00:52:06,000
Some items react to an event, an opportunity changes stage, a case reaches a deadline, a record
1241
00:52:06,000 --> 00:52:09,760
enters a new status, others apply reasoning, they decide whether a policy applies, they
1242
00:52:09,760 --> 00:52:13,600
calculate a route, they check whether a condition allows work to continue.
1243
00:52:13,600 --> 00:52:17,720
Then there is orchestration, the automation sends a notification, it creates a task, it
1244
00:52:17,720 --> 00:52:22,640
requests approval, it updates another system, it waits, escalates and closes the loop.
1245
00:52:22,640 --> 00:52:27,760
Lap each asset to those three jobs, event, reasoning, orchestration, one plug-in may contain all
1246
00:52:27,760 --> 00:52:32,600
three, that is common, a record changes, the plug-in checks several rules, then calls another
1247
00:52:32,600 --> 00:52:34,600
system and creates follow-up work.
1248
00:52:34,600 --> 00:52:38,200
That doesn't mean the plug-in was poorly built, it means several responsibilities accumulated
1249
00:52:38,200 --> 00:52:40,920
in one place, the inventory makes that visible.
1250
00:52:40,920 --> 00:52:44,320
Once you see the responsibilities, you can discuss the right future boundary.
1251
00:52:44,320 --> 00:52:48,680
Without that view, teams often replace code line by line, they recreate every old step
1252
00:52:48,680 --> 00:52:52,600
in a flow, they preserve every old condition, they carry forward every exception,
1253
00:52:52,600 --> 00:52:58,480
and they rebuild the same complexity using different tools, that isn't modernization, it is relocation.
1254
00:52:58,480 --> 00:53:02,520
You also need to find dependencies that aren't obvious from the automation name, a plug-in
1255
00:53:02,520 --> 00:53:05,160
may depend on a field that no one uses on the form.
1256
00:53:05,160 --> 00:53:09,680
A script may call a web resource used by only one app, a classic workflow may start another
1257
00:53:09,680 --> 00:53:13,920
workflow, an integration may expect a value to appear in a specific field before it processes
1258
00:53:13,920 --> 00:53:18,760
the record, a flow may already react to the same status change, these dependencies define
1259
00:53:18,760 --> 00:53:22,280
the risk, they tell you what could break when you move one piece.
1260
00:53:22,280 --> 00:53:23,480
And mode matters too.
1261
00:53:23,480 --> 00:53:25,520
Does the automation run before a record saves?
1262
00:53:25,520 --> 00:53:27,160
Does it run after the record changes?
1263
00:53:27,160 --> 00:53:28,320
Does it run in the background?
1264
00:53:28,320 --> 00:53:29,320
Does it run on a schedule?
1265
00:53:29,320 --> 00:53:30,560
Does it wait for a person?
1266
00:53:30,560 --> 00:53:33,920
A name like Opportunity Validation tells you almost nothing about that boundary.
1267
00:53:33,920 --> 00:53:38,560
The execution mode tells you whether the process affects data integrity, user experience,
1268
00:53:38,560 --> 00:53:42,960
or downstream work, documented clearly, also document the business owner, not a vague department
1269
00:53:42,960 --> 00:53:47,800
label, a real person or role responsible for deciding whether the rule remains valid.
1270
00:53:47,800 --> 00:53:50,480
That conversation can expose surprising things.
1271
00:53:50,480 --> 00:53:55,280
The team may discover that a complex approval route supports a policy that no longer exists.
1272
00:53:55,280 --> 00:53:59,280
A script may enforce a field requirement that the business removed from its process years
1273
00:53:59,280 --> 00:54:00,280
ago.
1274
00:54:00,280 --> 00:54:04,560
An integration may keep sending data to a system nobody uses, all customizations often
1275
00:54:04,560 --> 00:54:06,800
remain because nobody wants to touch them.
1276
00:54:06,800 --> 00:54:10,280
The inventory gives you a safer way to ask whether they should remain.
1277
00:54:10,280 --> 00:54:12,640
Separate active business rules from abandoned behavior.
1278
00:54:12,640 --> 00:54:16,760
A rule is active when someone can explain its purpose, confirm its owner, and describe
1279
00:54:16,760 --> 00:54:18,280
the outcome it still protects.
1280
00:54:18,280 --> 00:54:22,480
A customization without that evidence is not automatically safe to remove, but it should
1281
00:54:22,480 --> 00:54:25,240
not receive the same investment as a live process.
1282
00:54:25,240 --> 00:54:26,560
Market for investigation.
1283
00:54:26,560 --> 00:54:27,920
Look at whether it still runs.
1284
00:54:27,920 --> 00:54:29,920
Check whether records still depend on it.
1285
00:54:29,920 --> 00:54:32,440
Confirm whether another automation already replaced it.
1286
00:54:32,440 --> 00:54:34,760
Then decide with the people responsible for the process.
1287
00:54:34,760 --> 00:54:37,240
This work changes the migration conversation.
1288
00:54:37,240 --> 00:54:39,560
Instead of asking which plugins can we convert?
1289
00:54:39,560 --> 00:54:42,760
You ask which business outcomes still need automation?
1290
00:54:42,760 --> 00:54:43,760
That is a better question.
1291
00:54:43,760 --> 00:54:45,240
Now you can prioritize.
1292
00:54:45,240 --> 00:54:46,240
Start with pain.
1293
00:54:46,240 --> 00:54:49,680
Automation causes failures, delays, support work or manual chasing.
1294
00:54:49,680 --> 00:54:50,680
Then look at change frequency.
1295
00:54:50,680 --> 00:54:54,480
A rule that changes every quarter may suit a more visible automation model than a stable
1296
00:54:54,480 --> 00:54:56,520
calculation untouched for years.
1297
00:54:56,520 --> 00:54:57,520
Consider risk.
1298
00:54:57,520 --> 00:55:01,640
A process tied to sensitive data, revenue decisions or compliance needs a careful path.
1299
00:55:01,640 --> 00:55:03,520
Finally, consider technical fit.
1300
00:55:03,520 --> 00:55:05,960
Some automation belongs outside the record transaction.
1301
00:55:05,960 --> 00:55:06,960
Some does not.
1302
00:55:06,960 --> 00:55:10,720
Some code should remain because replacing it creates more risk than value.
1303
00:55:10,720 --> 00:55:13,120
After the inventory, every item needs a category.
1304
00:55:13,120 --> 00:55:14,120
Not a target tool yet.
1305
00:55:14,120 --> 00:55:15,120
A category.
1306
00:55:15,120 --> 00:55:18,600
Only then can you choose what changes, what stays and what should disappear.
1307
00:55:18,600 --> 00:55:21,360
A safer migration path from custom automation.
1308
00:55:21,360 --> 00:55:23,360
Don't begin with the most dangerous plugin.
1309
00:55:23,360 --> 00:55:25,040
Begin with the one that changes often.
1310
00:55:25,040 --> 00:55:26,920
Look for automation that crosses systems.
1311
00:55:26,920 --> 00:55:31,720
A process that updates dynamics, sends an approval, creates a task and notifies a team.
1312
00:55:31,720 --> 00:55:33,160
That is usually a better first move.
1313
00:55:33,160 --> 00:55:34,600
The boundary is easier to see.
1314
00:55:34,600 --> 00:55:37,320
And the business already feels the cost of every change.
1315
00:55:37,320 --> 00:55:39,720
Choose something important enough to prove the model.
1316
00:55:39,720 --> 00:55:42,120
But not so central that one mistake stops the company.
1317
00:55:42,120 --> 00:55:43,920
A recurring approval root works well.
1318
00:55:43,920 --> 00:55:46,040
A customer follow-up process can work too.
1319
00:55:46,040 --> 00:55:49,920
So can a notification process that depends on dynamics data and needs action in teams or
1320
00:55:49,920 --> 00:55:54,160
outlook pick work where the process changes more often than the data model.
1321
00:55:54,160 --> 00:55:57,560
That is where a visible automation layer earns its place fastest.
1322
00:55:57,560 --> 00:56:00,400
Before building anything, document the current behavior.
1323
00:56:00,400 --> 00:56:02,920
Not the intended behavior, the current behavior.
1324
00:56:02,920 --> 00:56:04,360
What does the automation produce?
1325
00:56:04,360 --> 00:56:05,600
Which records change?
1326
00:56:05,600 --> 00:56:06,600
Which messages send?
1327
00:56:06,600 --> 00:56:08,320
Which systems receive data?
1328
00:56:08,320 --> 00:56:09,680
What exceptions already exist?
1329
00:56:09,680 --> 00:56:12,560
A process may skip approval for certain account types.
1330
00:56:12,560 --> 00:56:14,920
It may root requests differently by region.
1331
00:56:14,920 --> 00:56:17,320
It may retry an external call after failure.
1332
00:56:17,320 --> 00:56:20,520
It may depend on a field updated by another customization.
1333
00:56:20,520 --> 00:56:22,840
Write that down, then document permissions.
1334
00:56:22,840 --> 00:56:24,760
Which identity runs the current automation?
1335
00:56:24,760 --> 00:56:25,920
What records can it read?
1336
00:56:25,920 --> 00:56:27,120
What data can it change?
1337
00:56:27,120 --> 00:56:29,400
Which external service permissions does it use?
1338
00:56:29,400 --> 00:56:34,200
A replacement flow cannot safely reproduce the outcome if nobody understands the authority
1339
00:56:34,200 --> 00:56:36,120
behind the old process.
1340
00:56:36,120 --> 00:56:37,440
Dependencies need the same attention.
1341
00:56:37,440 --> 00:56:41,200
A custom plug-in may publish a value that another integration expects.
1342
00:56:41,200 --> 00:56:43,480
Script may set a field that triggers later work.
1343
00:56:43,480 --> 00:56:47,120
A background process may rely on a status being written in a specific sequence.
1344
00:56:47,120 --> 00:56:50,720
The old automation may contain behavior the business never asked for directly, but other
1345
00:56:50,720 --> 00:56:51,960
systems still expect.
1346
00:56:51,960 --> 00:56:53,680
That is why migration needs evidence.
1347
00:56:53,680 --> 00:56:54,680
Not assumptions.
1348
00:56:54,680 --> 00:56:58,080
Once the behavior is understood, build the replacement in development.
1349
00:56:58,080 --> 00:56:59,080
Build it through a solution.
1350
00:56:59,080 --> 00:57:00,080
Bring in the flow.
1351
00:57:00,080 --> 00:57:01,600
Bring in the connection references.
1352
00:57:01,600 --> 00:57:03,160
Bring in the environment variables.
1353
00:57:03,160 --> 00:57:04,920
Keep the process components together.
1354
00:57:04,920 --> 00:57:08,840
The replacement should not begin as a personal flow that someone plans to organize later.
1355
00:57:08,840 --> 00:57:10,760
Later usually means after it becomes important.
1356
00:57:10,760 --> 00:57:13,000
Give it the right structure from the first version.
1357
00:57:13,000 --> 00:57:14,680
Use controlled configuration.
1358
00:57:14,680 --> 00:57:16,320
Use the right identity model.
1359
00:57:16,320 --> 00:57:17,360
Name the assets clearly.
1360
00:57:17,360 --> 00:57:21,520
A migration is not just moving logic from C-Port into a visual designer.
1361
00:57:21,520 --> 00:57:24,920
It is moving the process into an operating model that can support change.
1362
00:57:24,920 --> 00:57:26,520
Then test it beside the existing process.
1363
00:57:26,520 --> 00:57:29,880
Do not switch off the old automation on the day the new flow is built.
1364
00:57:29,880 --> 00:57:31,480
Use controlled records.
1365
00:57:31,480 --> 00:57:33,080
Create known scenarios.
1366
00:57:33,080 --> 00:57:34,520
A standard request.
1367
00:57:34,520 --> 00:57:35,520
An exception.
1368
00:57:35,520 --> 00:57:36,520
A rejected approval.
1369
00:57:36,520 --> 00:57:37,760
A delayed response.
1370
00:57:37,760 --> 00:57:39,600
A record with missing information.
1371
00:57:39,600 --> 00:57:40,920
That's what both paths do.
1372
00:57:40,920 --> 00:57:41,920
Compare the result.
1373
00:57:41,920 --> 00:57:43,720
Did dynamics receive the same outcome?
1374
00:57:43,720 --> 00:57:45,760
Did the right person receive the right message?
1375
00:57:45,760 --> 00:57:48,240
Did the external system get the correct data?
1376
00:57:48,240 --> 00:57:50,480
Did the exception root behavior as expected?
1377
00:57:50,480 --> 00:57:55,400
This parallel period matters because it exposes the details nobody remembered to document.
1378
00:57:55,400 --> 00:57:58,560
Maybe the old plug-in normalized a value before sending it.
1379
00:57:58,560 --> 00:58:00,760
Maybe it skipped a specific record type.
1380
00:58:00,760 --> 00:58:04,240
Maybe it handled an integration timeout in a way the team only notices under load.
1381
00:58:04,240 --> 00:58:05,640
Those discoveries are useful.
1382
00:58:05,640 --> 00:58:07,480
They do not mean the migration failed.
1383
00:58:07,480 --> 00:58:11,360
They mean the team found the real process before retiring the old automation.
1384
00:58:11,360 --> 00:58:12,760
Keep the comparison controlled.
1385
00:58:12,760 --> 00:58:17,100
You don't want both systems creating duplicate tasks or sending duplicate approvals to real
1386
00:58:17,100 --> 00:58:18,100
users.
1387
00:58:18,100 --> 00:58:18,940
Use test records.
1388
00:58:18,940 --> 00:58:20,100
Use a test queue.
1389
00:58:20,100 --> 00:58:21,440
Use a dedicated mailbox.
1390
00:58:21,440 --> 00:58:22,440
Where needed?
1391
00:58:22,440 --> 00:58:25,160
Configure one path to observe without performing the live action.
1392
00:58:25,160 --> 00:58:26,240
The aim is proof.
1393
00:58:26,240 --> 00:58:27,960
Not disruption.
1394
00:58:27,960 --> 00:58:32,000
When the new process behaves correctly, release it as a managed package.
1395
00:58:32,000 --> 00:58:35,680
Move the tested solution into production with the right configuration mapped for that
1396
00:58:35,680 --> 00:58:36,680
environment.
1397
00:58:36,680 --> 00:58:40,080
Once the release, no which version entered production, then monitor the runs.
1398
00:58:40,080 --> 00:58:41,080
Watch failures.
1399
00:58:41,080 --> 00:58:42,080
Watch retries.
1400
00:58:42,080 --> 00:58:43,080
Watch approval delays.
1401
00:58:43,080 --> 00:58:45,200
Check the records created or updated by the flow.
1402
00:58:45,200 --> 00:58:47,120
Talk to the people who use the process.
1403
00:58:47,120 --> 00:58:48,880
Technical success is not enough.
1404
00:58:48,880 --> 00:58:54,160
If the seller receives a confusing message or an approver, lacks the context to decide.
1405
00:58:54,160 --> 00:58:57,440
Only retire the old code when the replacement has earned that decision.
1406
00:58:57,440 --> 00:58:59,480
Not when the flow first saves successfully.
1407
00:58:59,480 --> 00:59:01,000
Not when the first test passes.
1408
00:59:01,000 --> 00:59:03,320
Retire it after the production process works.
1409
00:59:03,320 --> 00:59:04,720
The team can operate it.
1410
00:59:04,720 --> 00:59:06,640
And the business owner accepts the result.
1411
00:59:06,640 --> 00:59:08,520
Then remove the old path deliberately.
1412
00:59:08,520 --> 00:59:09,760
Document the retirement.
1413
00:59:09,760 --> 00:59:11,960
Confirm that no integration still depends on it.
1414
00:59:11,960 --> 00:59:14,040
Otherwise, you risk running two sources of truth.
1415
00:59:14,040 --> 00:59:16,720
This approach moves carefully without becoming slow.
1416
00:59:16,720 --> 00:59:18,200
You start where change hurts.
1417
00:59:18,200 --> 00:59:19,560
You build with the right structure.
1418
00:59:19,560 --> 00:59:21,360
You test against the actual behavior.
1419
00:59:21,360 --> 00:59:22,440
Then you release with evidence.
1420
00:59:22,440 --> 00:59:25,880
But low code can create its own mess when teams skip those disciplines.
1421
00:59:25,880 --> 00:59:27,680
The team model, business owns intent.
1422
00:59:27,680 --> 00:59:29,240
IT owns guardrails.
1423
00:59:29,240 --> 00:59:31,160
The process owner owns the intent.
1424
00:59:31,160 --> 00:59:32,920
Not the flow, not the connector.
1425
00:59:32,920 --> 00:59:33,920
The intent.
1426
00:59:33,920 --> 00:59:37,960
Design what outcome the process needs to produce along with the rules and the exceptions.
1427
00:59:37,960 --> 00:59:41,040
When an approval route changes, the process owner decides why.
1428
00:59:41,040 --> 00:59:44,560
They confirm the policy if an account type should skip a review.
1429
00:59:44,560 --> 00:59:47,800
And when an escalation needs a new recipient, they own that decision.
1430
00:59:47,800 --> 00:59:49,120
This changes the conversation.
1431
00:59:49,120 --> 00:59:51,560
Instead of telling IT, build what we asked for.
1432
00:59:51,560 --> 00:59:54,520
The business takes responsibility for what the process should do.
1433
00:59:54,520 --> 00:59:57,120
That responsibility cannot sit inside a technical backlog.
1434
00:59:57,120 --> 01:00:00,920
The backlog can implement a request, but it cannot decide whether the request still
1435
01:00:00,920 --> 01:00:01,920
makes business sense.
1436
01:00:01,920 --> 01:00:04,840
So makers take that intent and turn it into automation.
1437
01:00:04,840 --> 01:00:09,000
They build within an approved environment using approved connectors, following the delivery
1438
01:00:09,000 --> 01:00:10,520
path for their type of work.
1439
01:00:10,520 --> 01:00:12,480
That doesn't turn every maker into a developer.
1440
01:00:12,480 --> 01:00:13,960
It gives them a clear place to work.
1441
01:00:13,960 --> 01:00:16,160
A low-risk team process can move quickly.
1442
01:00:16,160 --> 01:00:18,280
A production process follows a stronger path.
1443
01:00:18,280 --> 01:00:20,800
The maker doesn't need to guess which rules apply.
1444
01:00:20,800 --> 01:00:23,160
The operating model already answers that.
1445
01:00:23,160 --> 01:00:25,120
IT owns the guardrails around the work.
1446
01:00:25,120 --> 01:00:26,120
Identity.
1447
01:00:26,120 --> 01:00:27,120
Data policies.
1448
01:00:27,120 --> 01:00:28,120
Release discipline.
1449
01:00:28,120 --> 01:00:29,120
Monitoring.
1450
01:00:29,120 --> 01:00:30,120
Support routes.
1451
01:00:30,120 --> 01:00:33,000
They stay with IT because they cross individual processes.
1452
01:00:33,000 --> 01:00:37,320
So one team might build an approval flow, another builds a service escalation, and a third
1453
01:00:37,320 --> 01:00:39,120
automates finance notifications.
1454
01:00:39,120 --> 01:00:40,720
Each team knows its own outcome.
1455
01:00:40,720 --> 01:00:42,640
It sees the shared platform underneath.
1456
01:00:42,640 --> 01:00:46,360
Which identities run unattended work, which connectors can work with customer data.
1457
01:00:46,360 --> 01:00:48,320
How do solutions move into production?
1458
01:00:48,320 --> 01:00:49,680
Who sees a failed run?
1459
01:00:49,680 --> 01:00:52,000
Where does a maker go when a connection breaks?
1460
01:00:52,000 --> 01:00:55,200
Those are platform questions, and they meet consistent answers.
1461
01:00:55,200 --> 01:00:58,280
Without that consistency, every team creates its own approach.
1462
01:00:58,280 --> 01:01:02,640
One process uses a personal account, while another uses an un-reviewed shared login.
1463
01:01:02,640 --> 01:01:06,160
One team tests changes another at its production directly.
1464
01:01:06,160 --> 01:01:09,120
One flow sends failure alerts, another fails quietly.
1465
01:01:09,120 --> 01:01:13,040
The automation may work today, but the organization cannot operate it as a system.
1466
01:01:13,040 --> 01:01:14,360
I'd prevent that drift.
1467
01:01:14,360 --> 01:01:18,560
Not by taking every build away from the business, but by defining the safe path before the business
1468
01:01:18,560 --> 01:01:19,560
needs it.
1469
01:01:19,560 --> 01:01:20,560
Developers still matter.
1470
01:01:20,560 --> 01:01:22,360
They matter at the true code boundary.
1471
01:01:22,360 --> 01:01:27,040
A developer handles work that needs controlled server-side execution, heavy processing, specialist
1472
01:01:27,040 --> 01:01:30,880
integration work, or reusable components beyond what a flow should carry.
1473
01:01:30,880 --> 01:01:31,960
That is not a fallback rule.
1474
01:01:31,960 --> 01:01:33,400
It is a focused rule.
1475
01:01:33,400 --> 01:01:37,280
Developers should not spend weeks turning ordinary routing rules into hidden code.
1476
01:01:37,280 --> 01:01:41,400
Their time belongs where code gives the organization something the platform cannot provide
1477
01:01:41,400 --> 01:01:42,400
cleanly.
1478
01:01:42,400 --> 01:01:43,880
A narrow real-time validation.
1479
01:01:43,880 --> 01:01:45,720
A performance-sensitive operation.
1480
01:01:45,720 --> 01:01:48,760
A reusable component needed across several processes.
1481
01:01:48,760 --> 01:01:50,600
A complex integration contract.
1482
01:01:50,600 --> 01:01:52,400
That division improves both sides.
1483
01:01:52,400 --> 01:01:56,000
The business stops waiting for developers to change ordinary process rules.
1484
01:01:56,000 --> 01:01:59,680
The developer stops becoming the default owner of every small automation request.
1485
01:01:59,680 --> 01:02:03,160
And I'd stop trying to govern work through approval meetings alone.
1486
01:02:03,160 --> 01:02:04,600
Review should follow risk.
1487
01:02:04,600 --> 01:02:06,120
Not job title.
1488
01:02:06,120 --> 01:02:08,880
A business maker can build a safe internal process.
1489
01:02:08,880 --> 01:02:11,840
A professional developer can create a risky integration.
1490
01:02:11,840 --> 01:02:13,440
Neither title tells you enough.
1491
01:02:13,440 --> 01:02:16,720
Look at the data, the process impact, and the identity involved.
1492
01:02:16,720 --> 01:02:17,720
Check the systems.
1493
01:02:17,720 --> 01:02:19,960
And consider what happens if the automation fails.
1494
01:02:19,960 --> 01:02:23,920
A reminder flow for one team needs a different review from a process that updates customer
1495
01:02:23,920 --> 01:02:25,960
records and triggers financial approval.
1496
01:02:25,960 --> 01:02:27,800
The maker's title does not change that.
1497
01:02:27,800 --> 01:02:29,480
The risk does.
1498
01:02:29,480 --> 01:02:32,320
This is the team model behind scalable automation.
1499
01:02:32,320 --> 01:02:33,760
Business owns what should happen.
1500
01:02:33,760 --> 01:02:36,320
Makeers build the process within the defined boundaries.
1501
01:02:36,320 --> 01:02:38,560
It keeps the platform safe and operable.
1502
01:02:38,560 --> 01:02:41,160
Developers take the technical work that genuinely needs code.
1503
01:02:41,160 --> 01:02:44,920
Then review follows the effect of the automation, not the person who created it.
1504
01:02:44,920 --> 01:02:47,400
That model changes the executive decision too.
1505
01:02:47,400 --> 01:02:50,320
Because the question is no longer whether to fund more custom development.
1506
01:02:50,320 --> 01:02:54,800
It is whether the organization wants automation capacity to remain trapped inside a developer
1507
01:02:54,800 --> 01:02:55,800
queue.
1508
01:02:55,800 --> 01:02:57,800
A 90 day reset for dynamics automation.
1509
01:02:57,800 --> 01:02:59,200
Don't start with the platform rebuild.
1510
01:02:59,200 --> 01:03:01,080
Start with 30 days of visibility.
1511
01:03:01,080 --> 01:03:02,600
Find the automation already running.
1512
01:03:02,600 --> 01:03:06,760
List the plugins, scripts, flows, classic workflows, and integrations.
1513
01:03:06,760 --> 01:03:07,760
Then identify the gaps.
1514
01:03:07,760 --> 01:03:08,760
Who owns each process?
1515
01:03:08,760 --> 01:03:09,760
Who can support it?
1516
01:03:09,760 --> 01:03:10,920
Which identity runs it?
1517
01:03:10,920 --> 01:03:12,680
Which automation has no current business owner?
1518
01:03:12,680 --> 01:03:14,040
You're not fixing everything yet.
1519
01:03:14,040 --> 01:03:16,960
You're finding the work your organization already depends on.
1520
01:03:16,960 --> 01:03:18,920
That list changes the conversation quickly.
1521
01:03:18,920 --> 01:03:21,760
Some automations will have clear owners and stable behavior.
1522
01:03:21,760 --> 01:03:23,360
Others will reveal a different problem.
1523
01:03:23,360 --> 01:03:27,280
Nobody knows why they run, who can change them safely or where the credentials sit.
1524
01:03:27,280 --> 01:03:28,280
That is your starting point.
1525
01:03:28,280 --> 01:03:31,120
In the next 30 days, define the operating rules.
1526
01:03:31,120 --> 01:03:34,640
Create the environments needed for development, testing, and production work.
1527
01:03:34,640 --> 01:03:35,840
Set the solution structure.
1528
01:03:35,840 --> 01:03:40,040
Define which connectors can work together through DLP policy and how unattended automation
1529
01:03:40,040 --> 01:03:41,200
uses identity.
1530
01:03:41,200 --> 01:03:45,160
Then decide what belongs in a personal environment, what belongs to a team, and what qualifies
1531
01:03:45,160 --> 01:03:46,840
as production automation.
1532
01:03:46,840 --> 01:03:48,160
Keep these rules short.
1533
01:03:48,160 --> 01:03:49,160
People need to use them.
1534
01:03:49,160 --> 01:03:50,720
A maker should know where to build.
1535
01:03:50,720 --> 01:03:53,280
The process owner needs to know who approves a change.
1536
01:03:53,280 --> 01:03:56,360
And the support team should know where to look when something fails.
1537
01:03:56,360 --> 01:03:57,480
The aim isn't paperwork.
1538
01:03:57,480 --> 01:04:00,560
It's removing uncertainty before more automation appears.
1539
01:04:00,560 --> 01:04:03,760
In the final 30 days, prove the model with one process.
1540
01:04:03,760 --> 01:04:06,720
Pick a process that changes often and crosses systems.
1541
01:04:06,720 --> 01:04:10,600
Maybe dynamic triggers an approval, teams notifies the right person and the outcome returns
1542
01:04:10,600 --> 01:04:11,600
to the record.
1543
01:04:11,600 --> 01:04:15,720
Build it in a solution with the right connection references and controlled configuration.
1544
01:04:15,720 --> 01:04:19,120
If you've tested it before production, then release it through the path you defined.
1545
01:04:19,120 --> 01:04:22,680
That one process gives the team evidence, not a slight deck evidence.
1546
01:04:22,680 --> 01:04:26,720
You can see whether releases move faster, failure ownership is clear, and approvals wait
1547
01:04:26,720 --> 01:04:27,720
less time.
1548
01:04:27,720 --> 01:04:32,080
And you can see how much support effort disappears when the process has a visible structure.
1549
01:04:32,080 --> 01:04:33,240
Measure those things.
1550
01:04:33,240 --> 01:04:34,240
Release time.
1551
01:04:34,240 --> 01:04:35,240
Failure rate.
1552
01:04:35,240 --> 01:04:36,240
Approval delay.
1553
01:04:36,240 --> 01:04:37,240
Support effort.
1554
01:04:37,240 --> 01:04:38,560
Don't measure activity.
1555
01:04:38,560 --> 01:04:42,160
Measure whether the operating model reduces friction around real work.
1556
01:04:42,160 --> 01:04:45,120
Then publish the decision framework before demand expands.
1557
01:04:45,120 --> 01:04:49,480
People will ask whether their process needs a flow, a low-code plug-in custom code, or
1558
01:04:49,480 --> 01:04:50,480
no change at all.
1559
01:04:50,480 --> 01:04:54,120
Give them a clear route before every new request becomes another architecture debate.
1560
01:04:54,120 --> 01:04:56,120
Because demand will expand, it always does.
1561
01:04:56,120 --> 01:04:59,720
Once people see that dynamics can trigger work across the tools they already use, they
1562
01:04:59,720 --> 01:05:01,400
won't stop asking for automation.
1563
01:05:01,400 --> 01:05:05,320
The question is whether those requests enter a system with ownership, boundaries, and clear
1564
01:05:05,320 --> 01:05:06,320
choices.
1565
01:05:06,320 --> 01:05:09,240
Or whether they become the next collection of hidden dependencies.
1566
01:05:09,240 --> 01:05:10,280
That is the structural shift.
Founder of m365.fm, m365.show and m365con.net
Mirko Peters is a Microsoft 365 expert, content creator, and founder of m365.fm, a platform dedicated to sharing practical insights on modern workplace technologies. His work focuses on Microsoft 365 governance, security, collaboration, and real-world implementation strategies.
Through his podcast and written content, Mirko provides hands-on guidance for IT professionals, architects, and business leaders navigating the complexities of Microsoft 365. He is known for translating complex topics into clear, actionable advice, often highlighting common mistakes and overlooked risks in real-world environments.
With a strong emphasis on community contribution and knowledge sharing, Mirko is actively building a platform that connects experts, shares experiences, and helps organizations get the most out of their Microsoft 365 investments.
Uninvited Governance Evangelist
Michael Roth has been working as a consultant since 2011 and moved into the IT and Microsoft ecosystem around 2015. With a background in Microsoft 365, collaboration technologies, and organizational consulting, he developed a holistic perspective on how technology, governance, security, and people need to work together to create sustainable digital solutions.
Today, he specializes in Power Platform Governance, Administration, Security, and organizational enablement. His work focuses not only on the technical architecture of the platform, but also on establishing scalable governance models, security concepts, operational processes, and adoption strategies that empower organizations without losing control.
Coming from both a technical and consulting background, Michael combines strategic thinking with hands-on platform expertise. He is particularly passionate about enabling citizen development in a secure and sustainable way, helping organizations balance innovation, compliance, and real business value.