All articles

Custom CRM

How to Move From Spreadsheets to a CRM: 6 Steps

The CSV import is the easy 20%. Decoding what your columns actually mean is the other 80%. A 6-step migration built from real postmortems.

Om Patel 18 min read
Photo: camera obscura / Unsplash

The short answer

Moving from spreadsheets to a CRM takes about two to three weeks for a small team, and the import itself is one afternoon of it. The work that decides success happens first: writing down what each column actually means, choosing what not to migrate, and resolving duplicate identities before anything moves. Finish with a hard cutover date that makes the old sheet read-only.

Most guides on this topic spend 1,500 words persuading you that spreadsheets are bad and 200 words on the actual move. That ratio is backwards. You already know the spreadsheet is failing, or you would not be reading this.

Here is the honest version: exporting a CSV and importing it takes about an afternoon. The project takes two to three weeks, and almost all of that time goes into deciding what your columns actually mean. A spreadsheet is not a database that happens to be in Excel. It is an undocumented process, held together by conventions that live in one or two people's heads. The CRM will not accept conventions. It only accepts definitions.

That gap is the entire difficulty, and it is why teams who treat this as a data-transfer problem end up with a more expensive spreadsheet.

When to actually make the move

The trigger is not a number of rows. It is the first time the spreadsheet gives you an answer that turns out to be wrong.

Every vendor guide picks an arbitrary threshold, usually somewhere between 100 and 500 contacts, because a threshold makes for a tidy call to action. Practitioners describe something different. The most useful framing I found came from a small business owner on r/smallbusiness who had been through it:

"The switch point usually isn't a number of customers, it's the first time the spreadsheet lies to you. Someone updates the wrong row, two people have different versions, a formula quietly breaks. Before that happens spreadsheets are genuinely fine, and moving early means paying a monthly fee to manage data you could still see at a glance. So the honest test: has the spreadsheet cost you money or an awkward customer moment yet? No: you're not behind. Yes: you're not early."

u/Suitable-Increase570, r/smallbusiness

That test holds up against the research. Ray Panko, an information systems professor at the University of Hawaii, spent years auditing real operational spreadsheets and found that 88% contain errors in 1% or more of their formula cells. The failure mode is not that spreadsheets break loudly. It is that they are quietly, routinely wrong, and you only find out when a customer does.

Two other signals worth trusting:

  • Reconstructing context costs more than changing systems. If you have to ask two or three people to establish where a single deal stands, the sheet has stopped working as a record.
  • You are losing deals to timing. As one commenter on the same thread put it, the real trigger "isn't a number of clients, it's when you start losing deals because of timing."

If none of that is true yet, close this tab. A sheet with 40 rows and one owner is a perfectly good CRM. If you already have a CRM and it is the thing failing, that is a different diagnosis, and the signs you've outgrown your CRM is the better read.

By the numbers

1 in 4 small and medium businesses still run their contacts on spreadsheets or Excel, according to CRM adoption data compiled by OfficeClip, even though over 90% of companies with 10 or more employees now use a CRM of some kind. If this is you, you are not unusual and you are not late.

Step 1: Audit the columns, not the data

Before you touch a single row, write down what every column actually means. Not its header. Its meaning.

This is the step nobody publishes and everybody underestimates, and it is where the project either succeeds or turns into six weeks of confusion. A practitioner on r/CRM described the problem better than any vendor documentation:

"The part that gets underestimated is all the 'everyone just knows what this means' logic living around the spreadsheet. A status, blank field, weird note, or manually colored row can have an understood meaning that never got documented. Moving into a CRM forces you to define those things, which is usually where the real work starts."

u/ops_and_chaos, r/CRM

Your sheet is full of this. The yellow rows mean "chasing payment." A blank Owner cell means Sarah, because Sarah handles anything unassigned. The Status column has 31 distinct values because everyone typed freehand for two years. None of that survives an import, because a CRM has no concept of "yellow."

Open a second sheet and build one row per source column:

Source columnWhat it really meansTarget fieldTypeAllowed valuesDecision
StatusFreehand, 31 variantsDeal stagePicklist5 stagesTransform, map old to new
(row colour)Yellow = chasing paymentPayment statusPicklistCurrent / OverdueMigrate, needs new column first
OwnerBlank means SarahRecord ownerUserTeam listTransform, fill blanks first
NotesEverything, mixedNoteLong textn/aMigrate active only
Last contactMixed formatsLast activity dateDateISOTransform, see Step 4

Two rules make this go faster. First, do it with the people who live in the sheet daily, not just whoever is running the project. They know what the colours mean, and involving them is how you avoid the shadow spreadsheet later. As one commenter warned, if they do not understand why the switch matters, "they'll just keep a shadow spreadsheet on the side and you end up with two sources of truth."

Second, when you collapse 31 freehand status values into 5 stages, you are making a real decision about what your pipeline is. Disagreement here is not an obstacle. It is the project surfacing early, which is the best time for it to surface.

Step 2: Decide what you are not migrating

Every guide tells you to clean your data. Almost none tell you to delete most of it, which is the higher-value move.

Contact data rots on a schedule. MarketingSherpa research published in HubSpot's database decay work puts B2B data decay at 2.1% per month, an annualised rate of 22.5%. People change jobs, companies rebrand, numbers get reassigned. A contact you last touched in 2021 is, statistically, more wrong than right. Importing it does not preserve knowledge, it manufactures confident-looking noise.

Give every column and every row segment one of four decisions:

  1. Migrate. Active customers, open opportunities, anything touched in the last 12 to 18 months.
  2. Transform. Needed, but the format or the values have to change first.
  3. Archive. Keep it queryable in a read-only file. You can always pull it back. You can rarely un-pollute a live database.
  4. Drop. The column nobody has used since 2022.

"Keep everything" is not a fourth option, it is a deferral, and it gets paid for later at a much worse rate. A CRM consultant on r/CRM described the payoff from doing this first:

"In one client migration, the biggest improvement came from deciding which fields were still worth carrying forward before cleaning anything. Once the data model was simplified, deduplication and formatting became much easier and adoption was noticeably smoother because users weren't starting with years of irrelevant data."

u/Growth_Natives, r/CRM

Note the order there: simplify, then dedupe, then clean. Doing it in that sequence means you never spend an hour standardising phone numbers in a column you were going to drop.

Watch out

Archive, do not delete. Keep the original sheet as a read-only file for at least six months. The first time someone asks "where did the reorder note field go," you will want it. This costs nothing and removes the main emotional objection to cutting data.

Step 3: Resolve identity before you import

Duplicates are the fastest way to lose your team's trust, and they are almost entirely preventable in the spreadsheet.

The mechanism is simple. Your sheet contains Acme, Acme Inc, ACME Corp, and acme.com. To you these are obviously one customer. To a name-matching import they are four records. Ship that, and a rep opens the CRM on day one, sees the same account four times with different owners, and concludes the system is garbage. Estimates of the scale vary widely, but Insycle's deduplication research puts the average duplicate rate in an unmanaged database at 20% to 30%, against a commonly cited healthy target of under 2%.

Three rules do most of the work:

Match on a stable key, not a display name. Email domain for companies, email address for people. Names are formatted by humans and humans are inconsistent. Domains are not.

Decide survivorship rules before you merge. When two rows for the same customer have different phone numbers, which one wins? Usual answer: the record with the most recent activity date. Write the rule down once so you are not adjudicating 200 individual cases.

Merge in the spreadsheet, not in the CRM. This is where the biggest time saving hides. A marketing assistant who migrated 300 contacts to HubSpot described exactly what happens when you skip it:

"I ended up creating a lot of duplicate records. Then I tried merging them, but it was honestly a bit of a mess. We had around 300 contacts, and I ended up going through a lot of them manually. That took way more time than preparing the data properly would have."

u/daria_tabolina, r/CRM

Spreadsheets are actually good at this part. Sort by domain, use conditional formatting to flag repeats, and the duplicates line up next to each other visually. That is a genuinely better dedupe interface than most CRM merge tools.

We build custom CRMs for small teams whose process does not fit a standard pipeline, and migration off spreadsheets is included, not a line item you discover later. If you want a second opinion on your column audit before you import anything, that conversation is free.

Book a free CRM demo

Step 4: Fix the five formats that break silently

This is the step that separates a clean migration from one that looks clean for three weeks. Every one of these failures returns a "success" message.

That is the important part. Your import will not error. It will cheerfully accept corrupted data and report a green tick, and you will discover the problem months later in a report that reads wrong. As one practitioner put it after living through it:

"Date formats break quietly. DD/MM rows land as MM/DD and nobody notices until a renewal report reads wrong months later. Worth spot checking twenty records after import rather than trusting the success message."

u/beventrc65, r/CRM

Here is the full set, with the fix for each:

TrapWhat you seeWhy it happensFix before export
Date flipping3 April becomes 4 MarchDay-first and month-first are both valid readings of 03/04/2026Convert every date column to ISO YYYY-MM-DD, formatted as text
Leading zeros strippedPostal code 06810 becomes 6810Excel coerces text that looks numeric into a numberFormat the column as Text before entering or pasting, or prefix with an apostrophe
Scientific notationPhone 447700900123 becomes 4.477E+11Long numeric strings are treated as numbersStore phone and account numbers as Text, never as Number
Mangled accentsMontréal becomes MontréalCSV saved in the wrong text encodingExport as CSV UTF-8 explicitly, not plain "CSV"
Column driftOne row gains extra columnsA comma inside a field, common in addresses and notesEnsure fields are quoted, or export as tab-delimited

The underlying cause of the middle three is the same, and it is worth naming: Excel edits your data on the way in and on the way out. Datahash's export documentation states it plainly, noting that Excel "coerces values as it writes them, and more aggressively than Sheets. Long numbers become scientific notation, leading zeros are dropped." Reopening a saved CSV in Excel re-applies the coercion, so a file you fixed can be silently broken again just by double-clicking it to check.

Two habits prevent nearly all of this. Format the affected columns as Text before you do anything else, and once you have exported the final CSV, do not reopen it in Excel. If you must inspect it, use a plain text editor.

Tip

Dates only flip when the day is 12 or lower. Anything from the 13th onward survives, because there is no month 13. That is why the corruption is so hard to spot: roughly 60% of your dates look completely fine, which is exactly enough to make a spot check pass if you are careless about which rows you check.

Step 5: Test import twenty records, then reconcile

Import a small sample, verify it field by field, fix the mapping, and only then run the full load.

Everyone nods at this and then skips it, because the full import takes eight minutes and feels harmless. It is not harmless: a bad mapping applied to 4,000 rows is a cleanup project, while the same bad mapping applied to 20 rows is a two-minute fix.

Pick the sample deliberately rather than taking the first 20 rows. You want it to include the awkward cases:

  • A normal, complete record
  • A record with missing fields
  • A known duplicate pair
  • A company with multiple contacts attached
  • A record with an accented name or an address containing a comma
  • A date early in the month and a date after the 12th
  • Your longest notes field

Then reconcile, which means comparing the imported record against the source row field by field, not glancing at the list view. Confirm counts match, confirm the date landed on the right day, confirm the postal code kept its zero, confirm the duplicate resolved the way your survivorship rule said it should.

The person who migrated those 300 contacts summarised the lesson as three changes she would make next time: clean and deduplicate before importing anything, decide the CRM fields beforehand, and "always test the import on a small batch first." That is Steps 1 through 5 of this guide, arrived at the expensive way.

Step 6: Hard cutover, read-only, archive

Set a date. On that date, the spreadsheet becomes read-only and the CRM becomes the only place work happens.

There is no gentle version of this, and the gentle version is the most common cause of quiet failure. Running both systems "for a few weeks while people adjust" sounds humane and is actually the worst of both worlds: half the team updates the sheet from habit, half uses the CRM, and neither system is complete. You have not eased the transition, you have split your source of truth in two and made both untrustworthy.

The cutover sequence that works:

  1. Announce the date at least a week out. Not a surprise.
  2. Do the final export the morning of cutover, so you capture the last day of edits.
  3. Run the production import.
  4. Set the sheet to view-only that same day. In Google Sheets, change sharing permissions. In Excel, move it to an archive folder and mark it read-only. This is the actual mechanism, and it takes 30 seconds.
  5. Rename it to something like ARCHIVE-2026-08-27-DO-NOT-EDIT, so nobody opens it by accident.
  6. Keep it for six months minimum.

Read-only rather than deleted is what makes a hard cutover politically survivable. Nobody is losing anything. They just cannot write to it anymore.

The two weeks after go-live decide whether it worked

The import is not the risky moment. The fortnight afterward is.

This is when people revert under pressure. A rep gets busy, does not want to learn the new deal form, and opens a personal copy of the old sheet "just for this week." That is the beginning of a shadow spreadsheet, and shadow spreadsheets do not get discovered, they get institutionalised.

Three things to actually do in that window:

Watch behaviour, not logins. Logins tell you nothing. Watch whether opportunities are being updated and whether next actions have dates on them. If a deal has not moved in ten days and the rep is clearly working it, they are tracking it somewhere else.

Ask where the number came from. In your first few pipeline meetings, if someone quotes a figure that is not in the CRM, ask where it came from. Do it neutrally, twice, and the message lands without a confrontation.

Fix friction immediately, not next quarter. If logging a call takes three minutes, people will stop. The highest-leverage thing you can do in week one is delete required fields until logging an interaction takes under 30 seconds. That is the core argument in our piece on getting your sales team to actually use the CRM, and it applies double during a migration, when goodwill is finite.

Start narrow, too. Several practitioners independently recommended piloting before moving everyone: define one active workflow, agree on owner, stage, last contact, next action and next-action date, and run 20 real records through it with two people first. Historical cleanup can wait until the team has proved it will use the new process.

How long this actually takes

For a small team, this is a two to three week calendar project and roughly 15 to 30 hours of real work. Here is where the hours go.

StepTypical effortNotes
Column audit and definitions4-8 hoursThe largest single block. Do it with the daily users.
Decide what not to migrate1-2 hoursFast once definitions exist.
Dedupe and survivorship3-6 hoursScales with row count and how many people edited the sheet.
Format fixes2-4 hoursMostly mechanical.
Test import and reconcile2-3 hoursExpect two or three rounds.
Production importUnder 1 hourThe part everyone thinks is the project.
Cutover and first-week support3-6 hoursDo not skip.

Add 50% to 100% if you have multiple source sheets, order or job history to bring across, or three people who each maintain their own version of "the" spreadsheet. Reconciling competing versions of the same data is its own project, and it belongs in Step 1.

When a CRM is not the answer yet

Two cases where you should not do any of this.

Your process is not stable. If how you sell is genuinely still changing month to month, a spreadsheet's flexibility is a feature, not a bug. Configuring a CRM around a process you will abandon in eight weeks is wasted work. Wait until the shape holds still.

The problem is process, not tooling. This is the more common one, and it is worth being blunt about because the CRM industry has no incentive to say it. A commenter on r/smallbusiness put it well: "I've seen businesses on spreadsheets close more deals than businesses on Salesforce, because the spreadsheet team had a rule that every new lead gets called within 5 minutes, and the Salesforce team had a beautiful pipeline that nobody looked at until end of day." A CRM makes a good process faster. It does not create one.

If your process is stable but genuinely unusual, standard pipelines can be the constraint rather than the solution, which is the real question behind custom CRM versus off-the-shelf. Most teams should start with off-the-shelf. Custom earns its cost when the operating model is stable, specific, and central to how you make money.

The bottom line

This move fails for a predictable reason: teams treat it as a data transfer when it is a definitions exercise. Audit what the columns mean before you look at the rows. Decide what you are deliberately leaving behind. Resolve identity on domains, not names. Fix the five formats that corrupt silently. Test on twenty records and reconcile field by field. Then cut over hard, make the old sheet read-only, and archive it for six months.

The version of this project that goes badly is not the one where the import throws an error. It is the one where everything looked fine, both systems ran in parallel for a month, and six months later half the team is still working out of a spreadsheet nobody admits to having.

Frequently asked questions

How do I move from spreadsheets to a CRM?
Work in six steps. Audit what each column actually means, decide what you are not migrating, resolve duplicate identities in the spreadsheet, fix the formats that break silently during import, test the import on twenty records and reconcile them field by field, then set a hard cutover date and make the old sheet read-only. The import itself takes an afternoon. The five steps around it take two to three weeks.
When should a small business switch from spreadsheets to a CRM?
Not at a specific row count. The honest trigger is the first time the spreadsheet gives you a wrong answer that costs you something: a missed follow-up, two people calling the same lead, a stale number quoted to a customer. As one small business owner put it on r/smallbusiness, the switch point is 'the first time the spreadsheet lies to you.' Before that, a sheet is genuinely fine and a subscription is premature.
Should I migrate all my historical spreadsheet data into the CRM?
No. Migrate what is active and what you are legally or operationally required to keep, and archive the rest somewhere you can still query. Contact data decays at roughly 2.1% per month, about 22.5% per year according to MarketingSherpa research published by HubSpot, so a five-year-old row is mostly fiction. Importing everything is the fastest way to make your team distrust the new system in week one.
How long does it take to move from a spreadsheet to a CRM?
For a small team with one or two source sheets and a few thousand rows, budget two to three weeks of calendar time and roughly 15 to 30 hours of actual work. Column auditing and field mapping take the largest share. The production import is usually under an hour. Multi-sheet setups with order history, or teams where three people each maintain their own version, run four to six weeks.
Why did my dates change after importing a CSV into my CRM?
Because day-first and month-first formats are ambiguous and nothing errors. A row written as 03/04/2026 meaning 3 April lands as 4 March, and any date where the day is 13 or higher survives while the rest flip. The import reports success. Fix it before export by converting every date column to unambiguous ISO format (YYYY-MM-DD) as text, then spot check twenty records after import rather than trusting the success message.
How do I remove duplicates before a CRM import?
Match on a stable identifier, not a name. Email domain beats company name, because Acme, Acme Inc, ACME Corp and acme.com are one customer that name-matching sees as four. Sort by your match key, decide survivorship rules in advance (which record's phone number wins when two disagree), and merge in the spreadsheet. Cleaning after import is far more work than cleaning before it.
Should I run the spreadsheet and the CRM in parallel for a while?
No, and this is the single most common way these projects fail quietly. Running both splits your source of truth in two, so neither is complete and nobody trusts either. Pick a hard cutover date, make the spreadsheet read-only that day, and archive it in place for at least six months so you can answer questions about where a field went.
What breaks most often during a spreadsheet to CRM import?
Five things, and all of them fail silently: date formats flipping between day-first and month-first, leading zeros stripped from postal codes and account numbers, long phone numbers converted to scientific notation, accented characters mangled by the wrong text encoding, and fields containing commas splitting into extra columns. None of these throw an import error. You find them weeks later in a report that reads wrong.
Do I need a custom CRM or will an off-the-shelf one do?
Start with off-the-shelf unless your process genuinely cannot be modelled in one. Only about 6-10% of CRM failures are caused by the platform itself, so a custom build rarely fixes the problem people expect it to fix. Custom earns its cost when your operating model is stable, unusual, and central to how you make money, for example trade scheduling or repeat-order logic that no standard pipeline represents.
Bespoke pipelines, automations, 360° customer records and real-time reporting, a CRM built around how your team actually works, connected to your entire stack.
Book a free CRM demo

Free tools

Find out what your site is costing you.

Enter your address and we check the real page. Scores are free and the itemised report lands in your inbox. No account, and we change nothing on your site.