9.2 Dataverse Connector Triggers & Operational Filters
Key Takeaways
- The flagship Dataverse trigger 'When a row is added, modified or deleted' supports granular Change types: Added, Modified, Deleted, Added or Modified, Added or Deleted, Modified or Deleted, and Added, Modified or Deleted.
- Trigger Scope determines the organizational boundary for event interception: Organization (tenant-wide), Business Unit (same BU), Parent: Child business units (BU plus descendants), or User (owned records only).
- The 'Select columns' property is vital for performance and preventing infinite trigger loops when a flow updates the same record that triggered it.
- Filter Rows uses OData filter syntax (e.g., statuscode eq 1 and revenue gt 50000) to pre-filter events at the Dataverse database layer before a flow run is instantiated.
- The 'Run as' property controls the security execution identity of the flow: Flow owner (default), Triggering user (calling context), or Modifying user/Record owner.
Dataverse Connector Triggers & Operational Filters
The Microsoft Dataverse connector provides the primary integration pipeline between Microsoft Dataverse and Power Automate cloud flows. Unlike generic polling connectors, the unified Dataverse connector integrates directly with the Dataverse Event Execution Pipeline via high-performance, asynchronous webhooks. For the PL-200: Microsoft Power Platform Functional Consultant exam, you must demonstrate mastery over trigger event types, organizational scope boundaries, OData query filters, schema attribute filtering, execution security contexts, and custom action triggers.
1. The Dataverse Trigger Architecture
The core trigger for Dataverse automation is When a row is added, modified or deleted. This trigger replaces legacy Common Data Service (CDS) and Dynamics 365 connectors, providing native support for solutions, connection references, and enterprise security models.
+-----------------------------------------------------------------------------+
| DATAVERSE EVENT PROCESSING PIPELINE |
| |
| [DATAVERSE DATABASE EVENT] (Create / Update / Delete) |
| | |
| v |
| +---------------------------------------+ |
| | 1. SCOPE FILTER | <-- Evaluates User / BU / |
| | Is record owner within target scope? | Parent-Child / Org scope |
| +---------------------------------------+ |
| | (Pass) |
| v |
| +---------------------------------------+ |
| | 2. SELECT COLUMNS | <-- Did any specified columns |
| | Were targeted attributes modified? | change? (Prevents loops!) |
| +---------------------------------------+ |
| | (Pass) |
| v |
| +---------------------------------------+ |
| | 3. FILTER ROWS | <-- Evaluates OData expression |
| | Does record meet OData criteria? | (e.g., statuscode eq 1) |
| +---------------------------------------+ |
| | (Pass) |
| v |
| +---------------------------------------+ |
| | 4. TRIGGER CONDITIONS | <-- Evaluates WDL expressions |
| | Do advanced @settings expressions pass| in trigger Settings tab |
| +---------------------------------------+ |
| | (Pass) |
| v |
| [INSTANTIATE CLOUD FLOW RUN] (Under configured 'Run as' identity) |
+-----------------------------------------------------------------------------+
Change Types
The Change type parameter determines which database lifecycle events activate the trigger:
Added: Fires when a new record is inserted (Create event).Modified: Fires when an existing record is updated (Update event).Deleted: Fires when an existing record is deleted (Delete event).Added or Modified: Fires on both creation and subsequent updates (Upsert event).Added or Deleted: Fires when records are inserted or removed.Modified or Deleted: Fires on record updates or removals.Added, Modified or Deleted: Universal trigger firing on all database state changes.
2. Trigger Scope Configuration
The Scope parameter defines the organizational boundary within the Dataverse business unit hierarchy where record modifications will be intercepted.
+-----------------------------------------------------------------------------+
| DATAVERSE TRIGGER SCOPES |
| |
| [ORGANIZATION] ---> Triggers tenant-wide across ALL BUs |
| |
| [PARENT: CHILD BUSINESS UNITS]---> Triggers in user's BU & ALL child BUs |
| |
| [BUSINESS UNIT] ---> Triggers ONLY in user's direct BU |
| |
| [USER] ---> Triggers ONLY on records owned by |
| the flow owner / triggering user |
+-----------------------------------------------------------------------------+
Scope Hierarchy & Security Boundaries
| Scope Option | Evaluated Record Ownership | Architectural Use Case |
|---|---|---|
Organization | Any record across the entire environment, regardless of owner or business unit. | Global enterprise workflows (e.g., ERP synchronization, centralized compliance auditing, cross-department notifications). |
Parent: Child business units | Records owned by users/teams in the flow runner's business unit OR any subordinate descendant business unit. | Regional supervisor automations (e.g., an East Coast VP overseeing regional sales branches). |
Business Unit | Records owned by users/teams within the exact same business unit as the flow runner. | Department-isolated processes (e.g., HR onboarding workflows confined to a single branch). |
User | Records owned directly by the user identity executing the flow. | Personal productivity automations and user-specific tasks. |
[!CAUTION] Scope Mismatch Failures: If a flow is configured with Scope set to
Business UnitorUser, and a record is created by a user in a different business unit, the flow will NOT trigger, even if the flow owner has System Administrator privileges. Default toOrganizationscope for enterprise-wide background automations unless strict departmental isolation is required.
3. Operational Filtering: Select Columns & Filter Rows
High-volume Dataverse environments require precise operational filtering to optimize platform throughput, reduce API consumption, and prevent catastrophic infinite trigger loops.
Select Columns (Attribute-Level Trigger Filtering)
When a flow monitors the Modified or Added or Modified change type, Dataverse triggers by default whenever any column on the record is updated. This introduces two major risks:
- Unnecessary Executions: Updating an unrelated column (e.g., updating a phone number) triggers a flow meant only to process credit limit increases.
- Infinite Trigger Loops: If Flow A triggers on Account modification, and Action Step 3 updates the Account's
LastProcessedDatecolumn, the update action causes Dataverse to fire Flow A again, creating an infinite recursive execution loop.
To resolve this, populate the Select columns property with a comma-separated list of schema column names:
statuscode,creditlimit,telephone1,cr123_approvalstage
With Select columns configured, Dataverse fires the trigger only if one or more of the specified columns were modified during the transaction.
Filter Rows (Server-Side OData Query Filtering)
The Filter rows property evaluates standard OData v4 expressions at the Dataverse database layer before instantiating a cloud flow run. If the expression evaluates to false, Dataverse discards the event without consuming Power Automate run quota.
// Example 1: Active Accounts with Revenue exceeding 100,000
statecode eq 0 and revenue gt 100000
// Example 2: Specific Choice Column Value (Approved status)
statuscode eq 864500001
// Example 3: Text column starts with prefix and lookup is populated
startswith(accountnumber, 'CORP') and _primarycontactid_value ne null
// Example 4: Date comparison (Created on or after specific date)
createdon ge 2026-01-01T00:00:00Z
Common OData Operators for PL-200
| Operator | Meaning | Example Syntax |
|---|---|---|
eq | Equal to | statuscode eq 1 |
ne | Not equal to | statecode ne 1 |
gt / ge | Greater than / Greater than or equal | revenue ge 50000 |
lt / le | Less than / Less than or equal | creditlimit lt 10000 |
and / or / not | Logical conjunction / disjunction / negation | statuscode eq 1 and (revenue gt 100000 or creditlimit gt 50000) |
null | Null check (Lookup columns use _columnname_value) | _parentcustomerid_value ne null |
startswith | String begins with prefix | startswith(name, 'Contoso') |
contains | String contains substring | contains(emailaddress1, '@contoso.com') |
Trigger Conditions (Settings Tab)
In addition to Filter Rows, makers can configure Trigger Conditions in the trigger's Settings > Trigger Conditions pane using Power Automate Workflow Definition Language (WDL) expressions:
@equals(triggerOutputs()?['body/statuscode'], 864500001)
@and(greater(triggerOutputs()?['body/revenue'], 50000), not(empty(triggerOutputs()?['body/emailaddress1'])))
All configured trigger condition lines must evaluate to true for the flow to execute.
4. Run-As Execution Identity & Security Context
When a Dataverse-triggered flow executes downstream actions (such as reading sensitive records or updating related tables), the permissions evaluated by Dataverse depend on the trigger's Run as configuration.
+-----------------------------------------------------------------------------+
| DATAVERSE 'RUN AS' EXECUTION IDENTITIES |
| |
| [FLOW OWNER (DEFAULT)] |
| - Runs under the identity and security roles of the flow creator/owner |
| - Uniform execution regardless of who triggered the change in Dataverse |
| - Ideal for system-level integrations and automated data transformations |
| |
| [TRIGGERING USER] |
| - Impersonates the exact user who performed the database modification |
| - Actions respect that user's specific Dataverse security roles and depth |
| - Write/Update actions tag the triggering user in 'Modified By' columns |
| |
| [RECORD OWNER] / [MODIFYING USER] |
| - Impersonates the user assigned as the owner of the modified row |
| - Ideal for routing tasks and activities on behalf of account managers |
+-----------------------------------------------------------------------------+
[!IMPORTANT] Security Implications of Triggering User: When
Run asis set to Triggering user, if User A modifies a record that triggers a flow containing an action to read a restricted financial table, the flow will FAIL with anAccessDeniederror if User A does not possess Read privileges on that financial table. Ensure security roles are appropriately assigned when using user impersonation.
5. The 'When an action is performed' Trigger
Beyond basic table row mutations, Microsoft Dataverse allows developers and functional consultants to define custom business operations called Custom Process Actions and Custom APIs. Cloud flows can intercept these invocations using the When an action is performed trigger.
+-----------------------------------------------------------------------------+
| 'WHEN AN ACTION IS PERFORMED' ARCHITECTURE |
| |
| [DATAVERSE CUSTOM API / ACTION INVOCATION] |
| (Called via JavaScript, C# Plug-in, Power Pages, or External REST API) |
| | |
| v |
| [TRIGGER: When an action is performed] |
| - Catalog: Core / Custom Business Domain |
| - Category: Sales, Service, or Custom Category |
| - Table name: (Optional: Bound to Account/Contact or Unbound/Global) |
| - Action name: contoso_CalculateCreditRiskScore |
| | |
| v |
| [ACCESS ACTION INPUT & OUTPUT PAYLOADS] |
| - Parses complex JSON parameters passed into the action |
| - Executes downstream logic and returns calculated results |
+-----------------------------------------------------------------------------+
Bound vs. Unbound Actions
- Bound Actions: Tied to a specific Dataverse table (e.g.,
contoso_ApproveInvoicebound toInvoice). The trigger requires selecting the Table Name and provides the targeted row GUID (Target/accountid). - Unbound (Global) Actions: Not associated with any specific table (e.g.,
contoso_SendTenantBroadcast). The Table Name is set to(none), and the action accepts global parameters.
A functional consultant builds an automated cloud flow using the Dataverse trigger 'When a row is added, modified or deleted' on the 'Account' table with Change type set to 'Modified'. Inside the flow, an 'Update a row' action updates the Account's 'LastReviewDate' column with the current timestamp. During user acceptance testing, updating an account causes the flow to execute hundreds of times in a continuous loop until the platform throttles the API limit. How should the consultant reconfigure the flow to eliminate this recursive loop?
An enterprise corporation has a top-level Business Unit called 'Corporate HQ' and three regional child Business Units: 'North America', 'EMEA', and 'APAC'. A sales operations director assigned to 'Corporate HQ' requires an automated cloud flow to execute whenever an Opportunity record owned by any sales representative in 'Corporate HQ' or any of its subordinate regional business units is closed as Won ('statuscode eq 3'). Which Scope property should be configured on the Dataverse trigger?
A healthcare provider requires that when a clinical technician updates a patient chart in Dataverse, an automated cloud flow triggers to generate a diagnostic order. For strict regulatory compliance and auditability, the flow must execute using the exact security privileges of the technician who made the change in Dataverse, ensuring that users without appropriate security roles cannot create orders on restricted patient records. Which Dataverse trigger property should the consultant configure?
A solution architect creates a Dataverse Custom API named 'contoso_ProcessRefund' bound to the 'Invoice' table. The Custom API is invoked from JavaScript on a model-driven form command button when a customer requests a billing refund. A functional consultant must build a cloud flow that triggers whenever this Custom API is invoked, receiving the refund amount and approval code. Which trigger should the consultant use?