Bulk lead import

Paste a list.
Drop a file.
Done.

Import 1,000 leads as fast as you can paste them. Headers auto-detected. Duplicates skipped with reasons. Phones normalised to E.164.

app.rookhq.com/w/acme/leads · Add lead

Paste list

name,email,phone,company,job title
Ava Patel,ava@acme.com,+14155551234,Acme,Head of Growth
Mia Sun,mia@kite.io,+919876543210,Kite,VP Sales
Bo Lin,,+447700900123,Northwind,Founder
Diego Torres,diego@nimbus.co,,Nimbus,CRO

Or upload CSV

Drag a CSV here

Up to 5MB · 5,000 rows

Importing leads should not be a project. It should be a paste.

Smart parsing

Headers it understands without asking.

Auto-detected column names

→ field 1

namefull namefirst name

→ field 2

emailemail address

→ field 3

phonephone numbermobile

→ field 4

companyorganizationorg

→ field 5

job titletitleroleposition

→ field 6

source

Honesty about errors

Per-row reasons when a row fails.

Bulk add result

Inserted, skipped, with the reason.

The bulk add modal closes only if every row landed cleanly. Otherwise it switches to a results view that lists exactly which row was skipped and why.

Fix the row, paste again. No silent failures.

Bulk add complete

412 added · 8 skipped

Added 412

Skipped 8

row 47: Duplicate email/phone for product

row 102: No email or phone

row 188: Duplicate email/phone for product

What lands in the database

Normalised, deduped, ready to send.

LeadStatus
AP

Ava Patel

Acme · ava@acme.com

new
MS

Mia Sun

Kite · mia@kite.io

new
BL

Bo Lin

Northwind · +447700900123

new
DT

Diego Torres

Nimbus · diego@nimbus.co

new

Ship-stoppers we handle

The real-world stuff.

Phone formats from anywhere

"(415) 555-1234" becomes "+14155551234". Powered by libphonenumber.

Empty rows

Skipped silently with a reason in the result.

Duplicate within product

Skipped, surface the row number so you can dedupe upstream.

Missing email AND phone

Rejected. A lead without either is a row of nothing.

Bring the list in. Ship the sequence.