Why Your Workiz / HouseCall Pro Reports Don't Match Reality

If your CRM's conversion report doesn't match what you see on the ground, it's not you — it's how the lead source gets recorded. Here's the fix.

CRMWorkizHouseCall ProServiceTitanJobberlead source attribution

Every field-service owner has had this moment: you open the conversion report in Workiz (or HouseCall Pro, or ServiceTitan), look at the lead-source breakdown, and think “that’s not right.” Referrals look too high, paid looks dead, and the numbers don’t match the calls you know you got. You’re not imagining it. The report is wrong — and it’s wrong for a boring, fixable reason.

The real problem: the source field is filled in by hand

Field-service CRMs are excellent at what they’re built for — scheduling, dispatch, invoicing, tracking jobs and revenue. What they are not built to do is know where a lead actually came from. In almost every one of them, the lead source is a dropdown a human fills in: a dispatcher picks “Google,” “referral,” “repeat,” or whatever, or just leaves the default.

So what you’re really looking at in that report is data entry, not reality:

  • A dispatcher who’s slammed picks the first option, or the same option every time.
  • A tracked Google call gets logged as “referral” because the caller mentioned a neighbor.
  • Online bookings come in with no source at all and land in a default bucket.
  • Two people enter the same lead two different ways.

Multiply that across hundreds of jobs and the report becomes confident fiction. The CRM isn’t lying on purpose — it’s faithfully reporting what people typed.

CRM report says Referral typed into a dropdown What really happened Tracked Google Ads call a paid lead, mislabeled The report reflects data entry, not the real source. Husky Digital
A hand-typed source turns a paid lead into a phantom "referral."

Why this is dangerous, not just annoying

This would be a footnote if you didn’t make money decisions on it. But you do. If the report says referrals drive everything and Google Ads or Local Services Ads look dead, you’ll cut the paid channel — even when the truth is that half those “referral” and “repeat” jobs started as a tracked paid call that got mislabeled. Bad attribution doesn’t just misreport the past; it points your budget at the wrong future.

The number you actually need — cost per booked job by channel — is impossible to trust when the channel itself is a guess.

What accurate attribution actually requires

The CRM knows the job and the revenue. The ad platforms (Google Ads, Local Services Ads, Meta) know the spend. Nothing connects the two unless you build the bridge. Here’s what a real setup looks like:

  1. Call tracking on every inbound path. A tracking number on your Google Business Profile (set up the safe way), Local Services Ads’ own reporting, and dynamic number insertion on the website so each call carries its true source instead of a dispatcher’s guess.
  2. Web leads tagged at the source. UTM parameters and the gclid captured on every form, with GA4 and Google Tag Manager wiring the events, so a form fill already knows it came from “Google Ads / brand campaign,” not “website.”
  3. Source pushed into the CRM automatically. Instead of a human picking from a dropdown, the real source rides into the CRM with the lead. The dispatcher’s field becomes a backup, not the source of truth.
  4. Booked jobs matched back to the channel. This is the piece that closes the loop: stitching each booked, paid job back to the lead that started it — internally, by phone number — so you can finally divide spend by booked jobs and get a real cost per job per source. (The phone number is how you connect your CRM to your lead store; the ad platforms themselves match on the click ID, which is the next point.)
Two ways the source reaches the report Dispatcher picks a dropdown guess · forget · default Confident fiction in the report Call tracking · UTM · gclid stamped at the source Pushed into the CRM automatically with the lead Real cost per job by channel Husky Digital
The dropdown ends in fiction; the tracked source ends in a number you can trust.

The part most agencies skip: feeding it back to the platforms

Here’s where it goes from “a report you can trust” to “a system that improves itself.” Most field-service CRMs now have native Google Ads and Local Services Ads integrations — but the pushback is usually shallow: it optimizes toward any booked job rather than a revenue threshold, rarely covers Meta, and dedupes poorly. For real control you build your own pipeline.

The mechanism is an offline conversion import, and it keys on the click ID, not the phone number. When a paid click lands on your site, Google passes a gclid (or gbraid/wbraid for many iOS clicks) — capture all of them on your forms. We collect every lead into our own store with that click ID, source, phone, and name; pull each lead’s real outcome from the CRM (booked, not booked, ticket size); match CRM-to-lead internally by phone; and then upload the qualified outcomes back to Google keyed on the click ID — via offline conversion import and Enhanced Conversions for Leads (which matches on hashed email/phone) — and to Meta via the Conversions API. Now the campaigns optimize toward leads that became booked, paid jobs, sometimes down to a revenue threshold — not toward whatever a dispatcher happened to mark.

That’s the difference between “Workiz says we got 80 leads” and “we got 80 leads, 24 booked, $290 average ticket, and the most profitable channel was Local Services Ads at a $38 cost per booked job.”

Lead sourcestamped on the click, not typed
Booked jobmatched back by phone
Outcomefed to the platforms by click ID
Cost per jobreal, by channel

The bottom line

If your CRM’s lead-source report doesn’t match reality, don’t try to discipline your dispatchers into perfect data entry — it won’t hold. Replace the guesswork with tracked sources that flow in automatically, match booked jobs back to the channel that created them, and feed qualified outcomes back to the ad platforms.

That custom attribution pipeline — connecting calls, forms, and CRM outcomes into a real cost per booked job — is exactly what we build. If you’re making spend decisions on a report you don’t trust, that’s what a growth audit untangles first.

We do this for you Fix my attribution

Ready to fix the leaks?

Our diagnostic audit covers your tracking, ad accounts, and SEO architecture.

Fix my attribution