Rapport Contact Deduplicator
Find duplicate contacts in a CSV (same e-mail, phone or similar name) and merge them.
How it works
Checks a contacts CSV (Rapport, HubSpot, Pipedrive or any file with name, e-mail, phone and company columns) for duplicates: the same e-mail even with different case, Gmail dots or +tags, the same phone number written differently, and very similar names at the same company. Shows every group with its reasons and gives you a merged CSV. Same rules as Rapport’s duplicate finder.
- Same e-mail: compared in lower case; for every provider a +tag is ignored (anna+news@ = anna@), for Gmail also dots (an.na@gmail.com = anna@gmail.com).
- Same phone: only digits count and the last nine are compared, so +49 40 2345678 and 040 2345678 match. Numbers with fewer than seven digits are ignored.
- Similar name: Jaro–Winkler similarity of the folded full names (accents, case and punctuation removed) of at least 0.92, AND the same company (legal forms like GmbH, Inc. or B.V. ignored) or the same non-free-mail e-mail domain. Identical names without any company or e-mail on one side are flagged as weaker matches.
- Pairs are joined into groups. In the merged CSV the first row of each group is kept; its empty fields are filled from the others, tags are combined, notes appended and the newest documented lawful basis/consent wins.
Check each group before you delete anything in your CRM: two real people can share a phone number or a name.
Sources
- Winkler, W. E. (1990): String Comparator Metrics and Enhanced Decision Rules in the Fellegi-Sunter Model of Record Linkage (U.S. Bureau of the Census (ERIC))
- Export your records (HubSpot Knowledge Base) — column names of the contact export (HubSpot)
- RFC 4180: Common Format and MIME Type for CSV Files (IETF)
Part of Rapport
-
Rapport CRM
A CRM for contacts, companies, deals and quotes — local-first, shared with your team.
How to find and merge duplicate contacts in a CSV
Check a contacts export from HubSpot, Pipedrive or a spreadsheet for duplicates by e-mail, phone and similar names at the same company, and download a merged file.
What it is for
Every contact list collects duplicates: someone fills in a web form with a different e-mail, a colleague adds a business card by hand, an import runs twice. Exact-match tools only find identical rows. This tool looks for the same person: the same e-mail even with other capital letters, a +tag or (for Gmail) dots; the same phone number written differently; or a very similar name at the same company. It groups the matches, explains each one and writes a merged CSV.
It runs the same matching as Edit → Find duplicates… in Rapport, where you choose the record to keep and every deal and activity moves along.
Worked example
The example is a HubSpot contacts export with nine rows and HubSpot's own column names:
Found 3 groups of duplicates in 9 rows (3 records to merge).
- Group 1 (rows 2 and 3): two Lena Vogt records with
lena.vogt@mediq.exampleandLena.Vogt@mediq.example— same e-mail; same name at the same company (Mediq Health GmbH and Mediq Health count as one company), score 1. - Group 2 (rows 4 and 5): Paul Hansen with
040 2345678and+49 40 2345678— same phone number, score 0.9. - Group 3 (rows 7 and 8): Sanne Bakker and Sanne Baker at Greenway Logistics B.V. and Greenway Logistics — similar name at the same company, score 0.75.
A hand-made list with six rows, Name, Email, Phone, Company as headers:
Found 2 groups of duplicates in 6 rows (2 records to merge).
an.na.schmidt@gmail.com and annaschmidt+shop@gmail.com are the same Gmail inbox, so the two Anna Schmidt rows form a group. Jonas Weber and Jonas Webber at Weber IT and Weber IT GmbH are matched by name. Tom Berg and Thomas Berg at Berg Bau are not matched: a nickname is too different for the name check, and their e-mails and phones differ.
How to read the result
- Rows / Groups / Records to merge — records to merge = rows that would disappear into another one.
- Duplicate groups — the CSV row numbers (the header is row 1), the records, the reasons and a score from 0 to 1; e-mail matches score highest, similar names lowest.
- Columns used — which of your columns the tool read as name, e-mail, phone, company and so on. Check it first when the result looks empty.
- Downloads —
contacts-merged.csvkeeps the first row of each group, fills its empty fields from the others, combines tags and notes and keeps the newest documented lawful basis;duplicate-groups.csvlists the groups for review.
Tips and common mistakes
- Look at every group before you delete anything in your CRM. Two real people can share an office phone number, and groups are joined: if A matches B and B matches C, all three end up together.
- Score 0.75 means "similar name at the same company" — the weakest kind of match. Check those by hand.
- Shared inboxes such as
info@oroffice@count as the same e-mail, so two people who both wrote frominfo@land in one group — split those by hand. - Put the record you trust most first in the file: the merged CSV keeps the first row of each group.
- Free-mail domains (Gmail, Outlook …) do not count as a shared company for the name check.
FAQ
Does it catch typos in e-mail addresses?
No. anna@exmaple.com and anna@example.com are different addresses; only a matching name at the same company would group them.
Why is a phone match not a 100 % score?
Phones are shared more often than e-mails — switchboards, family landlines — so the tool trusts them a little less.
Which columns does it need?
A name (full or first and last), and e-mail, phone or company to compare by. Other columns go into the merged file when Rapport knows them.
Is my list stored?
No. It is processed for this run only.
Guide last updated:
For scripts and AI agents
- JSON API:
POST https://rapportcsvdedupe.usefulweb.app/api/v1/calculate(same calculation as this page) - Interface description: OpenAPI 3.1 · AI guide: llms.txt
- MCP server (Streamable HTTP):
https://rapportcsvdedupe.usefulweb.app/mcp· tool namerapport_csv_dedupe
Example request
curl -s -X POST https://rapportcsvdedupe.usefulweb.app/api/v1/calculate \
-H 'content-type: application/json' \
-d '{…see OpenAPI examples…}'