Short answer: CSV enrichment takes a file you already have — names and companies, or LinkedIn URLs, or just domains — and fills the empty contact columns. You upload the file, map which column is which, and get the same rows back with a work email and a direct phone added where one exists. The rows that match nothing come back untouched and are not charged, which is what makes it safe to run on a messy list.
What your file needs to contain
Enrichment is a matching problem, so the quality of the match depends entirely on what you give it. Three input shapes work, in descending order of hit rate: For more details, see our guide on B2B Data Enrichment: Find Missing Phone Numbers with CSV Upload.
- A LinkedIn profile URL per row. The strongest key there is — it identifies one person unambiguously, so there is nothing to guess.
- Full name plus company domain. Nearly as good. The domain is what makes it work; a company name alone is ambiguous, because there are a dozen plausible "Acme Inc".
- Company domain alone. Then the question changes from "reach this person" to "who at this company matches my criteria", and you pick the titles you want rather than naming individuals.
What does not work is a first name and a company name with no domain. If that is all you hold, resolve the domain first — a company lookup by name does that step on its own.
Preparing the file, in practice
- One person per row. Two contacts in a single cell cannot be matched; split them first.
- Separate first and last name if you have them separately. A single "full name" column works, but initials and suffixes resolve worse.
- Strip the tracking parameters from LinkedIn URLs. Keep the
/in/slugform; the long query strings a browser adds do not help and sometimes break the match. - Leave your own columns in. They come back in the same order, so whatever you already had — account owner, deal stage, notes — survives the round trip and you are not re-merging files afterwards.
- Deduplicate before, not after. Paying to enrich the same person twice is the most common waste in a bulk run.
What comes back, and what the hit rate really is
This is the part most enrichment pages leave vague, and it is the only part you can plan on. Measured across all exports: a work email is returned for 36.3% of rows, and 10.0% of rows have an address confirmed by an accepted delivery. The gap between the two is addresses that pass the mailbox check but have not been sent to yet.
So a 1,000-row file is realistically a 360-address list. Phone numbers are thinner than email everywhere, ours included — a direct number is a bonus on the rows that have one, not the basis of a calling plan. Every row carries a status (valid, risky, not found) so you can filter before import rather than discovering the bad rows in your sender's bounce report.
Rows where nothing is found are not charged. That is what makes a doubtful list cheap to test: run 50 rows of your own ICP, count what returns, and decide then.
Why rows come back empty
Usually one of four reasons, and it is worth knowing which, because two of them are fixable on your side:
- The key was too weak — a name and a company with no domain. Fixable: resolve the domain and re-run.
- The person changed employer. The address at the old company may still resolve and be useless. The live profile is the authority on where someone works now; a stored database is only as fresh as its last pass.
- The company publishes nothing. Small firms routing everything through one shared inbox have no per-person address to find.
- The address exists but the mailbox server refuses to confirm it. Some providers accept everything and tell you nothing — those rows come back flagged risky rather than valid, and that flag is doing its job.
Where enrichment sits in the workflow
Three jobs are commonly confused and priced differently. Enrichment fills gaps in a list you already hold. Verification re-checks addresses you already have, which is the right step before a send to an old list rather than the way to build a new one. And building a list from scratch is a search problem, not an enrichment one — that is the LinkedIn email finder or a lead search, depending on whether you start from LinkedIn or from criteria.
For a recurring pass over the same CRM, the API does the same job without the upload step — see the enrichment API.
Frequently asked questions
Can I enrich a CSV with phone numbers only?
Yes, and it is worth doing as its own pass if the phone is what you actually need, because email and phone are charged separately and the coverage differs a lot between them.
How large a file can I upload?
There is no row limit on the upload path — the limit is the credits you want to spend. The 2,500-row cap people run into is LinkedIn's own limit on one search, and it applies to exporting from LinkedIn, not to enriching a file you already have.
Do I need a LinkedIn or Sales Navigator subscription?
Not for CSV enrichment. The upload path never touches your LinkedIn session. A seat is only needed to export from a LinkedIn or Sales Navigator search.
Will my own columns survive?
Yes. The file comes back with your columns intact and the new ones appended, in the same row order, so nothing has to be merged back by hand.
What does a row with no match cost?
Nothing for the enrichment. You see the row with an empty contact column and a status explaining why, which is itself useful when you decide what to feed the next pass.
One at a time is the slow way. Export the whole CSV at once.
Scrupp runs the whole CSV in one pass and returns every row — name, title, company, verified email and phone in one CSV. A work email comes back for about 36% of rows, each one checked against the mailbox server before it reaches your file. Rows where no address is found are not charged.