Most organisations move to Salesforce for better automation, reporting, ecosystem or scale. The configuration of the new system gets most of the attention. The migration of years of customer data gets far less, and it is where CRM projects most often go wrong.
This playbook explains how to migrate to Salesforce from HubSpot, Zoho CRM or Microsoft Dynamics 365 using a proven approach: planning, object mapping, load order, tools, preserving history, testing and cut-over.
When does migrating to Salesforce make sense?
- Your sales, service and partner processes have outgrown your current CRM’s automation or data model.
- You need enterprise-grade security, sharing and audit controls.
- You want to adopt Salesforce products such as Service Cloud, CPQ, Experience Cloud or Agentforce AI agents.
- Your company has standardised on Salesforce after an acquisition.
If you are still deciding, our overview of Salesforce CRM and its benefits for growing businesses may help.
The seven phases of a CRM migration
- Discover: inventory objects, fields, volumes, integrations and data owners in the source CRM.
- Clean: remove duplicates, fix obvious errors and decide what not to migrate.
- Map: define how each object and field maps to Salesforce, including picklist values and owners.
- Build: create the Salesforce data model, external IDs and migration scripts or jobs.
- Trial loads: load into a full or partial copy sandbox at least twice, reconcile and fix.
- Cut-over: freeze the source system, run the final load and delta, validate and switch users.
- Hypercare: support users, fix data issues quickly and decommission the old CRM.
How do HubSpot, Zoho and Dynamics objects map to Salesforce?
Every implementation has custom objects, but the core mapping follows a consistent pattern:
| Salesforce object | HubSpot | Zoho CRM | Dynamics 365 |
| User | Users and owners | Users | Users (system users) |
| Account | Companies | Accounts | Accounts |
| Contact | Contacts (associated with a company) | Contacts | Contacts |
| Lead | Contacts in early lifecycle stages | Leads | Leads |
| Opportunity | Deals | Deals | Opportunities |
| Product and Price Book | Products | Products and Price Books | Products and Price Lists |
| Opportunity Product | Line items | Deal products | Opportunity products |
| Case | Tickets | Cases | Cases (incidents) |
| Task and Event | Tasks, calls, meetings | Tasks, calls, meetings | Tasks, phone calls, appointments |
| EmailMessage or Task | Logged emails | Emails | Email activities |
| Files (ContentVersion) | Attachments and files | Attachments | Notes with attachments, SharePoint documents |
| Campaign | Marketing campaigns and lists | Campaigns | Marketing lists and campaigns |
Platform-specific points to watch
- HubSpot: a HubSpot contact can represent both a lead and a customer contact. Decide how lifecycle stages map to Salesforce Leads versus Contacts before you design the load. HubSpot associations between objects need explicit mapping to Salesforce lookups.
- Zoho CRM: custom modules and multi-select lookups often need custom objects or junction objects in Salesforce. Blueprint processes must be redesigned as Flows rather than migrated.
- Dynamics 365: business units and security roles do not map directly to Salesforce roles and sharing. Design your Salesforce security model fresh. Option sets become picklists, and connection or relationship entities may need junction objects.
Data cleansing checklist before you migrate
Every hour spent cleaning data in the source system saves several hours of fixing it in Salesforce. Before the first trial load:
- Merge duplicates in companies, contacts and leads using email domains, names and phone numbers.
- Archive stale records, such as leads with no activity for several years, unless you must retain them.
- Standardise values for countries, states, industries, lead sources and deal stages.
- Fix ownership by reassigning records owned by people who have left, or agree how inactive owners will be handled.
- Complete required fields that Salesforce will enforce, such as account names and opportunity close dates.
- Clean email addresses and phone numbers so automation and integrations work from day one.
- Name a data owner for each object who signs off mapping decisions and reconciliation results.
Designing the Salesforce data model for migration
- Create an external ID field on every migrated object holding the source system’s record ID. It lets you upsert, relink related records and trace any Salesforce record back to its origin.
- Standardise picklists before loading, and map old values to new ones in a documented table.
- Decide on record types and sales processes up front, so opportunity stages load correctly.
- Review the Salesforce data model for standard objects you can use before creating custom ones.
The correct load order
Parent records must exist before child records reference them. A reliable sequence:
- Users (including inactive users that own historic records)
- Accounts, then parent account relationships in a second pass
- Contacts
- Leads
- Products, price books and price book entries
- Campaigns and campaign members
- Opportunities, then opportunity contact roles and opportunity products
- Cases
- Custom objects, in dependency order
- Activities: tasks, events and emails
- Files and notes
Which migration tools should you use?
| Tool | Best for | Limitations |
| Data Import Wizard | Simple imports of common objects, up to 50,000 records at a time | Limited objects, little automation or repeatability |
| Data Loader | Large volumes, most standard and custom objects, insert, update, upsert and delete | Transformations must be done beforehand in files |
| Bulk API 2.0 scripts | Repeatable, automated loads with complex logic | Needs developer effort and careful error handling |
| ETL or integration platforms such as MuleSoft | Complex transformations, multiple sources, ongoing sync during a phased migration | Licence and setup cost |
| Specialist migration apps | Standard source-to-Salesforce migrations with predefined mappings | Less control over edge cases; check how custom objects are handled |
Preserving history: dates, owners, emails and files
- Created dates and creators: enable "Set Audit Fields upon Record Creation" for the migration user so historic CreatedDate and CreatedById values can be loaded on insert.
- Inactive owners: the related permission "Update Records with Inactive Owners" lets records keep their original, now inactive, owners.
- Emails: load as EmailMessage when Enhanced Email is enabled and fidelity matters, or as completed Tasks for a simpler history.
- Files: load documents as ContentVersion and link them to records with ContentDocumentLink. Check file storage capacity first.
- Automation during loads: use a bypass custom permission or custom setting so validation rules, Flows and triggers do not fire unnecessarily or send emails to customers during migration.
Testing and reconciliation
Every trial load should end with a reconciliation report signed off by the data owner:
- Record counts per object: source versus Salesforce, with explained differences
- Financial totals such as open pipeline value and closed-won revenue by year
- Spot checks of 20–50 records per object, comparing every mapped field
- Relationship checks: contacts on the right accounts, activities on the right records
- User testing of real scenarios, such as finding a customer and seeing their full history
Good reconciliation is also the foundation of reliable reports and dashboards after go-live.
A safe cut-over plan
- Announce a data freeze window for the old CRM, ideally over a weekend.
- Take a full backup export of the source system.
- Run the final full load, or load changes since the last trial load (the delta).
- Re-enable automation and integrations in Salesforce.
- Run the reconciliation checklist and smoke tests with key users.
- Switch users to Salesforce and set the old CRM to read-only.
- Provide floor-walker or virtual support for the first two weeks.
A typical migration timeline
| Weeks | Activities |
| 1 – 2 | Discovery, data profiling, volumes and scope decisions |
| 2 – 4 | Cleansing in the source system, object and field mapping, external IDs |
| 4 – 6 | Migration scripts or jobs, first trial load into a sandbox, reconciliation |
| 6 – 8 | Fixes, second trial load, user testing with migrated data |
| 8 – 9 | Cut-over rehearsal, final load, validation and go-live |
| 9 – 11 | Hypercare, data fixes and decommissioning the old CRM |
Larger migrations with many custom objects, several source systems or years of email history take longer, but the sequence stays the same. Running the migration timeline in parallel with the Salesforce build keeps both on track.
Common migration mistakes
- Migrating everything "just in case", including years of low-value data
- No external IDs, making re-runs and fixes painful
- Loading into production without full trial loads in a sandbox
- Forgetting inactive users, leaving historic records with the wrong owner
- Letting automation send emails to customers during the load
- Leaving data cleansing to the week before go-live
How long and how much?
Migration effort depends on volumes, number of objects, data quality, history requirements and files. It typically accounts for 10–20% of the total implementation budget. See our Salesforce implementation cost guide for how it fits into the overall project, and why Salesforce projects fail for the risks of underestimating it.
Plan your Salesforce migration with Groviya
Groviya has migrated organisations to Salesforce from HubSpot, Zoho, Dynamics 365, spreadsheets and bespoke systems. We handle mapping, cleansing, scripted loads, reconciliation and cut-over as part of a complete Salesforce implementation. Talk to our migration team about your data.