<< All versions
Skill v1.0.0
currentAutomated scan100/100bcharleson/clay-gtm-cli/clay-data-hygiene
──Details
PublishedOctober 25, 2026 at 05:34 PM
Content Hashsha256:5f0d5f422c3e934c...
Git SHA42328618c3c5
──Files
Files (1 file, 4.6 KB)
SKILL.md4.6 KBactive
SKILL.md · 156 lines · 4.6 KB
version: "1.0.0"
clay-data-hygiene — CRM Data Normalization and Cleaning
Normalize, deduplicate, and validate CRM data at scale. Fix malformed company names, standardize titles and departments, validate and re-verify emails, normalize phone numbers, and flag duplicate records. Run this on CRM exports to maintain clean data without manual effort.
install
bash
npm install -g clay-gtm-clibrew install cloudflaredclay tables add \--name data-hygiene \--webhook-url https://app.clay.com/webhook/YOUR_WEBHOOK_ID \--description "CRM data normalization — clean names, validate emails, normalize phones, flag dupes"clay listen start
commands
bash
# Clean a single contact recordclay fire data-hygiene \--data '{"crm_id": "003XYZ","crm_type": "contact","first_name": "john","last_name": "DOE","email": "john.doe@acme.com","phone": "415-555-0100","title": "vp, revenue operations","company": "acme corp"}' \--wait# Validate and re-verify email onlyclay fire data-hygiene \--data '{"crm_id": "003XYZ","email": "john@acmecorp.com","mode": "email_only"}' \--wait# Full deduplication checkclay fire data-hygiene \--data '{"crm_id": "003XYZ","email": "john@acme.com","linkedin_url": "https://linkedin.com/in/jdoe","mode": "deduplicate"}' \--wait# Batch clean a CRM exportcat crm_contacts.json | jq -c '.[]' | while read contact; doclay fire data-hygiene --data "$contact" --waitdone
output
json
{"success": true,"table": "data-hygiene","data": {"crm_id": "003XYZ","original": {"first_name": "john","last_name": "DOE","title": "vp, revenue operations","company": "acme corp","email": "john.doe@acme.com","phone": "415-555-0100"},"cleaned": {"first_name": "John","last_name": "Doe","title": "VP of Revenue Operations","title_normalized": "VP Revenue Operations","department": "Revenue Operations","seniority": "VP","company": "Acme Corp","company_domain": "acme.com","email": "john.doe@acme.com","email_valid": true,"email_deliverable": true,"email_confidence": 0.95,"phone": "+14155550100","phone_formatted": "(415) 555-0100"},"issues_found": ["title_not_normalized", "phone_missing_country_code", "company_name_inconsistent"],"issues_fixed": ["title_normalized", "phone_normalized"],"duplicate_check": {"is_duplicate": false,"potential_duplicates": []},"data_quality_score": 94}}
clay table setup
- Trigger: Webhook
- Steps:
- Name normalization (proper case formula)
- Title standardization (AI column: map raw titles to standardized set)
- Company name normalization (remove "Inc", "LLC", etc., proper case)
- Email validation (Hunter/NeverBounce/ZeroBounce)
- Phone normalization (E.164 format formula)
- Duplicate detection (lookup against existing CRM records via HTTP)
- Data quality score calculation
- Final step: HTTP API → POST to
{{_callback_url}}
common patterns
bash
# Only return records with issues to fixclay fire data-hygiene \--data '{"crm_id":"003XYZ","email":"john@acme.com","title":"vp sales"}' \--wait | jq 'select(.data.issues_found | length > 0)'# Get just the cleaned fields for CRM writebackclay fire data-hygiene \--data '{"crm_id":"003XYZ","email":"john@acme.com","first_name":"john","last_name":"DOE"}' \--wait | jq '{crm_id: .data.crm_id, cleaned: .data.cleaned}'# Find duplicate recordsclay fire data-hygiene \--data '{"crm_id":"003XYZ","email":"john@acme.com","linkedin_url":"https://linkedin.com/in/jdoe","mode":"deduplicate"}' \--wait | jq 'select(.data.duplicate_check.is_duplicate == true)'# Quality sweep — find low-quality recordscat crm_export.json | jq -c '.[]' | while read contact; doclay fire data-hygiene --data "$contact" --wait \| jq 'select(.data.data_quality_score < 70) | {crm_id: .data.crm_id, score: .data.data_quality_score, issues: .data.issues_found}'done# Validate all emails in CRM before a big campaign sendcat contacts.json | jq -c '.[] | {crm_id: .Id, email: .Email, mode: "email_only"}' \| while read contact; doclay fire data-hygiene --data "$contact" --wait \| jq 'select(.data.cleaned.email_deliverable == false) | {crm_id: .data.crm_id, email: .data.original.email}'done
row limit
bash
clay usage show data-hygieneclay tables reset data-hygiene --webhook-url https://app.clay.com/webhook/NEW_ID