Most data loss during a CRM move happens before anyone clicks Import, when a column in the old export has no matching field waiting for it on the other side. If you plan to migrate to GoHighLevel, the order of work matters more than the speed of it: fields and pipelines first, cleaned file second, import last.
This guide walks through that order, using HighLevel's own support documentation for the mechanics and HubSpot's export tools as the worked example for the source side.
What moves over and what you rebuild by hand
HighLevel's CSV importer handles contacts and opportunities. Everything else in your old system, such as automations, email templates, forms and landing pages, sits outside what those import tools describe, so plan to rebuild it rather than expect it to arrive.
That split decides how you schedule the project. The data import can be done in an afternoon once the file is clean. The rebuild is where the calendar time goes, because every automation has to be recreated, reconnected and tested before you can trust it.
If you're still deciding whether the switch is worth it, our GoHighLevel and HubSpot comparison covers the trade-offs. If you've already decided, keep reading.
Export everything from the old CRM
Export more than you think you need. A column you leave out now is a column you'll have to chase later, possibly after the old subscription has lapsed.
In HubSpot, the default export includes only the properties and associations visible in your current view. The HubSpot export documentation lets you switch that to all properties on records, or all properties and associations. Choose the second option. Download links expire after 30 days, so save the files somewhere permanent the day they arrive.
Export contacts, companies and deals as separate files. Large exports can take hours and may arrive split across several files, which is another reason to start early.
Build custom fields, pipelines and stages first
This is the step people skip, and it's the one that loses data. An importer can only place a value in a field that already exists.
Open Settings, then Custom Fields, and create a field for every extra property you want to keep. HighLevel's custom fields guide says a field's object and type can't be changed after creation. If you create a contact field when you needed an opportunity field, you start again with a new one.
So decide the type deliberately. A deal value belongs in a monetary field and a renewal date in a date field, not both in plain text.
Do the same for pipelines. The opportunity import expects the pipeline to exist already, and stages have to exist inside it. The importer won't create either.
Clean the file before you upload it
Fix problems in the spreadsheet, where a mistake costs seconds. Fix them after import and they cost hours.
The checks that matter most:
- Remove duplicate rows, and make sure every row has at least a name, an email or a phone number.
- Strip spaces, dashes and brackets from phone numbers and use international format with country codes.
- Make every date in a column follow one format.
- Keep notes under 5,000 characters per contact.
HighLevel's bulk import troubleshooting article lists these as the usual causes of failed rows.
File size is less clear-cut. HighLevel's own articles give different caps: 30MB in the import guide, 20MB or 10,000 rows in the troubleshooting page, and 50MB in the getting-started article. Split the file to the strictest of those and you won't hit any of them.
How to migrate to GoHighLevel, step by step
Once the fields exist and the file is clean, the import itself is short. Only an admin can run it, and the file must be a single-sheet CSV with a header row.
- Go to Contacts, then Smart Lists, and click Import Contacts.
- Choose whether you're importing contacts, opportunities or both, then upload the CSV.
- Pick an import mode: create only, update only, or create and update.
- Map each CSV column to a HighLevel field. Tick "Don't update empty values" if you're updating records that already hold data.
- Add a tag for the batch, and optionally a Smart List, then confirm.
These steps follow HighLevel's guide to importing contacts and opportunities.
Tag every batch with its source and date. If something looks wrong later, that tag is the only quick way to isolate the records that came from that file.
Duplicates and multiple contact details
HighLevel merges duplicates automatically, matching on email first and phone second. A record that matches gets updated instead of duplicated, which is helpful when you import in several batches.
It also accepts contacts with more than one email address or phone number, so a contact who appears under two emails in the old CRM doesn't have to be flattened to one.
Handle consent and do-not-disturb before anyone is messaged

Photo by Nothing Ahead on Pexels
A freshly imported contact list is the easiest way to email someone who unsubscribed years ago. Settle the rules before the data lands, not after the first campaign goes out.
If your CSV contains a DND column, HighLevel applies do-not-disturb across all communication channels for those contacts. That's safe but blunt: someone who opted out of texts only would also stop getting email. For channel-specific rules, use tags or workflows instead of the DND column.
Also check any workflow that triggers on a new contact or a new tag. An import can fire it for thousands of records at once, so switch those workflows off until the import is verified.
Importing deals and opportunities
Opportunities need three things per row: a contact to attach to, a name, and a pipeline. HighLevel's opportunity import guide accepts the statuses Open, Won, Lost and Abandoned.
The simplest route is a combined contacts and opportunities file, where a contact and its deal sit on the same line and link automatically. If you import opportunities alone, every row needs the ID of a contact that already exists in HighLevel.
Test with a small sample first. Completed imports have no one-click undo, so a bad mapping on 20,000 rows is a clean-up job, not a quick reversal.
Rebuilding automations after the data is in
With contacts and deals in place, recreate the automations in the order of how much revenue they touch: lead follow-up first, appointment reminders next, newsletters and nurture sequences last.
Resist copying every old workflow one for one. A migration is the cheapest moment to retire the sequences nobody can explain. Our write-up of GoHighLevel CRM setup for small business shows what a lean starting configuration looks like, and the piece on AI automation inside GoHighLevel covers what to add once the basics are stable.
If the rebuild is larger than your team can take on, our AI and automation service is where we handle that work.
Check the data before you cancel anything
Run the old CRM and the new one side by side until the numbers agree. That means comparing contact counts, deal counts per pipeline stage, and a handful of records you know well, field by field.
When rows fail, HighLevel lists them. Open Bulk Actions, choose Show Stats, then the Error tab, and download the log. Fix those rows in the spreadsheet and import them again.
Keep the original exports untouched. They're your rollback, since the importer has no undo, and the old system's download links expire. Cancel the old subscription only after a full billing cycle has run on the new setup without surprises.
Frequently asked questions
Can I undo a HighLevel import?
No. HighLevel's opportunity import guide states that completed imports have no one-click undo. Test with a small sample and tag each batch so you can find and correct the records later.
Can I change a custom field's type after creating it?
No. HighLevel doesn't allow a field's object or type to be changed after creation, so you'd create a new field and re-import the values into it.
What do I do with rows that fail to import?
Open Bulk Actions, choose Show Stats and go to the Error tab. You can download the error log, correct those rows and re-import only them.
Can a contact have more than one email or phone number?
Yes. HighLevel's CSV import supports creating contacts with multiple email addresses and phone numbers.
Does HighLevel create duplicates if I import twice?
Not for matching records. It merges on email first and phone second and updates the existing contact, provided you've picked an import mode that allows updates.
Cover photo by Georg Wietschorke on Pexels
Sources
- Importing Contacts and Opportunities via CSV — HighLevel Support Portal
- Troubleshooting Bulk Imports Via CSV — HighLevel Support Portal





























