Skip to content

CRM Data Migration: Best Practices to Avoid Data Loss

Juwel Rana

By Juwel Rana · CEO & Founder

1,531 views
CRM data migration: a small team reviewing customer records on a laptop

The worst thing about a failed CRM data migration is that it rarely looks like a failure. The import finishes, the record count looks right, and weeks later someone notices that a batch of contacts has no phone number or no owner.

That quiet loss is the thing to design against. A sound CRM data migration is ordered around it: decide what moves, clean it, map it, test a small batch, and then check the result field by field rather than by row count.

Why CRM data migration loses data without telling you

Import tools are built to finish. When a value doesn't fit its destination field, many of them keep the record and drop the value, which is far friendlier to the person clicking Import than to the person who needs that value in March.

HighLevel's own bulk import troubleshooting guide is explicit about this. For an invalid phone number, an unparseable date, an unknown dropdown option or an ambiguous owner name, its documented outcome is that the record imports without that value.

Only a handful of problems stop the whole import, such as a file with more than one sheet. Those are the easy ones, because you know immediately.

So the working assumption for any move is simple. A green "import complete" message tells you the rows arrived. It says nothing about whether the fields did.

Decide what moves before anything moves

Not every record deserves a place in the new system. Contacts nobody has touched in years, test entries and abandoned deals all cost you cleanup time on the way in and clutter every report afterwards.

Settle the scope of the CRM data migration in writing: which objects (contacts, companies, deals, notes, tasks), and how far back.

Then take a full export of the old system before you change a single thing in it, and keep that file untouched. It's your rollback plan, and it's also the reference you'll compare against later.

If your new platform is GoHighLevel, our walkthrough on migrating a CRM to GoHighLevel without losing data covers the platform-specific order of operations.

Clean the source data first

Fix problems where they start. HubSpot's CRM data migration pilot checklist puts "clean source data or clean export" as an early step, before any mapping happens, and the order is right: a CRM data migration mapped on messy data has to be re-mapped when the mess is found.

Three cleanups pay off most:

  • Merge duplicate contacts and companies, so the new system doesn't inherit two histories for one person.
  • Standardise phone numbers with a country code, and pick one date format for every date column.
  • Replace free-text values with the exact options the destination dropdown will accept.

The third is the one people skip. If the old system let anyone type "Referral", "referral" or "Ref." into a source field, the new one has to be told which of them is canonical before the import, not after.

Map objects first, then fields

HubSpot's checklist sequences the work deliberately: define the object mappings first, then the field mappings. Contacts, companies and deals are each their own object, and how they relate has to be settled before you decide where individual columns land.

Choose one unique identifier per record

Duplicates during a move come from matching, not typing. HubSpot's import file requirements say that to update existing records or avoid duplicates you need a unique identifier, which for contacts is the email address and for companies can be the domain name.

The same page adds the consequence for linked data: without unique identifiers on each side of an association, the import creates duplicates instead of linking existing records. Contacts to companies, deals to contacts, notes to deals: every link needs a key that exists in both files.

Keep the old system's record ID in a column and carry it into a custom field in the new one. It costs a field and saves you when someone asks in six months where a contact came from.

Match the destination's formats exactly

The format rules are specific and they differ by platform. HubSpot accepts phone numbers as a plus sign, country code and number, wants multiple-checkbox values separated by semicolons with the options already created, and requires dropdown values to match an option's label or internal value.

HighLevel is similar. It expects phone numbers in E.164 format, and a date that doesn't match the format you selected during import is dropped, as the troubleshooting guide describes.

Two other details are worth writing into the map. HubSpot says to use an owner's email rather than name when names are duplicated, and it notes that blank cells in an import are ignored rather than clearing existing values. That second rule matters when you re-run a corrected file over records that are already loaded.

Write the transformations down

Anything that changes between systems belongs in the map: a single name field split into first and last, a status renamed, a stage collapsed into another. If it only lives in someone's head, it can't be reviewed, and nobody can explain a surprising value later.

Run a pilot import and read it properly

A pilot run of your CRM data migration is a small import you can afford to throw away. HubSpot's checklist makes it the seventh of eight steps and says what to review afterwards: imported test records should show correct field mappings, correct associations and correct engagement data.

Pick the sample on purpose. Include the strange ones: a contact with two emails, a company with ten contacts, a deal with a long note history, a record with an accent in the name. A random handful of tidy records passes everything and teaches you nothing.

Then open each pilot record next to its source and compare fields one at a time. Counting rows isn't a test.

One practical safeguard: tag everything you import with a batch label, if the platform allows it. A tag gives you a clean way to find, review or remove a batch if the pilot goes wrong, though you shouldn't treat it as an undo button.

Silent failures to check for, by error code

CRM data migration checks: colleagues comparing a spreadsheet on screen

Photo by vandesart on Pixabay

These are the HighLevel outcomes from the official error list where the import carries on and you lose something. Every platform has its equivalents, so read the destination's own list before you start.

Error codeWhat triggers itWhat you lose
1002An owner name matches more than one userThe Owner field stays blank
1005A dropdown or checkbox value isn't an existing optionThe record imports without that value
1013A phone number isn't in E.164 formatThe record imports without a phone number
1014A date doesn't match the selected formatThe record imports without that date
1011The same unique value repeats in the fileDuplicates may exist and association didn't occur

Phone numbers are the one to watch for a business that sells by phone. A contact without a number is still a contact in every report and a dead end in every workflow.

Verify the full load against the source

Once the full CRM data migration has run, compare the new system with the export you saved at the start. Row counts come first, but they're the weakest check; follow them with field-level counts, such as how many contacts have a phone number in each system.

Those counts expose the silent failures above directly. If the old system had a phone number on most contacts and the new one has far fewer, error 1013 has been at work, and you know which column to fix.

Next, spot-check linked data. Open a handful of companies and confirm the right contacts and deals sit under each, then open a deal and look for its notes and activity. HubSpot's checklist asks for the same thing at pilot stage, and it's worth repeating at full scale because a different file can behave differently.

Last, test the automations that depend on migrated fields. A workflow triggered by a tag, a stage or an owner only proves itself on real records, and a sequence that quietly never fires is the kind of loss you won't notice for weeks.

Plan the cutover and keep the old system readable

A CRM data migration needs a cutover date. Freeze changes in the old CRM when you take the final export, or agree a short window in which updates are logged by hand. Records edited after the export are the ones that go missing in the move, because nobody remembers to carry them across.

Leave the old system in read-only mode for a while instead of cancelling it on cutover day. When someone finds a gap, you want to look at the original rather than a CSV.

If you want the connections rebuilt as well, such as forms, calendars, payments and follow-up sequences, that wiring is a separate job from the data move, and it's where AI and automation work pays off, and for a custom build rather than an off-the-shelf CRM there's our apps and SaaS development practice. If you're still choosing the destination, the GoHighLevel and HubSpot billing comparison shows how the two charge.

And finish by keeping your pilot map. The next move, or the next tool added to your stack, will start from a tested template instead of a blank sheet.

Frequently asked questions

How do I avoid duplicates when importing into a new CRM?

Merge duplicates in the old system first, then import with a unique identifier such as email. HubSpot's documentation says a unique identifier is what lets an import update existing records instead of creating new ones.

Should I migrate every record from my old CRM?

No. Decide scope up front and leave out test entries and records nobody will use. Keep a full export of the old system either way, so anything you left behind can still be found.

What should I test before running the full import?

Run a pilot on a small, deliberately awkward sample and check field mappings, associations and activity history record by record. That mirrors the review step in HubSpot's pilot checklist.

Why did my contacts import without phone numbers?

Most likely the numbers weren't in the format the platform expects. In HighLevel, a phone value that isn't in E.164 format triggers error 1013, and the record imports without a phone number. Correct the file and re-import.

Can I undo an import if something goes wrong?

Not reliably on every platform, which is why you tag imported records and keep the original export. Check your destination's current documentation before the full load, and rehearse the pilot first.

Cover photo by Mikael Blomkvist on Pexels

Sources

Latest Blog

Tree service conversion optimization: an arborist trimming a large treeTree Service Marketing • Conversion Rate Optimization

Tree Service Website CRO: Turn Traffic into Booked Jobs

Most tree service sites don't have a traffic problem, they have a conversion problem. Here's where homeowners decide to call, what proof they look for, and what to fix first.

Read More
Healthcare data privacy marketing: a clinic receptionist working at a computerHealthcare Marketing • Data Privacy

Data Privacy in Healthcare Marketing: A 2026 Guide

Ad pixels and retargeting lists can send patient details to third parties. Here's what the FTC and a Texas court decided, and a five-step audit for your tracking.

Read More
Health tech startup ideas: a doctor reviewing patient information on a tablet in a clinicHealthcare Software • Health Tech

10 Health Tech Startup Ideas Worth Building in 2026

Ten health tech startup ideas tied to real 2026 pressure: a federal prior authorization deadline, the most-funded clinical categories, and the gaps AI scribes left open.

Read More
Tree service customer retention: an arborist at work in a treeTree Service Marketing • Customer Retention

Customer Retention Strategies for Tree Service Companies

Winning a new customer costs far more than keeping one. Here are five retention practices for tree companies, from job-site reliability to recurring plant health care programs.

Read More
AI Overviews for healthcare: a doctor working on a laptop in a clinicHealthcare Marketing • AI Overviews

How to Appear in Google AI Overviews for Healthcare

Google says appearing in AI Overviews needs no special markup or files. For a clinic or health brand, the real work is accuracy, visible expertise and answers placed where a summary can lift them.

Read More
Healthcare RCM software development: a medical billing specialist reviewing claims at a deskHealthcare Software • RCM Software

Revenue Cycle Management Software for Healthcare

What a custom revenue cycle system has to do: speak the federally adopted claim transactions, make denials visible, and report them with shared definitions. Plus when building beats buying.

Read More

Subscribe to our newsletter

Offers, insights and updates — a couple of times a month, never more.