Six posts of diagnosis. Time to build the thing.
Here is the entire report an owner needs, in the order it should be read:
Cost per booked job: $316. Spend $6,000 → 41 contacts → 28 real → 19 booked → $29,220 revenue. Speed-to-lead: 6 min median, 71% of calls answered live. You own everything. Here's what we're changing next month.
That's it. Everything else is an appendix.
“I don't want a dashboard. I want one number I can argue with.”
The rest of this post is how to get to that number — what each row means, where the data comes from, the two places it goes wrong, and why the Black Box can't produce it even when it wants to.
The five rows
| Row | What it counts | Where it comes from |
|---|---|---|
| Spend | Every dollar, every channel, including management fees | Ad platforms + your invoice |
| Contacts | Every call, form, chat, LSA lead, GBP message | Call-tracking + form notifications + platform inboxes |
| Real | Contacts who are an actual prospective customer in your area | A human marks each one. No shortcut. |
| Booked | Real contacts who scheduled | Your CRM / scheduling software |
| Revenue | What the booked jobs were worth | Your invoicing |
Then two divisions:
- Cost per booked job = Spend ÷ Booked
- Return = Revenue ÷ Spend
And one more row that makes the number honest — by campaign. Because the average hides the thing you most need to see.
The worked month, split
Same $6,000, split by where it went:
| Campaign | Spend | Contacts | Booked | Revenue | Cost/job | Return |
|---|---|---|---|---|---|---|
| "AC tune-up $89" | $2,200 | 24 | 13 | $2,460 | $169 | 1.1× |
| Brand search | $600 | 7 | 4 | $2,960 | $150 | 4.9× |
| "AC replacement + financing" | $2,400 | 6 | 2 | $23,800 | $1,200 | 9.9× |
| LSA | $800 | 4 | 0 | $0 | — | 0 |
| Total | $6,000 | 41 | 19 | $29,220 | $316 | 4.9× |
Now the report can say something:
- The tune-up campaign produced the most contacts and the most bookings, and it's roughly break-even. It's an acquisition play — fine if those customers come back for repairs, a problem if they don't. Worth knowing which.
- The replacement campaign has the worst cost per job on the page and is the best thing you're running. By the Black Box's metrics (cost per lead: $400) it would be cut first.
- LSA booked nothing on $800. Post #6 says why: the four leads came in after 5pm and went to voicemail. That's not an ad problem. Fix the phone and re-read next month.
- Brand search is cheap and converts — people who already know you. Don't over-read it; it's catching demand the other campaigns and your trucks created.
None of these decisions are possible from "118 leads, CPL $51." All of them are obvious from this table.
Where the data comes from — and the two places it breaks
Everything above is built from systems you already have. The work is connecting them.
Break #1: "Real" needs a human. No software reliably tells a wrong number from a customer. Someone — your office, your intake desk, or your agency listening to call recordings — has to mark each contact. Thirty seconds each. For 41 contacts, twenty minutes a month. Every agency that says "we can't measure booked jobs" is really saying "we don't want to spend twenty minutes."
Break #2: Revenue lives in your invoicing, not the ad platform. The agency has to ask you for it. Monthly. And then use it. Most don't ask, because the answer might be smaller than the ROAS in the dashboard.
Everything else — spend, contacts, which campaign each contact came from — is standard call-tracking and form-tracking, set up once.
The same number, other businesses
The row labels change. The structure doesn't.
| Vertical | The number | The "booked" row | The "revenue" row |
|---|---|---|---|
| Home services | Cost per booked job | Scheduled appointment | Invoice total |
| Law — PI / criminal | Cost per signed case | Signed retainer | Case value (estimated at signing, trued up at resolution) |
| Law — family / estate | Cost per retained client | Paid consult or retainer | Flat fee or engagement value |
| Ecommerce | Cost per profitable order | Order minus returns | Contribution margin (revenue − COGS − shipping − returns), not revenue |
Ecommerce gets its own post next, because the platforms' "4× ROAS" hides a specific trick. But the structure is identical: the number at the top has to be something the bank account recognizes.
Why the Black Box can't make this report
Not won't. Can't.
- It doesn't own the relationship with your booking system and your invoices (Move 1 in reverse — it rented you assets; it never got yours).
- Its pricing is justified by activity, and this report measures outcome. A month with a low number is a month where the retainer looks expensive. Its reporting evolved to never have that month (Move 2).
- Marking "real" takes a human who knows your business. The account manager with forty clients doesn't have twenty minutes for yours (Move 3).
A report built on cost per booked job creates a number the agency can be held to. That's exactly why it isn't built.
Build it yourself in an afternoon
If you want this without changing anything else:
- Get call-tracking with a number per campaign and call recording. Put the numbers in the ads and on the landing pages.
- Route every form to one inbox with a timestamp.
- Once a month, export the list — every call and form, with source.
- Mark each one: real / not real; booked / not booked. Add the invoice amount for the booked ones.
- One spreadsheet, one pivot: spend, contacts, real, booked, revenue, by campaign.
First month takes an afternoon. After that, an hour. Then send it to your agency and ask which row they'd like to improve.
What AdPlanck sends
The block at the top of this post is the top of our monthly report — one number, five rows, speed-to-lead, ownership confirmation, next month's change. The appendix has the campaign split and every contact with its marking, so you can check us.
The price for that is flat and on the pricing page, with the reason next to each line. If the number's bad, you'll see it before we do, and that's the point.
Sources & notes
- Google Ads / Meta Ads Help: conversion tracking and attribution defaults
- Call-tracking vendors' documentation on campaign-level numbers (generic; no vendor endorsed)
- Worked month is a synthetic composite consistent with post #1; not client data.

