All articles

Lead Generation

How to Measure ROI on Contractor Marketing: 6 Steps

A 30-day read understates revenue by about half. Measure gross profit per marketing dollar, not revenue, using a 6-step cohort method built for trades.

Om Patel 16 min read
Photo: Warren Valentine / Unsplash

The short answer

Measure marketing ROI as gross profit per marketing dollar, not revenue per dollar. Total every marketing cost including your own hours, tag each lead by the month it arrived, give that cohort 90 days to close, then divide the gross profit those jobs produced by what you spent to get them. Below 1:1 you are losing money.

Measure marketing ROI as gross profit per marketing dollar, not revenue per marketing dollar. Total every marketing cost including your own hours, tag each lead by the month it arrived, give that group 90 days to close, then divide the gross profit those jobs produced by what you spent to get them. Almost every number an agency puts in front of a contractor skips at least two of those four steps.

That gap is not academic. It is the difference between a channel you should double and a channel that is quietly eating your year.

Why the number your agency reports is the wrong number

Start with the arithmetic that nobody puts in the monthly report.

Marketing advice aimed at contractors converges on revenue multiples. Estes Media tells contractors to target 3:1 on overall marketing spend and 5:1 on paid ads. Coalmarch's 2026 benchmark report puts a healthy home service PPC return at 7 to 9 times ad spend and SEO around 19 times, and adds that anything under 4 times usually means broken tracking rather than broken ads. These are all revenue-to-spend ratios.

Revenue is not yours. Gross profit is.

BusinessDojo's 2026 analysis of residential renovation work puts gross margins at 15 to 25 percent and net margins at 4.7 to 8.7 percent. Run a 3:1 revenue return through a 20 percent gross margin and you get 60 cents of gross profit for every dollar you spent to generate it. You lost money, and the dashboard congratulated you.

The formula worth memorizing:

Break-even revenue multiple = 1 divided by your gross margin.

Gross marginRevenue needed per $1 of marketing just to break even
15%6.7:1
20%5.0:1
30%3.3:1
45%2.2:1
55%1.8:1

A general contractor at 20 percent and an HVAC service shop at 45 percent cannot use the same benchmark, which is exactly what every generic "aim for 3:1" article asks them to do. Once you know your own break-even multiple, the target is straightforward: aim for at least 2:1 on gross profit, meaning two dollars of gross profit per marketing dollar. Below 1:1 you are strictly losing money. Between 1:1 and 2:1 marketing is paying for itself but not for the overhead sitting behind it.

By the numbers

An owner running a residential cleaning business posted his numbers on r/smallbusiness after ten years and $300,000 in stagnant revenue: "I've spent over $100,000 on SEO 'agencies' that were essentially BS" and "I've spent $20k on GAds in the last 6 months and made about $10k from those ads." That second line is a measured 0.5:1 revenue return. At any gross margin a cleaning business can achieve, it is a catastrophic gross profit return, and it ran for six months.

Step 1: Build the real denominator

Most cost-per-lead math uses ad spend as the denominator. That is the smallest part of what you actually spend.

Michael Stone of Markup and Profit, who has coached contractors on pricing for decades, is direct about this. Contractors tell him "we don't advertise, we work by referrals," and then he lists what they are already paying for: signs on the trucks, business cards, crew T-shirts, job site signs on every project, company name on the tools, letterhead and envelopes. All advertising. He adds the items owners never count: hours you or your staff spend on marketing valued at your rate, graphic design, printing, social media management, jobsite photography and video, and the website build amortized over about five years plus hosting.

His worked example: 110 leads in a year against $13,640 in total marketing cost gives a cost per lead of $124. If that contractor had counted ad spend alone, the number would have been a fraction of it, and every downstream decision would have been made on a fantasy.

Pull twelve months and total it honestly. The number will be larger than you expect, and it is the only denominator worth using.

Step 2: Define a lead once, then never move the definition

Stone's second point matters more than it sounds. Before counting leads, decide what a lead is.

He counts a lead as any sales call you actually go on. The homeowner who called for a ballpark square foot price and hung up is not a lead. The person who has already collected five bids and wants a sixth is not a lead. Both would show up in a call-tracking dashboard as conversions.

Pick a definition that matches how you sell. The only rule Stone insists on is consistency: "The important thing is to not change the parameters once they're set." A cost per lead that moves because your counting rule moved tells you nothing about your marketing.

Worth noting his warning on the other side of the funnel too. If you are closing 7 or 8 of every 10 leads, that is usually not sales skill. It usually means your prices are too low. He puts a healthy sales-to-lead ratio at roughly 1 in 3 to 1 in 4.

Step 3: Tag the lead at the door, because it arrives by phone

Here is the finding that should reorganize most contractor dashboards.

SearchLight Digital, reporting on a portfolio of 500 plus home services accounts across HVAC, plumbing and electrical in 2026, broke down how leads actually arrive: 82 percent came in as tracked phone calls, 15 percent as web forms, and 100 percent of closed revenue came through a call. No web form submission had closed at time of measurement.

If your measurement is a Google Analytics goal counting form submissions, you are measuring the channel that produced none of your revenue.

The fix is unglamorous and cheap. A distinct tracking number per channel, forwarding to your main line, so the source is logged automatically. CallRail runs from about $50 a month and is the only call tracking provider currently in the ServiceTitan marketplace, sending inbound calls in with marketing source, medium, campaign and keyword attached. On an $8,000 monthly ad budget that is well under one percent of spend.

Then the part that is actually hard: a lead source field filled in on every single job in your CRM. Open your last 20 completed jobs. If they do not all carry a source, you cannot calculate booking rate by channel, and everything after this step is guesswork. This is the same discipline behind responding to a lead fast enough to win it, and it fails for the same reason: nobody owns the field.

Watch out

An owner running an online services business laid out the failure mode precisely on r/smallbusiness: "We spend ~$80/month on Meta ads and genuinely cannot tell you whether it works. Leads convert without anyone updating the CRM, so attribution is broken." The spend was trivial. The blindness was not, and it scales to any budget.

If your leads arrive without a source attached, no amount of reporting will fix it downstream. Our lead generation work is built around a dedicated conversion page, a qualifying form that arrives with the answers already attached, and lead-to-sale tracking, so the cohort math below is something you can run every quarter instead of reconstructing from memory.

Get a lead plan

Step 4: Measure by cohort, not by calendar month

This is the step almost nobody does, and it is the reason good channels get cut.

A contractor sale is not instant. PipelineOn puts the realistic reporting windows at two to four weeks for click and lead data, and 60 to 90 days for booked-job and revenue data, because the sales cycle runs through estimate, follow-up and scheduling before any money moves.

SearchLight Digital quantified what happens when you ignore that. Measuring two consecutive months at the same data pull, they found the more recent month always looks worse simply because it has had less time to close. Their conclusion, on their own data: "A 30-day read understates revenue by roughly half." The same channel showed a $1,906 average ticket in the mature month and $900 in the month measured a month early. Nothing about the channel changed.

So the standard monthly agency report is not just incomplete, it is systematically biased against whatever you started most recently.

Do this instead. Tag every lead with the month it arrived, not the month it closed. Wait a full 90 days. Then run the numbers on that arrival cohort:

  1. What did we spend on this channel during the arrival month?
  2. How many leads did that channel produce that month?
  3. Of those specific leads, how many became completed, invoiced jobs by day 90?
  4. What gross profit did those jobs produce?
  5. Gross profit divided by spend equals your real return.

You are always reporting on a quarter that ended 90 days ago. That feels slow. It is the only version of the number that is true, and you can still watch cost per lead weekly for the operational signal.

Step 5: Convert to cost per booked job, then to gross profit

Cost per lead ranks channels wrong. Built on Tenth's formula fixes it:

Cost per booked job = cost per lead divided by (contact rate x booking rate on contacted leads)

Their worked comparison is the cleanest illustration of why this matters. A Google Local Services lead at $65 is exclusive, so contact rate runs 84 percent and booking on contacted leads 62 percent, giving $125 per booked job. An Angi lead at $38 is shared with up to three contractors, so contact rate falls to 52 percent and booking to 28 percent, giving $261 per booked job. The lead that costs 71 percent more produces jobs at less than half the cost.

The same inversion shows up across channels. PipelineOn cites a roofer who tracked door knockers against Google Ads using unique tracking numbers and QR codes on yard signs: door knockers came in at $340 per booked job, Google Ads at $510, and the yard signs that "felt like a waste" at $90.

Set the threshold before you look at the answer. Built on Tenth's rule: cost per booked job should stay under 10 percent of the average ticket for the job type that channel produces. A $380 emergency repair supports $38. A $2,800 replacement supports $280. A $9,500 full system change-out supports $950. Judge each channel against the ticket it actually generates, not one blended company average.

Then take the last step nobody takes: multiply the revenue those jobs produced by your gross margin, and divide by spend. That is the number in Step 1's terms, and it is the one that decides whether the channel stays.

Tip

Two of the three inputs are free to improve. Built on Tenth's math shows a 10-point gain in contact rate cuts cost per booked job by roughly 13 percent on every channel at once, and a 10-point gain in booking rate does the same. Fixing your phone before raising your budget is usually the higher-return move, which is also the argument in what to do when the phone stops ringing.

Step 6: Know when your numbers are too small to read

This is the honest caveat that benchmark articles leave out, and it protects you from the most expensive mistake in the list: acting confidently on noise.

Run the arithmetic. Say you generate 40 leads a month and spread them across five channels. That is 8 leads per channel. At a 25 percent booking rate you expect 2 booked jobs from each. One job landing differently moves your measured booking rate from 12.5 percent to 37.5 percent, a 25-point swing driven entirely by which homeowner happened to answer the phone.

At that volume a monthly per-channel comparison is not a measurement. It is a coin flip with a spreadsheet around it.

Two ways out, and you should use both:

  • Pool a full quarter per channel before you compare. Three months of 8 leads is 24, which is still thin but readable.
  • Run fewer channels. Five channels at 8 leads each tells you nothing. Two channels at 20 leads each tells you something. Concentration is a measurement strategy, not just a budget strategy.

For context on what the industry converts at: PipelineOn puts the home services average lead-to-job rate around 7.8 percent across all sources, while SearchLight's non-branded paid search data shows a 37.6 percent book rate at an $804 cost per paying customer, against Performance Max at 32.2 percent and $447. The spread between sources is enormous, which is precisely why you need enough volume per source to see it.

Do not cut a channel on last-click data

One guardrail before you start reallocating.

PipelineOn's attribution analysis found that last-click overvalues Google Ads by 40 to 60 percent, because the average homeowner hits 7 to 12 touchpoints before booking. A homeowner sees the truck wrap in March, checks reviews in April, and in May searches your company name and clicks the ad. Last-click hands Google Ads all the credit and the truck wrap none.

The observable consequence: when contractors cut a "low performing" upper-funnel channel on last-click data, branded search volume typically drops 60 to 90 days later. The dollar saved on yard signs costs three dollars of lead flow that nothing in the dashboard traces back.

Same reason branded and non-branded search should never be reported as one line. SearchLight's January 2026 dataset covering $14.9 million in HVAC and plumbing Google Ads spend across 816 contractors and 8,077 campaigns put blended cost per lead at $104, hiding branded search at $34 and non-branded at $149. A 4.4x difference sitting inside a single "Google Ads" row on your P&L.

The test for an upper-funnel channel is not its own conversion count. Pause it for a full quarter and watch total lead flow.

By the numbers

A one-man plumbing business in the North Carolina Piedmont Triad posted an inventory of everything that failed on r/smallbusiness: BBB, Yelp, Google page, Facebook ads, door hangers, car flyers, door to door, private marketing firms and paid SEO, each recorded as bringing "no leads." His conclusion after four years: "Pay per lead is the only route and I have spent more than most people make in a year in 2 years just on pay per leads." Nothing in the post indicates a single one of those channels was measured to a booked job. That is not an argument that the channels do not work. It is an argument that he never found out.

The 30-minute quarterly scorecard

You do not need software beyond call tracking and your CRM. Once a quarter, for each channel, fill in eight cells:

#FieldWhere it comes from
1Total spend, arrival quarterAd platform plus fees plus your hours
2Leads generatedCall tracking plus forms, deduplicated
3Cost per leadRow 1 divided by row 2
4Contact rateAnswered or reached, out of row 2
5Booking rate on contactedCompleted jobs out of row 4
6Cost per booked jobRow 3 divided by (row 4 x row 5)
7Threshold10 percent of average ticket for that job type
8Gross profit per dollarJob revenue x gross margin, divided by row 1

Row 6 against row 7 tells you whether the channel is defensible. Row 8 tells you whether it is profitable. Any channel below 1:1 on row 8 gets restructured or cut this quarter. Anything above 2:1 gets more budget.

PipelineOn reports that contractors who make this shift typically find 20 to 30 percent of marketing spend going to sources that produce leads but not jobs, and that reallocating it lowers blended cost per lead by double digits within 90 days. Broader context from Coalmarch's 2026 report: 83 percent of marketing leaders now rank proving ROI as their top priority, up from 68 percent five years ago. The measurement gap is closing across the industry, which means the operators who close it first buy leads their competitors have mispriced.

The cost of never running the numbers

Two industry voices make the stakes plain. Chris Lollini, a marketing advisor to HVAC contractors, in an ACHR News analysis: "Cost per lead is often misleading in HVAC. Cost per booked job tells the real story. Clicks, impressions, and rankings are inputs. Revenue is the outcome contractors should evaluate." Chris Hunter, principal industry advisor at ServiceTitan: "A $30 lead that never books is expensive. A $150 lead that turns into a replacement, a membership, and five-star reviews is profitable."

And one owner's version of the same lesson, from r/Contractor. Fifteen months in, $325,000 gross and $70,000 net, then seven months of decline: "work has dried up despite doubling the ad budget, reworking ads with the marketing folks, and even asking old clients for new work. Door hangers didn't work and neither did door knocking." He was posting to ask how to close the business gracefully.

Doubling an ad budget is the correct move when you know your cost per booked job and your gross profit per marketing dollar. It is the most expensive possible move when you do not, because you are scaling a ratio you have never measured. The six steps above take an afternoon to set up and thirty minutes a quarter to run. That is the entire price of knowing which of those two situations you are in.

If you want the same discipline applied upstream, how much a contractor should spend on marketing sets the budget, and what to pay a marketing agency prices the help.

Frequently asked questions

How do you measure ROI on contractor marketing?
Divide the gross profit from jobs a channel produced by everything you spent on that channel, including your own hours. Tag each lead by the month it arrived, give the group 90 days to close, then run the math on that group. Revenue divided by spend is the number most agencies report, and at trade margins it flatters a channel that is actually losing you money.
What is a good ROAS for a home service business?
Coalmarch's 2026 benchmarks put a healthy home service PPC return at 7 to 9 times ad spend, with SEO closer to 19 times, and note that anything under 4 times usually means broken tracking rather than broken ads. Treat those as revenue multiples. The number that decides whether you keep the channel is gross profit per dollar, which is the revenue multiple times your gross margin.
Why does my marketing look worse than it is when I check it monthly?
Because the jobs have not closed yet. SearchLight Digital, measuring 500 plus home service accounts in 2026, found home services revenue matures over 30 to 90 days and that a 30-day read understates revenue by roughly half. In their data the same channel showed a $1,906 average ticket once mature and $900 when measured a month early.
What is the difference between cost per lead and cost per booked job?
Cost per lead is what you pay for a conversation. Cost per booked job is what you pay for revenue: cost per lead divided by your contact rate times your booking rate. Built on Tenth's worked example puts a $65 Google Local Services lead at $125 per booked job and a $38 Angi lead at $261, because the cheaper lead is shared and converts far worse.
How do I track which marketing channel my leads come from?
Use a separate tracking phone number per channel and a lead source field on every job in your CRM. This matters more than most owners expect. In SearchLight Digital's 2026 home services data, 82 percent of leads arrived as phone calls and 100 percent of closed revenue came through a call, with no web form submission closed at time of measurement. A dashboard counting form fills is measuring a small minority of your business.
Should I count referrals and truck wraps as marketing cost?
Yes. Michael Stone of Markup and Profit is blunt about it: signs on trucks, job site signs, crew shirts, business cards, letterhead and the hours you spend on marketing are all advertising. Leaving them out shrinks the denominator and makes your cost per lead look better than it is. Amortize your website build over about five years and include hosting.
How many leads do I need before the numbers actually mean something?
More than one month of a small shop usually produces. At 40 leads a month split across five channels you have 8 leads per channel, and at a 25 percent booking rate that is 2 jobs. A single job either way swings the measured booking rate from 12.5 percent to 37.5 percent. Pool a full quarter per channel, or run fewer channels, before you act on a difference.
What is a reasonable cost per booked job for a contractor?
Built on Tenth's rule is that cost per booked job should stay under 10 percent of the average ticket for the job type that channel produces. At a $2,800 average replacement that is $280. At a $380 emergency repair it is $38. Set the threshold for each channel before you look at the result, so you are testing a number rather than rationalizing one.
Should I cut a channel that shows no direct conversions?
Not on last-click data alone. PipelineOn's analysis found last-click attribution overvalues Google Ads by 40 to 60 percent because the average homeowner touches 7 to 12 points before booking, and branded search volume typically drops 60 to 90 days after an upper-funnel channel is cut. Test by pausing the channel for a full quarter and watching total lead flow, not that channel's own conversion count.
Done-for-you lead generation: a dedicated conversion page, a qualifying form that arrives with the answers attached, and lead-to-sale tracking, fed by targeted outreach and Meta ad campaigns we build and run.
Get a lead plan

Free tools

Find out what your site is costing you.

Enter your address and we check the real page. Scores are free and the itemised report lands in your inbox. No account, and we change nothing on your site.