Turn a messy CRM into a ranked cleanup list.
Finds the hygiene problems that break reporting first: missing fields, stale records, duplicates, and bad stages, before the cosmetic ones.
Inside: The missing-field scan, the duplicate clusters, and a priority ranking by blast radius.
Install it in one line, or paste it in.
~/.claude/skills/ and runs automatically when it is relevant.Connect your context. Set it to your motion.
it reads every object automatically, across the whole database, not just the rows you exported.
it can compare CRM values against a source of truth and catch fields that silently drifted.
tightens the stale-record check with real last-touch dates.
This was built for a B2B SaaS org running a staged pipeline in a standard CRM. Set these to your stack:
Point it at your required fields and your stage model, not anyone else's. The audit is only as strict as the rules you give it.
| Set this | What it is | Default / Example |
|---|---|---|
| CRM | your CRM connector | a CRM (Salesforce |
| WAREHOUSE | optional source of truth | a data warehouse (SnowflakeBigQuery) |
| REQUIRED fields | fields your reports cannot work without | ownerstageclose dateamountsegment |
| STAGE model | your legal stage list and order | your opportunity stages |
| STALE_DAYS | no-update days that mean stale | 90 for accounts30 for open deals |
| DEDUPE keys | what makes two records the same | email + domaincompany name + domain |
| ROLL-UP grain | the level your reports summarize at | accountsegmentowner |
Everything the skill does, in full.
Reads your CRM records and returns a straight verdict on the data that reporting depends on. It finds the records with missing required fields, the ones that have gone stale, the likely duplicates, the deals sitting in impossible stages, and the accounts and opportunities with no owner. Then it ranks the problems by how much they distort the numbers, so you fix the leaks that matter before the cosmetic ones.
- 1Missing-field scan
For every record, check the REQUIRED fields and report the fill rate field by field, named. A report that groups by segment is a lie if a third of accounts have no segment. Show the percentage empty and the raw count, not "some records are incomplete."
- 2Stale-record check
Flag any record whose last meaningful update is older than STALE_DAYS. Use last activity date where you have it, created or modified date where you do not, and say which one you used. An open deal with no touch in 30 days and a close date next week is the loudest kind of stale.
- 3Duplicate detection
Group records that match on the DEDUPE keys and surface the clusters, not just a count. Show which record looks like the survivor (most complete, most recent activity) so the merge decision is already half made.
- 4Bad-stage and orphan check
Flag deals in a stage that does not exist in your model, deals past their close date still marked open, and any account or opportunity with no owner. No-owner records are invisible to every rep-level report, so they distort every roll-up silently.
- 5Priority ranking
Rank findings by blast radius: a missing field on the grain your reports group by outranks a typo in a record no dashboard reads. The output is a cleanup list ordered by how much each fix straightens the numbers.
- No "incomplete" without the named field and the exact fill rate.
- No duplicate flag without showing the cluster and the suggested survivor.
- Stale always states which date drove the flag, so nobody argues the definition.
- Counts are counts. The audit never estimates a number it can read directly.
DATA-HYGIENE AUDIT · 4,120 accounts · 8,660 contacts · 310 open deals Finding Scope Severity Detail Segment field empty 38% of accts HIGH 1,566 accts drop out of segment reports No-owner accounts 212 accts HIGH Invisible to every rep roll-up Likely duplicate accounts 96 clusters MED Matched on domain, survivors flagged Open deals past close date 41 deals MED Still open, close date in the past Stale open deals 57 deals MED No activity in 30+ days Cleanup order: 1. Backfill segment on the 1,566 accounts. It breaks every segment report. 2. Assign owners to the 212 orphan accounts before the next roll-up. 3. Work the 96 duplicate clusters. Survivors already suggested.
STALE_DAYS (90 for accounts, 30 for open deals) and the DEDUPE keys are defaults, not laws. They suited a mid-market SaaS base. If your sales cycle runs longer or your data model keys on something else, change them. The logic does not move. The thresholds and keys are yours.
Where an operator takes this next.
The read is step one. Here is where an operator takes it once the manual version proves out.
Catching it once is a cleanup. Catching it weekly is hygiene.
Point a scheduled Claude task at Salesforce every Monday and post the top 5 findings to the RevOps Slack channel.
Wire required-field validation into Salesforce so segment cannot go blank on a new account instead of catching it after the fact.
Connect Snowflake as a source of truth so fields that silently drifted between systems get flagged, not just fields that are empty.
One skill is the on-ramp.
A single skill does one job. Chained into a playbook, or run as a full build, it becomes a system. Here is where this one plugs in.