Enrich your own CSV
Upload a list of people you already have and let Ken match each row to a verified contact profile, adding emails, job titles, company data, and seniority signals automatically.
Overview
Import Contacts is the CSV path for bring-your-own lists. If you have a list you care about - event attendees, a CRM export, a conference roster, a partial scrape - you can upload it and Ken will match each row against its 280M+ person database, fill in the missing fields, and add those contacts to your campaign.
It lives inside a campaign, not at the workspace level. To reach it, open any campaign, click the Actions tab, then select Import Contacts from the Data Sources group in the left sidebar.
The same flow is also available inside the campaign-creation wizard: at the "Choose Data Source" step, select CSV Upload instead of Leads Database.
Before you start
- You need an active campaign. Import Contacts is a per-campaign action - you cannot run it without one.
- Your CSV must have at least one recognized name or identity column. The parser accepts many header spellings (see "How it works" below), but will reject a file that has none at all.
- Required for the best match quality: at minimum, first name, last name, and either a company name, a company domain, or a LinkedIn URL. A domain beats a company name for precision.
- File size limit: 10 MB. Row limit: 50,000 rows per file.
- File format:
.csvonly. Excel.xlsxfiles are not accepted - export to CSV first.
How to import and enrich your CSV
Step 1 - Open Import Contacts
- Open the campaign you want to add contacts to.
- Click the Actions tab in the campaign header.
- In the left sidebar, under Data Sources, click Import Contacts.
The panel opens with a drag-and-drop zone and a Previous Uploads section (collapsed by default) that shows files you have uploaded to this campaign before.
Step 2 - Upload your file
Drag your .csv file onto the upload zone, or click Click to upload to browse for it. The panel accepts files up to 10 MB.
A progress bar shows the upload status. Once the file reaches 100%, the panel automatically reads the header row and transitions to the column-mapping step.
Step 3 - Map your columns
The Map Columns view shows two columns side by side: Your File on the left (the column headers from your CSV) and Mapped Field on the right (the field in Ken's contact model each column maps to).
Ken auto-suggests mappings based on your header names. Review each row and correct any that are wrong using the dropdown on the right side. You can map a column to "Skip" if you do not want to import it.
A sample value from the first data row appears below each header so you can confirm the mapping is correct.
Common fields you can map:
- First Name, Last Name (or Full Name)
- Company Name or Company Domain / Website
- LinkedIn URL or LinkedIn URN
- Email Address
- Job Title, Phone Number, Location
When the mappings look right, click Import [N] rows at the bottom of the panel.
Step 4 - Wait for enrichment
After you click Import, a success toast confirms the import was queued:
"Import started for X rows. Dedupe runs first, then enrichment continues automatically in the background."
Enrichment runs in the background. You do not need to stay on the page - you can navigate away and the job continues. Check the Leads tab of the campaign to see contacts appearing as they are processed.
How it works
When you submit the file, Ken runs a five-tier identity-resolution cascade on every row. Each tier uses the strongest available signal from that row, and the first tier that finds a match wins - no weaker tier runs after.
| Tier | Signal used | Confidence | |------|-------------|------------| | 1 | LinkedIn URL or URN | High | | 2 | Name + company domain (resolved to company ID) | High | | 3 | Name + company name (fuzzy) | Medium or Low | | 4 | First name + last name only | Low | | 5 | Full name text search | Low |
Confidence labels reflect how the match was made, not just how well the text scored. A LinkedIn-URL match is high confidence even with a low text score. A fuzzy full-name match is low confidence even with a high one - full-name fuzzy is where false positives live.
Why domain beats company name: If your row has a domain like acme.com, Ken resolves it to an internal company ID first, then matches name against that exact ID. This sidesteps misspellings ("Acme," "Acme Inc.," "Acme Corp.") and is significantly more precise than matching on the string.
After matching, verified emails, job titles, seniority, decision-maker flags, experience history, and job-change signals are written back to the contact. Duplicates are removed automatically.
Scale guardrails: rows process in batches of 100 with at most 15 concurrent lookups, up to a hard limit of 50,000 rows per file. A malformed row becomes one unmatched result - it never fails the rest of the upload.
Troubleshooting & debugging
Symptom: "400" error on upload or file is immediately rejected.
Likely cause: the CSV has no recognized columns in its header row.
What to check: open the file and confirm the header row exists and is not blank. Verify at least one column uses a spelling Ken recognizes (e.g. first_name, firstname, first; last_name, lastname; company, company_name; linkedin_url, linkedin, url; domain, company_domain). Rename non-standard headers to a recognized spelling and re-upload.
Symptom: "Failed to read file" toast after upload.
Likely cause: the file is not valid CSV (it may be an Excel file saved as .csv with formatting artifacts, or a tab-delimited file).
What to check: open the file in a plain text editor and confirm it uses commas as delimiters and has a clean header row. Re-export from your source system as standard CSV.
Symptom: Mapping step shows no recognized fields in the dropdown.
Likely cause: the import field definitions failed to load.
What to fix: refresh the page and try again. If the issue persists, check for network errors in the browser console against /v1/upload/campaign/import-fields.
Symptom: Many rows appear in the Leads tab but most are missing emails or titles.
Likely cause: those rows matched on name-only (tier 4 or 5), which is low confidence. Low-confidence matches may not have a verified email if the database entry is sparse.
What to fix: add a company_domain column to your CSV and re-upload. Domain-based matching (tier 2) finds the right company record by ID, which greatly improves email verification rates. Alternatively, add LinkedIn URLs for the rows you care most about.
Symptom: The import toast appeared but no new contacts show in the Leads tab after several minutes. Likely cause: a large file (tens of thousands of rows) takes time to process. What to check: enrichment runs as a background job. Check back after a few minutes. If contacts still do not appear after 10+ minutes, check the campaign's Previous Uploads list - if the filename appears there, the upload was accepted. Contact support if no contacts appear after 15 minutes.
Symptom: Toast says "X rows skipped" alongside the success count. Likely cause: those rows had validation errors (e.g. a field value that does not fit the target field type). What to check: this is expected for CSVs with mixed data quality. The valid rows are still imported. If you need all rows, export the original file, fix the flagged values, and re-upload only the corrected rows.
Symptom: Import appears to succeed but the same contacts appear twice in Leads. Likely cause: duplicate removal runs on a per-import basis. If the same person was already in the campaign from a prior import or a people search, they should be deduplicated, but this can occasionally miss matches where the name spelling differs significantly between sources. What to check: use the Leads tab filters to find duplicates by email address or LinkedIn URL.
Symptom: The CSV upload option is not visible in the Actions sidebar. Likely cause: the campaign may still be in a draft state, or the user role does not have edit access. What to check: confirm the campaign is past the creation wizard and visible in the campaign list. Confirm the logged-in user has edit access to the campaign's client workspace.
FAQ
What columns does my CSV need? At minimum, one recognized identity column - first name + last name, full name, or LinkedIn URL. For the best results, include first name, last name, and either a company domain or a LinkedIn URL. Company name works but is less precise than a domain.
My CSV headers use custom names. Will it still work? Yes, but you will need to remap manually. Ken auto-suggests mappings based on common header spellings, but the mapping step lets you assign any column to the correct field regardless of the original header.
How long does enrichment take? Small files finish within a minute. Files near the 50,000-row limit can take 10 to 15 minutes. Enrichment runs in the background - you do not need to keep the page open.
Will uploading the same person twice create duplicates? Deduplication runs automatically. Contacts already in the campaign are skipped. Overlapping rows across two uploads are also deduplicated.
What happens to rows that match no one in the database? They are still added as contacts with whatever data your CSV contained, but without enriched fields. You can see them in the Leads tab - they will have the original CSV values only.