ai

CRM Hygiene Fixer: An AI Agent for Approved CRM Clean-Up

The CRM Hygiene Fixer is an AI CRM data cleanup agent that proposes duplicate and formatting fixes, then applies one approved batch at execute-after-approval level (L3). Revenue-operations teams use it on a CRM beside a customer data platform (CDP). Every batch has a rollback file. It never edits opportunity values or consent fields, deletes records or contacts anyone.

Rail level: L3 · Risk: medium · Function: sales revenue operations

By Art Kukharenko · Published · Updated

All AI agent rails

This is the only write job among the sales AI agent rails, so approval and rollback get most of the attention below.

Rail at a glance

The CRM Hygiene Fixer's model drafts the batch, and the execution service applies it. That service refuses any batch whose hash has changed.

FieldValue
JobPropose and, after approval, apply duplicate and formatting fixes in the CRM.
TriggerA scheduled hygiene run or a data-steward request.
Data scopeScoped CRM objects and fields. No opportunity values and no consent fields on the fix path.
Tool scopeRead: CRM records in scope, duplicate candidates. Propose: a fix batch with before and after values. Execute: apply one approved batch, through the execution service.
Output contractBatch diff, count, rollback file, and exceptions.
GateA revenue-operations approver, never the requester, signs each batch. Approval binds to the batch hash, so a later change voids it.
LimitsBatch size, approved objects only, and a required rollback file.
LedgerBatch hash, approver, records changed, rollback reference.
EvaluationSeeded duplicates and false duplicates in a sandbox.
Owner and kill switchAnswerable to the head of revenue operations. Revoking the batch tool stops changes, and proposals continue.

What it does and who uses it

The CRM Hygiene Fixer turns a clean-up backlog into small batches that one approver can read in a sitting. Formatting alone does not need a model, and a script is cheaper and easier to test. The model earns its place by explaining ambiguous duplicate candidates to the approver.

An illustrative batch for a B2B services firm looks like this, with invented records and values.

RecordFieldBeforeAfterReason
Contact 1041Phone(020) 7946 0958+44 20 7946 0958International format
Account 2207CountryU.K.United KingdomCountry list
Contact 1187Duplicate ofBlankContact 1041Same email and same account

Two items sit outside the batch, as exceptions. Contact 1290 shares a name and employer with Contact 1041, but not an email. A second pair differs on consent state, as reported by a rule that does not reveal the values.

The approver reads the diff and exceptions, then signs the hash of this exact batch. The execution service checks the hash, writes the rollback file and applies the rows.

Why this level

The CRM Hygiene Fixer sits at L3 because it changes records, yet a batch stays small enough for a named person to read. Batch size and approved objects bound the blast radius, and the rollback file exists before the first row changes.

The Rule of Two reaches the same answer 2. CRM records hold private data, and notes or descriptions come from outsiders. Free-text fields therefore stay out of scope, and the write runs in a separate service after human approval, so the model session never holds all three properties.

Merges are why this rail stops at L3. HubSpot says merged records cannot be unmerged, and that the merged contact keeps "the most marketable status" 3. Salesforce moves the duplicate contact to the Recycle Bin, and restoring it leaves the master record and its merge entry unchanged 4.

So a native merge can delete a record, resist rollback and shift consent-related state, with no consent field appearing in the batch. On this rail, a duplicate fix records a link to the surviving record. The merge itself stays a separate decision for a person, made in the CRM's own tools.

Three ways it fails, and the control for each

CRM clean-up does its damage through side effects, so the CRM Hygiene Fixer's controls check what a change would touch as well as the change itself.

FailureWhat it looks likeControl
False duplicateTwo people named Sam Patel at one large employer, or two subsidiaries sharing a domain, look like one record.Name-only and domain-only matches go to the exceptions list. The diff shows the match reason for each pair.
Consent state shifts by side effectChoosing a survivor could leave an opted-out person on a record that counts as marketable.The execution service refuses consent and opportunity fields. A rule outside the model compares consent state on each pair and moves differences to exceptions, without showing the values to the model.
A tidy edit fires an automationA changed country or stage value enrols records in a workflow, and customers get an email the rail says it never sends.The proposal lists automations that watch each field in scope, tested in the sandbox with automations on. Fields with a live trigger stay out until the owner resolves it.

How to evaluate it

Evaluate the CRM Hygiene Fixer in a sandbox that mirrors production objects, using seeded duplicates and false duplicates it has not seen.

  • Rollback drill. Apply a batch, edit some of those records by hand, then roll back. Correct behaviour restores untouched rows and lists edited rows for a person, so newer data is never overwritten.
  • Refusal tests. Submit a batch with an opportunity amount, an opt-out field and a delete. The execution service must refuse all three, whatever the model says.
  • Approval binding. Change one row after signing, and confirm the hash check fails.
  • Rollbacks per batch. In production, this is the plainest sign of bad proposals.
  • Duplicates remaining. Rerun detection after each batch, counting false duplicates separately.
  • Batch approval time, by role. Very fast approval of large batches suggests nobody is reading, so shrink the batch. Keep this away from named approvers: AI Act Annex III point 4(b) lists monitoring workers' performance, so take advice first 1.

Where it runs

The CRM Hygiene Fixer is safest on a private model, and an external model is an option only with masking and contract cover. Duplicate matching needs real values, so run exact matching as rules outside the model, then send the model masked candidates with their match reasons. The boundary architecture patterns cover placement. In PrivyCDP, an immutable ledger names the human or system actor behind each AI-assisted action.

Read the AI agent rails hub for how levels and approvals fit together, then use the rail card template to write this rail for your own CRM.

Browse use casesFunction playbooksAgent roster

FAQ

Can an AI agent clean CRM data safely?

Yes, within tight limits. Let it propose small batches, have a named person approve the exact diff, and apply through a separate service with a rollback file ready. Keep opportunity values, consent fields and deletes out of its tools altogether.

What belongs in a rollback file?

Each row needs the record ID, field, before value, after value and record version, plus the batch hash. The version lets a rollback skip records someone has edited since. Store the file outside the agent's reach, and rehearse using it.

Why are opportunity values out of scope?

A hygiene rule cannot tell a typing error from a negotiated price, and a wrong amount affects forecasts. A suspicious value can appear as an exception for its owner to check.

Sources

  1. EU AI Act, Annex III, list of high-risk uses by area
  2. Meta, when an agent session needs human supervision (31 October 2025)
  3. HubSpot Knowledge Base, merge records
  4. Salesforce Help, recover merged contacts

This article is general information, not legal advice.

Further reading

Published: · Updated:

Editorial dates describe content changes. Confirm current sources before making legal, security or purchasing decisions.