The Short Version
TL;DR
→The number you want is cost per booked job, by channel. Getting it means connecting three systems most contractors keep separate: the ad platform (spend), the phone or form (the lead), and the CRM or FSM (the booked job).
→You do not need enterprise software. Level 1 is a call tracking number and one tagged spreadsheet. Level 3 is offline conversion import that feeds Google your booked revenue so it optimizes for jobs, not clicks.
→The prerequisite nobody mentions: you have to answer the phone. 62% of home-service calls go unanswered (ServiceTitan). A dashboard over a leaky bucket just tells you precisely how much is spilling.
Industry Spotlight
72% of home service businesses plan to increase their marketing budgets this year (CallRail, 2026). Ask those same companies which channel produced their last ten booked jobs and most can’t answer. They are pouring more money into a system they cannot see the bottom of. And the bottom is leakier than anyone wants to admit: 62% of inbound home-service calls go unanswered (ServiceTitan, from 50,000-plus contractor phone lines), and 86% of the people who hit voicemail hang up and call a competitor (Invoca).
Miss 62% of the calls on a $5,000/month budget and you have wasted $37,200 a year on rings nobody answered.
CallJolt 2026 missed-call analysis, on ServiceTitan phone-line data.
Sources: CallJolt 2026, Missed Call Statistics (ServiceTitan, Invoca data) · CallRail 2026, Home Services Marketing Statistics · ALM Corp 2026, Google Ads Offline Conversion Imports
You cannot fix what you cannot see, and cost per lead hides both problems at once. It cannot tell you the LSA line is cheap per lead but expensive per job, and it cannot tell you half those leads rang a phone nobody picked up. Cost per booked job, tracked by channel, exposes both. It is one number, and building it is a plumbing project, not a software purchase. Here is the build.
From the team at DUO
The closed loop below, call tracking to CRM tags to offline conversion import, is the plumbing behind everything we do. We don’t count leads. We count booked jobs, and this dashboard is how. If you want us to wire it into your Google Ads, LSA, and FSM so the numbers reconcile every month, we will build it and run the first month alongside your team so you can see the shape of the data before you own it.
Build my booked-jobs dashboard →Let’s Get Into It
Three systems, one blind spot. Here is the gap, the diagnosis, and the three-tier build to close it.
The Problem
Your spend lives in Google Ads, LSA, and Meta. Your leads live in your phone system and your inbox. Your booked jobs live in your CRM or FSM. Three systems, and in most home services companies they never talk to each other. So the best number anyone can produce is cost per lead, which, as we covered last week, is the wrong unit. The report looks complete. Precise. The problem is, it’s measuring the wrong thing.
The Diagnosis
You have a lead report, not a revenue report, if any of these are true:
- ×You can’t say which channel produced your last ten booked jobs.
- ×Your ad platform optimizes to “leads” or “conversions” you never defined as booked jobs.
- ×Spend, leads, and jobs live in three tools that never talk to each other.
- ×You have no call tracking numbers, so every phone lead is invisible to attribution.
- ×Nobody reconciles marketing spend against booked revenue every month.
A working dashboard connects three layers: tracking (which channel did this lead come from), attribution (which lead became a booked job), and optimization (feed that back so the platform chases jobs, not clicks). Most contractors have none of the three. The good news is you can stand up layer one this week with tools you can buy for the price of a tank of gas.
The Fix. Pick Your Level.
The build is a stack. Level 1 has to work before Level 2 makes sense, and Level 2 has to work before Level 3 is worth the effort. Start where you are.
Level 1. This Friday.
Tag it, and track it in a spreadsheet.
2 hours setup + 30 min/week ongoing. Ops person or office manager.
1Put a call tracking number on each channel. A distinct number for LSA, Google Ads, your website, and yard signs. Tools like CallRail start around $45 a month. Now every call is stamped with the source that produced it, and phone leads stop being invisible.
2Build one spreadsheet, one row per channel. Columns: spend, leads, booked jobs, revenue. Fill booked jobs and revenue from your CRM or FSM once a week. Add one formula, spend divided by booked jobs. That single column, cost per booked job, will reorder your entire budget the first time you see it.
3Define “booked job” once, in writing. Not a lead. Not an estimate sent. Booked means scheduled work on the calendar. Make sales and marketing use the same definition. Ambiguity here is the exact reason “conversions” on your current report mean nothing.
Level 2. This Month.
Connect the CRM so it stops being manual.
1 day setup + light upkeep. Marketing person or agency, plus your FSM admin.
1Capture the source on every lead automatically. Call tracking already passes the channel. Add a hidden field to your web forms that captures the GCLID, the Google click ID, and writes it onto the contact record in your CRM or FSM. Now the origin of every lead is stored, not guessed.
2Tag the booked job back to the lead. When a job is scheduled in ServiceTitan, Jobber, or Housecall Pro, the source and GCLID ride along on the record. Booked jobs now roll up by channel on their own, with no hand-keying. This is the step that kills the weekly spreadsheet chore.
3Report cost per booked job by channel, next to cost per lead. Put the two columns side by side every month. The gap between them is the whole story. The channel with the cheapest leads is often the most expensive per job, and this is the first report that will ever show you that.
Level 3. This Quarter.
Close the loop. Feed the platforms your revenue.
1 week setup + 3 hours/month. Ads manager plus a named owner.
1Turn on offline conversion import in Google Ads. Upload the booked job, with its dollar value, back to Google against the GCLID you stored in Level 2. (Google moved this to the Data Manager API in June 2026, so your ads manager will handle the setup.) Google finally learns which clicks became real revenue.
2Switch bidding from leads to value. Once the account has roughly 30 or more booked-job conversions a month, value-based Smart Bidding optimizes toward revenue instead of clicks. Accounts that close this loop typically see cost per lead fall 15 to 30%, because the algorithm stops buying the cheap leads that never book.
3One person should own this and reconcile monthly. Marketing spend against booked revenue, by channel, every month. Cut the channels that are expensive per booked job. Move that money to the ones that are not. This is a 30-minute meeting that decides where thousands of dollars go, and it needs a name attached to it, not “marketing.”
Do this next
- ☐Write your definition of “booked job” in one sentence. Share it with sales and marketing today.
- ☐Put a distinct call tracking number on your top three channels this week.
- ☐Build the one-row-per-channel sheet: spend, leads, booked jobs, revenue, cost per booked job.
- ☐Fill in last month from your CRM or FSM. Find your most expensive channel per booked job.
- ☐Ask your ads manager two questions: are we importing offline conversions, and are we bidding to value or to leads?
- ☐Put one name on the monthly reconciliation. A person, not a department.