Importing and Cleaning an External CSV


What it does: turns a messy export from Apollo, ZoomInfo, Clay, a CRM or LinkedIn itself into a clean Reachium lead list.

Run it when: the leads already exist somewhere else and you are not going to rebuild them here.

Time: 20 minutes for a few thousand rows.

Depends on: SOP 04, Choosing How to Build the List. Reachium's own scrapes land clean and never need this.




Before you start


The CSV exported and openable

The row count, so you can reconcile afterwards

A lead list created, or a decision to add to an existing one




The steps


1. Find the profile URL column by its values, not its header.

This is the single thing that goes wrong most. Every source names it differently, and some ship two columns that look alike. The right column is the one whose values look like linkedin.com/in/..., whatever the header calls it. A profile URL is required on every row; without it the row cannot be imported at all.


2. Map the rest of the columns by meaning.


Source

Profile URL column

Watch out for

LinkedIn Connections export

URL

Older exports have no job title and no phone

Sales Navigator via Evaboot

LinkedIn Url or Profile Url

Email only present if enriched

Sales Navigator via PhantomBuster

defaultProfileUrl or linkedinProfileUrl

profileUrl is often a sales/lead URL and will be skipped

Apollo

Person Linkedin Url

Company Linkedin Url is a company page and will be skipped

ZoomInfo

LinkedIn Contact Profile URL

Two phone columns, pick one

Clay or a CRM

whichever column holds /in/ values

Headers are whatever someone typed


The fields that carry over are profile URL, first and last name, email, company name, job title and phone. Everything else in the file is dropped, which is fine.


3. Split full names.

If the source has one name column, split on the first space: first token to first name, the rest to last name. Compound surnames and single-name profiles come out approximate, so expect a handful to need fixing later. At least one of first or last name must be present or the row is skipped.


4. Set aside the rows that cannot be imported.

Company page URLs, Sales Navigator lead URLs, and rows with an email but no profile URL. That last group is worth keeping in a separate file rather than quietly binning it: those people are real, they just need a profile URL before they can be reached on LinkedIn.


5. Do not bother normalizing URL formatting.

http versus https, a www or country subdomain, a trailing slash, tracking parameters on the end: all handled on import. Time spent tidying these is time wasted. Only the /in/ shape matters.


6. Import in batches of 500.

Three thousand leads is six batches, ten thousand is twenty. Re-sending a batch is safe, because rows are keyed on the profile URL and a retry after a lost response cannot duplicate anyone. No credits are charged; this is your own data.


7. Reconcile the count.

Compare the list total against the number of rows you sent. The difference is the skipped rows, and the response says which and why. Never report a list as fully imported without checking this. A 4,000-row file that landed 2,600 leads usually means the wrong URL column was mapped.


8. Know when to use the app instead.

Beyond roughly 10,000 rows, the importer in the app is built for the job and will be faster and safer than cleaning the file in a conversation.


9. Fix stragglers individually.

One lead with a typo'd company or a mangled name gets corrected in place. Do not re-import the whole file to fix six rows.




Do this / Not this


Do this

Not this

Identify the URL column by its values

Trust a header called "LinkedIn"

Apollo's Person Linkedin Url

Apollo's Company Linkedin Url

Reconcile list total against rows sent

Announce "all imported"

Keep the no-URL rows in a side file

Delete them silently

Batches of 500

One call with 4,000 rows

Name the list after the ICP

Name it after the file

Use the app importer past 10,000 rows

Grind through 40 batches




Done when


Every row mapped to profile URL, name, and whatever optional fields exist

Rows without a valid /in/ URL identified and set aside, not lost

All batches sent and the list total reconciled against the input count

Skipped-row count and reason known and reported

List named after the ICP, ready for a campaign


Powered by reachium.io