Import CSV
Bulk load customers from CSV — required columns, mapping, validation, best practices.
CSV import is the fastest way to populate LealUp on day one, especially if you're migrating from Gainsight, ChurnZero, Planhat, or just a spreadsheet.
When to use it
- Initial onboarding — import your entire book (20–2000 customers in minutes).
- Migrating from a previous CS tool — export → import is the universal path.
- Bulk update — change owner on many customers at once, update tier, etc.
- Backfill of custom fields — populate a new field for the whole book.
Where
Admin → Customers → Import CSV
Requires admin or director role.
Required columns
Your CSV must have at least these columns (case-insensitive, we accept multiple common names):
| Column | Accepted alternatives | Type |
|---|---|---|
name | customer_name, company, account_name | text |
email_domain | domain, primary_domain | text |
arr | arr_usd, annual_revenue, acv | number |
owner_email | csm_email, csm, owner |
Recommended optional columns
| Column | What for |
|---|---|
status | Active, Trial, Churned, Paused (default: Active) |
renewal_date | ISO 8601 date (YYYY-MM-DD) |
country | ISO 3166 code (CL, MX, BR, US, etc.) or name |
segment | value that matches your segment configuration |
tier | Platinum / Gold / Silver / Bronze |
industry | Fintech / Retail / Healthtech / etc. |
created_at | when the customer started with you (defaults to today) |
Custom fields
Any column prefixed with cf_ is treated as a custom field:
cf_tier→ maps to thetiercustom field.cf_acv_target_usd→ maps toacv_target_usd.
The field must be created beforehand in Admin → Custom fields. If it doesn't exist, LealUp offers to create it during import.
Wizard flow
- Upload file — max 10 MB,
.csvformat (UTF-8 recommended, also supports latin-1). - Preview — LealUp shows the first 10 rows, auto-detects headers.
- Mapping — CSV columns ↔ LealUp fields. Auto-suggests, but you can override.
- Validation — errors and warnings per row:
- Invalid email → error (row skipped).
- Non-numeric ARR → error.
- Domain duplicate with existing customer → warning (option: skip / update / merge).
- Non-existent custom field → warning (option: create or skip).
- Dry-run report — summary: "Create X, update Y, skip Z". Downloadable as a log.
- Confirmation — click "Import".
- Background processing — for big CSVs (>500 rows), it runs async. Notification on finish.
Minimum CSV example
name,email_domain,arr,owner_email
Acme Inc,acme.com,145000,[email protected]
Globex,globex.io,80000,[email protected]
Initech,initech.cl,32000,[email protected]Example with optional and custom fields
name,email_domain,arr,owner_email,renewal_date,segment,cf_tier,cf_industry
Acme Inc,acme.com,145000,[email protected],2026-06-15,Enterprise LATAM,Platinum,Fintech
Globex,globex.io,80000,[email protected],2026-08-20,Mid-Market,Gold,RetailValidation in detail
Errors (row is not created)
- Owner email doesn't exist in the workspace as an active user.
- Non-numeric or negative ARR.
- Empty domain when it's a required column.
- Wrongly-formatted date (
renewal_datemust be ISO 8601). - DROPDOWN value out of range (e.g.,
tier: Ultrawhen you only have Platinum/Gold/Silver).
Warnings (row is created with reservations)
- Duplicate domain — a customer with that
email_domainalready exists. Choose: skip (default), update (merge fields), or create-anyway (rare). - ARR = 0 — created but flagged as "no ARR".
- Unrecognized country — created but flagged.
Info (non-blocking)
- Customers in
Trialwith ARR — OK, feeds the tier/plan calculation. - Name duplicates — if there's no domain but there is a name, warning "possible duplicate".
Matching existing customers
When importing, LealUp searches in order:
email_domainexact match.external_id(if you're setting it via anexternal_idcolumn).- Fuzzy name match (threshold 90%).
If there's a match, it offers options:
- Skip — don't touch.
- Update — update fields that are empty in LealUp with values from the CSV.
- Overwrite — overwrite with CSV values (destructive, requires confirmation).
Bulk update
If your CSV has only customers that already exist (all match), the flow is effectively a bulk update:
- All new ARRs overwrite the old ones.
- New owner_email reassigns ownership.
- Custom fields get updated.
Useful for:
- Updating ARR after an annual RevOps exercise.
- Massively reassigning a book when a CSM leaves.
- Updating a new field for the whole portfolio.
Rollback
If after the import you find an error:
- Admin → Audit log → Filter by "bulk_import" → find the import ID.
- Undo import → reverts every change in that operation.
Window: 24h from the import. After that, manual.
Migrate from Gainsight / ChurnZero / Planhat
Suggested process:
1. Export from the previous tool
- Gainsight: Companies → Export (full CSV with custom fields).
- ChurnZero: Accounts → Export.
- Planhat: Companies → Export.
- Custify: Customers → Export.
2. Clean the CSV
- Rename columns to LealUp's standard names (or map in the wizard).
- Remove columns you don't care about (simpler).
- Verify date formats (ISO 8601).
3. Import with dry-run
- First pass: dry-run only (no commit).
- Review errors and warnings calmly.
- Adjust the CSV or mapping.
4. Real import
- Commit it.
- Sample-check customers (pick 3–5 random ones and verify everything's fine).
5. Complement with integrations
- Connect Gmail/Calendar → the timeline rebuilds going forward (no historical import).
- Connect Zendesk/Jira for support.
- Optional: import historical events via
POST /v1/ingest/eventsbatch.
6. Recreate playbooks
- Playbooks don't migrate automatically (different logic between tools).
- Start with LealUp's 5 seeded playbooks and adapt.
Common issues
"UTF-8 breaks with Latin characters"
- Save the CSV as UTF-8 with BOM.
- If your CSV comes from Excel, use "Save As → CSV UTF-8".
"LealUp says 'too many errors'"
- If >25% of rows fail, the import pauses to review.
- Download the log, fix the CSV, retry.
"Import got stuck in processing"
- Large CSVs (>5000 rows) run async.
- Admin → Audit log → Imports — see status.
- If it stayed "processing" >2h, contact support with the import ID.
"Customers without owner"
- If an
owner_emailfrom the CSV doesn't exist as an active user, the row fails. - Fix: create the users first in Admin → Team, then re-import.
Limits
- Max 10 MB per file (approx 50k rows with typical columns).
- Max 10 concurrent imports in queue per workspace.
- Columns: max 50 per CSV.
For larger volumes, contact support (Scale/Enterprise can use the POST /v1/admin/bulk-import endpoint directly via API).