Almanac

Consultant KB for Microsoft Power Automate end to end: cloud flows, desktop flows and RPA, connectors and integration, AI and agent flows, process and task mining, approvals and human-in-the-loop, ALM and solutions, governance and security, licensing and capacity, monitoring and troubleshooting, plus cross-cutting decision guides. Implementation notes, configuration decisions and the gotchas that bite on real projects. Populated by the daily author agent from the Power Automate release plans, docs repo and product blog, plus the author's own consultant notes.

feature-dataverse-connector-and-triggers.mdv1 · history
CurrentApplies to Cloud flowsUpdated last monthSource Microsoft Learn

What it does

The Microsoft Dataverse connector starts flows when data changes in Dataverse and gives you the row-level actions to read and write it. It's the connector you build model-driven app automation on, and the one most Power Platform solutions end up leaning on hardest.

Key facts

  • Triggers: When a row is added, modified or deleted, When a row is selected, and When an action is performed. Actions cover create, update, get, list, delete, relate/unrelate, changesets, file and image upload/download, and bound/unbound actions.
  • The row trigger needs the flow owner to hold user-level create, read, write and delete on the Callback Registration table, plus read on the table being watched.
  • Scope controls which rows are watched: User, Business Unit, Parent: Child business unit, or Organization.
  • Select columns filters update triggers to named columns. Lookup columns aren't supported there — specify one and changes to it won't fire the flow. Use scalar types only.
  • The filter expression takes OData syntax (firstname eq 'John', contains(firstname,'John')) and the flow runs only when it evaluates true after the change is committed.
  • The row trigger doesn't fire on 1:N or N:N relationship changes.
  • Run as lets each Dataverse action run in the context of flow owner, row owner, or modifying user. The flow owner needs the Act on Behalf of Another User privilege — the Delegate security role has it by default.
  • The Dataverse Delay until trigger property never expires, unlike the Delay until action, so it handles long waits.

When to use / skip

This is the default for anything event-driven inside a Dataverse-backed solution — it's not premium-class, it's transactional rather than polled, and it respects security scope. Skip it where a plug-in or a real-time workflow is the better fit: if you need the logic inside the database transaction, or you need synchronous validation that can block the save, a flow running asynchronously afterwards is the wrong tool.

Configuration decisions

  • Scope: Organization is the honest answer for most system automation, but it's also the one that turns a small change into a tenant-wide event storm. Pick deliberately.
  • Whether to filter with Select columns, a filter expression, or both — and whether the filtering happens in the trigger or in a condition afterwards, which costs you a run either way.
  • Which identity the Dataverse actions run under, and whether Run as impersonation is needed for audit trails to look right.
  • FetchXML versus OData in List rows: FetchXML for aggregates, link-entity joins and anything you'd write in advanced find; OData filter for simple predicates.
  • Whether the flow is solution-aware with a connection reference, which it should be if it's touching Dataverse at all.

Gotchas

  • Self-triggering loops are the classic failure. A flow that triggers on update of a table and then updates a row in that table will trigger itself. Guard it with a trigger condition that checks the value isn't already what you're about to set, and add a Terminate as a backstop.
  • Multiple updates to the same row each evaluate the trigger, even when the new values match the old ones. Repeat runs are normal, not a bug.
  • Don't put always-present columns like the primary key in Select columns — every update includes them, so every update triggers the flow.
  • Trigger fires on inclusion in the update request, not on the value actually changing. A form save that writes an unchanged field still counts.
  • List rows pages by default. Without pagination turned on and a sensible page size you'll silently process the first tranche and think the job's done.

Consultant notes

  • Loop protection is a design standard, not a per-flow decision. Agree the pattern once with the team and apply it to every Dataverse-triggered flow.
  • Warn the client that Dataverse triggers are asynchronous. Users who expect a field to be populated the instant they hit save will raise it as a defect; set that expectation in UAT, not after go-live.
  • Scope and Run as together decide what the audit trail says. Finance and compliance stakeholders care about this more than the project team expects — get it agreed before build.

Worth a look after each release wave; the trigger's filtering and Run as options have both gained capability recently

Was this accurate?