Home › Blog › Never Cold Email the Same Person Twice: Build a Master Deduplication System
Duplicate outreach is the fastest way to look like a spammer to both the prospect and the filter. The fix is not a sequencer setting, it is a master database that dedupes at three levels: email, person, and company. Here is the system we run across 2M scraped leads a month.

Keep a master database outside your sequencer logging every contact ever loaded, then check every new list against it before launch at three levels: email (exact), person (name + domain fuzzy match), and company (domain cap). Sequencer duplicate detection only sees its own workspace; the master sees everything across tools, clients, and years. Same table doubles as your suppression list.
Every data source overlaps. Apollo and a Sales Navigator scrape share half their rows. This quarter's export and last quarter's export share more. Two clients in the same niche share targets. Your sequencer dedupes within one workspace, but the moment your operation spans two campaigns, two tools, or two clients, nothing is watching the whole picture, and the same VP gets your "first" email three times in six weeks. Prospects screenshot that. Filters notice the pattern too: repeated sends to the same mailbox that never engaged is negative-signal accumulation you chose voluntarily.
email | lowercased, normalized
domain | company domain, no www
first_name | normalized
last_name | normalized
campaign | which campaign loaded them
date_added | when they entered the system
last_contacted | last touch date
status | active / replied / opted-out /
| bounced / do-not-contact / customer
Import flow, every list, no exceptions:
new CSV → clean (CSV Cleaner) → check vs master
→ remove email/person matches → enforce domain cap
→ remove status != cleared → load remainder
→ append loaded rows back into masterThe workflow discipline matters more than the tooling: nothing enters a sequencer without passing through the master first, and everything that enters a sequencer gets appended back. Run the cleanup pass with our free CSV Cleaner before the dedupe check so formatting differences do not defeat your matching, and pipe replies and bounces back into the status column weekly so the same table stays current as your suppression system.
Maintain one master database outside your sequencer (Google Sheets works to about 50K rows, then Airtable or a real database) where every contact you have EVER loaded gets logged with email, domain, company, campaign, and date. Before any new campaign launches, the new list is checked against the master and matches are removed. The sequencer's built-in duplicate detection only sees its own workspace, so the moment you run two tools, two workspaces, or two clients, it is blind.
Both, at three levels. Email-level catches the exact same address. Person-level catches the same human with two addresses (j.smith@ and jsmith@, or a personal Gmail from an old export). Company-level catches the real killer: three different data exports each returning a different employee at the same company, so the company hears from you three times in a month and nobody at your end noticed. Cap contacts per domain and stagger them deliberately.
Minimum: email (lowercased), company domain (normalized, no www), first and last name, campaign name, date added, date last contacted, and status (active, replied, opted out, bounced, do not contact). The domain column is what enables company-level rules, and status is what turns the same database into your suppression system. One table answers both questions: have we emailed this person, and are we allowed to.
Normalize before comparing: lowercase everything, strip plus tags and dots in Gmail addresses, and match on first name + last name + company domain as a secondary key. Fuzzy person matching catches most repeats. Clay and OpenRefine both handle this well at volume, and a simple Sheets formula combining LOWER(first) & LOWER(last) & domain as a helper column catches the bulk of it for free.
Same database, two different questions. Deduplication asks whether the contact is already in a campaign so you do not double-send. Suppression asks whether the contact must never be emailed again (opted out, bounced, closed-lost, existing customer). Run both checks at import: dedupe removes repeats, suppression removes the forbidden. Our full suppression playbook covers the second half.
Prewarmed Inboxes So You Can Send Cold Emails Today
Get Prewarmed & Fresh InboxesGoogle, Microsoft 365 and Azure inboxes with free prewarmed domains and DNS configured before you log in. Prewarmed inboxes send the day they land; every order is delivered within 48 to 72 hours.
Get Prewarmed & Fresh Inboxes