River
Y CombinatorBacked by Y Combinator
FREE TEMPLATE

CRM Data Hygiene Checklist

Survivorship written field by field before a single pair is reviewed, plus the eleven fields your platform resolves whatever your reviewer clicks.

Free download  ·  No account needed

Lifecycle stageFurthest down the funnel winsA fresh lead merged into an old customer stops being a lead. This month's demand understates itself with no error anywhere.
Marketing contact statusMost marketable winsA cleanup sold as shrinking the database can raise the marketing contact count, and on some subscriptions that is an invoice.
Legal basisMost recent from both recordsThe survivor's consent state is not the state either original record had, and nobody chose it. Check this after every batch.

Every CRM hygiene checklist runs on the same cadence: log activity weekly, deduplicate monthly, audit the fields quarterly, rebuild the schema once a year. It is reasonable advice about reversible work, and it gives one line to the only operation in the whole job that destroys data permanently. A merge cannot be undone. Not by support, not by an API call, not by recreating the record that disappeared. So this pack works outward from the merge instead.

Survivorship gets written field by field before a single pair is looked at, because at merge time a reviewer has ten seconds per pair and keeps whichever record looks fuller. That reflex is how a working phone number gets replaced by one disconnected in 2019. The older create date wins on account age. The more recently verified value wins on phone. The owner of the record carrying the open deal wins on owner, whichever side is primary.

Then the half nobody writes down: eleven fields your platform resolves on its own logic, whichever value your reviewer clicks. Lifecycle stage ratchets to the furthest down the funnel, so a fresh lead merged into an old customer stops being a lead, which is why stage definitions belong next to this. Marketing contact status ratchets to the more marketable of the two, which is a bill rather than a data point. The sheet marks those rows not overridable, because knowing them is the entire value.

Eleven of twenty-one fields are not yours to decide

Every not-overridable row is a documented platform behaviour, not a preference. The point of recording them is knowing which numbers move during a cleanup.

Survivorship by Field

Illustrative rows for a fictional medical distributor, Wrenfield Medical Supplies.

FieldPlatform default on mergeOverridableOur ruleConsequence if it goes wrong
Create dateOlder record's value is keptNoAccept. Already correct.None. Account age is measured from first contact.
Phone numberPrimary's value winsYesMost recently verified value winsA rep dials a disconnected number and marks the contact bad data
OwnerPrimary's value winsYesOwner of the record with the open deal winsA live renewal moves to somebody who has never spoken to the buyer
Lifecycle stageFurthest down the funnel is keptNoPlan around itNew demand is reclassified as existing customers
Marketing contact statusMost marketable of the two is keptNoAudit the count after every batchThe billable count rises after a cleanup meant to shrink it
Legal basisMost recent values from both are keptNoReview consent after every batchConsent state changes without anybody choosing it
Number of conversionsThe two values are added togetherNoAccept and annotate the reportingConversion rate per form runs permanently high on merged contacts
Record idA new id is generated for the survivorNoCapture both original ids firstWarehouse joins and webhooks orphan silently. No error is raised.
Any updated fieldChange timestamp becomes the merge timeNoSnapshot both records firstEvery date-keyed report returns the merge date for merged records
Static list membershipSecondary is removed from all static listsNoExport both records' memberships firstA hand-built campaign audience shrinks and nobody is notified
ReversibilityNone. A merge cannot be undone.NoSnapshot, then merge. Never the reverse.The snapshot is the only surviving copy of the original data

11 of 21 rules are decided by the platform. Two of them, marketing contact status and legal basis, get checked after every batch precisely because they cannot be controlled during one.

Candidate Merge List

The exception queue. 10 of 739 pairs needing a human, showing all four decisions. A further 2,506 pairs cleared by bulk criteria are not listed here.

#PairPrimaryConflictWhat disappearsDecision
1P. Raghunathan, 2019 record and 2024 recordAOwner differs. B owns the open renewal.NothingMerge, then reassign owner
2Two addresses, one marketing and one unsubscribedASurvivor becomes marketing regardlessA deliberate unsubscribeHold. Consent question first.
3T. Ferris, Customer 2021 and Lead last weekAPlatform keeps Customer regardlessThe fact that he returned as new demandMerge and annotate the lead count
4Harnleigh Group Ltd and Harnleigh GroupANoneNothingMerge. Cleanest pair on the list.
5Wrenfield Medical North and Wrenfield Medical SuppliesnoneNot a duplicate. Two trading regions on one domain.n/aReject. Add both to the exclusion list.
6One address, legal basis differs on each recordBBoth bases survive onto one recordNothing, which is the problemHold. Route to the data protection lead.
7Castermill Holdings, parent and child recordsABoth sit in a hierarchyNothing yetBlocked. Unhook the hierarchy first.
8One address, 214 and 39 previous mergesn/aCombined count is 253, above the 250 ceilingn/aBlocked permanently. Needs a fresh record.
9Ostwick Facilities and Ostwick Facilities ManagementACombined associations exceed the limitNothing yetBlocked. Unhook 9 stale deals and retry.
10One address, on 4 static lists and on 1AB's list membership is dropped on mergeA hand-built event invitee listMerge after exporting B's memberships

Bulk merge offers five survivor criteria: most recent engagement, oldest engagement, created first, created last, most recently updated. None of them is the record the open deal is attached to, which is why pairs 1 and 4 are on this sheet rather than in the bulk pass.

Duplicate Detection Rules

False positive rates measured on judged samples, because the rate decides whether a rule can be merged from or is triage only.

RuleObjectMatches onPairsFalse positivesWhy it misfires hereVerdict
Platform defaultContactName, email, country, phone, zip, company418219.7%Shared family addresses, two people on one company phoneTriage only
Platform defaultCompanyDomain, name, country, phone, industry113614.5%Franchise locations on a domain, holding companies on a switchboardTriage only
Exact emailContactEmail address only18940.0%It does not. Identical addresses are the same person.Safe to bulk merge
Customer numberContactCustom ID synced from the ERP6120.7%Four cases of one shared login at the customer endSafe after excluding the four
Exact domainCompanyCompany domain name only43831.3%Franchisees and subsidiaries legitimately share a parent domainManual review only
Phone plus nameCompanyPhone number and company name20757.5%Shared switchboards in serviced offices and business parksReject the rule
Fuzzy nameCompanyName similarity above 70%not rununknownWould collide two genuinely separate regional accountsNot built. Slots are full.

Custom detection rules cap at two per object using up to nine properties each, so a third idea means retiring one of the first two. That ceiling, not ambition, is why the fuzzy rule was never built and why the 57% rule had to go.

What the pack does that a cadence checklist does not

01

Writes survivorship as rules that resolve

One row per field, naming the deciding attribute rather than the preference. The older create date wins on account age. The legal entity name wins on company name. Two people applying the sheet to the same pair reach the same answer, which is the only test a merge-time rule has to pass.

02

Names the fields you cannot control

Eleven rows marked not overridable, with the platform's own behaviour quoted and the consequence spelled out. Three of them ratchet: lifecycle position, billable status and consent basis. The output is not a fix, because there is none. It is knowing which numbers move during a cleanup.

03

Treats the snapshot as the audit trail

The exportable merge history reaches back ninety days and covers only merges run in the duplicates tool, so a one-off merge from a record's actions menu leaves no export. Any field the merge updates is restamped with the merge date. The snapshot is the only copy of the original dates.

04

Splits the queue by what a criterion can resolve

Exact-email and exact-identifier pairs with trivial associations go through in bulk and get logged. Pairs carrying an open deal, a hand-built list, a hierarchy or a different owner land on the candidate list with a named primary. Five mechanical conditions decide which, not judgement.

05

Gives blocked pairs a real state

A hierarchy that fails the merge, a combined association count above the limit, and a pair whose records have exhausted the merge-count ceiling are three different problems with three different next actions, one of them unrecoverable. Blocked pairs are the only category that gets worse when ignored.

06

Separates fill rate from correctness

Fields that default on creation are always fully populated and frequently wrong, so a hygiene score built on fill rate reports a bad database as healthy. The compliance sheet counts blanks on records with an open deal separately, and marks the fields where full compliance still means bad data.

How the pack runs

  1. 1

    Send the export

    Contact and company export with record id, create date, owner, email or domain, and whatever fields your reports group by. A current duplicate pair export is welcome alongside it.

  2. 2

    Write survivorship first

    River fills the field-by-field sheet with your rule, the platform default beside it, and whether the value can be overridden at merge time at all.

  3. 3

    Measure the detection rules

    Each rule gets a judged sample and a false positive rate, which decides whether it can be merged from in bulk or is triage only.

  4. 4

    Review before anything merges

    The candidate list arrives with a named primary per pair, the conflicts listed, what disappears written down, and a decision of merge, reject, hold or blocked.

Frequently asked questions

Deduplication is one line on a hygiene checklist. Why a whole pack?

Because it is the only line that cannot be undone. Fill rates, formats and stale records are all recoverable next quarter. A merged record is gone, and the surviving one now carries a mixture of two records' values that nobody chose deliberately. Everything else on the checklist can wait.

What does it mean that a field is not overridable?

The comparison dialog highlights your choice in green and the platform resolves the field by its own rule anyway. HubSpot documents that lifecycle stage keeps the stage furthest down the funnel and marketing contact status keeps the most marketable of the two. Both are ratchets, and one of them is billable.

Can we just bulk merge and fix the problems afterwards?

For exact-email pairs with trivial associations, yes, and the pack says so. The five bulk survivor criteria are most recent engagement, oldest engagement, created first, created last and most recently updated. None is the record with the open deal attached, so anything carrying live pipeline needs a human.

There is no undo, but is there not a merge history to fall back on?

Thinner than it looks. The exportable history reaches back ninety days and covers only merges performed in the duplicates tool, so a one-off merge from a record's own actions menu leaves nothing. And updated fields are restamped with the merge date, so field history loses the original dates too.

How do we know which fields even need a survivorship rule?

From what your reports group by, not from the field list. A field nothing consumes does not need a rule and probably should not exist. If you have not mapped that yet, a CRM field dictionary names every field, its owner and the report consuming it, which is the input this sheet is built from.

Our duplicate backlog is bigger than the tool will display. Now what?

Count it from the export instead. The duplicates manager displays a bounded number of pairs by subscription tier, so above the ceiling the tool cannot show you the size of your own problem. Sizing the whole cleanup as a priceable scope is what a CRM audit diagnostic does.

We run two CRMs and both are full of duplicates. Where do we start?

Inside one system, with survivorship, because a merge in either one is irreversible while a sync disagreement is not. Once each side is clean, a HubSpot and Salesforce reconciliation classifies the remaining record-level differences by cause instead of merging blind.

Write survivorship before the next merge

Send the contact and company export and get the field-by-field rules, the detection rates and the candidate queue back.

Get the template