Docs
Importing contacts from CSV
How to import people into Loop from a CSV file — required columns, upload limits, and what the import status card means.
To import contacts, drop a .csv file into the Add leads dialog from People → Import (or the audience step of a loop). Only an email column is required — Loop auto-detects it, dedupes by email, and imports the rest of your file in the background so you can keep working.
What columns does Loop read from my CSV?
Only email is required. A few other columns map straight to fields on each person:
name,phone,company,role— these map directly to fields on each person.linkedin,instagram,notes, and any other column you include ride along as context Loop uses when it writes to people.
One important gotcha: an instagram column is context only. Adding it to your CSV does not connect or link the Instagram channel — that only happens through the actual Instagram connection in your channel settings.
If you're not sure what your file should look like, use Download template on the upload screen — it gives you a CSV with the recognized columns pre-filled.
How do I import a CSV?
- Open People, then click Import (or, from the loop-creation wizard, choose the CSV source in the Add leads dialog).
- Drop your
.csvfile, or click to browse for one. - Optionally give the import a List name. If you leave it blank, Loop names the list after your file.
- Loop checks the file client-side and shows you a preview — including a duplicate/skip summary — before anything is sent.
- Confirm the import. Loop uploads the file and the import continues to run even if you close the dialog.
- Click Use this list to attach the imported list to your loop (in the wizard), or let it land straight in People (standalone import).
What if Loop can't find an email column?
If Loop can't auto-detect which column holds email addresses, it doesn't reject the file. Instead, the confirmation screen lets you manually pick the column that holds email addresses before anything is imported.
What do the import status states mean?
Once you confirm an import, a status card tracks it:
- Importing your CSV — the import is running. The card shows a live progress bar (rows processed vs. total) and you can safely navigate away or close the dialog — Loop finishes the import in the background.
- Completed — you'll get a toast confirming how many people were imported (and into which list). In the wizard, a completed list is automatically attached to your audience.
- Failed — you'll get a toast explaining what went wrong, with the most common reasons below.
If some rows in your file don't import, Loop tells you exactly why instead of a generic "skipped" count — for example, rows skipped for an invalid email, rows missing an email entirely, or rows that failed to save. A duplicate email is not skipped — it's linked into the list you're building, since Loop dedupes your audience by email.
What are the file limits?
- Files over 5 MB are rejected — split a large export into smaller files and upload them one at a time.
- Files with more than 5,000 rows are rejected — split the file and upload in batches.
- An empty file (no header row, or a header with no data rows) is also rejected.
Common gotchas
- "Couldn't find an email column" — Loop couldn't auto-detect your email column. Use the manual column picker on the confirmation screen rather than re-exporting your file.
- Instagram column doesn't connect the channel. It's stored as context for Loop's conversations, not a connection. Connect Instagram separately from your channel settings.
- Duplicates aren't lost. If an email already exists in your audience, Loop links it into the new list instead of skipping it — so your "unique people" count after import can be lower than your row count, which is expected.
- Large files are fine — plan for the wait. Big lists import in the background; you don't need to keep the dialog open, and you'll get a toast when it's done.
Related: see /people to manage imported contacts, or /loops to build a loop against an imported list.