Trades industry news, updated weekly
Business Tips

Cost Per Lead Is a Vanity Metric. Track This Instead.

Maria ChenMaria Chen··10 min read

Cost Per Lead Is a Vanity Metric. Track This Instead.

When I was doing ops work at Atlantic Comfort Partners, reviewing acquired shops before close, every single one of them had a cost-per-lead figure ready to go. Some had it printed. A few had it on a dashboard. It was clean, recent, pulled directly from Google Ads.

Not one of them had a cost-per-sold-job number that could survive a spreadsheet.

That gap is where small residential shops bleed margin. CPL is a lead-generation metric. Most owners are using it as a marketing metric. Those are different things, and the confusion is expensive in ways that don't show up until someone external is looking at the P&L.

The Number Every Contractor Pulls From Google Ads (And Why It Lies)

Google Ads surfaces cost-per-lead because that's the conversion event most shops configure: a phone call, a form fill, a booked appointment. The platform counts it, divides it, gives you a number that looks authoritative.

Here's what it doesn't tell you.

A cheap lead that closes at low rates and generates a capacitor swap looks nothing like an expensive lead that closes high and generates a system replacement. The per-lead costs might differ by a factor of eight. The gross profit outcomes might differ by a factor of fifteen. CPL alone cannot tell you which channel to fund. It tells you which channel generates calls. Calls are not margin.

At Atlantic Comfort, the shops with the lowest CPL numbers frequently had the thinnest install margins. They had built their ad spend around high-volume, low-commitment demand — seasonal tune-up specials, filter change offers, branded discount campaigns. The lead volume was real. So was the compression on every closed ticket. The P&L didn't match what the Google Ads dashboard implied.

What "Cost Per Sold Job" Actually Means

The calculation is not complicated. Total channel spend divided by closed jobs sourced from that channel. That's it.

Two variables consistently trip contractors up. First: they put leads in the denominator instead of closed jobs. A lead that doesn't close is a cost with no return. Second: they don't attach gross profit to the result, so they end up with a marketing efficiency metric that floats free of the financial outcome it's supposed to inform.

Cost-per-sold-job tells you what you paid to close one job from a given channel. Cost-per-acquired-customer folds in callbacks, repeat visits, and long-run customer value. Most shops under 25 trucks don't need the full customer lifetime value model yet. But they should know which direction they're building toward, and right now, most are building toward neither.

The CPL looks like a win until you sort the closed jobs by ticket size and run gross margin on what your cheapest leads actually generated.

The Real Number Is Gross Profit Per Closed Job by Channel

Cost-per-sold-job only becomes useful when you net it against the gross profit on those jobs.

I'll describe a pattern I've seen across multiple small residential shops, not just one, because the specifics vary but the structure doesn't. A shop optimizes its ad spend toward high-volume demand: tune-ups, seasonal specials, low-commitment inbound. The CPL is good. The close rate is decent. But when you sort the closed jobs by ticket size and run a rough margin on each category, the work generated by that lead mix is concentrated in low-margin service calls. The install mix is thin. The gross profit per closed job from the paid channel is well below what the owner assumes, because the assumption was never tested against the actual job data.

When equipment costs moved with the SEER2 transition, shops running that model absorbed the hit. They had no margin cushion and no pricing discipline built around actual cost-of-doing-business math. The shops I watched come through that period with intact margins had repriced and had moved budget toward channels where the buyer was already further into a replacement decision. Their cost-per-sold-job was higher. Their gross profit per closed job was better by a range I'd put at 30 to 50 points on install jobs, based on the shops I audited during that period.

The math you want to be running: gross profit per closed job by channel, minus cost-per-sold-job for that channel. What's left is the net contribution of your marketing dollar on that channel. That number should drive budget decisions. Not CPL.

Why Flat-Rate Price Books Make This Problem Worse

The flat-rate pricing books sold by the major industry vendors produce predictable revenue per ticket. They do not produce predictable margin per ticket. I've said this in other pieces and I'll say it here again because it compounds directly into the channel-tracking problem.

When a shop pairs a vendor price book with a marketing budget chasing lead volume, it's running two unvalidated assumptions at once. The price book's labor times were built on someone else's shop average. Your techs, your market, your truck stock may run materially longer on the same job. I've seen shops where the actual job duration on a TXV replacement ran consistently longer than the book assumed, which means the margin assumption in the book price was wrong on every one of those tickets. If you're closing a lot of those jobs because your CPL target selected for volume, the variance accumulates fast and invisibly.

This is not an argument against flat-rate pricing. It's an argument for validating your flat-rate times against your own job data before you trust the margin assumptions they imply. Pull 90 days of closed jobs, match invoice times to booked flat-rate times, and see whether they reconcile. Most shops that do this exercise find they don't.

How to Build the Tracking System Without a Data Team

The most common objection I hear is some version of: "I don't have the systems for this."

Usually, they have the data. It's just not organized.

On ServiceTitan: the reporting suite can produce everything I'm describing, and in shops above roughly 12 trucks with a real dispatcher and someone who can actually build reports, it earns its cost. Below that threshold, the math is harder to defend, and in my experience the implementation typically locked the price book and reporting structure to whatever the consultant configured on day one. Nobody on the team knows how to modify it. The reports exist and go unused. That's a real constraint, not an excuse.

What actually works for most shops I consult with is a spreadsheet with five columns.

Channel. Spend. Leads. Closed Jobs. Gross Profit on Those Jobs.

Updated monthly. That's the system. You're not trying to build attribution software. You're trying to answer one question: which channel is generating the most gross profit per dollar spent? Five columns answer that question.

The harder part is populating the closed jobs and gross profit columns accurately, which comes down to one operational change. Train your CSR to ask "how did you hear about us?" on every inbound call and log the answer in the job record. In the job record, in a field that survives into the job report. Not a separate sheet, not a note that disappears when the call ends.

The answers won't be perfect. Some customers will say "Google" when they mean your Business Profile. Some will say "a friend" who also saw your truck last week. Fine. Data with some noise beats no data, and right now most shops are making channel budget decisions on what the marketing vendor's proposal projected, or what someone said at a trade show.

What to Do With This on Monday Morning

Pull the last 90 days of closed jobs from whatever system you use. Sort by source if that field is populated. If it isn't, sort by job type and ticket size and work backward.

Attach a rough gross margin figure to each job. Parts cost plus labor hours at your actual burdened labor rate. You're not building a financial statement. You're trying to see whether the jobs from your Google Ads spend look different from the jobs coming through referrals or your Business Profile.

Sort by source. Calculate average gross profit per closed job by channel. Calculate cost-per-sold-job by channel. Put those two numbers next to each other.

Before you make any budget reallocation based on that comparison, check your cash timing. A system replacement that's sitting on informal payment terms for fourteen months is not the same gross profit event as one that cleared in two weeks. Your days sales outstanding affects which channel's closed jobs are actually funding next month's payroll. Know which channel is generating your slow-pay accounts before you decide to scale it.

Then go talk to your CSR about the source field. Ten seconds per call. Sixty days of that produces something you can actually make a decision from.


FAQ

If I only have time to track one number, which one should it be?

Gross profit per closed job by source. Not CPL, not close rate in isolation, not revenue per job. Gross profit by source tells you whether the work you're winning is profitable and which channel is generating it. Everything else is a component. Start there.

How do I handle leads that come from multiple sources?

Log the last-touch source the customer reports, because that's what your CSR can capture at booking. Multi-touch attribution requires tracking infrastructure most shops under 25 trucks don't have, and in my view it's not worth building at that scale. Last-touch attribution gives you enough directional signal to make a channel budget decision. Log what the customer tells you and move on.

My close rate differs for phone leads versus form fills. Should I treat those as separate channels?

Yes. Phone leads and form fills behave differently even within the same campaign. In my experience, phone leads close higher and faster; form fills shop more. If you're running one CPL comparison across both, you're averaging two different buyer behaviors into a number that describes neither. Split them in your spreadsheet and calculate cost-per-sold-job separately. You may find that your form fills look cheap to generate but produce mediocre closed-job economics, while phone leads cost more and perform better. If that's the pattern, push the campaign toward call extensions.

How often should I recalculate cost per sold job by channel?

Monthly, once the tracking is in place. Quarterly is fine while you're building the baseline. The reason monthly matters is seasonality: HVAC marketing in July looks nothing like February, and a quarterly average smooths over variation you need to see. After a full year you'll have seasonal benchmarks per channel, and the monthly comparison becomes much more useful.

What if my volume is too low to get meaningful data per channel?

At low volume you're working with directional signals, not statistical significance, and that's fine. If you closed four jobs from direct mail last quarter, you can't draw firm conclusions. But you can note what those four jobs averaged in gross profit versus your four Google Ads jobs, let that inform a modest budget test, and let the pattern build over two or three 90-day cycles before making a major reallocation.

Does this change if I run residential service and commercial install under the same marketing budget?

Those should probably be two separate budgets before they're one tracking framework. Residential service leads and commercial install leads have different ticket sizes, different close cycles, different gross margin profiles, and different cash timing. Running them under a single CPL target averages together numbers that shouldn't be averaged. Split the budget, split the tracking, evaluate each line on its own gross profit per closed job by source. The math is the same. The inputs are different enough that mixing them produces conclusions that don't apply to either side.

Enjoyed this article?

Get articles like this in your inbox every Monday. Free, no spam.

More from The Backcharge