The part most cleanups get wrong
A one-time clean is a photograph. It is accurate the day it is taken and wrong a month later, because whatever created the duplicates is still running - two intake forms that do not talk to each other, a spreadsheet someone imports by hand, a sync that re-adds contacts it has already added, and a customer who is Bob Smith on one line and Robert Smith on another.
So a de-duplication job that is worth paying for delivers two things: the clean file, and the rule that keeps it clean. You get both, and you keep both.
Every merge is listed. The output includes a record of which rows were merged into which, and why. You audit the decisions instead of trusting them - which matters, because a de-duplicator that quietly picks the wrong survivor loses real customers.
Look at how we handle data before you send us any
Nine tools on this site are free, need no sign-up, and run entirely inside your browser - nothing you load into them is uploaded anywhere. They are the actual work, not a slide:
DeltaCSV compares two exports by key and tells you what really moved between them. FlipCSV turns a CSV into clean JSON. SwiftStatement pulls a bank statement PDF into a spreadsheet.
If one of those already solves your problem, use it and keep your money. You will be told that here rather than sold something.
See it work on a deliberately messy file worked example
Everything below is real output from a real de-duplication pass, run on the invented 13-row file shown here. The data is synthetic - no client's records appear on this page, ever - but the rules, the log and the counts are exactly what the script produced.
| id | name | phone | city | |
|---|---|---|---|---|
| 1001 | Robert Smith | rsmith@example.com | (703) 555-0142 | Manassas |
| 1002 | Bob Smith | rsmith@example.com | 703-555-0142 | Manassas VA |
| 1003 | Jennifer Ruiz-Alvarez | j.ruiz@example.org | 703 555 0188 | Fairfax |
| 1004 | Jennifer Alvarez | j.ruiz@example.org | — | Fairfax |
| 1005 | Michael O'Connor | mike.oconnor@example.net | (571) 555-0110 | Arlington |
| 1006 | Mike OConnor | mike.oconnnor@example.net | 571-555-0110 | Arlington |
| 1007 | Dana Whitfield | dana.w@example.com | (703) 555-0163 | Vienna |
| 1008 | Priya Raman | praman@example.com | (571) 555-0177 | Reston |
| 1009 | Robert Smith | rsmith@example.com | — | Manassas |
| 1010 | Dana Whitfield | dwhitfield@example.com | (703) 555-0163 | Vienna |
| 1011 | Priya Ramann | priya.raman@example.com | (571) 555-0234 | Reston |
| 1012 | David Nguyen | dnguyen@example.com | (703) 555-0199 | Vienna |
| 1013 | Daniel Nguyen | dan.nguyen@example.com | (703) 555-0201 | Vienna |
The three matching rules, in the order they were applied: R1 same normalised email, R2 same phone once punctuation is stripped, R3 a near-identical name in the same city. The surviving record is the earliest sign-up, with any empty fields back-filled from the rows merged into it, so a merge never loses data.
The merge log, verbatim:
IN 13 rows OUT 7 rows MERGED 6
KEPT 1001 (Robert Smith) <- merged 1002, 1009
rule: R1 same email (rsmith@example.com)
KEPT 1003 (Jennifer Ruiz-Alvarez) <- merged 1004
rule: R1 same email (j.ruiz@example.org)
KEPT 1005 (Michael O'Connor) <- merged 1006
rule: R2 same phone (5715550110)
KEPT 1007 (Dana Whitfield) <- merged 1010
rule: R2 same phone (7035550163)
KEPT 1008 (Priya Raman) <- merged 1011
rule: R3 name 96% + same city (reston)
13 rows in, 7 out. Read the log rather than the count: every survivor names what was folded into it and which rule decided, so you can disagree with a specific line instead of the whole run.
What it deliberately did NOT merge, and why that matters more. David Nguyen and Daniel Nguyen sit in the same city with near-identical phone numbers, and their names score 80% similar - under the 85% threshold, so they were left alone and flagged for a human. Two different people collapsed into one is the expensive mistake, because you only find out when one of them stops getting email.
The same run is why matching never rests on names alone. Robert / Bob Smith scores 76% and Michael / Mike O'Connor 81% - both under the threshold, both genuine duplicates. They were caught by the email and phone rules instead. Nicknames are why one clever rule is worse than three plain ones.
What you get
$500
One-time clean
One source or a handful of files, up to about 50,000 rows in total. Bigger or more tangled than that gets its own quote — always before any work starts, never after.
- Your files merged into one, de-duplicated on rules we agree against your real data first
- Near-match handling for the cases that actually cost you: middle initials, maiden names, second addresses, an email off by one character
- Columns, dates and formats normalised so the file is usable, not just shorter
- A full merge log - every decision, auditable
- The script itself, yours to keep and re-run whenever you like
from $1,200
Kept clean
- Everything above, wired to run on a schedule against your live source
- A short report after each run: what it merged, what it skipped, what needs a human
- Set up as a scheduled job in something you already have - a cron entry on your server, your cloud provider's scheduler, or a scheduled GitHub Action - in your account, on your credentials
- A one-time build price, not a subscription. Once it is running there is nothing further to pay us: no per-run fee, no retainer, no licence
- Optional, only if you want it: we watch it and fix what breaks, from $100/month. Decline it and the thing still runs
Fixed scope, fixed price. The number you approve does not move unless you ask for something new - and if it does, you get the new number before any work happens.
How it works
- Tell us what you have. One sentence is enough to start. A 20-row sample with the names changed is enough to quote precisely - you never need to hand over a real list to get a price.
- Get a fixed price and a date, the same day. Along with the matching rules we propose, in plain English, before anything is written.
- Built, tested, handed over. With a short walkthrough so you can run it yourself. Every build here is reviewed independently of whoever wrote it before it reaches you.
The guarantee: it is tested before hand-off, and any defect in the delivered scope that you report within 30 days is fixed free. That is a promise about our work, on our time - not a promise about your revenue.
A wrong merge, though, usually surfaces long after any warranty window - the month someone emails the wrong Bob. That is the real reason for the merge log and for handing you the script: the log names exactly which rows were combined and on which rule, so a bad merge is traced to a decision rather than guessed at, and the script re-runs with the rule corrected. You are not dependent on us still being around to fix it.
Honest scope
This is a good fit for customer lists, mailing lists, CRM and e-commerce exports, membership rosters, supplier tables and event registrations - anything that arrives as CSV, Excel, JSON or a database export.
It is not a fit for de-duplicating images or documents by content, for anything that needs a human to decide record by record at scale, or for a live migration of a system that must not go down. If that is what you have, say so and you will get a straight answer about whether we are the right people.
Questions people ask first
Is my data safe if I send you a customer list?
You never have to send a full list to get a price. A description, or a 20-row sample with the names changed, is enough to quote from. When we do handle real data it stays in the accounts you control, it is not used for anything else, and it is deleted when the job is done. The nine free tools on this site run entirely in your browser: the file or text you load into a tool is processed on your own machine and is never sent anywhere. (The only thing that ever leaves the page is an email address, and only if you choose to type one into the newsletter box.)
What actually counts as a duplicate?
That is the part worth deciding before any code runs, and we decide it with you. Exact matches are easy. The ones that cost you are the near-matches: the same person with a middle initial, a maiden name, a work address and a home address, or an email that differs by one character. We agree the matching rules against your real data first, then apply them - and every merge the script makes is listed so you can audit it rather than trust it.
What if I only have one messy file, not two?
That is the common case and it is fine. Comparing two exports is a separate job - the free DeltaCSV tool on this site does that one for nothing. De-duplication works on a single file, or on several that need merging into one.
Do I own the result?
Yes - the clean file and the script that produced it. You can re-run it yourself whenever you like. There is no retainer, no lock-in and no monthly fee unless you ask for the scheduled version, in which case it runs in your accounts and you own that too.
How fast is it?
You get a fixed price and a delivery date the same day you describe the job. Most one-time cleans are done within a few days of that.
My data is genuinely a mess. Is that a problem?
No. Inconsistent columns, mixed date formats, stray quotes, rows with the wrong field count and three spellings of the same city are the normal starting condition. If the file is so far gone that cleaning it honestly is not possible, you will be told that instead of being sold a job that cannot work.
Start here
Email tim@leuklogic.com with one sentence about your list - what it is, roughly how many rows, and what a duplicate means to you. You will have a fixed price and a delivery date the same day.