> ## Documentation Index
> Fetch the complete documentation index at: https://docs.dealtoaster.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Import contacts from a CSV file

> Upload a CSV file, map its columns, review the rows before anything is imported, and read the report.

You can bring your list into DealToaster from a CSV file. The import has four steps, and nothing is imported until you have reviewed the rows. This page walks through each step and explains the report.

## Before you start

* Export your list from your spreadsheet as a CSV file with one row per person and a header row.
* One column must hold the email address.
* The upload step shows the current size and row limits for a file. If your file is larger, split it and import the parts one by one.
* DealToaster detects the file's encoding and delimiter (comma, semicolon, tab or pipe). You can change the delimiter in the next step if the detection is wrong.
* The upload step links **Download a sample CSV**, a small file that shows the format.

Open **Contacts** and select **Import CSV**.

## The four steps

**1. Upload**

Drop a CSV file on the page or choose one. Nothing is imported yet.

**2. Map**

DealToaster suggests a field for each column. Check the suggestions:

* Exactly one column must go to **Email**.
* The other fields you can map to are **First name**, **Last name**, **Company**, **Job title**, **Phone**, **LinkedIn URL**, **Website**, **City** and **Country**.
* Set a column to **Ignore this column** to leave it out, or to **Custom field** to keep it under a name of your own. A custom field name uses lower-case letters, digits and `_`, and starts with a letter.
* If the columns look wrong, change the **Delimiter** or untick **First row is a header**.
* Columns with unknown headers are suggested as custom fields; the headers `status`, `last_replied_at` and `created_at` of a contacts export start as **Ignore this column**, and you can still map them.
* If no column goes to **Email**, the page says "Choose the column that holds the email address."
* To pick a different file, select **Choose another file**.

The page shows the review counts as soon as one column goes to **Email**.

**3. Review**

The counts add up to the rows in the file:

| Count | Meaning |
| - | - |
| **Ready to import** | Rows that will become contacts. |
| **Invalid** | Rows that are malformed, have a missing or invalid email address, or have a value that is too long. |
| **Duplicates in the file** | Rows that repeat an address already seen earlier in the file. |
| **Already contacts** | Addresses you already have. They are left unchanged. |
| **Suppressed** | Addresses of unsubscribed, bounced or do-not-contact contacts you deleted earlier. They are not brought back. |

Select the button that reads "Import" followed by the number of contacts, for example "Import 120 contacts", to start. Keep the page open for the few seconds it takes. Use **Back** to change the mapping first.

**4. Report**

The report shows **Imported**, **Skipped**, **Errors** and **Rows in the file**. Select **View imported contacts** to see them in Contacts, or **Import another file** to start again.

## Read the report

When some rows were not imported, the report says "The rows below were skipped or rejected; nothing else was changed." The list gives the **Row** (the row number as your spreadsheet shows it), the **Column**, the **Reason** and the **Value** for each row, marked **Error** or **Skipped**. Select **Download errors (CSV)** to save the list. When every row was imported, the page says "Every row was imported."

Every row is counted: the rows in the file always equal the imported, skipped and error rows together, and none is dropped silently. The list keeps the first 100 problem rows and says so; the counts above it cover all of them. The list is kept for a limited time after the import; the counts stay.

## How rows are treated

* An address counts once, whatever its capitalization. A repeat in the file is skipped.
* A contact you already have is skipped and left unchanged. The import never updates existing contacts.
* Values are stored as text. If a value begins with an apostrophe followed by `=`, `+`, `-`, `@`, a tab or a carriage return, the apostrophe is removed. That is how DealToaster writes values in the files it creates (the contacts export and the errors file), so that a spreadsheet never runs them as formulas; a file you export imports back as it was.

## When the file is refused

A file-level problem stops the import on the first step with a message, for example:

* the file is not text, is empty or has no data rows;
* the file is larger than the limit or has more rows than the limit, with the advice to split it into smaller files.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.