A worked example: one messy contact list
The built-in sample is a 120-row contact list with the kinds of duplicates real exports produce. Load it in the tool and you will see the same clusters described here.
What is hiding in the sample
| Duplicate kind | Example pattern | Caught by |
|---|---|---|
| Exact copy | The same row exported twice | Exact matching |
| Email variants | jane.doe@gmail.com vs janedoe+news@gmail.com | Email normalization, then exact matching |
| Phone formats | (555) 014-2280 vs +1 555 014 2280 | Phone normalization, then exact matching |
| Case and spacing | ACME SUPPLY INC vs Acme Supply | Case folding + company suffix cleanup |
| Misspelled names | Jon Smith vs John Smith, same company | Fuzzy matching (review cluster) |
| Complementary rows | One row has the phone, the other has the city | Merge with fill-missing — nothing is lost |
The sample file is generated by a script in the project (scripts/make-sample.mjs), so the example is reproducible: the same input always produces the same clusters.
What you get back
- Clean CSV — one row per person, with empty fields filled from their duplicates.
- Duplicates audit CSV — every removed row, its cluster ID, and the reason (“Duplicate of data row 14 in cluster C3 (exact match, score 1)” style entries).
- Summary JSON — input rows, output rows, removals, cluster counts, and the exact settings, so the run can be repeated or checked later.
Counts always reconcile: clean rows + audited removals = the 120 rows you started with.