Import contacts from Excel or CSV
Bring an existing customer list into Juno from an Excel or CSV file — map the columns, label the batch, and read which rows were created, updated or skipped.
You can bring an existing customer list into Juno from an Excel (.xlsx) or CSV file. Each row becomes one contact, extra columns become custom attributes, and a contact you already have is updated rather than duplicated.
Juno imports contacts but doesn't export them — there's no download of your contact list from the console.
Prepare the file
The easiest start is Juno's own template. On the Contacts page, click Import contacts, then Download template. It comes with the right headers, an example row and a sheet of instructions.
The rules:
- Row 1 is the header row. Don't delete or rename it. Without it, your first contact is read as the headers and lost.
- Every row needs an email or a phone number with a country code. That's how a contact is identified.
- Phone numbers need the country code, like
+6591234567. A number with a+is linked as the contact's WhatsApp number, so their messages land on this profile. A number without one is kept only as aphoneattribute — visible on the profile, but not linked to WhatsApp, so that contact is left out of WhatsApp broadcasts (the broadcast composer shows how many of an audience WhatsApp can reach). - When a row has an email, the email is the identity. If the row also has a phone number with a
+, the number is linked to the same contact. - Extra columns are welcome. City, membership, last visit, a note — each becomes a custom attribute you can filter on in a segment, or put into a broadcast or journey message with a Contact attribute variable.
- Up to 5,000 rows per file. Delete the example row before importing.
Import it
- On the Contacts page, click Import contacts and choose your file.
- Check Columns. Juno guesses a role for each column from its header — Email, Name, Phone, Custom attribute or Ignore. Change any guess that's wrong. Only the first email, name and phone column takes that role; a second "phone" column becomes an attribute.
- Look over the preview of the first rows.
- Fill in Label these contacts — optional, but worth it. A label is how you reach exactly this batch later, as a broadcast audience or in a segment. Without one, the only audience that includes them is everyone. The label is created if it doesn't exist yet. A misspelt label can be fixed later under Contacts → Manage labels.
- Click Import N contacts. A progress count shows as the rows go in. Stop halts it part-way. Rows already imported stay.
Read the result
At the end you'll see how many contacts were created, updated and skipped, with a row number and reason for each skipped row:
| Reason | What to fix |
|---|---|
| No email, and no phone with a country code | Add an email, or put + and the country code on the number |
| Not a valid email address | The email column holds something else — often a phone number or a web link |
| Duplicate of an earlier row | The same person appears twice in the file — merge the two rows |
| Too much data in one row | Trim the extra columns for that row |
| This row could not be saved | Check the row, then import the file again |
It's safe to import the same file again. Existing contacts are updated, not duplicated: new attribute values are added or replace the old ones, a missing name is filled in, and a name someone typed in the console is kept.
An import isn't consent
Having someone's number doesn't mean you may message them. An imported list is a list of people who haven't opted out yet — not people who have opted in. Before you send a broadcast to it, read opt-in and opt-out.
Importing needs permission to create contacts. If the button refuses, ask your workspace owner about your role.
Where to go next
- Contacts, profiles and segments — using the attributes you imported
- Labels — why labelling the batch helps
- Opt-in and opt-out — before you message an imported list