← Back to case studies

CRM migration and pipeline rebuild for a regional HVAC contractor

Outcome

Reduced quote-to-close time by 40% and eliminated the manual job scheduling spreadsheet used daily by 6 staff.

CRMHubSpotWorkflow AutomationField ServicesData Migration

Background

A regional HVAC contractor with 12 technicians and a three-person admin team had been running their operations on a combination of a legacy CRM, three Google Sheets, and a shared inbox. Customer communication happened over text messages. Job scheduling lived on a printed whiteboard.

The owner came to kaanduIT after a billing error caused by duplicate entries cost him a client relationship worth approximately $8,000/year.

The problem

The core issue wasn’t the tools — it was that there was no single source of truth. A new job could exist in four places simultaneously (the inbox, a spreadsheet, the CRM, and someone’s text messages) with no automatic reconciliation between them.

This created:

  • Duplicate jobs, especially for recurring maintenance contracts
  • Lost follow-ups on quotes that didn’t get a response within 48 hours
  • Manual scheduling coordination taking ~90 minutes per day across the admin team
  • No visibility into pipeline value or conversion rates

What we built

Phase 1: CRM selection and migration (weeks 1–2)

After reviewing the client’s workflow, I recommended migrating to HubSpot’s free CRM tier with a paid Operations Hub add-on for automation. The deciding factors:

  • HubSpot’s deal pipeline maps cleanly to the quote → scheduled → in-progress → invoiced flow of a field services business
  • The mobile app is usable enough for techs to log notes on-site
  • Operations Hub automation is powerful enough to handle the follow-up workflows without a third-party tool

Data migration: I exported ~1,400 contacts and ~600 historical jobs from the old system, cleaned the data in Google Sheets (deduplication, address normalization, phone number formatting), then imported via HubSpot’s CSV importer. The actual migration work took about 6 hours.

Phase 2: Automation workflows (weeks 3–4)

I built four core workflows in HubSpot:

Quote follow-up sequence When a deal moves to “Quote Sent,” a 3-step follow-up sequence triggers automatically: an email at 48 hours, a Slack notification to the sales rep at 72 hours, and a deal stage change to “Follow-Up Required” at 5 days with no response.

Job scheduling notification When a deal moves to “Scheduled,” the assigned technician receives a text message (via Twilio integration) with the job details, customer address, and a direct link to the HubSpot record. No more relaying job info by text.

Recurring maintenance reminders Contacts tagged as maintenance contract customers receive an automated email 30 days before their annual service is due. The email pulls the customer’s name, last service date, and a booking link.

Invoice tracking When a job closes, a task is automatically created for the admin team to send the invoice within 24 hours. Overdue invoices (7+ days unpaid) trigger a Slack alert to the owner.

Phase 3: Team training (week 5)

Two 90-minute training sessions — one for the admin team, one for the techs. I built a one-page quick-reference doc for each role and recorded a 12-minute Loom walkthrough they use for onboarding new staff.

Results

Six weeks after go-live:

  • Quote-to-close time dropped from ~18 days to ~11 days
  • Quote follow-up rate improved from ~60% to 100% (automated, so it’s consistent)
  • Manual scheduling coordination reduced from ~90 min/day to ~15 min/day
  • Zero duplicate jobs in 6 weeks (compared to ~3/week previously)
  • Owner has a real-time pipeline dashboard for the first time

The billing error that triggered the engagement hasn’t happened again.

What I’d do differently

I underestimated how long data cleaning would take. If I were scoping this again I’d add a full day to the estimate for data work.

I also would have pushed harder for the techs to use the mobile app rather than texting the office. Adoption ended up at about 60%. It’s functional but not ideal — something to keep working on post-launch.