Case Study · An Arizona residential window-tint & film contractor

Tracking a contractor's Facebook and Google leads all the way to Jobber revenue

Home services Conversion Tracking SetupAttribution & Closed-Loop ReportingPlatform Integration
  • ~$3.1M Revenue now tied to a source
  • ~6x Return on tracked ad spend
  • 13 → 200+ Google leads attributed

Problem

An Arizona residential window-tint contractor was spending across Facebook and Google every month and couldn't say which ads actually produced booked jobs. Leads landed in Jobber, the work got done, the revenue got recorded, but none of it was ever connected back to the ad that started it. Their best paid channel read as roughly 13 leads, Facebook read as zero, and nearly $600K in collected revenue sat in an 'unattributed' bucket with no channel attached.

Approach

I built a lightweight attribution pipeline (a micro-CDP) that follows a lead from the ad click through the form or call, into Jobber, and onto the revenue from the job once it closes. It reads each platform's real source data, ranks the sources by trust, and normalizes identity so the same person joins across all three systems. Spend can finally be read against booked revenue instead of platform-reported conversions.

You’re spending a few grand a month on Facebook and Google, the phone rings, jobs get booked, and if someone asks you which ads actually made the money, the honest answer is you don’t know. That was the starting point here.

Money was going out to Facebook and Google every month, and nothing on hand could say which of it came back as a booked job. That’s a measurement problem, not a tactics problem, and it’s the one almost nobody checks.

What I found

The tracking looked fine from the outside and was broken underneath. Leads came in through forms and calls and got created in Jobber, but the connection stopped there. Nothing tied a booked job back to the ad, the campaign, or even the platform that produced the lead.

So the numbers lied in both directions. When I opened the data, Google, their single biggest trackable revenue source, showed about 13 attributed leads, and Facebook showed zero. Not because those channels weren’t working, but because the real source was getting overwritten somewhere in the plumbing between the ad platform, the lead-capture tool, and Jobber. The channel was real. The label was junk, with things like “automation,” “external,” and “unattributed.”

A few concrete examples of how the source was getting lost:

  • Facebook jobs were mislabeled. Dozens of leads came in through Facebook Lead Ads with the Facebook lead ID, campaign, and ad set all captured. Then an internal automation stamped them “external” or “automation” after the fact, erasing the real source. The Facebook data was sitting right there; nothing was reading it.
  • Jobber’s own “Lead source” field wasn’t being read. Jobber clearly showed “Lead source: Google” on jobs that the system had recorded as “external,” because nothing was pulling Jobber’s lead-source field back out.
  • Identity didn’t match across systems. The same phone number came in as (780) 983-5743 from one tool and +17809835743 from another, and emails in mixed case, so the same person didn’t join across the lead-capture tool, Jobber, and the ad platforms. One human looked like three strangers.

The cost of all this: nearly $600K in collected revenue (around 16% of the total) was sitting in the “unattributed” bucket. A sale happened, money came in, and it couldn’t be tied to a channel. You can’t judge a campaign when a sixth of your revenue is invisible and your best paid channel reads as 13 leads. So every spending decision was a guess.

What I built

I built a small attribution pipeline (a micro-CDP) that sits between the ad platforms, the lead-capture tool, and Jobber, and becomes the single source of truth.

It captures the lead’s source from every layer and ranks those sources by how much they can be trusted: Facebook’s own lead-ad data beats Jobber’s “Lead source” field, which beats the lead tool’s native attribution, which beats web-form UTMs, which beats operational labels like “automation.” The most trustworthy source always wins, and the junk labels that used to overwrite the truth get overwritten themselves.

Then it normalizes identity (every phone number to one format, every email to lowercase) so the same person joins across all three systems instead of fragmenting. Phone calls were wired in the same way, because for a contractor the call is usually the best lead, and it’s the one almost nobody tracks. Finally, when a job closes in Jobber, the pipeline writes back to the lead tool and tags that contact as an active client, so marketing stops spending on people who already bought.

The part a cheaper “set up the pixel” freelancer wouldn’t do: the attribution data was real, but it was buried three layers deep. The lead tool nested it under one field, Jobber hid the human-readable source in another, and Facebook’s lead ID was getting clobbered by an automation before anyone could read it. Getting it out meant reading each platform’s actual API payloads and building a precedence engine. A glance at a dashboard would never have found it.

The result is one connected line: ad spend, to lead, to booked job, to revenue.

What changed

For the first time the contractor could open one view and see which ads were actually producing booked revenue, not just clicks and form fills.

  • Google went from ~13 attributed leads to more than 200, around 90 of them paying jobs worth north of $230K in collected revenue. Same channel, same time period; it had just been invisible.
  • Facebook went from zero to roughly 90 attributed leads, with about $22K in collected revenue tied back to it. That revenue previously read as “external.”
  • About $3.1M of the ~$3.7M in total collected revenue is now tied to a source. Attribution coverage landed around 75% of leads and 84% of revenue, up from a black box.

Here’s the one I point to. A Facebook campaign that cost ~$1,800 had driven ~$8,400 in collected revenue (about 4.5x and still closing), and it had been effectively dead in the data, because every one of its leads was labeled “external” or “automation.” That’s the “looked dead, was actually working” story, with real dollars: exactly the campaign a contractor would have shut off based on the dashboard.

On the cleanest read I have (a window where ad spend and revenue line up directly), about $2,450 in Facebook spend produced 126 leads and ~$14,400 in collected revenue so far, roughly 6x, and that’s before the rest of those leads finish closing.

And here’s the part the platform could never close on its own: Meta’s dashboard had no revenue reporting at all. It could show leads and cost-per-lead, but it had no idea which of those leads turned into paying jobs or how much money they brought in. There was no real number to spend against until this pipeline created one.

Once the data was trustworthy, the spending decisions got easy. Budget could move toward the campaigns the revenue actually backed, and away from the ones that only looked good on the platform’s own scoreboard.

Why this is the one I tell people about

This is the whole offer in a single job. The tracking told the truth, the attribution proved the ROI, and the spend could finally be steered by something real instead of a dashboard that was quietly lying. Nothing exotic. Just the loop, closed, for a business that had been flying blind on a real ad budget.

Ready to get started?

Book a free strategy call. We'll discuss your goals, answer your questions, and outline next steps. No pressure, no obligation.