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 column | What it really means | Target field | Type | Allowed values | Decision |
|---|---|---|---|---|---|
| Status | Freehand, 31 variants | Deal stage | Picklist | 5 stages | Transform, map old to new |
| (row colour) | Yellow = chasing payment | Payment status | Picklist | Current / Overdue | Migrate, needs new column first |
| Owner | Blank means Sarah | Record owner | User | Team list | Transform, fill blanks first |
| Notes | Everything, mixed | Note | Long text | n/a | Migrate active only |
| Last contact | Mixed formats | Last activity date | Date | ISO | Transform, 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:
- Migrate. Active customers, open opportunities, anything touched in the last 12 to 18 months.
- Transform. Needed, but the format or the values have to change first.
- Archive. Keep it queryable in a read-only file. You can always pull it back. You can rarely un-pollute a live database.
- 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.
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:
| Trap | What you see | Why it happens | Fix before export |
|---|---|---|---|
| Date flipping | 3 April becomes 4 March | Day-first and month-first are both valid readings of 03/04/2026 | Convert every date column to ISO YYYY-MM-DD, formatted as text |
| Leading zeros stripped | Postal code 06810 becomes 6810 | Excel coerces text that looks numeric into a number | Format the column as Text before entering or pasting, or prefix with an apostrophe |
| Scientific notation | Phone 447700900123 becomes 4.477E+11 | Long numeric strings are treated as numbers | Store phone and account numbers as Text, never as Number |
| Mangled accents | Montréal becomes Montréal | CSV saved in the wrong text encoding | Export as CSV UTF-8 explicitly, not plain "CSV" |
| Column drift | One row gains extra columns | A comma inside a field, common in addresses and notes | Ensure 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:
- Announce the date at least a week out. Not a surprise.
- Do the final export the morning of cutover, so you capture the last day of edits.
- Run the production import.
- 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.
- Rename it to something like
ARCHIVE-2026-08-27-DO-NOT-EDIT, so nobody opens it by accident. - 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.
| Step | Typical effort | Notes |
|---|---|---|
| Column audit and definitions | 4-8 hours | The largest single block. Do it with the daily users. |
| Decide what not to migrate | 1-2 hours | Fast once definitions exist. |
| Dedupe and survivorship | 3-6 hours | Scales with row count and how many people edited the sheet. |
| Format fixes | 2-4 hours | Mostly mechanical. |
| Test import and reconcile | 2-3 hours | Expect two or three rounds. |
| Production import | Under 1 hour | The part everyone thinks is the project. |
| Cutover and first-week support | 3-6 hours | Do 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.
