1.5 Designing Dataverse Code Components, Automations, and Integrations

Key Takeaways

  • Power Fx formula columns, plug-ins, and custom APIs form a low-to-high code spectrum for Dataverse-side logic, chosen based on whether side effects and transactional guarantees are required.
  • A custom API's logic can be implemented by either a plug-in (synchronous, code-based) or a Power Automate flow (maker-maintainable), which is a key design tradeoff.
  • Automated, instant, and scheduled cloud flows serve different automation triggers, from data-change reactions to user-initiated actions to batch jobs.
  • Inbound integrations reach Dataverse via the Web API, connectors, or virtual tables; outbound integrations publish via plug-ins to Azure Service Bus/Event Hub, business events, or flow-triggered connector calls.
  • Every integration point in a technical design must be checked against the authentication and security design so no entry point bypasses the intended access controls.
Last updated: July 2026

The final piece of technical design is deciding how Dataverse-side logic is packaged for reuse and how the solution talks to systems outside the Power Platform. This spans three related design areas: Dataverse code components, Power Automate automations, and inbound/outbound integrations with Azure.

Designing Dataverse Code Components

Three mechanisms let a Dataverse solution run custom logic, ordered here from lowest to highest code investment:

  • Power Fx formula columns compute a value declaratively using Power Fx expressions evaluated by Dataverse itself, with no plug-in assembly to deploy. They are the right design choice whenever the "custom logic" is really just a computed value (a total, a concatenation, a conditional label) rather than a side effect or external call.
  • Plug-ins are compiled .NET assemblies registered against the Dataverse event pipeline (covered in depth in the plug-in domain) and are the right choice for logic with side effects — validating and blocking a save, updating related records, or calling the Organization service — that must run consistently for every caller.
  • Custom APIs define a brand-new, strongly typed message (with declared input/output parameters) that becomes callable through the Web API and SDK just like a built-in message such as Create or Update. A custom API can be bound to a specific table (appearing as an action on that entity) or unbound (a global operation). Critically, a custom API's logic can be implemented either by a plug-in or by a Power Automate flow registered as its processing step — this flexibility is a frequent design decision point, since a flow-backed custom API is easier for a low-code team to maintain, while a plug-in-backed one runs synchronously with full transactional guarantees.

Designing Automations with Power Automate Cloud Flows

Cloud flows are the automation layer for logic that is really an orchestration rather than a single-table rule. Design decisions include:

Flow typeTriggerDesign use
AutomatedDataverse event (create/update/delete) or connector eventReact to data changes across systems
InstantManual button (Power Apps or Teams)User-initiated one-off actions
ScheduledRecurrenceBatch jobs, periodic sync, cleanup

When designing a flow-based automation, decide up front whether the flow needs to be synchronous from the user's perspective (in which case an instant flow triggered from the app, with the app waiting on a response, may be needed) or can run fully asynchronously in the background (a Dataverse-triggered automated flow).

Designing Inbound and Outbound Integrations

Integration design splits into two directions, both of which typically involve Azure services alongside native Dataverse capability.

Inbound (external system → Dataverse)

  • Dataverse Web API — the standard OData v4 REST endpoint external systems call directly, authenticated via Entra ID (see the authentication section).
  • Standard or custom connectors — external systems reached from a Power Automate flow rather than Dataverse being called directly.
  • Virtual tables — external data surfaced as if it were Dataverse data, avoiding duplication for read-heavy scenarios (see the data modeling section).

Outbound (Dataverse → external system)

  • Plug-ins registered on service endpoints publish Dataverse events to Azure Service Bus (queues or topics) or Azure Event Hub, decoupling Dataverse from the receiving system entirely — the receiver picks messages up independently, and Dataverse doesn't need to know it exists.
  • Dataverse business events and webhooks let external listeners subscribe to platform events without a full plug-in registration, using a lighter-weight subscription model.
  • Power Automate flows triggered by Dataverse changes can call outbound connectors directly, which is often simpler to build and maintain than a Service Bus-based plug-in pipeline, at the cost of being tied to the Power Automate runtime rather than a pure messaging backbone.

Choosing an Integration Pattern

NeedRecommended pattern
Real-time, guaranteed, decoupled outbound event deliveryPlug-in → Azure Service Bus/Event Hub
Simple outbound notification to a known set of systemsPower Automate flow triggered by Dataverse event
Read-only access to external data without duplicationVirtual table
External system writing directly into DataverseWeb API with Entra ID app registration
Exposing custom Dataverse logic as a callable operationCustom API (plug-in- or flow-backed)

A complete technical design names the specific pattern for every integration point in the requirements, states which Azure resources (if any) are involved, and confirms the authentication and security design from earlier sections covers every one of those entry points — an integration that bypasses the security model designed for the UI is a common, exam-relevant design flaw.

Sequencing the Design Work

In practice, these three design areas are not chosen independently — they build on each other in sequence. First decide what kind of Dataverse code component the logic needs (formula column, plug-in, or custom API), because that decision determines whether the logic can even be reached from outside Dataverse. Then decide whether an automation (a cloud flow) is orchestrating around that code component or is the entire solution by itself. Only after both are settled does the integration direction matter: an inbound integration typically calls a custom API or the Web API directly, while an outbound integration is typically triggered by the same plug-in or flow that already enforces the business logic, rather than being bolted on as a separate, uncoordinated mechanism. Designing these three areas together, instead of one at a time, is what keeps a solution's automation and integration surface consistent and auditable.

Test Your Knowledge

A requirement needs a custom Dataverse operation, callable from the Web API, that a low-code team can build and later maintain without editing compiled code. Which design combination satisfies this?

A
B
C
D
Test Your Knowledge

A design calls for Dataverse to publish record-change events so that a downstream system can consume them independently, on its own schedule, without Dataverse needing to know the receiver exists. Which outbound integration pattern fits best?

A
B
C
D