Case StudyJobberCRM MigrationData

Case Study: Migrating 11,000+ Clients from ACT! CRM to Jobber With Zero Failures

A Florida dryer-vent cleaning and home-protection company had over a decade of customer history trapped in ACT! CRM. It all had to land in Jobber cleanly, matched to clients who already existed there, without touching the live jobs the team was running every day.

The challenge

This was not an export-one-file, import-another job. ACT! fights you:

  • The history lived in 25 batch HTML exports, about 11,800 contacts and 38,470 free-text notes, not a clean database dump.
  • Clients and properties already existed in Jobber from an earlier partial import, so records had to be matched and enriched, never duplicated.
  • The business was live: new jobs, invoices and checklists were created daily and could not be touched.
  • The data was messy: inconsistent phone formats, notes mixing appointments with real services, duplicate and multi-property customers.

The approach

  1. Extract and parse. A custom parser turned the 25 HTML exports into one clean master dataset of contacts, notes, jobs and property data.
  2. Clean and structure. Phone numbers normalised, notes split into real services versus appointments, a uniform property summary per client, and one historical job per real service visit.
  3. Match. Phone number as the primary key (about 9,900 matches), falling back to name plus ZIP or address (about 1,800), with anything ambiguous flagged for a human rather than guessed.
  4. Migrate through the API. Everything written through Jobber's GraphQL API by a hardened client: automatic token refresh, retries with backoff, resume after interruption and parallel workers, so multi-hour runs could survive a network blip without duplicating work.
  5. Verify and hand over. Reconciliation reports, colour-coded review workbooks with clickable client links, and every script documented so the client is never locked in.

The problems that decide whether a migration is clean

  • A hidden timezone bug. ACT! rendered every note's timestamp in the exporter's timezone, not the business's. About 14% of service dates were rolling onto the wrong day. Every timestamp was corrected to US Eastern before anything was written.
  • Notes misaligned with their dates. ACT! stored short and long notes in different HTML structures, which silently paired the wrong text with the wrong date for about 950 clients. They were re-paired by their layout position.
  • Documents with no file-upload API. Jobber's API does not take a normal file upload, so attachments were served through a temporary secure tunnel and attached by URL, letting Jobber fetch each file itself: 306 clients, about 390 documents, 0 failures.
  • Duplicates and multi-property customers. Condo owners and repeat customers were flagged for approval and never auto-merged, so no real record was lost.

Clean-up after the migration

The earlier partial import had left problems in the live account, so these were fixed too:

  • Text consent. A mis-mapped column had left about 11,000 clients with a junk entry and their real mobile numbers unable to receive texts. Every record was cleaned and texting enabled on the real numbers, with no messages sent in the process.
  • Redundant fields. Five duplicate custom fields cleared and archived across 11,173 clients.
  • Settings restored. A side effect where editing clients reset their communication preferences was caught and reversed across 11,221 clients.

What this means if you are moving to Jobber

Whatever you are leaving, whether that is ACT!, Squeegee, spreadsheets or another field service tool, the same three things decide whether the move is clean: match before you create, check every date against the timezone it was exported in, and never write anything you cannot verify and roll back.

Window cleaners moving off Squeegee will find the specifics in the Squeegee to Jobber migration guide.

Moving your business into Jobber?

I plan and run Jobber migrations end to end: extraction, cleaning, matching against what is already in Jobber, the API migration itself and the verification. Tell me where your data lives today.

Book a Free 30-Min Call

Frequently asked questions

Can historical jobs be imported into Jobber?

Yes, through Jobber's GraphQL API. In this project about 22,500 historical jobs were created, one per real past service visit, each attached to the right client and property with its notes and dates corrected.

Can documents and PDFs be attached to Jobber clients through the API?

Not by a normal file upload. The working approach was to serve each file at a temporary secure URL and attach it by URL so Jobber fetched it directly. That attached about 390 documents to 306 clients with no failures.

Will a migration disrupt our live Jobber account?

It should not. Here new records were matched to existing ones, live jobs and invoices were never touched, and every run could be resumed or verified without creating duplicates.

Keep reading

More on window cleaning operations