BounceBlock.io
← All articles
Data hygiene

How to remove duplicate contacts from a CSV (the right way)

DR
Written by
Daniel Reyes · Data Quality Lead
Jul 14, 2026 · 9 min read

Removing duplicate contacts sounds like a solved problem — until you realise a spreadsheet's 'remove duplicates' button only catches the easy ones. The duplicates that actually cost you are the near-matches: the same person entered with a different email, a reformatted phone number, or a stray capital letter. This guide covers what really counts as a duplicate, why they're worse than they look, and a workflow that removes them for good.

Why duplicate contacts are worse than they look

A duplicate isn't just a wasted row. It inflates the list size you make budget and forecasting decisions on, splits a contact's engagement history across two records so neither looks as active as it truly is, and — in a CRM — routes the same lead to two reps who then step on each other. When you send, duplicates mean the same person gets your email twice, which is a fast way to earn an unsubscribe or a spam complaint.

Those complaints matter beyond the annoyance: mailbox providers treat them as a signal that you're not managing your list well, which quietly erodes the sender reputation that decides whether your mail reaches the inbox at all. So a pile of duplicates doesn't just clutter a spreadsheet — it costs you deliverability, distorts your metrics, and wastes real money on every send.

What counts as a duplicate (it's not just exact matches)

The obvious duplicate is two identical email addresses. Every tool catches those. The expensive duplicates are the ones that don't match character-for-character, and they're everywhere in real data:

  • Case and whitespace differences — 'Jane@Co.com' and 'jane@co.com ' with a trailing space read as different strings to a naive de-dupe.
  • Reformatted phone numbers — (415) 555-0182 and +14155550182 are the same number written two ways.
  • The same person across fields — one row has their email, another has only their phone, so neither the email column nor the phone column alone catches the pair.
  • Different addresses for one person — jane@co.com in one import and j.doe@co.com in another, both the same human.

How to remove duplicates in a spreadsheet — and where it fails

For a quick pass, a spreadsheet is a reasonable start. In Google Sheets you can use Data → Data cleanup → Remove duplicates; in Excel, Data → Remove Duplicates. Both let you pick which columns define a duplicate. To catch case and spacing differences, normalise first — wrap the email column in a LOWER() and TRIM() formula, then de-dupe on the cleaned column rather than the raw one.

But a spreadsheet has a hard ceiling: it can only compare the text you give it. It can't recognise that a reformatted phone number is the same number, it can't match a person across the email and phone fields at once, and it certainly can't tell you whether the address it kept is even deliverable. It removes exact string duplicates and stops there — which leaves the near-matches and the dead-but-unique addresses untouched.

Deduping across email and phone together

The duplicates a spreadsheet misses most often are the cross-field ones. If you de-dupe on email, you miss the record that shares a phone number; if you de-dupe on phone, you miss the shared email. Catching these means normalising both fields — lowercasing and trimming emails, standardising phone numbers to a single international format — and then matching a record as a duplicate if either field collides.

This is exactly what a purpose-built cleaner does automatically. BounceBlock deduplicates across both email and phone in the same pass, so the same person entered two different ways collapses to a single clean record — and because it verifies while it dedupes, the record it keeps is also confirmed deliverable, not just unique.

A reliable de-dupe workflow

The most dependable approach is two passes. First, a quick structural clean: normalise casing and formatting and remove the exact duplicates — a spreadsheet or a browser-based list cleaner handles this instantly and privately. That shrinks the file to the rows worth checking.

Second, the real clean: run the list through a tool that dedupes across email and phone and verifies deliverability at the same time. This is the pass that catches the reformatted duplicates, the cross-field matches, and the well-formed addresses that no longer deliver — none of which a spreadsheet can see. Run both in order and you get the cleanest possible file for the least effort, because the free structural pass removes the noise before the deeper pass does the work only it can.

How to keep duplicates from coming back

De-duping once is a snapshot; duplicates re-accumulate every time you import a new source without checking it against what you already hold. The habit that keeps a list clean is to dedupe at the moments duplicates multiply — merging two CRM exports, folding in a purchased or event list, consolidating leads from several vendors — rather than waiting for a once-a-year cleanup.

Validating new contacts at the point of capture helps too: verifying and normalising an email and phone as they enter your database means fewer near-duplicate variants get created in the first place. Combined with a periodic bulk clean of what you already hold, that keeps your list trending toward clean instead of slowly re-filling with the same people entered five different ways.

See how clean your list really isFree preview of your first 100 contacts — no credit card.
Clean my list free →