# Import contacts

Upload a single CSV file to register contacts as subscribers on email, SMS, WhatsApp, and Viber at once. Map each column that holds a contact address to the channel it belongs to. The same column, such as a phone number, can be mapped to more than one channel, so you no longer need a separate file for SMS and WhatsApp numbers that are the same number.

<Aside type="note">
This wizard replaced the four separate CSV import pages that used to exist for email, SMS, WhatsApp, and Viber. Any link or bookmark to the old pages opens this wizard instead.
</Aside>

## Prepare your CSV file

### CSV formatting rules

#### General structure

* The first row must contain column headers describing the data in each column.
* Each subsequent row represents a single contact, with values corresponding to the headers.
* Values must be separated by commas.
* Save the file in UTF-8 encoding to ensure proper character display.
* The maximum file size is 100 MB.

#### Contact columns

Include at least one of the following columns, depending on which channels you want to register the contact for:

* **Email**: the recipient's email address.
* **Phone number** (for SMS, WhatsApp, and Viber): must be in international format, starting with `+` followed by the country code, for example *+120XXXXX234*. Enter the plain phone number. Pushwoosh adds the `whatsapp:` or `viber:` prefix internally once you map the column to that channel, so don't add it yourself.

A phone number that isn't in a valid international format is dropped for that channel during import rather than causing the whole row to fail.

<Aside type="note">
The column names in your CSV file don't need to match these labels. During import, you map your existing column names to a channel in the wizard. For example, a column named *Mobile* can be mapped to the **SMS** or **WhatsApp** channel.
</Aside>

#### Optional columns

* **User ID**: a unique identifier for the user (e.g. name or email). Not required, but recommended so the contact's channels share one user profile instead of several.
* Any other column can be mapped to a system tag for segmentation and personalization, for example **Location**, **Birthday**, **Language**, or **Customer type**.

#### Example CSV file

```csv
Email,Mobile,User ID,Name,Location
john.smith@email.com,+120XXXXX234,john.smith@email.com,John Smith,New York
jane.smith@email.com,+131XXXXX890,jane.smith@email.com,Jane Smith,Los Angeles
```

## Upload and map the CSV file

1. Go to **Audience → Import CSV → Import Contacts**.

![Import CSV hub in the Audience section showing the Import Contacts card alongside Update tag values, Import push subscribers, Import events, and Import subscription categories](/import-contacts-1.webp)

2. Click **Upload CSV** and select your file. To replace it, click **Upload Another CSV**.

3. Enter a **Segment name** for the imported contacts.

4. Under **Contact column in CSV**, select a column and, next to it, choose the **Channel** it registers (**Email**, **SMS**, **WhatsApp**, or **Viber**). Click **+ Add channel** to map another column, or to map the same column to an additional channel.

5. Under **UserId column in CSV**, select the column with unique user identifiers, if your file has one.

6. To include extra data for segmentation, select a **Column Name** from your CSV and assign it a **Tag**. Click **+ Add Column** to map more attributes.

![Map step of the Import Contacts wizard with one column mapped to Email, one Mobile column mapped to SMS, WhatsApp, and Viber, and a City column mapped to a tag](/import-contacts-2.webp)

7. Click **Start Import** to begin processing the file.

After the import, the contacts are available for campaigns on the channels you mapped. They appear as a new segment in the [Segments list](/product/audience-data-and-segmentation/segmentation/) and can also be accessed via [User explorer](/product/audience-data-and-segmentation/user-explorer/).

<Aside type="note">
Added counts channel registrations, not CSV rows, so a contact mapped to two channels (e.g. SMS and WhatsApp) adds 2 to the total.
</Aside>

## Rows skipped during import

The completion screen groups skipped rows by reason:

* **Email address is not valid**
* **Phone number is not valid**
* **No contact address in the row:** every mapped column was empty

A row can be partially imported and still show up in this breakdown. For example, the email column succeeds, but the phone column fails validation.

Click **Download skipped rows** to get a CSV of those rows only. The file adds the skip reason as an extra column so you can fix the rows and re-upload them.

<Aside type="note">
Download the file from this completion screen before you leave. It's only available here, while the wizard still has the upload in memory. If you open the same import later from the recent imports list on the Import CSV hub, the reason counts still show, but the download link doesn't.
</Aside>

## Rows the import failed to register

Some rows look fine in the file but still don't go through. For example, an email address can be spelled correctly and still get rejected because it belongs to a disposable or bounced domain. Pushwoosh counts rows like this as **Failed**, separately from Added or Skipped.

Failed rows aren't broken down by reason and aren't included in the skipped-rows download. To find them, compare your source CSV with the imported segment. Fix the missing addresses (for example, remove a disposable or bounced domain), then re-upload only those rows in a new import.