How to use Dedupe.dev

The tool has three tabs: Excel / CSV for spreadsheet files, Text lines for a pasted list, and JSON for an array of objects. Everything runs in the page, so no file is uploaded, the first occurrence of each duplicate is kept, and the order of what survives is unchanged.

The Excel / CSV tab

This is the tab that opens on /excel, /csv, /xls and /contacts. Drag a file onto the drop area, or click browse and pick one. It accepts .xlsx, .xls, .csv and .tsv. Once the file loads, the drop area shows its name and the number of data rows found, which is the first thing worth sanity-checking: if that count is wildly wrong, the file is probably delimited by something other than what its extension claims.

Choose what makes a row a duplicate

Under Duplicate when these columns match there is one chip per column. Click a chip to switch it on. Rows are then compared on those columns only, so selecting just the email chip collapses two records for the same person even when their names and phone numbers differ. Leave every chip off and the whole row is the key, meaning two rows must match in every cell to count as duplicates. Columns with a header show its text; columns without one are labelled by position, as col 3.

The two checkboxes

First row is a header is on by default. It keeps that row out of the comparison and passes it straight through to the download, so your headings are never treated as data and never removed. Turn it off for a file that starts immediately with values.

Case-sensitive is off by default, which means ACME and acme are treated as the same value. That is what you want almost always, and it is the main thing this tool does that a plain spreadsheet dedupe does not. Tick it only when case genuinely carries meaning, such as a column of identifiers or hashes.

Where fuzzy matching went

The browser tool used to have a fuzzy-matching checkbox. It is gone, on purpose: the comparison is pairwise, and on real-world lists it froze the tab rather than finishing. Fuzzy matching now runs server-side in the API, where "Smith, Jane" and "jane smith" collapse after normalisation and a similarity threshold you set catches near-misses like "Jane Smyth". A free API key is enough to use it. The browser tool is exact-only, which is why it stays instant at any size.

Run it and read the result

Press Remove duplicates. A line appears reporting how many unique rows were kept and how many duplicates were removed. Read that count before you do anything else: it is the check that your key columns were the ones you meant. Then press Download cleaned CSV. The file arrives named after your original with -deduped appended, and your original is untouched, because nothing was ever edited in place.

The Text lines tab

For a list you can paste, which is most of them. Paste one item per line, then use the three checkboxes: Trim whitespace and Drop blank lines are on by default, Ignore case is off. Trimming matters more than it sounds, since a trailing space from a copy and paste is the usual reason two identical-looking lines survive. Press Remove duplicates and the result appears in a second box with a count of unique lines, ready for Copy result. Nothing is downloaded here, it goes to the clipboard. See the duplicate line remover.

The JSON tab

Paste a JSON array of objects. Leave Key path empty to remove objects that are entirely identical, or give a dotted path such as user.id to keep one object per value at that path. Invalid input says so rather than failing silently. As everywhere else, the first matching object wins and array order is preserved, which is where the common one-line JavaScript idiom differs: a Map built from the array keeps the last occurrence. More on that at the JSON array deduplicator.

What it deliberately does not do

It removes rows. It never merges them, so two records that each hold half the information stay half-complete, and the copy that survives is simply the one that came first. If you need field-level merging, do the removal pass here to shrink the problem, then merge the short remainder by hand in the system the data belongs to. The CRM contact workflow covers that loop end to end, and preparing a CSV for import covers the checks worth running alongside the dedupe.

FAQ

Frequently asked questions

Is my file uploaded when I use the tool?

No. The file is read and processed by JavaScript in the page. There is no upload endpoint for the browser tools at all. Open your browser's developer tools, watch the Network tab, and run a dedupe: nothing leaves the machine.

Which row is kept when duplicates are found?

The first occurrence, always, and the original row order of everything that survives is preserved. Nothing is merged and no fields are combined. Rows are only ever removed, which is what makes the operation safe to undo by keeping your original file.

Why does the result download as a CSV even though I loaded an .xlsx?

Because CSV is the format every spreadsheet and import tool reads. The download is named after your file with -deduped added. Open it in Excel and use Save As if you need a workbook back.

What do I select if a duplicate means the whole row repeats?

Nothing. Leave every column chip unselected and the entire row becomes the key, so two rows are duplicates only when every cell matches. Selecting chips narrows the comparison to just those columns.

How large a file can it handle?

500,000 rows go through in well under a second, so file size is rarely the limit; the ceiling is your device's memory. Fuzzy matching is not part of the browser tool: it lives in the API, where it runs server-side.

Last updated