The best way to migrate legacy account lists into Salesforce Lightning is a staged process: audit and cleanse the source data first, map fields to your Salesforce schema, run a sandbox test import, deduplicate records, then load production data with Data Loader or the Data Import Wizard. Validate every batch before moving forward.
Rushing the load is where most teams get burned. A clean, repeatable migration beats a fast one every time.
Step 1: Audit and Cleanse the Legacy Data
Before you touch Salesforce, fix the source. Legacy account lists almost always carry duplicate companies, inconsistent naming ("IBM" vs "I.B.M." vs "International Business Machines"), dead records, and missing required fields.
Do this first:
- Standardize company names, country codes, and industry values
- Remove records with no usable identifier (no name, no domain, no phone)
- Normalize date and currency formats to match Salesforce expectations
- Tag records by data quality so you can prioritize the clean ones
A simple way to find duplicates early is matching on website domain rather than account name. Domains are far more reliable than free-text company names.

Step 2: Map Legacy Fields to the Salesforce Schema
Create a field-mapping document that pairs each legacy column with a Salesforce Account field. Decide early which fields are standard, which need custom fields, and which you'll drop.
| Legacy field | Salesforce field | Notes |
|---|---|---|
| Company Name | Account Name | Required, must be unique-ish |
| Web | Website | Use for dedupe matching |
| Sector | Industry | Map to Salesforce picklist values |
| Annual Rev | AnnualRevenue | Strip currency symbols |
| Legacy ID | External_Id__c | Create as External ID field |
The single most useful trick: add a custom External ID field on the Account object that holds your legacy system's primary key. This lets you use upsert operations, makes re-runs idempotent, and gives you a clean rollback path. Salesforce documents this in the Data Loader guide.
Step 3: Choose the Right Import Tool
Salesforce gives you two main native options, plus the ecosystem.
Data Import Wizard
Good for simple, one-time loads under 50,000 records. It runs inside Lightning, supports basic deduplication, and handles standard objects. Use it when the data is already clean and small.
Data Loader
The workhorse for serious migrations. Supports up to 5 million records, CSV input, upsert by External ID, and command-line automation. Choose Data Loader when you need repeatable runs, large volumes, or scheduled jobs.
Third-party ETL tools
For multi-object migrations with relationships (Accounts, Contacts, Opportunities together), tools like dataloader.io, Jitterbit, or MuleSoft handle dependency ordering better. They cost more but save weeks on complex moves.
If you're still deciding on your overall CRM stack, the HubSpot vs Salesforce comparison covers tradeoffs that affect how much migration work you're signing up for.
Step 4: Test in a Sandbox First
Never load to production blind. Spin up a full or partial sandbox, run the import there, and check:
- Did all required fields populate?
- Did picklist values map correctly, or did some default to blanks?
- Did record counts match (source rows vs created accounts)?
- Did automation, validation rules, or flows block any inserts?
Validation rules are the silent killer here. A rule requiring a clean phone format will reject thousands of legacy records mid-load. Either fix the data or temporarily deactivate the rule for the migration user.

Step 5: Deduplicate Against Existing Records
If your org already has accounts, you'll create duplicates unless you match. Use upsert on the External ID, or configure Salesforce Duplicate Rules and Matching Rules before the load. Match on website domain plus billing country for the strongest accuracy.
After loading, run a duplicate report and merge survivors. Keeping account data clean matters even more when you layer in account-based marketing, since fragmented accounts break targeting and reporting.
Step 6: Load Production in Batches
Work in controlled batches rather than one giant file:
- Start with a small pilot batch (500-1,000 records)
- Verify in Lightning, then scale up
- Log every batch's job ID, success count, and error file
- Keep the error CSVs Data Loader produces; they tell you exactly what failed and why
Enable Bulk API mode for large volumes to avoid hitting governor limits and to speed up processing.
Step 7: Validate and Enrich Post-Migration
After the load, reconcile counts and spot-check records. Then enrich. Legacy lists are usually stale, so run accounts through a data provider to refresh firmographics and contacts. The Apollo vs ZoomInfo vs Lusha comparison helps pick a tool for filling gaps in revenue, headcount, and contact data.
Final validation checklist:
- Record counts reconcile between source and Salesforce
- No unexpected duplicates in the duplicate report
- Required fields populated above your quality threshold
- Ownership and territory assignment applied
- Reports and list views render correctly in Lightning
Common Migration Mistakes to Avoid
- Skipping the sandbox. Production is not your test bed.
- Ignoring picklist mismatches. Unmapped values silently go blank.
- No External ID. Without it, re-running creates duplicates and you can't roll back cleanly.
- Leaving validation rules on. They'll reject good records during bulk loads.
- Loading relationships out of order. Accounts must exist before Contacts and Opportunities reference them.
Key Takeaways
- Clean the source data before importing anything into Salesforce Lightning.
- Add an External ID custom field to enable safe, repeatable upserts.
- Use the Data Import Wizard for small clean loads, Data Loader or ETL tools for large or relational migrations.
- Always test in a sandbox, deduplicate against existing records, and load in batches.
- Validate counts and enrich stale legacy data after the migration completes.
A disciplined, staged migration turns a risky one-shot import into a controlled process you can repeat and trust.
