# 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?

1. Open **People**, then click **Import** (or, from the loop-creation wizard, choose the CSV source in the **Add leads** dialog).
2. Drop your `.csv` file, or click to browse for one.
3. Optionally give the import a **List name**. If you leave it blank, Loop names the list after your file.
4. Loop checks the file client-side and shows you a preview — including a duplicate/skip summary — before anything is sent.
5. Confirm the import. Loop uploads the file and the import continues to run even if you close the dialog.
6. 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](/people) to manage imported contacts, or [/loops](/loops) to build a loop against an imported list.
