Field Audit History — Inline Audit Trail for Dynamics 365
A free PCF control that puts Dataverse audit data where users actually look: right next to the field. No more 5-click journey to Related > Audit History.
“Who changed this email address?” A sales rep asks me this on a support call. I walk them through it: open the record, click Related, click Audit History, scroll through a wall of every change on the entire record, click into an individual event, then mentally translate emailaddress1 to “Email.” Six steps. The rep says thanks and never checks audit history again.
Dataverse has one of the most powerful auditing engines in any CRM platform. It tracks every field change — who, when, old value, new value. Compliance teams love it. But the UI to access it? It’s like Microsoft built a vault and then hid the key behind five doors.
That’s why I built Field Audit History — a PCF control that puts audit data where users already are: right on the form, next to the field they’re looking at.
What It Does (Three Levels of Detail)
The control gives users three ways to access audit data, from fast to comprehensive:
1. Audit Icons on Field Labels
Small clock icons appear next to every field that has auditing enabled. Gray by default, blue on hover. Users can see at a glance which fields are being tracked — without clicking anything.
This alone changes the game. Instead of wondering “is this field even audited?” — you can see it instantly.
2. Quick Peek — One Click, Instant Answer
Click any clock icon and a compact popup appears anchored to that field. It shows the last 8 changes for that specific field: date, who changed it, old value → new value. No navigation, no panel loading, no context switching.
The popup includes a “Changed By” filter if multiple users made changes. Every entry has Copy and Restore buttons — copy a previous value to your clipboard, or restore it with one click. For that sales rep on my support call? This is all they’d ever need. One click, answer in two seconds.
Multiple people editing the same record? Use the “Changed By” dropdown right inside the popup to filter to a specific user’s changes.
3. Deep Dive — Full Sidecar Panel
Click the status bar (“Audit tracking · 4 fields”) or “View All” to open a wide panel covering 80% of the viewport. This is the power-user view:
- Visual timeline with color-coded operations — green for Created, blue for Updated, red for Deleted
- Human-readable field names — “Email” not
emailaddress1, “Account Name” notname - Four client-side filters — all instant, zero additional API calls
| Filter | Type | What It Does |
|---|---|---|
| Field | Multi-select dropdown | Show only changes to specific fields |
| Changed By | Multi-select dropdown | Show only changes by specific users |
| Operation | Toggle buttons | Filter by Created / Updated / Deleted |
| Date Range | Date pickers | From/to date filtering |
Opening the panel from a Quick Peek pre-filters to that specific field. Remove the filter to see everything. No re-querying — filtering happens client-side on already-loaded data.
Here’s the Field filter in action — select “Email” and the timeline instantly narrows to just that field’s changes:
Beyond Read-Only — Copy, Restore, Export
Audit history isn’t just for looking. Three action features turn it into a working tool:
Copy to Clipboard
Every audit entry has a Copy button. Click it to copy the old or new value — useful when a support rep needs to paste a previous email address into a ticket, or when you need the exact value from before a bulk update mangled your data.
Value Restore
See a wrong value? Click Restore on any audit entry to revert the field to its previous value. A confirmation dialog shows exactly what will change before anything happens.
This is the feature that gets the biggest reaction in demos. No more opening the record, finding the old value in audit history, manually typing it back, and saving. One click, confirm, done.
Export to CSV
Need audit data for a compliance report or external review? The Export CSV button in the Deep Dive panel downloads the entire loaded audit trail — filtered or unfiltered — as a CSV file. Dates, users, old values, new values, all in a spreadsheet-ready format.
The Native Audit UI vs. This Control
Let me be specific about what changes:
| Native Audit History | Field Audit History PCF | |
|---|---|---|
| Where | Related > Audit History (hidden sub-grid) | Right on the form — icons on field labels |
| Clicks to answer | 5-6 clicks minimum | 1 click (Quick Peek) |
| Field names | Schema names (emailaddress1) | Display names (Email) |
| Filter by field | Not available | Built-in multi-select |
| Filter by user | Not available | Built-in multi-select |
| Filter by date | Not available | Built-in date range |
| Scope | Every change on entire record | Per-field or full record — your choice |
| User adoption | Almost zero (too buried) | High (visible, contextual) |
That last row is the one that matters. Dataverse audit data is genuinely useful — compliance, dispute resolution, troubleshooting. But if nobody can find it, it doesn’t exist. This control makes it visible.
How to Set It Up
- 1
Import the solution
Download the managed ZIP from the GitHub releases page. Import it via Power Platform admin center > Solutions > Import. One solution — works on any entity.
- 2
Add a host field
Create a single-line text field on your entity (e.g., vp365_audithost). This field becomes the control's anchor point. Place it wherever you want the 'Audit tracking · N fields' status bar to appear.
- 3
Bind the PCF control
Open the form editor, select the host field, click 'Component' in the properties pane, and add the Field Audit History control. Save and publish. That's it — every audited field on the form automatically gets a clock icon.
No per-field setup. The control reads entity metadata on form load and auto-detects which fields have auditing enabled. If you enable auditing on a new field tomorrow, the icon appears automatically the next time someone opens the form.
Configuration: Make It Yours
The control ships with sensible defaults. But if you need control over which fields show icons, you can deploy a JSON web resource (vp365_AuditHistoryConfig) with per-table rules:
| Mode | What It Does | Best For |
|---|---|---|
| audited (default) | Icons on fields where IsAuditEnabled = true | Most orgs — follow your existing Dataverse audit config |
| include | Icons ONLY on fields listed in the config | Focused view — only highlight the 3-4 fields users actually care about |
| exclude | Icons on all audited fields EXCEPT listed ones | Reduce noise — hide modifiedon, modifiedby, and other system fields |
| all | Icons on every visible field regardless of audit metadata | Maximum visibility during compliance reviews |
Example config for showing audit icons on specific fields only for the Contact table:
var config = {
tables: {
// Default: show on all audited fields
"*": { mode: "audited", fields: [] },
// Contacts: only these fields get icons
"contact": {
mode: "include",
fields: ["emailaddress1", "telephone1", "jobtitle"]
},
// Accounts: audited fields minus system noise
"account": {
mode: "exclude",
fields: ["modifiedon", "modifiedby"]
}
}
};
The wildcard "*" applies to any table without an explicit rule. You only need to configure the tables where you want something different from the default behavior.
The Gotchas Microsoft Doesn’t Highlight
I’ve deployed this in a production environment. Here’s what you need to know before you enable it:
Auditing must be enabled at three levels. Org-level (Settings > Auditing > Start Auditing), entity-level (table properties), and field-level (column properties). Miss any one of these and the field won’t show an icon. I’ve seen admins enable entity auditing and wonder why nothing appears — they forgot the field-level toggle.
Users need specific security privileges. Two privileges control audit data access:
| Privilege | What It Grants |
|---|---|
| prvReadRecordAuditHistory | Read audit change records for any entity |
| prvReadAuditSummary | Read audit summary data |
If a user doesn’t have these, the control shows a clear error with the exact privilege names. The form keeps working — the control degrades gracefully, never crashes.
Lookups and option sets show display names, not GUIDs. This is actually a positive — the control uses OData annotation headers (Prefer: odata.include-annotations="*") to get formatted values. So you’ll see “John Smith” instead of a GUID and “Active” instead of 1. But this is worth knowing because if formatted values aren’t available for some reason, you’ll see the raw values as a fallback.
Client-side filtering means filters only work on loaded data. The Dataverse audit API doesn’t support server-side filtering by field name, user, or date. The control loads pages of audit entries (25 per page, up to 250 total by default) and filters in the browser. For 99% of use cases, this is plenty. If you have records with thousands of audit entries spanning years, you might need to increase audit.maxPages in the config.
Platform updates could break icon injection. The clock icons are injected by scanning the form DOM for field label elements using known Unified Interface patterns. If Microsoft changes their DOM structure, icons might stop appearing. But the form keeps working normally, and the Deep Dive panel (which doesn’t depend on DOM injection) still works from the status bar.
Performance
I was paranoid about form load time — nobody wants a PCF that makes their forms sluggish. Here’s what I measured:
| Metric | Target | Actual |
|---|---|---|
| Form load impact | < 500ms | ~300ms (config + metadata load in parallel) |
| Quick Peek open | < 1s | ~500ms (single API call) |
| Deep Dive panel open | < 2s | ~1s (single API call) |
| Filter response | Instant | < 16ms (client-side, no API call) |
| Bundle size | < 500KB | ~460KB (Fluent UI tree-shaken) |
The key architectural decision: audit data is only fetched on demand. The initial form load does two lightweight API calls in parallel — entity metadata and config. Actual audit records aren’t loaded until the user clicks an icon or opens the panel. So the 300ms overhead is for knowing which fields are audited. The heavy data only loads when someone actually wants to see it.
Who Should Use This
If you have Dataverse auditing enabled — and you should for any regulated or enterprise environment — this control makes that investment visible. The data is already being captured. This just puts it where people can see it.
Specific use cases I’ve seen work well:
- Compliance teams who need to verify field-level changes during audits without training users on the native audit sub-grid
- Sales managers tracking who changed deal amounts, stages, or close dates — the “someone moved my cheese” problem
- Support teams troubleshooting “this field used to have a different value” disputes
- Admins validating that automation (workflows, plugins, Power Automate) is writing the expected values
👍 Pros
- ✓ Free and open — no license beyond standard Dataverse
- ✓ Three-second answer to 'who changed this?' — from 6 clicks to 1
- ✓ Zero training needed — icons are intuitive, popup is self-explanatory
- ✓ Fully configurable per table — choose exactly which fields show icons
- ✓ Graceful degradation — if anything fails, the form works normally
- ✓ Human-readable everything — display names, formatted values, relative dates
👎 Cons
- ✗ Model-driven apps only — no canvas apps, custom pages, or Power Pages
- ✗ DOM injection may need updates after major platform releases
- ✗ Client-side filtering only — Dataverse audit API doesn't support server-side filters
- ✗ Bundle is 460KB — adds to total form payload (but only loads once)
Get It
Field Audit History is published under the vp365 prefix and ships as a managed Dataverse solution. You can find the latest release on GitHub — download the ZIP, import it, and you’re live in under 10 minutes.
Solution name: vp365FieldAuditHistory
Current version: 3.0.1
Publisher: vp365.ai
React: 16.14.0 (platform-provided, virtual control)
UI framework: Fluent UI v8
The control is read-only — it never writes to Dataverse. It reads entity metadata and audit history, nothing else. No external service calls, no telemetry, no data leaving your environment.
VP365.ai covers Power Platform and Dynamics 365 for practitioners who build and deliver — not just evaluate. More PCF controls and deep dives coming soon.
Stay in the loop
Get new posts delivered to your inbox. No spam, unsubscribe anytime.