Study guide
5.4 Registering Plug-ins with the Plug-in Registration Tool & Optimizing Plug-in Performance
Microsoft Power Platform Developer Associate PL-400
Track your progress as you read
Finished sections get a check mark.
1 Introduction, Exam Overview & Developer Toolchain
0.1 PL-400 Exam Facts 0.2 Audience Profile & Required Developer Skills 0.3 The Power Platform Developer Toolchain 0.4 Extension-Point Map & AI in the Developer Workflow
2 Create a Technical Design
1.1 Analyzing Technical Architecture and Choosing Out-of-the-Box vs. Custom Solutions 1.2 Designing Authentication, Authorization, and Security Architecture 1.3 Deciding Where Business Logic Runs and Choosing the Right Table Type 1.4 Designing Reusable Power Apps Components and Custom Connectors 1.5 Designing Dataverse Code Components, Automations, and Integrations
3 Build Power Platform Solutions
2.1 Managing Power Platform Environments for Development 2.2 Dataverse Security Roles for Code Components, Least Privilege & Troubleshooting Operational Security 2.3 Solutions, Managing Dependencies & Solution Layers 2.4 Environment Variables & Connection References 2.5 Power Platform Pipelines & CI/CD with Power Platform Build Tools
4 Implement Power Apps Improvements
3.1 Complex Power Fx Formulas and Functions 3.2 Building Reusable Canvas Component Libraries 3.3 Invoking Power Automate Cloud Flows from a Canvas App 3.4 Troubleshooting Canvas and Model-Driven Apps with Monitor and Browser Debugging Tools 3.5 Optimizing Canvas and Model-Driven App Performance
5 Extend the User Experience
4.1 The Client API Object Model & JavaScript Form Scripting 4.2 Event Handler Registration & Navigation to Custom Pages via the Client API 4.3 Client Scripting Against the Dataverse Web API; Command Bar & Buttons with Power Fx and JavaScript 4.4 PCF Fundamentals: The Component Manifest & Lifecycle Events 4.5 Implementing PCF Component Interfaces; Device, Utility & Web API Features 4.6 Packaging, Deploying & Consuming a PCF Component
6 Extend the Platform: Dataverse Plug-ins & Custom APIs
5.1 Plug-in Fundamentals & the Event Execution Pipeline Stages 5.2 Execution Context & Implementing Business Logic in Plug-ins 5.3 Pre/Post Images & Organization Service Operations in Plug-ins 5.4 Registering Plug-ins with the Plug-in Registration Tool & Optimizing Plug-in Performance 5.5 Custom API Messages & Plug-ins That Implement a Custom API 5.6 Configuring Dataverse Business Events
7 Extend the Platform: Custom Connectors
6.1 Open API Definitions: Building and Extending a Custom Connector 6.2 Authentication and Policy Templates for Custom Connectors 6.3 Importing Definitions and Creating Connectors for Azure Services 6.4 Azure Functions in Custom Connectors and Data Transformation
8 Extend the Platform: Platform APIs & Azure Functions
7.1 Dataverse Web API Operations & OAuth Authentication 7.2 Organization Service Operations, Concurrency, Transactions & Bulk Operations 7.3 Service Protection API Limits & Retry Policies 7.4 Azure Functions for Long-Running, Scheduled & Event-Driven Workloads 7.5 Authenticating to Power Platform with Managed Identities
9 Extend the Platform: Power Automate Cloud Flows
8.1 Dataverse connector triggers/actions, trigger filters & retry policies 8.2 Complex expressions & flow control with error handling 8.3 Sensitive input/output parameters & Azure Key Vault 8.4 Reusable child flows & Microsoft Entra ID service principals
10 Develop Integrations
9.1 Publishing Dataverse Events: IServiceEndpointNotificationService & the Plug-in Registration Tool 9.2 Registering Service Endpoints: Webhooks, Azure Service Bus & Event Hub 9.3 Data Synchronization with Change Tracking & Alternate Keys 9.4 Upsert-Based Synchronization with the UpsertRequest Message
11 Exam Readiness & Practice
10.1 Cross-Domain "Where Do I Implement This?" Decision Framework 10.2 Exam-Day Strategy, PL-400 Item Styles & Study Plan
5.4 Registering Plug-ins with the Plug-in Registration Tool & Optimizing Plug-in Performance
Key Takeaways Explain This Topic AI
The Plug-in Registration Tool (PRT) registers assemblies, plugin types, steps, and images in a strict hierarchy, and requires Sandbox isolation mode for custom code.
Step registration fields -- Message, Primary Entity, Stage, Execution Mode, Filtering Attributes, and Secure/Unsecure Configuration -- determine when a step fires and what data it can access.
Filtering Attributes restrict a step to fire only when specific fields are part of the update, which is one of the highest-leverage performance levers available at registration time.
Secure Configuration stores secrets like API keys outside the UI and solution export; Unsecure Configuration is visible to anyone who can view the step.
Sandboxed plug-ins run under a hard two-minute execution timeout; long-running work belongs in an Azure Function or Power Automate flow, not inline in the plug-in.
Last updated: July 2026
Writing the plug-in class is only half the job -- Dataverse doesn't know a compiled assembly exists until you register it, and how you register each step directly affects both correctness and performance. The Plug-in Registration Tool (PRT) is the primary tool for this, and the choices it exposes map directly to the pipeline concepts from 5.1-5.3.
The Plug-in Registration Tool
PRT is a standalone application, distributed as a NuGet package ( Microsoft.CrmSdk.XrmTooling.PluginRegistrationTool ) and also installable through the Power Platform CLI, that connects to a Dataverse environment and lets you register, update, and manage plug-in assemblies without writing SDK code by hand. Registration follows a strict hierarchy:
Assembly -- upload the compiled DLL. You choose an Isolation Mode : Sandbox is required for essentially all custom, non-Microsoft code -- it runs the assembly in a restricted, isolated worker process. The legacy None mode runs unrestricted with full trust and is reserved for privileged first-party scenarios; it isn't available for typical ISV or customer plug-in deployment.
Plugin Type -- the specific class within the assembly (an assembly can contain multiple IPlugin classes).
Step -- the registration that ties a plugin type to a specific message, table, stage, and mode. One plugin type can have multiple steps.
Image -- optional, registered under a step (5.3).
Step Registration Fields
- Field Purpose
- Message The SDK message to subscribe to ( Create , Update , Delete , a custom message, etc.)
- Primary Entity The table the step fires for
- Event Pipeline Stage Pre-validation, Pre-operation, or Post-operation (5.1)
- Execution Mode Synchronous or Asynchronous
- Deployment Typically Server Only for modern deployments
- Run in User's Context Which security context the plug-in executes under
Filtering Attributes Restricts the step to fire only when one of the listed attributes is present in the update
Unsecure / Secure Configuration Two free-text strings passed into the plug-in's constructor
Filtering Attributes deserve special attention: without them, an Update step fires on every update to the table, regardless of which field changed. Filtering to just the attributes the logic actually cares about means the plug-in -- and the sandbox overhead of invoking it -- is skipped entirely for unrelated changes. This is one of the single highest-leverage performance decisions available at registration time.
Secure vs. Unsecure Configuration solve different problems. The unsecure configuration string is visible to anyone with access to view the step, including through solution export, so it's appropriate for non-sensitive settings. The secure configuration string is stored separately, is never exposed through the UI or solution export, and can only be read by the plug-in itself at runtime -- the correct place for API keys, connection strings, or other secrets. Both strings, if present, are passed into the plug-in class's constructor: public class MyPlugin : IPlugin
- {
- private readonly string _secureConfig;
- public MyPlugin(string unsecureConfig, string secureConfig)
- {
- _secureConfig = secureConfig;
- }
- public void Execute(IServiceProvider serviceProvider) { /* ... */ }
- }
- Optimizing Plug-in Performance
The exam expects concrete, applied performance judgment, not just terminology. The recurring levers:
Filter aggressively. Use Filtering Attributes so a step only fires for relevant field changes, and restrict registered images to the specific columns the logic reads rather than the full record.
Prefer asynchronous where the user doesn't need to wait. Anything that doesn't have to block the save -- notifications, non-critical downstream updates, calls to slow external systems -- belongs at post-operation, asynchronous, so the caller's transaction isn't held open.
Respect the sandbox timeout. Sandboxed plug-ins run in an isolated worker process with a hard two-minute execution limit ; a step that exceeds it is terminated and fails. Genuinely long-running work, such as large batch processing or slow third-party calls, doesn't belong inline in a plug-in at all -- hand it off to an Azure Function or a Power Automate flow (7.4, 8-series) and have the plug-in just kick off that work.
Guard against recursion. Check context.Depth before a plug-in performs writes that could re-trigger its own step, both for correctness and to avoid wasted sandbox cycles.
Query narrowly. Always pass an explicit ColumnSet on Retrieve / RetrieveMultiple instead of requesting every column, and add filter criteria to QueryExpression or FetchXML rather than retrieving broadly and filtering in code.
Reuse the service instance. Create one IOrganizationService per Execute call, via the factory, rather than requesting it repeatedly, and batch multiple related operations through ExecuteMultipleRequest instead of looping individual calls when a plug-in must perform several writes.
Trace judiciously. ITracingService.Trace calls are useful for debugging but add overhead in high-volume synchronous steps; keep them meaningful rather than verbose in production code.
Registration and performance decisions aren't separable from the design choices in 5.1-5.3: a step registered at the wrong stage, without filtering attributes, or with an oversized image, is a correctness and a performance problem at the same time -- and it's exactly the kind of combined judgment PL-400 scenario questions test.