Skip to content
Salesforce

Salesforce data migration without the surprises

We move accounts, contacts, opportunities, cases and history into Salesforce with profiling, deduplication, reconciliation gates and a rehearsed cutover, so day one looks like the plan.

  • 3–8 weeks typical
  • Two rehearsal loads before cutover
  • Field-level reconciliation
  • Rollback plan on every run
Who this is for

Moving to Salesforce, merging orgs, or repairing a bad load

Data migration is where Salesforce projects quietly fail. The build is fine, the training is done, and then sales opens the org and finds three copies of every customer. We run the data stream as its own workstream, with its own gates.

Typical situations

  • Replacing HubSpot, Dynamics, Zoho, Pipedrive or a home-grown CRM
  • Consolidating two Salesforce orgs after an acquisition
  • Loading years of case, email and activity history into Service Cloud
  • Rebuilding trust after a rushed load left duplicates and broken ownership

What you get at the end

  • One record per customer, holding the best value from every source
  • Pipeline and case totals that reconcile to the source, stage by stage
  • Audit evidence for every load: counts, exceptions, sign-offs
  • A cutover window your sales and support teams can plan around
What we deliver

Six artefacts, all of them yours

Everything below lives in your repository and your org when we leave. Nothing depends on a tool licence we hold.

Mapping workbook

Every source field mapped to a Salesforce field with type, transformation rule and business owner. Signed off before the first load.

Transformation scripts

Re-runnable Python or Node.js loaders on Bulk API 2.0, versioned in Git and logged by load id. The same script runs rehearsal and production.

Deduplication rules

Match keys and survivorship rules per object, tested on your real data, then kept alive as platform duplicate and matching rules.

Validation reports

Record counts, field-level reconciliation and sample audits, produced for every rehearsal and again for the production run.

Cutover runbook

Freeze window, load sequence, owners, go/no-go criteria and the communication plan. Rehearsed twice before it matters.

Rollback plan

Backup before load, delete-by-load-id scripts, and a decision rule agreed in advance so nobody argues at two in the morning.

Process

The pipeline, gate by gate

Seven steps and three sign-off gates. Nothing reaches production until the sandbox load reconciles and business users have audited real samples.

Salesforce data migration pipeline: extract, profile, map and transform, dedupe, load to sandbox, validate, load to production, with three sign-off gates Source systems legacy CRM, sheets, ERP Extract full, then delta Profile nulls, formats, dupes Gate 1 · profile signed off Map & transform workbook + scripts Dedupe match rules, survivorship Load to sandbox Bulk API, by load id Gate 2 · counts reconcile Validate fields + samples Gate 3 · UAT sign-off Production freeze window
Three gates stand between the first extract and production. A failed gate stops the run; we fix the mapping or the rules, reload and re-check. No gate is skipped on cutover day.
  1. Extract

    Pull a full snapshot from each source by API or export, with a repeatable delta query for changed records.

  2. Profile

    Measure nulls, formats, orphans, duplicates and outliers per field. The profile report decides scope and gets signed off.

  3. Map

    Source to target field mapping in a workbook, including picklist translations, record types and ownership rules.

  4. Transform

    Scripts apply the mapping: dates, currencies, phone formats, lookups resolved by external id, exclusions applied.

  5. Dedupe

    Match rules group records; survivorship rules pick the winning values. Merges are logged so they can be reviewed.

  6. Load

    Objects load in dependency order, automation bypassed where agreed, every batch tagged with a load id.

  7. Validate

    Counts, field-level reconciliation and business sample audits. Rehearsed in a sandbox, then repeated in production.

Deduplication

Match rules and survivorship, written down

Dedupe is two decisions, not one. Match rules decide which records are the same entity. Survivorship rules decide which values win when sources disagree. Both are tested on profiled data and reviewed with the people who own the records.

ObjectMatch keys (starting point)Survivorship rule
AccountsNormalised name + website domain + country; registration number where heldRecord with the most recent closed-won opportunity wins; longest complete address kept
ContactsEmail; fallback name + account + phoneCRM record beats marketing list; non-null values fill gaps; most recent consent status wins
LeadsEmail + companyConverted leads are dropped; newest open lead wins; older ones become activity history
OpportunitiesSource id only, never matched by nameSystem of record for revenue wins outright; the other source is archived as notes
CasesSource case number; thread id for email-to-caseStatus and owner from the live system; description from the richest source
Rules are tuned on your data

A "duplicate" in a marketing list is often two real people at the same company. Merging them loses a contact and a consent record. We review every rule against the profile report before it touches a record.

Validation

Three layers of checking, every load

  • Record counts

    Source rows minus agreed exclusions must equal Salesforce rows, per object and per load id. Any difference is listed in the exceptions log with a reason.

  • Field-level reconciliation

    For the fields that matter (amount, stage, close date, status, owner) we compare every record, not a sample. Pipeline by stage and cases by status must match to the unit.

  • Sample audits

    Business users check 30–50 records per object against the old system during UAT: addresses, notes, attachments, history. Their written sign-off is gate three.

Cutover

A rehearsed freeze, not a long weekend

The production run is the third time the scripts execute, not the first. Here is the shape of a typical cutover for a single-source migration.

  1. T minus 10 working days

    Second rehearsal and freeze notice

    Full load into a production-like sandbox with the final mapping. The mapping is locked. The freeze window and user communications are agreed with sales and support leads.

  2. T minus 2 working days

    Delta prepared, integrations scheduled to pause

    We extract records changed since the rehearsal and dry-run the delta. Inbound integrations are scheduled to pause so nothing writes during the load.

  3. T zero, 4–24 hour freeze

    Production load

    Backup, then full or delta load in object order. Gate two counts, gate three sample audit, go/no-go call. Users return to a clean org, or the rollback runs by load id.

  4. T plus 1 to 5 days

    Hypercare

    Exceptions queue worked daily, duplicate rules switched on, integrations resumed in sequence, ownership and sharing spot-checked with each team.

Checklist

Pre-migration checklist

Ten things to settle before the first load. Each one has cost a project a week when it was left to the day.

  • A named owner for every object, with authority to approve exclusions
  • Record types, picklists and validation rules finalised in the target org
  • Users created and active in Salesforce, so ownership can be assigned on load
  • Legacy ids stored in an external id field on every migrated object
  • Date, currency and time-zone conventions agreed per source system
  • Exclusion rules written: closed-lost older than an agreed age, test accounts, inactive users
  • Validation rules and automation that would block loads identified, with a bypass plan
  • Attachment and email volumes measured, and scoped in or out explicitly
  • Freeze window agreed with the people who will be locked out
  • Rollback decision rule written, with the name of who makes the call

Scanned contracts, order forms and PDFs sitting in the old system are a separate problem. Our document processing work turns them into fields and files before they are loaded, rather than migrating a pile of attachments nobody can search.

FAQ

Frequently asked questions

How long does a Salesforce data migration take?

Three to eight weeks for a single-source migration of accounts, contacts, opportunities and cases with a few years of history. Multi-org consolidations and heavy activity history run longer. The profiling step in week one tells us which end of the range you are at.

Which tools do you use to load data into Salesforce?

Bulk API 2.0 through scripted loaders (Python or Node.js) for anything repeatable, Data Loader for small one-off sets, and the platform's duplicate rules for ongoing protection. We avoid point-and-click ETL for the production run because every load must be re-runnable and logged.

Can you migrate while the old CRM stays live?

Yes. We run a full load into a sandbox and then production while the old system keeps working, then apply a delta load during a short freeze window. The freeze is typically 4–24 hours, agreed with sales and support leads in advance.

What happens if the migration fails on the day?

Every production load is tagged with a load id and preceded by a backup. If a gate fails we stop, then either fix forward or roll back by deleting that load id. The decision rule is agreed in the cutover runbook before the day, not during it.

Do you also migrate attachments, emails and activities?

Usually yes, but we scope them separately because volume drives time. Files move to Salesforce Files with ownership preserved; emails and tasks are loaded as activities with their original timestamps. Very large archives often belong in a searchable knowledge base rather than the CRM.

Ready to make AI work in production?

Tell us about your systems, your data and your constraints. We reply within one business day with a straight answer and a suggested next step.