In short
A Salesforce migration goes well if you do it in this order: inventory the org, extract with Bulk API 2.0 or Data Loader keeping each record's ID, load in an order that respects relationships, validate with record counts per object, run both systems in parallel for a few days, and make a clean cutover. What gets forgotten most: files, logged emails and change history.
1. Inventory: what's in your org
Before you move anything, make the list: standard and custom objects with data, record counts for each, relationships between them, active and inactive users, picklists and Record Types. Also check Storage Usage in Setup: it tells you how much space your data and files take up.
2. What to export, beyond the obvious
| Data | Where it lives in Salesforce |
|---|---|
| Accounts, contacts, leads and opportunities | Account, Contact, Lead, Opportunity |
| Products and price books | Product2, Pricebook2, PricebookEntry, OpportunityLineItem |
| Cases | Case, CaseComment |
| Tasks and events | Task, Event |
| Logged emails | EmailMessage |
| Files | ContentVersion, ContentDocumentLink |
| Notes | ContentNote, and Note in older orgs |
| Legacy attachments | Attachment |
| Stage history | OpportunityHistory |
| Field history | AccountHistory, OpportunityFieldHistory and the rest of Field History |
| Chatter | FeedItem, FeedComment |
| Your own objects | The ones ending in __c |
3. Extraction tools
- Data Export Service: in Setup, under Data Export. It generates ZIP files with one CSV per object, weekly or every 29 days depending on your edition. Good for a full backup, not for incremental loads.
- Data Loader: Salesforce's desktop tool for exporting and importing CSV files. Enough for small and mid-sized orgs.
- Bulk API 2.0: for high volumes and automated extractions. It's the one that makes incremental loads possible during the parallel run.
Whatever you use, always keep each record's Salesforce ID, the 18-character one. It's the key to rebuilding relationships and to checking afterwards that nothing is missing.
4. Load order
- Users and owners
- Accounts
- Contacts
- Products and price books
- Opportunities and their line items
- Cases
- Tasks, events and emails
- Files and notes
- Stage and field history
Each object is loaded after the objects it depends on. If you load opportunities before accounts, you lose the relationship.
5. What to decide with the business
- Inactive owners: who their records get reassigned to.
- Picklists: values no longer in use get merged or archived.
- Record Types: which ones survive as types and which were just a workaround.
- Multi-currency: if you use dated exchange rates, keep them so historical amounts still add up.
- Duplicates: clean them up before loading, not after.
6. Validate
For each object: records in the source, records loaded, records rejected and why. Then control totals, such as won amount by year, and a sample reviewed by someone who knows the data.
7. Parallel run and cutover
For a few days both systems run side by side: every night the changes from Salesforce are loaded, and the team works in the new CRM with real data. On cutover weekend the final load runs, on Monday everyone works in the new system, and Salesforce stays read-only until the contract ends.
Common mistakes
- Forgetting the files and finding out when someone looks for a signed contract.
- Losing stage history and, with it, your conversion reports.
- Not keeping the Salesforce ID and being unable to check anything.
- Loading without users, so everything ends up owned by whoever ran the load.
- Cutting it close to the contract end without a full copy stored outside Salesforce.
This guide is the method 2Q Technologies follows in every migration. To see it applied week by week, with what we need from you, see our migration page.
FAQ
How long does a Salesforce migration take?
In a mid-sized company with reasonably clean data, the data and integrations work usually takes about a week, within a 5 to 8 week project. Millions of records or many integrations stretch the timeline.
What happens to my data when the contract ends?
Salesforce's master agreement allows a limited period after termination to request your data export. Don't cut it close: have the full extraction done and validated before the last day.
Can field change history be migrated?
Yes. Field History is exported like any other object and loaded as history inside each record in the new CRM.
What about emails?
Emails logged in Salesforce are migrated linked to their account, contact and opportunity.
Sources: Bulk API 2.0 guide (Salesforce Developers), Data Loader guide (Salesforce).