← All posts
CRM migrationSpreadsheet to CRMApril 26, 2026Clint Research Team

How to Migrate From Spreadsheets to a Contractor CRM

A 2025 Capterra survey found 73% of small businesses still run on spreadsheets for at least one core function. Here is the step-by-step playbook to move a contractor business from spreadsheets to Jobber, Housecall Pro, or ServiceTitan without losing a single customer.

10 min read

Key takeaways

  • Most contractors carry 18 to 36 months of spreadsheet history that contains duplicates, broken phone numbers, and missing service addresses before any CRM ever sees the data
  • Jobber, Housecall Pro, and ServiceTitan all accept CSV imports for customers but only ServiceTitan ships a structured job-history importer, the other two require workarounds
  • Cleaning the spreadsheet before import is cheaper than cleaning the CRM after, by a factor of 10 according to Validity's 2025 State of CRM Data Management report
Contents
  1. 011. Inventory Every Spreadsheet That Touches a Customer
  2. 022. Pick Your Target CRM Before You Clean Anything
  3. 033. Consolidate Spreadsheets Into One Master Sheet
  4. 044. De-duplicate Aggressively Before Import
  5. 055. Standardize Phone Numbers and Addresses
  6. 066. Decide What Job History Comes With You
  7. 077. Map Tags, Categories, and Custom Fields
  8. 088. Run a 50-Row Test Import
  9. 099. Run the Full Import During a Slow Window
  10. 1010. Run a Two-Week Reconciliation
  11. 11Sources
  12. 12Frequently Asked Questions

A 2025 Capterra survey of 500 small businesses found 73% still run on spreadsheets for at least one core operations function, and contractors are over-represented in that number. Most $1M to $5M home service shops have a customer list in Google Sheets, a job log in a different tab, and an invoice tracker in QuickBooks Online that does not talk to either.

Moving to a real contractor CRM is not the hard part. The hard part is getting 36 months of half-baked spreadsheet data into the new system without dragging the mess in with you.

Here is the playbook.

1. Inventory Every Spreadsheet That Touches a Customer

Before you pick a CRM, find every spreadsheet your team is using. There are usually more than the owner thinks.

Common ones to track down: the master customer list, a separate quote log, a tab the office manager keeps for recurring service customers, a tab the bookkeeper uses to chase unpaid invoices, and a Google Sheet one tech keeps on his phone for the warranty work he handles personally.

List each file, who owns it, what fields it has, and how many rows. If a file has not been opened in 6 months, it is probably not worth migrating.

A 2025 thread on r/sweatystartup had a plumbing operator describe finding 11 separate spreadsheets across his team after committing to a Jobber move. He estimated 40% of his customer base existed in only one of those files, never the master.

Text Clint: "list every spreadsheet my team has shared with me in the last 12 months that has more than 50 rows"

2. Pick Your Target CRM Before You Clean Anything

Cleaning data without knowing the target is wasted work. Each CRM expects different fields, formats, and required columns.

Jobber's import accepts a CSV with first name, last name, company name, phone, email, street, city, state, ZIP, and notes. Jobber's customer import help article lists the exact column headers it expects.

Housecall Pro's import is similar but adds an account_id field for legacy IDs and a tags column. Housecall Pro's customer import documentation shows the template.

ServiceTitan is the heaviest. Customer import is one CSV. Locations (service addresses) are a separate CSV linked by customer ID. Equipment, contracts, and invoices are each their own importer. ServiceTitan's migration partners page lists Datix, Service MVP, and AroFlo as the three vendors most contractors use for paid migrations, with quotes typically running $5,000 to $25,000 depending on data volume.

Pick the target now. The CSV templates above become the schema you clean against.

Text Clint: "pull the import CSV template fields for Jobber and Housecall Pro side by side"

3. Consolidate Spreadsheets Into One Master Sheet

Open a new Google Sheet. The columns should match the CRM's import template exactly, in the same order, with the same headers.

Paste each source spreadsheet into its own tab first, then copy rows into the master one source at a time. Do not skip the source tag. Add a column called source_sheet and stamp every row with where it came from (master-2024, office-recurring, tech-warranty).

That source column is what lets you go back later when something does not match. Without it, every conflict becomes a guessing game about which version was right.

A roofer interviewed on the Owned and Operated podcast (Wilson and Carr) described using exactly this method to consolidate 7 years of spreadsheet history into a single 8,400-row import for ServiceTitan, with the source column letting him resolve 600+ conflicts in two evenings.

Text Clint: "tell me which fields appear in some of my spreadsheets but not others, so I know what gaps I need to fill"

4. De-duplicate Aggressively Before Import

This is the step that saves you the most money. Importing 8,000 rows that contain 1,200 duplicates means paying for 1,200 phantom seats of customer history forever.

Sort by phone number. Identical 10-digit phones are duplicates 95% of the time. Sort by email. Same logic. Sort by last_name + street_number. That catches the families where mom and dad are entered separately.

Mark duplicates with a dupe_of column pointing at the row you are keeping. The keep-row is usually the one with the most filled fields and the most recent activity. Delete the dupes only after you have spot-checked 50 of them.

Most contractors find 10 to 25% of their spreadsheet customer list is duplicates. The Validity 2025 State of CRM Data Management report found cleaning data before import costs about 10x less than cleaning it inside a live CRM, because every dirty record gets touched by automations, reports, and downstream syncs the moment the CRM goes live.

For a deeper checklist on what duplicate patterns to hunt down, see 9 dirty data problems hiding in every contractor CRM.

Text Clint: "audit my master sheet for duplicate customers based on phone, email, and address"

5. Standardize Phone Numbers and Addresses

Phone numbers come in 14 formats from 14 different sources. Standardize all of them to a single format before import.

The format that all three major CRMs accept cleanly is (555) 555-5555 or the bare 10 digits 5555555555. Strip dashes, dots, country codes, and the +1 prefix. Customers with phone fields under 10 digits or over 11 digits get flagged as bad data.

Addresses are messier. Run them through Google's address validation API or a service like Smarty. Misspelled cities, ZIP codes that do not exist, and street names abbreviated three different ways all become failed routing later. ServiceTitan in particular will reject locations with malformed addresses on import.

A 2024 r/hvac thread had a Florida HVAC owner describe importing 4,200 customers into Housecall Pro with addresses straight from his spreadsheet. 380 of them silently failed geocoding, which meant the dispatch map was wrong for 9% of his customer base for 4 months before he noticed.

Text Clint: "find rows in my customer sheet where the phone number is shorter than 10 digits or the ZIP code is not 5 digits"

6. Decide What Job History Comes With You

This is where most contractors get hurt. The CRM importers above accept customers cleanly. They do not accept job history cleanly.

Jobber's CSV import does not include a job-history field. Housecall Pro's import does not either. ServiceTitan accepts historical invoices via a separate import, but only if they map to existing customer and location IDs.

The pragmatic move is to import 12 to 24 months of job history into a single notes field per customer. Concatenate the date, service description, and amount into one block of text. It is not pretty but it is searchable.

For longer history, leave the spreadsheet archive in a read-only Google Drive folder named pre-CRM-history. Tag the customer record in the new CRM with legacy-data-available so techs know to ask the office.

Going deeper on what reports the CRM can produce after migration is covered in Jobber reports every home service business should run.

Text Clint: "summarize the last 24 months of jobs per customer from my master sheet into a single notes block per customer"

7. Map Tags, Categories, and Custom Fields

Spreadsheets have informal tags. CRMs have formal ones. The translation step is unglamorous but determines how reportable your data is.

Walk through your spreadsheet's notes column and pull out every word that looks like a tag. VIP, referral, do not call, commercial, warranty-only, slow-payer. Make a list of the top 30. These become the tag library you create in the new CRM before import.

ServiceTitan calls these tags and business unit. Housecall Pro calls them tags. Jobber calls them tags and client types. Pick one canonical name per concept and apply it consistently in the import sheet.

Custom fields are a separate problem. If your spreadsheet has columns like panel_brand, system_age, or service_contract_end_date, those become custom fields in the CRM. Create them in the CRM's settings before importing or the data lands in a notes field and is not reportable.

Text Clint: "scan the notes column on my customer sheet and list the most common tag-like phrases I should standardize"

8. Run a 50-Row Test Import

Never import the full file first. Take 50 rows that span the messiest variations (oldest customer, newest customer, customer with weird characters in name, customer with unusual ZIP, commercial account with multiple contacts) and run those through the CRM import.

Check what landed. Are the tags applied? Did the address geocode? Did the phone number format right? Is the email field populated? Does the customer show up when a tech searches for them in the field app?

Fix the broken rows in the master sheet, then re-export and re-import the same 50. When all 50 land cleanly, you are ready for the full file.

A roofer on r/Roofing described skipping this step in 2024 and importing 6,000 rows into Housecall Pro that all had email and phone swapped. Took him 3 days to roll back and re-import.

Text Clint: "give me 50 customer rows from my sheet that span the widest variation in formats so I can test-import them"

9. Run the Full Import During a Slow Window

Pick a Friday afternoon or a Sunday night. Have the office manager and at least one tech on standby for the first 4 hours after the import to spot-check.

Do the import in batches if your CRM allows it. Jobber accepts up to 1,000 rows per file. Housecall Pro recommends batches of 500. ServiceTitan's import tool handles much larger files but the corresponding location and equipment imports want batching.

Take a snapshot of total customer count, total active jobs, and total open invoices before the import. After import, those numbers in the new CRM should match the source-of-truth in the spreadsheet within 1%.

If you are coming from a workflow where Jobber data was syncing to Google Sheets, see how to connect Jobber to Google Sheets for the inverse pattern post-migration.

Text Clint: "compare my pre-migration customer count and total open invoices to what I see in the CRM right now"

10. Run a Two-Week Reconciliation

For the first two weeks after migration, run two systems in parallel. Every new customer goes into the CRM. The spreadsheet stays read-only.

At the end of week two, run a reconciliation. Did any customer the techs spoke with in those two weeks not exist in the CRM? Did any duplicate get re-introduced because a CSR could not find an existing record? Did any tag migration get missed?

Fix what you find, then archive the spreadsheets to a folder labeled pre-CRM-historical-readonly. Lock the share permissions to view-only for everyone except the owner. The temptation to keep editing both will kill the migration if you do not enforce this.

Text Clint: "show me any customer who got a job in the last 14 days but does not have a phone number or email on file in the new CRM"

Sources

Clint sits outside your CRM and answers questions about the data inside it. Once the migration is done, ask Clint to find duplicates, surface stale customers, and flag the records that did not import cleanly. See it in action at textclint.com.

Frequently Asked Questions

5 questions home service owners actually ask about this.

  • 01How long does a spreadsheet-to-CRM migration take?

    A clean migration of 2,000 to 5,000 customers takes 3 to 5 working days for the data prep, plus the import itself. Most contractors stretch it to 2 to 3 weeks because they discover messy data they did not know about.

  • 02Should I hire a migration consultant?

    For Jobber and Housecall Pro, generally no. The CSV import tools are simple enough. For ServiceTitan, vendors like Datix, Service MVP, and AroFlo charge $5K to $25K and most multi-million-dollar shops use them, because the equipment and history imports are non-trivial.

  • 03What is the most common migration mistake?

    Importing dirty data and trying to clean it inside the new CRM. The Validity 2025 report quantifies this at roughly 10x the cost of cleaning before import. Pre-migration is the cheapest moment to fix duplicates, bad phones, and broken addresses.

  • 04Do I need to import historical jobs?

    For most contractors, 12 to 24 months of job history is enough to run reactivation campaigns and lifetime value reports. Anything older can stay in archived spreadsheets in Drive.

  • 05Can Clint help with the migration itself?

    Clint connects to the new CRM after the data is in, and helps audit duplicates, find gaps, and answer questions about your customer base. The CSV migration step itself is best handled by the CRM's native importer or a paid migration partner for ServiceTitan.

See Clint in action

Clint is the pre-built AI for home service shops. Connect your CRM, email, and phone system in minutes and the agents run on your real data.