CRM Cleanup — Metrics Summary (Demonstration Project)
Synthetic dataset. Every name, company, email and phone number below was generated for this demo. No real contact data was used. The pipeline is the same one we run on client data — inside the client's own CRM account.
Headline results
| Metric | Before | After |
|---|---|---|
| Total records | 5,000 | 4,266 |
| Duplicate records merged | — | 734 (277 exact, 285 same-email, 172 fuzzy name+company) |
| Avg field completeness (7 core fields) | 91.3% | 92.6% |
| Distinct phone formats in use | 9 | 1 (standard: (XXX) XXX-XXXX) |
| Distinct State spellings | 60 | 15 (USPS codes) |
| Distinct Lifecycle Stage labels | 16 | 4 (fixed picklist) |
| Invalid emails flagged | 242 in file | 67 flagged in Email Valid column |
| Invalid phone numbers removed & flagged | — | 176 |
What was fixed
- 2,913 whitespace defects trimmed (leading/trailing/double spaces)
- 4,351 casing fixes (names → Title Case, emails → lowercase, companies standardized)
- 3,156 phone numbers reformatted to a single standard
- Company suffixes standardized (LLC / Inc. / Co.) so account matching works
- Lifecycle stages mapped to a 4-value picklist: Lead, MQL, Customer, Churned
- Survivorship on merge: the most complete record wins; gaps are filled from its duplicates, so no data is lost in a merge
Field completeness detail
| Field | Before | After |
|---|---|---|
| First Name | 100.0% | 100.0% |
| Last Name | 100.0% | 100.0% |
| 97.4% | 100.0% | |
| Company | 100.0% | 100.0% |
| Title | 73.0% | 77.7% |
| Phone | 79.6% | 80.3% |
| State | 89.0% | 90.1% |
Completeness can rise after dedupe because merged duplicates donate their non-empty fields to the surviving record.
Files
contacts_raw.csv— the messy input (5,000 rows)contacts_clean.csv— the cleaned output (4,266 rows, +Email Validaudit column)clean_crm.py— the pipeline (readable, auditable)
Generated automatically by the cleanup pipeline on synthetic data.