Dataverse Record Change Notifier
Monitors a Dataverse table for record changes (create, update, delete) and sends real-time notifications to relevant stakeholders via Teams or email, including change details and before/after values.
Provided as-is, without warranty of any kind. Review and test each pattern in a non-production environment before deploying it to live automations. See our Terms.
Overview
This flow watches a Dataverse table for row-level changes (add, modify, delete) and turns each event into a human-readable notification. When a row changes it classifies the operation, pulls the latest record details, builds a change summary, and posts an adaptive card to Microsoft Teams. If the change touches a critical field, it also emails the data steward so they can review or roll back. The pattern is meant as a reusable demo template — point it at any Dataverse table to get audit-style notifications without building a custom subscriber.
Use Case
Teams that own a business-critical Dataverse table often need to know the moment a record is created, edited, or deleted — and they want context (who, what, when) rather than a raw record link. This flow gives data stewards, ops leads, and integration owners a low-friction way to stand up real-time change notifications: Teams gets a formatted card for everyday awareness, and email is reserved for high-signal changes (deletes or edits to critical columns) that warrant a human review.
The flow is ideal for teams that:
- Data stewards monitoring a critical Dataverse table
- Ops teams that need real-time awareness of record creates/updates/deletes
- Integration owners auditing inbound changes from other systems
- Compliance reviewers who require a change trail for sensitive records
Flow Architecture
When a row is added, modified or deleted
Dataverse - When a row is added, modified or deletedFires whenever a row in the target Dataverse table is created, updated, or deleted. Change type is set to Added, Modified, Deleted; scope is Organization. Point this at your target table when deploying.
Initialize varChangeType
Initialize variableCreates a String variable varChangeType that will hold a human-readable label for the change (e.g. 'New Record Created').
Switch on SdkMessage
SwitchBranches on triggerOutputs()?['body/SdkMessage']. Case 'Create' sets varChangeType to 'New Record Created'; case 'Update' sets it to 'Record Updated'; case 'Delete' sets it to 'Record Deleted'.
Get a row by ID
Dataverse - Get a row by IDFor Create and Update events, fetches the latest record by passing triggerOutputs()?['body/ItemInternalId'] as the Row ID. Skipped for Delete since the row no longer exists.
Compose change summary
ComposeBuilds the notification payload: Change Type (varChangeType), Record Name (primary name field), Modified By (triggerOutputs()?['body/_modifiedby_value']), Modified On (triggerOutputs()?['body/modifiedon']), and key fields that changed.
Post adaptive card to Teams
Microsoft Teams - Post adaptive card in a chat or channelPosts the formatted change summary as an adaptive card to the configured Teams chat or channel, with a deep link back to the record.
If change involves critical fields
If conditionChecks whether the change touched any field on the critical-fields list, or whether the operation was a Delete. Use this branch to escalate high-signal events to email.
Environment Variables
| Schema name | Type | Default | Description |
|---|---|---|---|
| flowlibs_DataverseTableLogicalName | String | <configure> | Logical name of the Dataverse table to monitor (e.g. account, contact, or a custom table). The trigger and Get a row by ID action both bind to this table. |
| flowlibs_TeamsChannelId | String | <configure> | Channel ID where adaptive-card change notifications are posted. Set to a low-noise ops or data-stewardship channel. |
| flowlibs_TeamsTeamId | String | <configure> | Team ID that owns the notification channel above. |
| flowlibs_DataStewardEmail | String | alerts@yourcompany.com | Recipient address for critical-change emails. Set to the data steward or ops mailbox responsible for reviewing high-signal changes. |
| flowlibs_CriticalFields | String | <configure> | Comma-separated list of column logical names that should escalate to email when changed (e.g. 'statuscode,ownerid,creditlimit'). The condition step checks the change summary against this list. |
Connectors & Connections
| Connector | API name | Actions used |
|---|---|---|
| Microsoft Dataverse | shared_commondataserviceforapps | SubscribeWebhookTrigger (trigger - When a row is added, modified or deleted) GetItem (Get a row by ID) |
| Microsoft Teams | shared_teams | PostCardToConversation (Post adaptive card in a chat or channel) |
| Office 365 Outlook | shared_office365 | SendEmailV2 (Send email for critical changes) |
Note — All connections are referenced as solution connection references; the flow is portable between environments as long as a connection is mapped at import time.
Customization Guide
Almost every realistic variant of this flow can be implemented by changing environment variable values. A few cases require small edits inside the flow definition — those are called out explicitly below.
- Narrow the trigger to specific columns
- Use the Select columns property on the Dataverse trigger to fire only when the columns you care about change. This cuts noise drastically on chatty tables and avoids burning Power Automate runs on irrelevant edits.
- Add a debounce for bulk updates
- If the source table is hit by bulk imports or integrations, add a small Delay (or a parallel branch that aggregates by record ID over a short window) before the Teams post so each record produces one consolidated notification instead of a flood.
- Log every change to an audit table
- Insert an extra Dataverse Add a new row action after the Compose step that writes the change summary to a dedicated audit table. Gives compliance a queryable trail independent of Teams retention.
- Tune the critical-field check
- Update the flowlibs_CriticalFields env var to match the columns your business actually treats as high signal. The condition is the only gate between 'Teams-only' and 'Teams + email' notifications.
- Customize the adaptive card
- Edit the JSON in the Post adaptive card action to add quick-action buttons (e.g. Acknowledge, Open in Model-Driven App, Open in Dataverse) so reviewers can act on the change from Teams without context-switching.
Key Expressions
The flow is intentionally light on Power Fx / WDL gymnastics — the heaviest expressions are the branch-name concatenation and the approval outcome check. They are listed below in the order they appear in the flow.
EXPR.01Resolve SDK message to a friendly change type
Used as the Switch expression; values are 'Create', 'Update', or 'Delete' and map to the varChangeType label.
EXPR.02Row ID for Get a row by ID
Passes the Dataverse internal ID of the changed row to the Get a row by ID action so the flow can pull the latest values.
EXPR.03Who modified the record
Timestamp of the change in ISO-8601; formatted for display in the adaptive card.
EXPR.04When the record was modified
Timestamp of the change in ISO-8601; formatted for display in the adaptive card.
Comments
Sign in to join the conversation.
Sign inNo comments yet. Be the first to share your experience with this flow.