Help center

How can we help?

Bulk import from a spreadsheet

Drop in any ATS export — an AI agent reads the file end-to-end, maps every column, deduplicates, and shows its reasoning before anything is saved.

Bulk import from a spreadsheet

The fastest way to load a long list of candidates exported from Greenhouse, Lever, Ashby, Workable, Recruitee, Teamtailor, LinkedIn Recruiter, SeekOut, Gem, or any in-house tool.

There is no manual column mapping anymore. You drop in the file, an AI agent reads it, and you review the result.

How it works

  1. Drop in a file.xlsx, .xls, .csv, or .tsv, up to 10 MB / 150 rows per file today. Larger files will land in a later release.
  2. The agent runs — a high-reasoning model reads the whole sheet (headers, sample values, column stats) and decides, per row, what belongs in which canonical field. It also flags duplicates against candidates already in this role.
  3. Review — every row is shown with the extracted fields, the agent's confidence, the columns it used, and a short reasoning note. Duplicates, low-confidence rows, flagged rows, and any "extra" fields the agent proposes are filterable from the top of the panel.
  4. Edit or accept — fix any field inline, accept or reject proposed schema extensions in one click, then import the rows you're happy with.

Nothing is written to your candidate list until you click Import.

What the agent extracts

The agent always tries to fill these canonical fields when the data is present:

  • Full name, first name, last name
  • Email, phone
  • LinkedIn URL, portfolio / personal site
  • Current title, current company, location
  • Headline, seniority, years of experience
  • Source (where you found them) and stage (where they are in your pipeline)
  • Tags
  • Free-text notes

Anything that doesn't fit a canonical field is preserved as a structured "extra" on the candidate, so nothing in your export is lost.

Schema extensions

If your export contains columns we haven't seen before (e.g. "Visa status", "Salary expectation", "Loom intro link"), the agent will propose them as new fields. A banner at the top of the review table lets you accept them — they'll attach to the imported candidates as structured extras — or reject them, in which case they're ignored.

Deduplication

Each row is matched against existing candidates in this role by:

  1. Email (case-insensitive)
  2. LinkedIn slug (the part after linkedin.com/in/)
  3. Name + company when the agent has high confidence

When a match is found you'll see a Dupe badge. Importing a duplicate merges new fields into the existing candidate — fields you've already edited are preserved.

Filtering the review table

Use the chips above the table to focus on what needs attention:

  • All — every row
  • Low confidence — rows the agent was unsure about
  • Flagged — rows the agent couldn't parse cleanly (bad email format, missing name, etc.)
  • Dupes — rows that match an existing candidate
  • Extras — rows that include a proposed new field

Limits & quality

  • 150 rows / 10 MB per file in this phase. For larger exports, split the file.
  • Quality is measured against a fixture pack covering Greenhouse, Lever, Ashby, LinkedIn Recruiter, and pathological in-house CSVs. We ship prompt changes only when overall precision and recall stay above our internal bar.

Privacy

  • Parsing happens in your browser. The file is not uploaded until you start the import.
  • The agent runs on our servers in your workspace context. Only the cells of rows you import are written to your candidate list.

Troubleshooting

  • "The agent skipped my column" — open the row, look at the reasoning note, and edit the field inline. If a whole column is missing, that's usually a sign the header was ambiguous (e.g. "Notes 2") — rename it in your sheet and re-upload.
  • "Wrong duplicate match" — click Skip on that row. The existing candidate is untouched.
  • "My export is over 150 rows" — split the file. We're lifting this in a future release.

See also

Still stuck?

Didn't answer your question?

Contact support →