── SKILL
data-hygiene-audit✓ APPROVED

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.

01 / HOW TO USE

Install it in one line, or paste it in.

1
In Claude Code (one command)
Copy the install line, paste it into your terminal, and restart Claude Code. The skill installs itself to ~/.claude/skills/ and runs automatically when it is relevant.
2
In Claude, ChatGPT, or a Project (no terminal)
Open the file, then upload it to your chat or paste its contents in. A skill is just a markdown file of instructions, so any capable AI can follow it.
New to skills? A skill is a plain-text file that teaches your AI a workflow. Point any capable assistant at it and it follows the steps, on your data.
02 / MAKE IT YOURS

Connect your context. Set it to your motion.

CONNECT YOUR CONTEXT · AND WHY IT HELPS
a CRM

it reads every object automatically, across the whole database, not just the rows you exported.

a data warehouse

it can compare CRM values against a source of truth and catch fields that silently drifted.

an activity or email tool

tightens the stale-record check with real last-touch dates.

SET IT TO YOUR MOTION

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 thisWhat it isDefault / Example
CRMyour CRM connectora CRM (SalesforceHubSpotPipedrive)
WAREHOUSEoptional source of trutha data warehouse (SnowflakeBigQuery)
REQUIRED fieldsfields your reports cannot work withoutownerstageclose dateamountsegment
STAGE modelyour legal stage list and orderyour opportunity stages
STALE_DAYSno-update days that mean stale90 for accounts30 for open deals
DEDUPE keyswhat makes two records the sameemail + domaincompany name + domain
ROLL-UP grainthe level your reports summarize ataccountsegmentowner
03 / THE FULL SKILL

Everything the skill does, in full.

── WHAT THIS DOES

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.

── THE METHOD
  1. 1
    Missing-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."

  2. 2
    Stale-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.

  3. 3
    Duplicate 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.

  4. 4
    Bad-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.

  5. 5
    Priority 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.

── QUALITY GATES
  • 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.
── OUTPUT (EXAMPLE)
EXAMPLE OUTPUT
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.
── WHERE THE NUMBERS COME FROM

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.

── EXAMPLE CHAT
EXAMPLE CHAT
You
Audit this CRM export, something's off with our segment reporting. [uploads CSV]
CLAUDE
Ran the missing-field scan first, since that is usually the loudest problem. 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 The catch: your segment report is not wrong, it is just silently missing over a third of the base. That is why the numbers looked low.
You
What about duplicates? We merged two lists last quarter.
CLAUDE
Found 96 likely clusters matched on domain, each with a suggested survivor (most complete, most recent activity), so the merge decision is already half made. Cluster: "Acme Corp" x3 -> survivor: record with most fields filled, most recent activity One sharpener: connect the CRM directly so I can check every account, not just the 4,120 in this export. Dedupe only catches what is in front of it.
04 / GO FURTHER

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.

01
Run the audit weekly, automatically

Point a scheduled Claude task at Salesforce every Monday and post the top 5 findings to the RevOps Slack channel.

02
Block bad data at the source

Wire required-field validation into Salesforce so segment cannot go blank on a new account instead of catching it after the fact.

03
Cross-check against the warehouse

Connect Snowflake as a source of truth so fields that silently drifted between systems get flagged, not just fields that are empty.

05 / PART OF A BIGGER PLAY

One skill is the on-ramp.

── GET NEW SKILLS IN YOUR INBOX

One operator-built skill a week. Free.