Sending the same cold email twice to one business owner is a fast way to look careless. It happens easily: you scrape two overlapping cities, run a second keyword like "hair salon" after "barber", or merge an old CSV with a new one. Suddenly the same shop sits in your list three times, under slightly different names.
This guide shows you how to dedupe a lead list in Google Sheets or Excel today, in the right order, without deleting leads you actually want.
Why duplicates cost you more than you think
Duplicates are not just untidy. They cause real problems:
- Double sends. The same person gets your first email and every follow-up twice. That reads as spam and invites complaints.
- Sender reputation. Complaints and repeated sends to the same inbox can hurt your domain. See how to protect your domain reputation for the wider picture.
- Wasted credits and verification. Every duplicate you verify or enrich is paid work for no new lead.
- Misleading numbers. Your reply rate looks worse when one business is counted as three contacts who "didn't reply".
Step 1: Make a backup and standardize your columns
Before deleting anything, duplicate the sheet and name it "raw". Work on a copy.
Then make sure every source uses the same columns. If one file says "Company" and another says "Business Name", rename them so they match, then stack all rows into one sheet. Add a column called Source (for example "Maps Austin" or "Old CSV March") so you can trace where each row came from later.
Step 2: Clean the data so matches can actually match
Duplicates often hide behind formatting. "Joe's Barbers " and "joe's barbers" are the same shop, but a spreadsheet treats them as different. Create helper columns that normalize each key field:
- Email: lowercase and trim. In Sheets or Excel:
=LOWER(TRIM(C2)) - Domain: strip the website down to the bare domain. Remove "https://", "http://", "www." and anything after the first slash. A simple version:
=LOWER(REGEXREPLACE(D2,"^(https?://)?(www\.)?([^/]+).*$","$3"))in Google Sheets. - Phone: keep digits only. In Sheets:
=REGEXREPLACE(E2,"[^0-9]","") - Name: lowercase, trim, and remove common words like "llc", "inc" and "the" if they cause near-misses.
Paste the helper columns as values once they look right, so later sorting does not break the formulas.
Step 3: Dedupe in the right order
The order matters because each key catches a different kind of duplicate. Work from the most reliable key to the least.
| Order | Match key | What it catches | Watch out for |
|---|---|---|---|
| 1 | Exact email | Same inbox listed twice | Nothing, these are always true duplicates |
| 2 | Domain | Same business with different emails | Shared domains like gmail.com, or franchise sites |
| 3 | Phone | Same business, different spelling or no website | Shared call centers or franchise numbers |
| 4 | Name + city | Leftovers with no email or site | Chains with many real locations |
Exact email
Sort by your clean email column. In Google Sheets, use Data > Data cleanup > Remove duplicates and tick only the clean email column. In Excel, use Data > Remove Duplicates with just that column selected. Leave blank emails alone for now; the tool will treat all blanks as one duplicate otherwise, so filter them out first and add them back after.
Domain
This is the step that saves most double sends to small businesses. A barbershop might list info@ and the owner's address. Decide: do you want one contact per business, or every contact? For cold outreach to local businesses, one well-chosen contact per domain is usually the safer default.
Exclude free email domains (gmail.com, yahoo.com, outlook.com and so on) from this step, or you will collapse hundreds of unrelated businesses into one row.
Phone, then name plus city
Run the same process on the digits-only phone column, then on a combined key like =F2&"|"&G2 (clean name plus city). Review these by eye before deleting, especially for chains. Two locations of the same daycare brand in different neighborhoods may be two genuine leads.
Step 4: Choose which duplicate to keep
Remove Duplicates keeps the first row it sees. So sort before you remove, putting the best row on top. A good rule of thumb for what counts as "best":
- Has a named owner or decision maker, not just info@
- Has a verified email
- Has the most fields filled in (website, category, city)
- Comes from the most recent source
A quick way: add a Score column that counts filled fields with =COUNTA(A2:H2), sort by score descending, then dedupe. If two rows each hold useful data, merge them by hand first.
Step 5: Dedupe against people you already contacted
A clean new list can still overlap with last month's campaign. Keep a master "contacted" sheet with every email and domain you have sent to, plus anyone who unsubscribed or asked not to be contacted.
Then flag overlaps in your new list with =COUNTIF(Contacted!A:A, C2)>0. Filter TRUE and remove those rows, or move them to a separate follow-up list if your timing and situation make a later touch reasonable. Never re-add someone who opted out. Rules on cold email differ by country, so check what applies to you.
Step 6: Verify, then load
Dedupe before verifying, not after, so you only pay to check unique addresses. Then run verification and decide what to do with risky results such as catch-all addresses; this guide on catch-all emails walks through that call.
Finally, spot check a dozen rows. Do the merge tags fields look right? Is the business name readable, not "JOE'S BARBERS LLC - BEST FADES 24/7"? Fixing these now matters as much as removing duplicates.
Keeping lists clean going forward
Most duplicate mess comes from moving files between tools. In GetClient, leads you scrape from Google Maps and CSVs you import live in My Leads folders, and campaigns send from that same place, so you are not re-exporting and re-merging between a scraper, a verifier and a sender. Unsubscribed addresses are also skipped automatically when sending. You can try it with 100 free credits, no card needed; see plans and credits.
Whichever tool you use, the habit is the same: one master list, one contacted list, and a dedupe pass every time new rows come in.