CRM Duplicate Cleanup Skill

Export your contacts or companies, run one command, and get every duplicate group with a reason, the record to keep, the blanks to fill, and ready merge files for HubSpot and Salesforce.

CRM Duplicate Cleanup Skill cover

What it does

Find duplicate contacts and companies in a CRM export, pick the record to keep, fill its blanks from the duplicates, and get merge files for HubSpot and Salesforce. It works as a Claude Code plugin (skill crm-duplicate-cleanup) or a command-line tool. Python 3.9+, no dependencies. It's read-only: it never connects to your CRM.

What you get

The screenshot is real output from the kit’s own commands. Tested from a fresh download of this exact zip: ./run_tests.sh ran 13 tests OK on Python 3.13 and 3.10.

Real terminal output from CRM Duplicate Cleanup Skill: demo and passing tests

Quick start

python3 -m crmdedupe contacts hubspot-contacts.csv --out dedupe/
python3 -m crmdedupe companies salesforce-accounts.csv --out dedupe/
./demo.sh          # bundled HubSpot contacts example
./run_tests.sh     # 13 tests, including a 20,000-row run

How it matches

Contacts: merged (high confidence)Contacts: review only
same email (case-insensitive)same phone and name, but different company or email domain
same Gmail inbox (dots, +tags, googlemail.com)same phone, different or similar name (shared line)
same phone and same name (nicknames count: Bob = Robert, Kate = Katherine)similar name (typos) at the same company
same name and same company (Inc/LLC/Ltd ignored) or same work-email domainsame last name and company, different first name
Companies: mergedCompanies: review only
same website domain (https://www.x.com/about = x.com)same name, different domains (subsidiaries or regions)
same normalized name (Acme, Inc. = The Acme Corporation) when at most one has a domainsimilar name in the same city
same phone and a similar name

Accents, punctuation, &, phone formats, extensions and +1 are normalized. Ten-digit numbers without + are treated as US/Canada. Use --country-code 44 or --country-code '' to change that.

Output (--out dedupe/)

  • clusters.csv: every duplicate group with master or duplicate role, the reason, and all original columns.
  • review_pairs.csv: possible duplicates that are never merged automatically.
  • master_updates.csv: master fields that are blank but filled on a duplicate. Apply these first: Salesforce keeps the master's values, blanks included, when merging.
  • deduped.csv: one row per real person or company, with blanks filled and a merged_rows column.
  • salesforce_merge.csv: master ID plus up to 2 merge IDs per row. Salesforce merges at most 3 records at once, so larger groups are split into successive merges.
  • hubspot_merge_requests.jsonl: one POST /crm/v3/objects/contacts/merge (or companies/merge) body per duplicate, as {"primaryObjectId", "objectIdToMerge"}.
  • summary.json

Master rule (--master): most-complete (default: most filled fields, then oldest create date), oldest, or newest (latest modified or activity date).

Column detection covers HubSpot and Salesforce export headers (Record ID, Contact ID, Account ID, Email, First/Last Name, Company Name or Account Name, Phone Number, Website or Company Domain Name, City, Create/Created Date, Last Modified/Activity Date). Override any column with --email-col, --company-col, --id-col, --phone-col and so on.

Honest limits

  • It plans merges; it doesn't perform them. Merges can't be cleanly undone in HubSpot or Salesforce, so test 1 group first.
  • Matching is rule-based, not ML. Unusual name orders, or people who share both a phone and a name, may need review.
  • Very common blocking keys (for example thousands of rows with the same last-name prefix) are skipped and reported. Exact email and phone matches are still found through their own blocks, unless that email or phone is itself shared by hundreds of rows.

Format and license

Zip, 17 KB, v1.0, 13 files. You may use and modify this kit for your own work and for clients you serve, including paid client work. Not affiliated with or endorsed by HubSpot or Salesforce.

FAQ

Does it change my CRM?
No. It reads a CSV export and writes files; you or your admin run the merges.
Does it handle nicknames?
Yes, Bob/Robert, Kate/Katherine, Bill/William and about 50 more.
Which CRMs?
Any CSV export; HubSpot and Salesforce headers are detected automatically and get merge files.
How do I get the files?
Right after payment, Stripe’s confirmation page shows your download link.
Refunds?
Email hello@youraitools.co within 14 days if it doesn’t work and we can’t fix it.
Can I pay with crypto?
Yes. Pay the same price in USDC or USDT on Base, Ethereum, Arbitrum, Optimism, Polygon or Solana from the "Pay with crypto" button, with no account or KYC. We check the payment on-chain and show your download links as soon as it confirms.

Get CRM Duplicate Cleanup Skill

Find HubSpot and Salesforce duplicate contacts and companies from a CSV export: emails, Gmail aliases, phones, nicknames, Inc/LLC names. Master record, filled blanks, merge files.

Save with a bundle

Pairs well with

Download$19

301 Redirect Mapper Skill

Map old URLs to new ones for a site migration, collapse redirect chains, catch loops, and export 301 rules for Apache, Nginx, Netlify, Vercel, Cloudflare and Shopify.

View 301 Redirect Mapper Skill
Download$29

Amazon Settlement Reconciliation Skill

Reconcile Amazon settlement reports (Flat File V2) to bank payouts offline: rows checked against total-amount, balanced journal, profit per SKU, gap and duplicate checks.

View Amazon Settlement Reconciliation Skill
Download$19

Contract Renewal Tracker Skill

Track contract and SaaS renewals from a spreadsheet: auto-renewals rolled forward, cancel-by deadlines, locked-in renewals flagged, .ics reminders. $19 once.

View Contract Renewal Tracker Skill

Related