Import from a file
You can add leads in bulk from the dashboard without writing code: upload a CSV file or paste a JSON list. An import goes through the same path as POST /leads/batch, so duplicates are merged exactly as they are for the API.
Open the import
Section titled “Open the import”- Go to Leads in the dashboard.
- Click Import, next to Filter and Export above the leads table.
- Choose JSON or CSV, add your leads, then click Import.
Owners and editors can import. A viewer’s import is refused with Viewer role cannot modify data (see Team Access).
Limits
Section titled “Limits”The dialog shows your limit: Max N leads per import.
| Plan | Leads per import |
|---|---|
| Free | 100 |
| Pro | 500 |
| Scale | 500 |
To import more, split your file and import each part. Every new lead counts toward your plan’s lead limit; a lead merged into an existing one does not.
Click the upload area and pick a .csv file. The dialog reads it in your browser and shows how many valid leads it found (N valid leads ready to import) before anything is sent.
- The first row is the header. Column names are case-insensitive and surrounding spaces are ignored.
- Columns are separated by commas. Wrap a value in double quotes to include a comma or a line break, and write a quote inside a quoted value as
"". - Blank lines are skipped. Columns not listed below are ignored.
- If the file has more valid leads than your limit (rows missing
nameorsourceare not counted), the Import button stays disabled.
Standard columns
Section titled “Standard columns”name and source are required. A row without both is skipped.
| Column | Notes |
|---|---|
name, source |
Required |
email, phone, website, description, category |
|
address, city, state, postal_code, country |
|
latitude, longitude, rating, review_count |
Numbers. An empty, 0 or non-numeric value is left out. |
source_id |
Your own identifier, used to merge duplicates |
logo_url |
|
tags |
Separated by |, for example vip|q3-campaign |
name,source,email,city,tags"Beta, Ltd",referral,,Paris,Custom attributes, SIREN and do not contact cannot be set from a CSV file. Use JSON for them.
Google Maps scraper exports
Section titled “Google Maps scraper exports”A file with a title column is read as a Google Maps scraper export. Each row needs a title, which becomes the lead’s name, and source is set to google_maps.
| Export column | Lead field |
|---|---|
title |
name |
input_id |
source_id |
descriptions |
description |
phone, website, category |
same name |
thumbnail |
logo_url |
review_rating, review_count |
rating, review_count |
latitude, longitude |
same name |
complete_address |
address, city, postal_code, state, country, with address, city, postal_code, state and country columns as fallback |
emails |
email: the first address of a comma- or semicolon-separated list |
Paste a JSON array of leads, or a single lead object, into the text area. Each lead uses the same fields as Create Lead, so JSON can also carry tags, custom attributes, siren and do_not_contact. Give each lead a name and a source.
[ { "name": "Beta Ltd", "source": "referral", "tags": ["partner"], "attributes": [{ "name": "segment", "type": "text", "value": "enterprise" }] }]Duplicates
Section titled “Duplicates”Each lead is checked against your existing leads, as with the API (email, SIREN, source_id, then phone plus a similar name). When it matches, the existing lead is updated instead of a new one being created:
- Non-empty incoming values overwrite existing ones, except the name, the status and the map coordinates (latitude, longitude), which a merge never changes; fields you leave out are unchanged.
- Tags are added to the existing tags, never replaced.
- Custom attributes merge by name.
- Locked fields are never written.
- An import never lifts do not contact. A lead marked
"do_not_contact": truein JSON gets the opposition added.
The full rules are in Deduplication.
Result
Section titled “Result”When the import finishes, the dialog closes, the leads table reloads and a message shows Imported X/Y leads. X counts new and merged leads. The message is red when at least one lead failed; the others are saved. The dashboard does not list which rows failed or why. To see per-lead results, send the same leads to POST /leads/batch, which returns an errors entry for each failed lead.
A lead can fail when your plan’s lead limit is reached, or when its data is refused, for example an invalid SIREN.
Scoring rules run on every imported lead, and your webhooks receive leads.created for new leads and leads.updated for merged ones.
Errors
Section titled “Errors”| Message | Cause |
|---|---|
| No valid rows found | The CSV has no row with name and source, or no title for a Google Maps export. |
| Max N leads per import | The JSON list is longer than your plan’s limit. Nothing is imported. |
| Import error | Nothing is imported. The details give the reason: the JSON is not valid, a website or logo_url is not an absolute http(s) URL, the import is larger than 10 MB, or you are a viewer. |