# CRM hygiene report: <CRM and account>, <YYYY-MM> review

## Baseline

- CRM and edition: <HubSpot Sales Hub Professional | Salesforce Enterprise | Attio Pro | other>
- Rules: <rules file name>, version <x>, hash <from summary.md>; definitions approved by <role> on <date>
- Exports, one line each: <object>, <method and view or filter>, exported <YYYY-MM-DD HH:MM UTC>, <rows> rows, CRM count <n>, encoding <utf-8>
- Script: <ran: python3 scripts/profile_crm_export.py ... | not run, rules applied by hand, duplicates NOT CHECKED>
- Inputs read: <stack.md, data-dictionary.md, decisions.md, or what the user supplied>

## Coverage per object

- <object>: <FULL | PARTIAL, reason | UNCONFIRMED>. Every rate below inherits this label.
- Salesforce converted leads set aside as archived records (read only by the X checks, F07 and L10): <n | not Salesforce>

## FAIL

- <check ID and name, object>: <numerator> of <denominator> <population> (<rate>). Records: <IDs>. Spot check: <confirmed | mismatch explained>. Exception cited: <decisions.md entry | none>

## WARN

- <check ID and name, object>: <numerator> of <denominator> <population>. Decision needed from: <role>

## INFO

- <check ID>: <context that changes how other checks read, such as bounce classes or role mailboxes>

## PASS

- <check ID, object>: 0 of <denominator> <population>

## NOT CHECKED

- <check ID, object>: <reason, such as column not mapped, not retrieved, no definition, coverage>

## Duplicates

- Convention: excess duplicate records = records in certain and probable groups minus the number of groups, over records excluding test and internal ones. Possible pairs are listed, never counted as excess.
- <object>: <n> certain groups, <n> probable groups, <n> possible pairs; excess <n> of <N> (<rate>)
- Calibration, marked by <role with CRM access> from the record pages: certain <x> of <y> same (pass at all), probable <x> of <y> same (pass at 90%). Failing basis and setting changed: <none | basis, setting, rerun date, decisions.md entry>
- Vendor cross-check: <found by both, only by the CRM, only by the script, or not run>

## Ownership

- Open deals or customers without an active human owner: <count and IDs>; reassignment owner: <role>

## Lifecycle and stages

- <customers without evidence, won deals without amount, closed deals in the future, stale pipeline share, orphaned stages>

## Associations

- <contacts without a company, open deals without company or contact, wrong-domain associations, dangling references>

## Email, bounces and decay

- Marketing population <n>; bounced or opted out yet marketable <n>; address-dead bounces <n>; sender-side bounces <n> handed to deliverability
- Dormant <n> of <n>; never engaged <n>. Decay sample: <coverage and defect rate among verified, or not run>

## Fields

- Required fields missing by population; placeholders counted apart; format variants with the proposed canonical value

## Spot checks

- Traced <n> flagged records (one per FAIL line, at least 10) and 10 passing records: <x> of <y> match (pass at 95%)
- <record ID>, <check>, <field>: <match | mismatch and its explanation>. Relationship checks: <the won deal, association or both duplicate records seen>. Never write name, email or phone values here.

## Unique affected records

- <object>: <n> records with at least one FAIL; <n> with a FAIL or WARN. Never summed across checks.

## Cleanup plan (drafts, in this order)

- 1. Stop harm to people: <suppression change list rows>
- 2. Stop the writer: <source fix, owner>
- 3. Owners of open deals and customers: <rows>
- 4. Integrity and certain duplicates: <merge plan groups>; check_merge_plan.py <0 BLOCK and <n> PENDING with --draft at hand-over | 0 BLOCK after sign-off on <date>>
- 5. Revenue reporting fields: <rows>
- 6. Reviewed probable duplicates: <groups>
- 7. Lifecycle, associations, required fields, formats: <rows>
- 8. Dormancy and deletion candidates: <proposal for the retention owner>
- Numbers that will move and who has been told: <customer count, pipeline, contact tier>

## Prevention

- <defect>: created by <form | import | integration | user>, fix <source change>, owner <role>, monitor <check ID and cadence>

## Trend (monthly)

- Compared with <previous profile date>, same rules version <yes | no, changes listed first>
- Resolved <n>; new on existing records <n>; defects on records created since the last review <n, by creation source>; new duplicate groups by creation source <list>; records missing since last month <n>

## Approvals

- <item>: approved by <role> on <date>, or pending

## Next review

- <date>; weekly checks until clean: <E06, O01, O02, L10 if any failed>

Nothing in the CRM was changed by this audit.
