How to import contacts
Bring contacts in from a CSV: match the columns, check a dry run that lists every problem, import, then download the rows that didn't make it.
Bring people in from a spreadsheet: add tags and custom-field values to contacts you already talk to, and keep a record of people who haven't messaged you yet. An import sends nothing to anyone.
Who can import: owners and admins. The Import button sits beside Add contact in the Contacts page header, where importing is turned on for your workspace.
Before you start: what an import can and can't do
- Instagram contacts are matched by username. A username that belongs to someone who has messaged you adds to their contact. A new one is added as a record marked Unverified: Instagram only allows messages to people who messaged you first, and when that person does, their conversation arrives as its own contact.
- An import can't give anyone permission to be messaged on Instagram.
- A WhatsApp number needs documented permission. A yes in the permission column needs where permission was given and when. Anyone without it is imported with no permission on record, and nothing is sent to them. A no is always recorded.
- An import never re-subscribes someone who opted out. They can send START, or write to you.
- Email addresses can come along (where customer email is switched on). An Instagram or WhatsApp file can have an Email address column, and each address is linked to the contact on its row. The permission columns then describe the address: a yes needs where and when, and subscribes it to your emails; a no puts it on your do-not-email list whatever you choose for contacts you already have — even for a row whose contact isn't imported (with Don't create new contacts, say); a blank means no permission on record, and nothing is emailed to it. A yes for an address on your do-not-email list is refused — an import never re-subscribes an address. If your workspace has a custom field called email, the address fills it too (unless another column is matched to that field), so everything that reads that field — Hotmart purchases, your integrations,
{{email}}— keeps finding it. A WhatsApp file with permission columns can't also carry addresses: one yes can't mean both, so import them as two files. - A contact you merged is updated where it lives now. A row that matches a record you merged into another contact updates that contact. A WhatsApp yes for a merged number isn't carried over to another number, so that row is listed with the reason.
- An import doesn't start anything. It fires no rules, enrols nobody in a sequence and sends no message.
The file is a CSV with the column names in its first row, separated by commas, semicolons or tabs. It can have up to 5,000 rows, 50 columns and 2 MB — split a bigger list into several files.
Step 1: choose the file
- Open Contacts and click Import in the page header.
- If WhatsApp is turned on for your workspace, choose Instagram or WhatsApp. One file is one channel.
- Under CSV file, choose your file.

Step 2: match the columns
Each column in your file gets a row with an example value and an Import as menu. HyperDM guesses from the column names, so check every guess.
| Import as | What the column holds |
|---|---|
| Instagram username | @maya.makes, maya.makes, or a link to their profile. |
| Instagram ID (from a HyperDM export) | The digits from a HyperDM contact export. |
| WhatsApp number | International form: + and the country code, like +44 7700 900123. |
| Email address | maya@example.com, one per row. Offered where customer email is switched on. |
| Name | What to call them, up to 100 characters. For contacts you already have, it follows your choice under Contacts you already have. |
| Tags | Tags separated by commas or semicolons — up to 20 per row, each up to 40 characters. |
| A custom field | A value the field can hold: a number; yes or no; a date written 2026-09-14; a date and time written 2026-09-14 16:30; or a List's values separated by commas. |
| Permission (yes / no) | yes or no — for the WhatsApp number, or for the email address when the file has an Email address column. Leave it blank if you don't know. |
| Where permission was given | A form on your website, At checkout, A signed paper form, or Other written permission. |
| When permission was given | A date written 2026-09-14 that isn't in the future. |
| Permission note | Optional, on one line. |
| Don't import | The column is left out. |
Then:
- Under Contacts you already have, choose what happens to people already in HyperDM:
- Fill in what's missing adds tags and fills in an empty name or field. Values they already have stay.
- Update with the file's values replaces their name, or a field, when the file has a value for it. Tags are added, never removed. An empty cell never clears anything.
- Leave them as they are changes nothing about them — except an opt-out, which is always recorded.
- Untick Add people who aren't contacts yet if you only want to update people you already have.
- Click Check the file.
Step 3: check the dry run
Nothing is saved yet. The dry run counts the rows in the file, the new contacts, the contacts it would update or leave alone, and the rows that can't be imported — each one listed by its row number with the reason.
If the check is refused, your file and every match stay exactly as they were, with the reason beside them. Click Back to change a match.
Step 4: import
- Click Import.
- Read the results: how many contacts were added, updated, unchanged, skipped and not imported. With an Email address column, they also say how many addresses were linked, subscribed and unsubscribed. If some addresses couldn't be saved — or a very large file ran out of time before all of them were — click Save the email addresses again: the contacts aren't imported twice, and it carries on with the addresses.
- If any rows didn't import, click Download the rows that didn't import. It's a CSV of those rows exactly as your file had them, with the reason on each. Fix them and import that file.
The import checks everything again and runs as one step. If it fails, nothing is imported and it says so. Clicking Import again is safe: an import can't run twice. The download of rows that didn't import is kept for 30 days.
Common problems
| Message | What to do |
|---|---|
| "This row has no Instagram username." or "This row has no WhatsApp number." | Fill in the identity column, or check it's matched to Instagram username or WhatsApp number. |
| "Use their username — letters, numbers, periods and underscores." | An Instagram username can't contain spaces or other symbols. |
| "Start with + and the country code…" | Write the number in international form. |
| "More than one contact matches this — HyperDM won't guess which one." | Two contacts already share that username. Update them from the Contacts page instead. |
| "No contact has this Instagram ID." | IDs only exist for people who messaged you. Match the username instead. |
| "They opted out. An import can't re-subscribe anyone…" | Nothing to fix: they stay opted out until they send START or write to you. |
| "This number was merged into another contact, and permission can't move from one number to another…" | Import the yes against the number it was given for, or leave the permission blank. |
| "A yes needs where permission was given…" or "…when permission was given…" | Match the Where and When columns, or leave the permission blank. |
| "The same contact as row N." | Keep one row per person. |
| "This address unsubscribed, bounced or reported spam. An import can't re-subscribe it…" | Nothing to fix in the file. If they've asked you to, a teammate can subscribe the address from the contact's drawer: Email → Subscribe with evidence…. |
| "This row says permission was given, but it has no email address for it…" | Fill in the address, or leave the permission blank. |
| "The email channel isn't turned on for this workspace…" | Set the Email address column to Don't import. |
| "Couldn't check the file's email addresses against your do-not-email list…" | That attempt changed nothing. Click the same button again in a moment. |
| "This row's email address couldn't be saved just now…" | Click Save the email addresses again. Your contacts aren't imported twice. |
| "Some email addresses weren't saved before time ran out…" | Click Save the email addresses again — it picks up the addresses, not the contacts. For a very large file, you may need to click it more than once. |
| "Something more recent already decided this address's permission…" | Nothing to fix: a newer yes or no for that address was kept. The contact's Email section shows it. |
| "This file is too big to send in one go." | Split the file, or match fewer columns. |
Import SMS contacts with their consent evidence
SMS is coming soon, so this only appears where it's switched on for your workspace. An SMS import is a different file with a fixed template, because texting someone needs documented permission — when they agreed, how, what they were told, and a reference you can produce — and a "yes" alone isn't evidence:
- Click Import and choose SMS (with consent evidence). The dialog becomes Import SMS consent, with three steps: the file, the dry run, the result.
- Click Download the template, fill one row per person and choose the file. Every column and rule is in Contacts → Import SMS consent evidence.
- Read the dry run — Rows in the file, Ready to import, Can't be imported, With consent evidence, and every row that won't import with its column and the reason — then click Import SMS consent.
- If rows didn't import, Download the rows that didn't import. The reasons there are the SMS ones, for example that a number opted out of your texts, or that a reference is already used by another contact.
The same rules hold as above: it sends nothing, starts nothing, never re-subscribes a number that opted out of your texts, and running it twice imports nothing twice.
Everything else on the page is in Contacts.
More in Inbox & contacts
- Bulk actions on contactsSelect rows or everyone matching a filter, pick an action under More actions, confirm the count, then watch it run and read the outcome.Read
- Work the Inbox as a teamShare the Inbox with a team: assign conversations to people or groups, complete and reopen them, write internal notes, label them and save views.Read
- Export your contactsDownload your contacts as a CSV with their tags, fields and permission, or as a file for a Facebook or Instagram custom audience.Read
Try HyperDM for free
50 free conversations a month, no card. Connect Instagram and follow the guide you just read.