Blog Open the app

How to Match an Apollo, ZoomInfo, or LinkedIn Sales Nav List Against Your CRM (Before You Import)

July 15, 2026 · 11 min read · Written by Sam Kale

Every quarter, an SDR pulls a fresh list out of Apollo, ZoomInfo, or LinkedIn Sales Navigator. It matches the ICP, the titles look right, and the plan is to import it into Salesforce or HubSpot on Monday.

Then Monday happens. The AE assigned to Acme Corp gets an alert that an SDR just enrolled her account in an outbound cadence. A closed-won customer receives a "have you considered our product?" email. Duplicate accounts pile up because "Acme, Inc." in the import doesn't quite match "Acme Corporation" in Salesforce. The RevOps lead spends the rest of the week firefighting.

The fix isn't better native duplicate rules — those aren't going to catch fuzzy company name variations any time soon. The fix is a pre-import pass with fuzzy matching that segments the prospect list into what's safe to import and what isn't.

Why Prospecting Lists Overlap With Your CRM

Apollo, ZoomInfo, and LinkedIn Sales Navigator all work off giant contact and company databases. When your SDR builds a list matching "SaaS companies, 50-500 employees, engineering leaders in the US," the tool returns everyone in its universe who matches. That set will include:

The first four groups are the ones you don't want SDRs cold-emailing. The fifth is the whole point of the exercise. On the average B2B sales org, 20-35% of any freshly-pulled prospecting list falls into groups 1-4.

The awkward test: If your SDR imported a 5,000-record list today, how many of your existing customers would receive an outbound "intro to our product" email this week? For most orgs the answer is somewhere between "a few" and "a lot" — and it's the ones you find out about that are the worst.

Why Native CRM Duplicate Detection Doesn't Save You

Salesforce, HubSpot, and every other CRM has a duplicate rule engine. On paper, it should catch this. In practice, it catches exact matches and misses the interesting cases:

None of those are edge cases. All of them are common. That's why RevOps teams end up doing pre-import matching outside the CRM.

The Approach: Two Passes, Account First Then Contact

The workflow that works is a two-pass fuzzy match:

  1. Pass 1 — Account match. Compare each prospect's company to your existing Accounts (or Companies) in the CRM. Flag matches as "existing account."
  2. Pass 2 — Contact match. For the prospects whose company is a match, additionally check whether the person is already a Contact/Lead on that account.

This gives you three clean buckets by the end:

Step 1: Export Both Lists to CSV

Export from Apollo / ZoomInfo / LinkedIn

Whichever prospecting tool you're using, export the list you want to import. Standardize on these columns before matching:

LinkedIn Sales Navigator exports are the messiest because Sales Nav doesn't officially support bulk export — most teams use a third-party tool (Evaboot, Wiza, Bardeen) or the Recruiter data export. Whatever you use, land the same columns.

Export from your CRM

Two exports:

  1. Accounts (or Companies in HubSpot): account_id, account_name, domain (or website), country, owner, type (Customer / Prospect / Partner), lifecycle_stage.
  2. Contacts + Leads: contact_id, account_id, first_name, last_name, email, title, status.

Include closed-lost and dormant contacts. The whole point is to catch prospects who have any prior history.

Step 2: Match Accounts First

Upload both files to a fuzzy matching tool. On the left: your prospecting export. On the right: your CRM Accounts. Configure the match like this:

Column pairingWeightNotes
Prospect company_domain ↔ CRM domain45%Domain is the strongest signal — hard to spoof, easy to normalize.
Prospect company_name ↔ CRM account_name35%Handles cases where the domain differs (subsidiaries, rebrands).
Prospect country ↔ CRM country10%Prevents matching a US company to its European namesake.
Prospect employee_count ↔ CRM size10%Optional tiebreaker — if you don't track size in the CRM, drop it.

Set match mode to company so the matcher normalizes legal suffixes (Inc, Corp, GmbH, Ltd, Pty Ltd, etc.) and handles common abbreviations.

Run the match. Every prospect row now has a best-guess CRM account plus a similarity score. In practice:

Step 3: Filter by CRM Account Status

Now that you know which prospects overlap with existing accounts, apply your routing rules. A typical split:

CRM account statusWhat to do with the prospect
Customer (active)Do not import. Route to CSM/AM if the contact is new.
Customer (churned)Do not import to outbound. Route to win-back campaign or the prior AE.
Open opportunityRoute to the opportunity owner. They decide whether to add the contact.
Recent lead / prospect (last 12 mo.)Route to the existing account owner. Do not enroll in cold outbound.
Dormant / no ownerFair game for SDR outbound — but attach to the existing account, don't create a duplicate.
No CRM matchNet-new. Import and route to SDR queue.

The routing table is where RevOps earns its keep. It's worth codifying it once, sharing with sales leadership, and applying it programmatically to every list import going forward.

Step 4: Match Contacts (Second Pass)

For prospects whose company matched an existing account, run a second, narrower fuzzy match: person against the existing contacts/leads at that account.

Configuration:

Prospects with a contact-side match score of 85+ are already in the CRM; skip them. Prospects with a score below 85 are new contacts at an existing account — route them per the table above.

Step 5: Prepare the Import File

At this point the original prospecting list is split into three CSVs:

  1. do_not_import.csv — existing customer contacts, do-not-touch. Keep for audit.
  2. route_to_owner.csv — new contacts at existing accounts. Send to the account owner with the source (Apollo / ZoomInfo / LinkedIn) noted. Owner decides.
  3. net_new_import.csv — safe for outbound. Import to CRM, route to SDR queue.

Only net_new_import.csv goes through the normal import path. The other two either get filed away or handed to specific owners.

One important detail: for the route_to_owner.csv file, include the matched CRM account ID alongside each prospect. When the owner decides to add the contact, they can attach it directly to the existing account without creating a duplicate. This one column saves hours of cleanup later.

How Often to Do This

Every prospect list before it hits the CRM. That's the rule.

SDRs typically pull lists weekly or biweekly. A pre-import fuzzy match on each one takes 15-20 minutes once the workflow is set up. That's a small tax to avoid the two much larger costs it prevents: cold-emailing customers, and cleaning up duplicate accounts every quarter.

Some RevOps teams automate this end-to-end — a Zapier/Make/n8n flow that watches a Google Drive folder for new prospect CSVs, runs them through the fuzzy matcher, and drops the split files into three destination folders. Whether you automate it or run it manually, the same principle applies: the list gets matched before it gets imported.

Common Mistakes to Avoid

Trusting the CRM to catch it. If your team's plan is "import it, and Salesforce duplicate rules will flag anything." that's the plan that leads to a marketing incident. Native rules only catch exact matches. Fuzzy matching outside the CRM is the only reliable safeguard.

Matching only on company name. Company names are noisy. Domains are structured. Anchor the match on domain first, name second — not the other way around.

Forgetting closed-lost. A prospect who went dark 8 months ago is not a net-new lead. Include closed-lost opportunities and dormant leads in the CRM-side export.

Assuming personal emails imply new contacts. If Apollo returns jane.smith@gmail.com and your CRM has jsmith@acme.com for the same "Jane Smith, VP Engineering" at Acme — that's the same person. Match on name + title + company, not just email.

Not saving the "matched" CSV. The do_not_import.csv and route_to_owner.csv files are your audit trail. Save them. Next quarter, when someone asks "why aren't we outbounding Acme?" you can show them.

Bottom Line

Prospecting tools return the whole universe of ICP-matching contacts — and that universe overlaps heavily with anyone your team has ever talked to. Native CRM duplicate detection catches maybe 30% of the overlap. The other 70% either creates a duplicate account or drops a customer into a cold outbound cadence.

A 20-minute fuzzy match before import fixes it. Match domain + name for accounts. Match name + email domain + title for contacts. Split the list into three buckets and route each one correctly. That's the difference between a growing pipeline and a Monday morning apology email.

Related Reading

Have a prospecting export sitting in a folder waiting to get imported? Match it against your CRM in a few minutes with fuzzy matching on domain + company name + person. Free for 500 rows, no signup.

Try DedupFuzzy Free