Uploading contacts
Contacts enter Kai through a CSV upload. Think of your file as a company list with a contact inside each company, not just a people list. The richer the company data, the better Kai's research and the sharper the outreach it writes.
What Kai actually needs
Kai's research engine starts with the company, not the person. It crawls the company website, pulls recent news, reads the tech stack signals, and builds a picture of what this business is doing right now. Only then does it personalise the outreach to the individual. So while the contact fields (name, email, title) are required to send, the company fields (website, signals) are what make the sequences worth sending.
Required and recommended columns
| Field | Required | Column names Kai recognises automatically |
|---|---|---|
| First name | Yes | first_name, First Name, firstname, fname |
| Last name | Yes | last_name, Last Name, lastname, lname |
| Yes | email, Email, email_address, work_email | |
| Company | Yes | company, Company, company_name, Account, Organization |
| Job title | Yes | title, Title, job_title, position, role |
| Company website | Strongly recommended | company_url, website, domain, Website, company_website |
| LinkedIn URL | Recommended | linkedin_url, LinkedIn, linkedin, profile_url |
| Phone | Optional | phone, Phone, mobile, phone_number |
Kai's column mapper reads your CSV header row and matches columns to the fields above automatically. If a column name is not on this list, Kai treats it as an intent signal rather than discarding it, which is the right default for most exports from tools like Clay, Apollo, or HubSpot.
Intent data
Intent signals are extra pieces of information about a prospect that indicate buying intent, relevant behaviour, or useful context. They are not required, but when present they make Kai's outreach meaningfully more specific.
Examples of intent signals that belong in your CSV:
- Technology used: Marketo, Pardot, HubSpot
- Funding event: Series B, $12M raised Q1 2026
- Hiring signal: hiring demand gen manager
- Content engagement: downloaded AI report, visited pricing page
- Competitor used: Turtl, Foleon competitor
- ICP score or tier: A, 87, tier 1
- Job change: joined 3 months ago
- Event attended: Content Marketing World 2025
How to include intent data in your CSV
Add intent signals as extra columns in your CSV. The column name becomes the label and the cell value becomes the signal. You do not need to use special names: Kai's column mapper recognises intent-flavoured words automatically (including: intent, competitor, trigger, signal, visit, score, mover, funding, tech, stack, tool, technology, industry, event, activity, engage, source, stage, health) and pre-selects Intent signal in the column type dropdown.
For any column Kai does not recognise as a standard field, it defaults to Intent signal rather than discarding the data. This means if your Clay or Apollo export has extra enrichment columns, they will all carry through into Kai's research context without any extra configuration.
Standard fields mapped automatically. Intent signals shown in indigo. You can change any column type using the dropdown.
Changing a column type manually
In the column mapping screen, every column has a dropdown showing its detected type. You can change any column from Intent signal to Skip (to exclude it entirely) or to one of the standard fields if Kai mapped it incorrectly. You can also change a standard-mapped column to Intent signal if, for example, your export has a column called "notes" that contains contextual information you want Kai to use.
How Kai uses intent data
Intent signals are stored against the contact and passed to Claude as part of the research context when generating the sequence. If a contact has a funding signal, Claude may reference the round in the hook or angle the value proposition toward growth. If they are using a specific technology, Claude may position Foleon's integration story or contrast with that tool. The signals do not guarantee a specific angle, but they give Claude the raw material to write something more timely and relevant than generic copy.
Intent signals are visible in the contact card in Kai, shown as badges below the contact's name and title. This lets you see at a glance what signals Kai had available when it wrote the sequence.
Uploading the file
Go to Campaigns in the sidebar and select the campaign you want to add contacts to.
The button is in the top right of the campaign contact list. This opens the file picker and column mapping screen.
Check that standard fields have been mapped correctly and that intent columns have been detected. Change any that are wrong using the dropdown on each column row.
Contacts are added with status Pending. Research and sequence generation start when you click Run in the campaign view.
Duplicate handling
Kai checks for duplicate email addresses within the same workspace before inserting a contact. If a contact with that email already exists in the campaign, the upload skips them silently. Contacts in different workspaces are not treated as duplicates.
Status flow after upload
- Pending -- Uploaded, not yet researched
- Researched -- Firecrawl has crawled the company and Claude has distilled the data
- Pending Approval -- Sequence written, waiting for review in Approvals
- Approved -- Reviewed and approved, ready to push
- Injected -- Pushed live to Lemlist, sequence running