Skip to content

Migration guide · CRM Platform

Spreadsheets to a CRM migration

Spreadsheets, Outlook and shared drivesSalesforce or HubSpot

Short answer

Moving from spreadsheets to a CRM means consolidating client lists, pipelines and notes from Excel, Google Sheets, Outlook and shared drives into Salesforce or HubSpot, deduplicating them, and setting up the processes and automation that spreadsheets cannot provide.

Why firms make this move

Many firms run on spreadsheets longer than they should. The pain shows up as duplicate outreach, lost follow-ups, no pipeline visibility and key-person risk when someone leaves. A first CRM is a chance to define a simple, consistent process.

The hardest part is usually agreeing on one version of each list.

What moves

  • Client and prospect lists
  • Pipeline trackers as deals or opportunities
  • Notes and key dates
  • Email history from Outlook or Gmail, going forward
  • Ownership and territories

See the field-by-field map ↓

What to watch out for

  • Several conflicting versions of the same list
  • Free-text columns that need to become structured fields
  • Undocumented processes that live in people's heads

How Vantage Point runs the migration

  1. Collect and inventory every source
  2. Design a simple data model and pipeline
  3. Clean, deduplicate and standardize
  4. Load, validate and train
  5. Turn on email integration and automation

Typical timeline

Typically 3 to 6 weeks.

Frequently asked questions

Salesforce or HubSpot for a first CRM?

It depends on complexity and growth plans. Our Salesforce vs. HubSpot guide compares them, and we help firms choose.

How much history should we bring?

Active clients, open pipeline and the last few years of key notes are usually enough to start.

Last reviewed October 2, 2026 by the Vantage Point team. Browse all migration paths

Field-level map

Spreadsheets to a CRM: field by field

16 mappings we start from on this migration, 14 of which need a transform, a lookup or a decision. Every project gets its own signed-off version; this is the baseline.

FromToHowNotes
Sheet rowFull name Contactfirstname / lastname req split
Sheet rowEmail Contactemail req direct De-duplication key. Check for blanks and shared inboxes.
Sheet rowEmail (test and load runs) Contact / Leademail (temporary .invalid suffix) derive While you test and load with any automation still on, append .invalid to every email address so no welcome message, alert or auto-response can reach a real person. Strip the suffix in one update at go-live, before turning outbound email back on. Salesforce sandbox refreshes only do this for user emails, not contact or lead emails.
Sheet rowPhone Contactphone derive Normalize to one format (E.164 if you will dial from the CRM).
Sheet rowState / province ContactState code (state and country picklists) picklist map With Salesforce state and country picklists turned on, each row must carry a value that matches a valid state and country code or name exactly. Full names typed differently, odd abbreviations or typos fail the whole row. Map every distinct value to its two-letter code before loading, then rerun only the failed rows.
Sheet rowCompany Company / Accountname derive Create once, then associate every person.
Sheet rowStatus column ContactLifecycle stage / lead status picklist map
Sheet rowOwner initials AnyOwner lookup
Sheet rowDates typed as text AnyDate property derive Parse into real dates. Watch day/month order.
Sheet rowOriginal created or lead date Lead / ContactSource date field (or CreatedDate) derive Every loaded record gets the load date as its created date, so queues, list views and age formulas built on created date show old leads as new or hide them behind date filters. Load the original date into its own field, or set CreatedDate with the Set Audit Fields permission, and point filters, sorting and age calculations at it. Check for placeholder dates such as 1899 or 1900 that came from blank cells.
Sheet rowCells with several values AnyMulti-select property split
Sheet rowNotes column NoteBody direct
Sheet tabDeals or pipeline tab Deal / Opportunityname / amount / stage / close date picklist map
Sheet rowCampaign column (name or ID) Campaign MemberCampaignId + LeadId / ContactId association Load the people first, then create the campaign membership records that link each one to its campaign. Spreadsheet edits (autofill, drag-copy, number formatting) can quietly change long ID values, so keep ID columns formatted as text, or match on a campaign external ID or short code instead of the record ID.
Whole fileBulk load run Any— manual review Before a bulk load, pause automation that fires on insert (triggers, record-triggered flows, assignment rules, welcome emails) or confirm it is safe to run. Load a small test batch first, check the results and the error file, then load the rest.
Sheet rowCodes used as match keys (promo, mailer or source codes) AnyExternal ID / match key derive Trim spaces and normalize case before matching. Some source systems uppercase values on save, so the same code can arrive in two cases and load as false duplicates. In Salesforce, decide whether a unique External ID field should be case-sensitive before loading.

Field names are the platforms' standard API names; your org's custom fields are mapped during discovery. What the "How" labels mean

How labels
direct
Value copies across unchanged.
picklist map
Each source value is mapped to a target value.
lookup
Matched to an existing record, such as a user by email.
association
Becomes a relationship between records, loaded in a later pass.
derive
Calculated or cleaned during the load.
split / concat
One field becomes several, or several become one.
rebuild
Configuration or automation that is rebuilt rather than moved.
drop
Not migrated, deliberately.
manual review
Needs a decision with your team before the load.