Every decision in the year plan comes out of one column: what a booked job costs through each channel, split by job type. Most of the accounts we audit have never produced that column, because the agency reported leads and the leads looked good.
What cost per lead hides
Cost per lead is spend divided by whatever the platform counted as a lead, and the platform counts generously. The solicitor who called the tracking number is a lead. The caller who wanted a plumber is a lead. Your customer of nine years, calling the number printed on the truck because that was the number in front of her, is a lead you paid for a second time.
Cost per booked job is spend divided by the jobs that went on the board. It takes three connections to build, and once it exists it sets the budget.
Three connections
A tracking number per channel comes first. Dynamic number insertion on the website, so a visitor from a Google ad sees a different number from a visitor who arrived through organic results, and fixed numbers of their own on the Local Services listing, the Business Profile, the ads and the truck.
Then a person who listens. Every recording gets a tag: booked, quoted, existing customer, wrong service, spam. An hour a week for a two-truck shop, a morning for a ten-truck one. Automatic scoring reads a 40-second warranty question as a booking often enough to move the number you are about to spend against.
Then the field software. ServiceTitan, Housecall Pro and FieldEdge hold the booked job and its ticket value; the connection carries the source in with the job and brings the value back out. Without it you know a call booked and you do not know whether it booked $189 or $12,400.
The spreadsheet
Seven columns: week, channel, spend, calls, booked jobs, ticket value, cost per booked job. Repair and replacement get their own rows, because one average across both hides the campaign that is losing money. The Monday report we send is this table on one page.
Splitting the rows is what exposes a channel with the cheapest leads in the account and the highest cost per booked job.
Feed it back to the platforms
Mark leads as booked in the Local Services dashboard and enter the job value. Google says the booked marks help it improve the quality of the leads it sends, and the job values are the only booked-revenue figure the dashboard can show you.
Import booked jobs into Google Ads as offline conversions. Smart bidding then learns from jobs and their values, and it stops buying toward whatever the website was counting as a conversion. Both connections take an afternoon to set up and five minutes a month to check.
What it changes on Monday
The decisions the table produces are small ones. An install job type switched off in Local Services because installs are booking at a cost you will not pay in January. A daily budget moved from the replacement campaign to the repair campaign. A campaign with the lowest cost per lead in the account paused, because its booked column is empty.
Where the number is wrong
Attribution across channels is the honest weakness. A homeowner sees your truck at a neighbor's house on Saturday, searches your company name on Sunday, clicks the ad sitting at the top of the results and calls. The report credits paid search with a job the truck earned.
The correction is a question on the booking call. How did you hear about us, asked every time, written down next to the tracked source. After a season the two columns disagree in a pattern, and the pattern tells you which channels are taking credit for work another channel did. We keep both columns in the call report for that reason.