Super Migrator does not paste contacts. It exports them as two CSV files and you bring them in with HighLevel's own importer, which handles duplicates and lets you check every column before anything is written. Two files, two imports, in this order.
contacts.csvcontact-conversations.csvPaste Tags and Custom Fields into the destination first (the extension's Paste all already runs them early, so check those two rows say created or verified). The importer matches custom field columns to fields by name. If the field doesn't exist yet, the column has nowhere to go and the importer will skip it.
Both land in your browser's Downloads folder when the Contacts (CSV) row finishes.
contacts.csv and contact-conversations.csv
They download a moment apart. The first time, Chrome may ask whether this site can download multiple files. Say yes. If you said no, run the Contacts (CSV) row again.
The second file is only written when at least one contact has a conversation. A location with no SMS, email or chat history produces contacts.csv alone.
Excel likes to reformat phone numbers and dates on the way out. If you want to look inside, open a copy, and upload the original to HighLevel.
contacts.csvIn the destination sub-account: Contacts → the import icon at the top of the list (Import Contacts) → upload contacts.csv → Next. You'll get a screen that lists every column in the file and asks what to map it to.
The file carries HighLevel's raw contact record, so there are more columns than you need. Map the ones below and leave everything else unmapped. An unmapped column is simply ignored.
| Column in the file | Map it to |
|---|---|
firstName | First Name |
lastName | Last Name |
email | |
phone | Phone |
companyName | Business Name |
address1 | Street Address |
city | City |
state | State |
postalCode | Postal Code |
country | Country |
website | Website |
source | Contact Source |
dateOfBirth | Date of Birth (if the column is there) |
timezone | Timezone (if the column is there) |
tags | Tags comma-separated, ready to go |
contactNotes | Notes creates one note per contact |
| Columns named after your custom fields | The custom field with the same name. HighLevel usually pre-selects these for you. Check a couple to be sure. |
contactConversations | Leave unmapped skip The second file handles conversations. Mapping this here can push a very long transcript into a field that wasn't built for it. |
id, locationId, dateAdded, dateUpdated, assignedTo, followers, type, contactName, anything ending in LowerCase | Leave unmapped skip These are the old account's internal ids and bookkeeping. They mean nothing in the new one. |
| Anything else you don't recognise | Leave unmapped skip |
On the next screen, tell HighLevel to match existing contacts on both Email and Phone, and to add new contacts and update existing ones. That way re-running the import later tops up rather than doubles up.
The importer offers to tag everything in this batch. Use something like migrated-2026-09. It costs nothing and makes it easy to find, or remove, this exact batch later. Then click Import. HighLevel runs it in the background and emails you when it's finished. Progress shows under Contacts → Bulk Actions.
Open them in the destination. Name, phone, tags and custom field values should all be there, and the Notes tab should hold their old notes. If notes are missing, contactNotes was left unmapped. Re-run the import with just email, phone and contactNotes mapped and it will attach them to the existing contacts.
contact-conversations.csvSame importer, same place. This time you're only adding one thing to contacts that already exist: their conversation history, as a note.
Email and Phone are there so HighLevel can find the right contact. Conversations is the transcript.
| Column in the file | Map it to |
|---|---|
Email | |
Phone | Phone |
Conversations | Notes one note per contact, the whole transcript |
First Name, Last Name | Leave unmapped skip The contact already has a name from import 1. Mapping these does no harm, it's just not needed. |
This is the one setting that matters here. Many contacts have a phone and no email, so matching on email alone would miss them. And if the importer is allowed to create new contacts, any row it can't match becomes a duplicate with nothing but a note on it. Pick update existing contacts and make sure create new is off.
Their Notes tab now holds a note with every message in order, each one stamped with the date, the direction and who wrote it. It reads like this:
A contact with more than one conversation (say an SMS thread and an email thread) gets them one after the other in the same note, separated by ||||.
Anyone opening the contact sees who they are, how they were tagged, and everything that was ever said to them.
HighLevel has no way to import messages into a conversation thread, from any tool. The history lives in Notes instead. Reply to a migrated contact and a fresh conversation starts, with their past in the Notes tab next to it.
Every note the contact had is in there, each with its date and author, but they are joined into a single note separated by ||. That's a limit of what the importer accepts per row.
User ids belong to the old agency. Set assignment in the destination with a workflow or a bulk action after the import. Pipelines migrate with the extension; opportunities do not.
Reply to your licence email with a screenshot of what the importer said and we'll sort it with you. Then finish up with the post-migration checklist.