Prompt

Dedupe a messy contact list

Time to build: 1 min
Difficulty: Easy
Tools: Claude ▪ Lusha

The short version: to dedupe a contact list built from several sources, paste the overlapping rows and Claude collapses them to one verified row per person.

A Claude prompt that takes overlapping contact lists and collapses them to one verified row per person. Claude handles the matching across versions. Lusha provides the canonical truth that picks which version is right.

Once Lusha is connected in Claude, the connector runs in the background — no special syntax needed. Just paste the merged list and run.

The example output below was pulled live via the Lusha connector on May 25, 2026. Contacts are real, masked to initials, with company names replaced by category descriptors. No emails or phone numbers are published.

The prompt

<context>
Contact list with duplicates: different rows represent the same person captured
at different times, in different systems, with different fields.
Collapse to one verified row per unique person.
</context>

<task>
1. Merged contact list (one row per line, whatever fields each row carries):
   [PASTE LIST]
2. Identify duplicates by matching on:
   email (strongest signal),
   LinkedIn URL (strongest after email),
   name + company combination,
   name + LinkedIn URL where company is unclear.
3. For each unique person, resolve the canonical record via Lusha:
   current company and title,
   validated email with confidence grade,
   validated phone with DNC status,
   job start date.
4. Collapse duplicate rows into one verified row. Where input fields conflict,
   Lusha's current employer is the source of truth.
5. Output a deduplicated table:
   Name | Current company | Current title | Email | Phone |
   Number of input rows merged | Conflicts resolved.
6. Summary at the top: total input rows, total unique people, total no-matches.
</task>

<constraints>
- Resolve in preview mode. Reveal emails and phones only after I confirm
  the deduplicated list looks right.
- Confirm the company domain matches before trusting a match. A misspelled
  company name can match a different organisation.
- Same name at two different companies is two different people. Do not merge
  by name alone.
- If Lusha returns no current record for a unique person, keep the
  best-available input fields and flag as no-match.
- When two input rows show the same person at different companies, the row
  whose company matches Lusha's current employer is correct. Flag the other
  row as stale.
- Do not invent fields. The deduplicated row uses verified data from Lusha or
  input fields, never guesses.
</constraints>

What you'll get back

Input: 8-row merged contact list. The same person appears multiple times in three cases — one with conflicting employer info, one with partial data, one with old versus current company. Two rows are unique. One row is designed to fail to match.

Output: 8 input rows collapsed to 5 unique people. 4 resolved against Lusha. 1 no-match.

PersonVerified companyVerified titleRows mergedConflict resolved
B.R.[Cloud data platform]Chief Financial Officer2Two emails on file: kept the company address, flagged the other as alternate
T.M.[Productivity SaaS]Global Head of Revenue Operations2Partial-data row merged with full-data row
S.P.[AI infrastructure SaaS]VP of Revenue Strategy and Operations2Two companies on file: the productivity SaaS was previous, the AI infrastructure SaaS is current
L.F.[Dev workflow SaaS]Head of Revenue Operations and Strategy1None (unique row, no duplicate)
T.W.——1No match: kept input, flagged for re-research

Names masked to initials and company identifiers replaced with category descriptors. Full records, including company names, emails, and direct dials, are returned inside your Claude session.

The S.P. row is the useful demonstration. Two input rows showed two different employers: one at a previous company, one at the current one. The prompt did not pick the wrong one or duplicate the contact. Lusha’s current employer is the source of truth, so the previous-company row collapsed into the current-company row with a stale flag.

What it cost: 1 credit. Contact search bills at 1 credit per batch of up to 25 unique people, so an 8-row list collapsing to 5 is a single batch. A 500-row list collapsing to 300 unique people would be 12. Revealing contact details is separate: 1 credit per email, 5 per phone, per person.

Dedupe before you enrich, not after. Enriching a list with duplicates means paying to reveal the same person twice. On a list with 20% duplication, that’s a fifth of your reveal spend on rows you will then merge and discard.

If a person comes back as no-match: check the company name on those input rows before treating it as a data gap. An abbreviated or misspelled company name can prevent a match, or match a different organisation entirely and return a confident-looking result for the wrong person.

Contacts verified live via Lusha connector, May 25, 2026.

Why use Lusha

Dedupe is two problems pretending to be one. Three things change when the matching layer and the truth layer are separated cleanly.

Claude handles the matching across rows. Fuzzy name comparison, LinkedIn URL canonicalization, email normalization, partial-data handling — all the work of recognizing that two rows under different spellings or partial data probably refer to the same person. That logic lives in language, not in a SQL join.

Lusha resolves which version is the truth. When two rows describe the same person at different employers, the matching layer can’t pick between them. The truth layer can, because Lusha knows which company that person works at now. Without verified data, the dedupe quietly keeps the wrong row half the time.

No-match rows stay in the output, flagged. A row Lusha cannot resolve doesn’t get silently dropped. It stays in the deduplicated list with a no-match flag, so the rep can re-research or archive it deliberately rather than discovering the gap later.

Data drawn from 515M+ verified contacts, sourced and processed under GDPR, CCPA, SOC 2 Type II, ISO 27001, ISO 27701, and TRUSTe Responsible AI. Full detail in the Trust Center and privacy notice.


FAQ

How do I dedupe a contact list with data from several sources?

Match first, then resolve. Matching is the language problem — recognising that “Rob Smith, Acme” and “Robert Smith, Acme Corp” are one person despite different spellings and partial fields. Resolving is the data problem — deciding which row is current when the two disagree about employer or title. Doing only the first leaves you with a clean-looking list built on whichever row happened to sort first.

How many credits does deduping a list cost?

1 credit per batch of up to 25 unique people. A 500-row list collapsing to 300 unique people costs 12, since you pay per person resolved rather than per input row. Revealing contact details is separate at 1 credit per email and 5 per phone. Deduping before enriching is what keeps that second number down.

What if the same person appears at two different companies?

That is the case worth running this for. Two rows showing different employers usually means one is stale rather than that there are two people. Lusha’s current employer decides it: the row matching the current company is kept, the other is flagged stale rather than merged blindly or kept as a second contact.

How does the prompt avoid merging two different people with the same name?

Name alone is never sufficient, and the constraints state that explicitly. Matching runs on email first, then LinkedIn URL, then name plus company. Two people with the same name at different companies stay separate rows. The risk with name-only matching is not just a merged record — it is a merged record with one person’s email and another’s phone number.

What happens to contacts that never matched anything?

They stay in the output with a no-match flag rather than being dropped. A silently removed row is worse than a flagged one, because nobody knows to go looking for it. Before re-researching, check the company name on those rows — a misspelling is a more common cause than a genuine coverage gap.

Is this the right prompt for cleaning a single CRM export?

Not quite. This one is built for overlapping lists from different sources. For a single export where the problem is decay rather than duplication, refresh stale CRM records is the better fit — it re-verifies each row against live data rather than collapsing rows together. Run dedupe first if the export has duplicates, then refresh.

Ready to run this?

One data connection. Works in Claude, ChatGPT, your CRM, or any agent you build.