Lead List Deduplicator

Two exports, one clean list. Paste two CSV files (or one file twice) and this tool merges them by email address or by company domain, resolves conflicting cells with a policy you choose, and gives you a CSV you can copy into a spreadsheet or CRM. Everything runs in your browser, so no lead data is uploaded or stored.

Free tool · nothing is uploaded

Merge two lists into one clean CSV

Match by email or company domain, merge duplicates under your own conflict rule, and copy the result. Headers, quoted fields and plain email lists are handled automatically.

  • CSV, TSV or plain list
  • Email or domain match
  • Fill blank fields
  • Clean CSV export

Paste your lists

CSV, TSV, semicolon CSV or one email per line. A header row is optional.

Paste the second export here. If you only have one list, paste it in either box to dedupe inside it.

One row per email. Best when you want to keep individual contacts.

List A is read first, so its non-empty values win. Blanks are always filled from the duplicate.

Merge result

Paste a list on the left to see the merged lead count and duplicate report.

0 unique leads

— Waiting for input

  • Rows read 0
  • Duplicates merged 0
  • Skipped rows 0
  • Columns out 0
Rows kept as unique leads 0 of 0

Merged CSV

Your merged CSV will appear here, with one row per unique lead.

0 rows · 0 columns

Rows that could not be matched

Rows with no usable email or domain are listed here so nothing disappears silently. They are not included in the CSV.

  • Nothing skipped yet.

What a lead list deduplicator does

A lead list deduplicator reads two lists of people, matches rows that describe the same lead, and writes one CSV where each unique lead appears exactly once. The matching rule is the important part: two rows are "the same lead" either when they share an email address or when they share a company domain, and you choose which rule to apply.

This matters more than it sounds. Most teams build a list from several sources — a LinkedIn export, a webinar sign-up, a purchased file, a CRM dump — and those sources overlap. Sending to the overlap costs you money in credits, annoys the same person two or three times, and skews every open or reply rate you measure afterwards. Cleaning the overlap before the first send is the cheapest step in the whole campaign.

How to use this tool

  1. Paste your first export into List A. CSV, semicolon-separated files, tab-separated sheets and a plain one-email-per-line column all work.
  2. Paste the second export into List B. If you only have one list, paste it in either box and the tool deduplicates inside it.
  3. Choose the match key. Email address keeps individual people; Company domain collapses everyone at one company into a single row.
  4. Choose the conflict rule for fields where the two rows disagree.
  5. Read the result panel: unique leads, duplicates merged, rows skipped, and a per-column count.
  6. Check the What changed notes and the skipped-rows list at the bottom, then press Copy CSV.

How matching works

Match keyRows are the same when…Best for
Email addressThe normalized email is identical (case-insensitive, and +tags ignored if that option is on)Keeping every individual contact in the file
Company domainThe registrable domain is identical, taken from a domain/website column or from the email after the @Account-based lists where you want one row per company

Email normalization

Before matching, each email is trimmed, the whole address is lowercased, and it is validated against a practical pattern (a local part, an @, then a dotted host). With the +tags option on, [email protected] and [email protected] become one lead, because most mail systems deliver both to the same mailbox. Because the email is the key in this mode, the email column in the output contains the normalized address — lowercased, with the +tag removed when that option is on.

Domain normalization

For domain matching, a value is reduced to a host: any https:// scheme, www., a path, a query string and a port are stripped, then the host is reduced to its registrable domain — the last two labels are kept (acme.co.uk keeps its three-part suffix, and mail.acme.com becomes acme.com). That means https://www.acme.com/about, www.acme.com and acme.com all match. IP addresses, bare words and values with no dot are rejected, and the row is skipped with a reason instead.

How conflicting fields are merged

When two rows share a key but disagree on a cell — one says VP Sales, the other Vice President, Sales — the tool has to pick. Blanks are never allowed to overwrite real data; only two non-empty, different values count as a conflict, and your chosen rule decides the winner:

RuleWhich value is keptUse it when
First seen winsThe value from the row read first; List A is read before List BList A is your system of record
Last seen winsThe last non-empty valueThe file was exported most recently
Most complete rowThe row with more filled cells becomes the baseOne export is richer than the other
Longest valueThe longer non-empty string per fieldYou would rather keep Vice President, Sales than VP Sales

Whichever rule you choose, empty cells in the surviving row are still filled from the duplicate. That is why a merged lead usually has more filled fields than either original row, and the tool reports how many cells were filled this way.

Worked example

The sample loads two overlapping lists. List A has five data rows, including one line with no usable email; List B has six rows, including one line that is not a CSV row at all. With Email address matching and First seen wins, the tool reports:

MetricValueWhy
Rows read115 in List A + 6 in List B (header rows excluded)
Unique leads5sarah@, mike@, ana@, dave@, tara@
Duplicates merged4[email protected], [email protected], and the two repeats of Mike and Ana
Skipped rows2one line with no email, one line with no CSV structure

Switch the match key to Company domain and the same input produces four leads: [email protected] and [email protected] collapse into acme.com, while northwind.io, brightlabs.co and vertexhq.com each stand alone. The numbers above are outputs of the algorithm described on this page, not benchmarks.

What the CSV parser handles

  • Delimiters — comma, semicolon or tab, sniffed from the first few lines outside quoted text.
  • Quoted fields — "Acme, Inc." stays one cell, and "" inside quotes becomes a literal quote.
  • Header rows — detected when the first row contains known header words (email, company, domain…) or when it has no email but later rows do.
  • Headerless files — a single column is named Email or Domain from its content; multi-column headerless files are aligned by position against the headered list.
  • Column union — columns are merged by normalized name, so First name in List A and first_name in List B become one column, while columns unique to one list are still carried through.
  • Line endings and BOM — CRLF, LF and a UTF-8 byte-order mark are all accepted.

Limitations

  • Matching is exact after normalization. It will not catch [email protected] versus [email protected], a typo in a domain, or two people with the same name. Fuzzy matching needs a different kind of tool and would create false merges you cannot undo.
  • Domain matching merges real people. If your list is contacts, not accounts, use email matching — otherwise three colleagues become one row with one job title.
  • The last-two-labels domain rule is a heuristic, not a public-suffix list, so unusual suffix structures may be reduced incorrectly.
  • Each list is capped at 5,000 data rows and 60 columns so a paste cannot freeze the tab. Split bigger files and merge the results again in a second pass.
  • Skipped rows are reported but not exported. If a row has no valid email and no valid domain, it cannot be matched, and silently inventing a key would be worse than listing it.
  • Nothing is uploaded: parsing, matching and CSV generation all happen in the browser, and the page stores no data after you leave it.

Frequently asked questions

Should I dedupe by email or by domain?

Use email when the file lists individual people and you intend to email each of them. Use domain when the file is an account list, when you are building account-based sequences, or when the same company appears repeatedly across exports. Neither is more correct — they answer different questions.

What happens to the columns that only one list has?

They are kept. The output column list is the union of both headers, so a LinkedIn column from List B survives even if List A has no such field, and rows from List A simply leave that cell blank.

Does the tool fix the values it merges?

No. It picks between values using your conflict rule and fills blanks; it never rewrites a job title, guesses a company name, or corrects a typo. The one part that is normalized is the match key: emails are lowercased (+tags optionally removed) and domains are reduced to a bare registrable host. Every other column keeps the original cell text from whichever row won the field, and the email column keeps the normalized address it was matched on.

Why were some of my rows skipped?

Because they had no usable match key: no valid email in email mode, and no valid domain in domain mode. Every skipped row is listed at the bottom of the page with its reason, so you can fix the source file rather than discover the loss inside your CRM.

Can I merge more than two lists?

Two at a time. Merge the first two, copy the result back into List A, paste the third list into List B, and run it again. The second pass behaves exactly like the first because the output is a normal CSV.

Is this the same as checking list quality?

No. Deduplication only removes overlap between rows. Whether the addresses are valid, role-based or risky is a separate question that a lead list quality scorer answers.

Related tools

Next step

Deduplication makes a list sendable; it does not make it work. See how mizanursguide.com builds B2B lead generation that starts from a clean list and ends with booked calls.