The core rule
Never delete, always merge, and always keep a map. A dedupe that loses activity history destroys attribution and rep trust in one move. The merge-map is the artifact that makes the whole operation reversible.
The method
- Export everything first. Full snapshot to a warehouse (BigQuery/Snowflake). This is your rollback and your audit trail.
- Resolve identity offline. Do NOT dedupe inside the CRM UI. Build candidate pairs in the warehouse: exact domain match, normalized-name match, then fuzzy matching on the remainder with a confidence score.
- Human-review the gray zone. Above 0.95 confidence: auto-merge. Below 0.7: leave alone. In between: a review queue (this is where agents help, with citations).
- Build the merge-map. A table of
loser_id → winner_idwith match reason and confidence. This is the single source of truth for the operation. - Merge via API in tranches. Small batches, verify activity counts transfer after each tranche. Stop on any anomaly.
- Install the guardrail. New-record webhooks check the merge-map + identity resolution so the duplicates never come back.
What to measure
- Duplicate rate before/after (unique canonical companies ÷ total records)
- Activity records preserved (must be 100%)
- New-duplicate creation rate in the 30 days after (should approach zero with the guardrail)
