Divide each source's spend by the paid jobs it produced, not the leads it sent. Tag every call to a source using tracking numbers or AI call summaries, and compare each source's spend with the revenue from its completed jobs. Keep sources spending under about 15 per cent of that revenue, fix those near 25, cut those above.
Cost per lead flatters the cheap marketplaces and cost per completed job exposes them. The tracker needs one spreadsheet and about ten minutes a week. AI earns its place in two steps: turning call summaries into source tags, and writing a short monthly note from the finished table. The arithmetic stays in the spreadsheet, because a chat assistant can quote you the right column's name and the wrong column's number.
Choose the finish line: booked, attended or paid
A lead is not a job. Between them sit three finish lines, and the one you choose changes every figure. Booked means a visit is in the diary. Attended means the engineer turned up. Completed and paid means the work was done and the money arrived. Use the last one. A booked job that cancels, or an invoice that is never paid, still cost you the lead fee and an hour of someone's day.
Count every job by the month the lead arrived, not the month it completed. A boiler replacement quoted in September that goes ahead in November belongs to September's source. Otherwise winter jobs get credited to the autumn marketing that did not produce them, and the books drift. For slow quotes, check the previous month's figures again after five weeks, when the late jobs and Google's lead credits have landed.
Tag every enquiry to a source, cheapest method first
There are five ways to know where a call came from. Start at the top and add a more expensive method only when the free one leaves too many unknowns.
- Ask. "How did you hear about us?" costs nothing and catches referrals. Customers say "Google" for anything seen on a phone, so treat it as a clue.
- Use the line the customer dialled. Give each paid source its own number. CallRail's pricing page lists Lead Tracking at $50 a month for five local numbers, 250 minutes and 25 texts with call and text attribution, Lead Tracking Complete at $95 with form attribution, and Lead Conversion at $150 with AI call summaries.
- Use the platform's own record. Google Ads shows each lead with a Charge Status, and marketplace dashboards list each lead they sent.
- Use AI call summaries. Quo's Business plan adds AI call summaries and transcripts ($23 per user a month billed annually, $33 monthly) and Scale adds AI call tags ($35 or $47). Jobber's Receptionist keeps a summary, transcript and recording of each conversation it handles, and Smith.ai lists recording, transcription and summaries on every plan.
- Add a form field. On the website, a required "How did you find us?" dropdown with five fixed options tags every enquiry that comes through the site.
None of these is perfect, so keep an Unknown row. HVAC lead sources and which book replacements applies the same tagging idea to heating and cooling. If Unknown passes about 15 per cent of calls, the tracking is leaking, and no source decision is safe until it is fixed.
Set up call tracking in an afternoon
Decide the source list first, then give a separate number to each source that does not already leave its own record. Forward every tracking number to your main line, and write the map into the tagging prompt so each summary can use it.
| Source | Where its number goes | What to check |
|---|---|---|
| Website | Header and contact page only | That an old number is not still printed in the footer or on a PDF |
| Van signs and stationery | Printed on vans, cards and invoices | That the number is readable at the distance a customer sees it |
| Directory profile | Added to the profile, if the directory allows a separate number | The directory's own rules before you change anything |
| Flyers and referral cards | A third number, or a code word on the card | That you count only calls that quote the code |
| Pay-per-lead ads | No extra number: the Google Leads page is the record | That you export it every month |
At $50 a month for CallRail's five-number plan, tracking adds about $1.11 to each of the 45 completed jobs in the sample month below. Ring every tracking line on the first of each month. A dead number sends leads to a ringing void, and nothing in the spreadsheet will tell you.
If you also want AI summaries to do the tagging, price the two routes side by side. CallRail's Lead Conversion plan is $150 a month and sits in front of the phone line you already have. Quo's Business plan replaces the phone system itself: for a four-van firm with four office and on-call users it is $92 a month on annual billing or $132 monthly, at $23 or $33 a user. Either way, tracking costs between 2 and 6 per cent of the sample month's $2,640 of lead spend, which is a small price for not cutting the wrong source.
Turn AI call summaries into tagged rows
If your phone tool already writes a short summary per call, a chat assistant can turn a batch into spreadsheet rows. The risk is guessing: models like to complete a pattern, so "I saw you online" becomes "Website". Fix that in the instructions. A prompt for a week of summaries:
You tag plumbing enquiries by lead source. Use only facts in each summary.
Allowed tags: Local Services, Angi, Thumbtack, Directory, Website, Referral, Repeat customer, Unknown.
Line map: Line A = Local Services ads. Line B = website. Main = no tracking.
Rules:
1. If the dialled line is a tracking line, use its source.
2. If the caller names a source, use that.
3. Otherwise tag Unknown. Never infer a source from the job type or time of day.
For each call output: number | tag | job type | urgency | outcome | one-line reason.
Five illustrative summaries to feed it:
1. Line A, 3m20s. Dripping kitchen tap, wants a visit tomorrow. Booked Thursday 9 to 11.
2. Main line, 1m05s. Says a neighbour recommended us. Blocked drain, not urgent. Booked Friday.
3. Line B, 0m45s. Asks about boiler servicing. We do not service boilers. Call ended.
4. Main line, 2m10s. Says she found us on a directory. Wants a bathroom refit quote. Email sent.
5. Main line, 1m30s. Says "I saw you online". Leak under the sink, wants someone today. Booked this afternoon.
A good reply (illustrative):
1 | Local Services | Dripping tap | Routine | Booked | Dialled Line A
2 | Referral | Blocked drain | Routine | Booked | Caller said a neighbour recommended
3 | Website | Boiler servicing | n/a | Not our work | Dialled Line B
4 | Directory | Bathroom refit | Routine | Quote sent | Caller said "a directory"
5 | Unknown | Leak under sink | Urgent | Booked | "Online" is not a source
What to fix: row 4 needs the directory's name, so add it to the call script. Row 3 was a lead that could never become a job; keep it in the lead count for paid sources, because you were charged for it, and mark it "not our work" so you can see how much budget goes on wrong enquiries. Row 5 stays Unknown unless someone rings back and asks. If a model had tagged row 5 as Website, your own site would look better than it is.
The monthly tracker: columns and formulas
One row per source per month, with these columns: Month, Source, Spend, Leads, Booked, Completed, Revenue. Make Source a dropdown so a typo does not create a seventh source. Then add three calculated columns:
Cost per lead =IFERROR(C2/D2,"")
Cost per completed job =IFERROR(C2/F2,"")
Spend as share of revenue =IFERROR(C2/G2,"")
Spend is always net of credits and taken from invoices or statements, never from an ad dashboard's estimate. Revenue is what you invoiced for those completed jobs, before the cost of parts if you cannot split it. Complete the sheet from the job software, filtering on the lead source field, and use the same source list in both.
A sample month for a four-van plumbing firm
Every figure is invented to show the method. Spend is net of any credits; the directory fee is the firm's own monthly invoice.
| Source | Spend | Leads | Booked | Completed | Revenue | Cost per lead | Cost per completed job | Spend as share of revenue |
|---|---|---|---|---|---|---|---|---|
| Local Services Ads | $1,250 | 25 | 13 | 11 | $5,060 | $50 | $114 | 25% |
| Angi | $620 | 17 | 5 | 4 | $1,520 | $36 | $155 | 41% |
| Thumbtack | $380 | 15 | 4 | 3 | $1,110 | $25 | $127 | 34% |
| Membership directory | $240 | 8 | 5 | 5 | $2,300 | $30 | $48 | 10% |
| Own site and Google profile | $150 | 21 | 13 | 12 | $5,520 | $7 | $13 | 3% |
| Referrals and repeat customers | $0 | 11 | 10 | 10 | $4,200 | $0 | $0 | 0% |
| All sources | $2,640 | 97 | 50 | 45 | $19,710 | $27 | $59 | 13% |
Reading the sample: keep, watch or cut
Apply one rule to every row. Under 15 per cent of revenue: keep. Between 15 and 25: watch, and look for a leak to fix. Over 25: cut or cap, unless the first job reliably leads to repeat work. The logic is simple. If a typical job leaves a 45% gross margin and winning it costs 25% of revenue, 20% is left to pay for overheads and profit, which is thin for a small firm. These cut-offs are starting points; use your own margin.
- Cheapest to find, dearest to win: Angi and Thumbtack have the lowest cost per lead ($36 and $25) and the highest share of revenue (41% and 34%). Only 5 of Angi's 17 leads booked. Before cutting, test faster replies for a month; if the booked rate does not move, cap the spend.
- Borderline: Local Services Ads sit at 25%, on the line. Five of its leads were calls missed in business hours, each billed at $50, so $250 of the net $1,250 bought no conversation. Answering those calls, or texting back inside a minute, is the lever.
- Keep and feed: the directory is at 10%, but eight leads is too few to judge. Roll three months together before changing anything.
- Protect: the own site and referrals are almost free per job. Their limit is not spend but how many people ask, so look at review requests and the website's contact paths instead of budget.
Count the own-site row honestly. If you spend three hours a month writing for it and value your time at $40 an hour, add $120: the cost per completed job rises from $13 to about $23, which is still the best figure in the table.
There is a second lens on the same table: contribution. Multiply revenue by your gross margin and subtract spend. At a 45% margin, Local Services Ads leave $1,027, the directory $795, the own site $2,334 and referrals $1,890. Angi leaves $64 and Thumbtack about $120, before overheads and before the evenings spent chasing 32 leads. When the vans are full, a source that nets $64 is a poor use of attention. When they are half empty, it is still positive, which is why capacity belongs in the decision.
One big job can rescue a bad source
Averages hide the job that carries a row. Look inside the directory's $2,300: $1,600 of it was one bathroom refit, and the other four jobs brought $700, an average of $175. Without the big job, $240 of spend is 34% of revenue, which moves the directory from keep to cut or cap. The big job is real money and worth winning, but one customer in a quarter is not a pattern. For every row with fewer than a dozen jobs, calculate the share of revenue twice, once with the largest job and once without, and decide on the weaker figure until more data arrives.
Reconcile Google's Leads page against your jobs
Google's help pages describe how pay-per-lead charging works for plumbing, and "Plumber" is among the categories listed for Performance Max campaigns with pay-per-lead goals. You are charged only when a potential customer contacts you directly through the ad, and only for valid leads. A call that reaches your voicemail or an automated greeting during business hours counts as connected, and is charged if the caller stays on the line for more than 20 seconds, whether or not they leave a message. A repeat contact from the same phone number or email within 15 days is not charged again. Leads that Google later judges poor quality, duplicate or invalid can be credited to your account balance, usually within 30 days, while the original charge stays on the invoice. The Leads page shows each lead as Charged, Not charged, In review or Credited.
Each month, export the Leads page and match it to your phone log by phone number. In the sample month Google charged 28 leads at $50, which is $1,400, and credited 3 of them, $150, leaving 25 leads and $1,250. The phone log showed 5 of the charged leads were calls nobody answered in business hours. That is a finding about your phone cover, not a reason to blame the advertiser. If a lead looks invalid, the Local Services help pages explain the dispute and feedback route, and how to dispute Google Local Services leads with an AI evidence pack goes through the evidence to gather.
Google's own help says old Local Services Ads performance reports will not transition to Google Ads when an account moves to Performance Max. It promises a download of historical reports on the redirection page; until that appears, it advises screenshots before you migrate, so capture at least the monthly lead and spend figures this tracker needs. The migration steps are in a plumber's export checklist for the move to Performance Max.
Marketplaces and directories: match their leads to your jobs
For Angi and Thumbtack the tracking problem is different: the lead arrives in the platform, but the customer often books by phone later or goes with someone else, and the platform may not tell you which. Log each marketplace lead on the day, with the customer's first name and phone number, then mark it Hired, Lost or No reply when you know. Thumbtack's pro page says there is no charge to join and that you control your pricing and budget for leads, which determines how many you get; it shows no per-lead prices, and I could not read Angi's pro pages, so I quote no Angi prices. Your statement is the only reliable price. A worked Angi cost-per-job example for plumbers and HVAC shows the same sums for that one source.
A directory membership such as Checkatrade changes the arithmetic again if you pay it as a fixed fee rather than per lead. Checkatrade's own pages would not load for me and third-party figures disagree, so take the price from your invoice. With a fixed fee, cost per completed job is the fee divided by jobs: $240 over 5 jobs is $48, but the same $240 over 2 jobs is $120. That is why a quiet month looks terrible and a busy one looks brilliant. For this source the three-month view matters most, and comparing MyBuilder and Checkatrade for plumbers and electricians covers the pair.
Three ways the tracker misleads you
Double counting repeat callers
A customer rings from a Local Services ad on Monday and again from their own number on Wednesday after you missed the first call. Your log has two rows. Google, within its 15-day window, treats it as one lead. Dedupe by phone number before counting: in the sample, 31 log rows for Google became 28 leads once three repeat calls were merged.
A source too small to judge
Eight directory leads in a month is a coin-toss. Over three months, say the firm paid $720 and completed 15 jobs: $48 each, the same as the single month, but now with some weight behind it. Do not cut, or double, a source on one month's data unless the gap is enormous.
An Unknown bucket that quietly grows
Suppose 21 of 120 calls are Unknown. That is 17.5%, above the 15% line, and the cause is usually that staff stopped asking. The fix is a line in the call script and a reminder in the weekly meeting, not a cleverer prompt.
Four checks that the month's tracker adds up
Before acting on a month, run four checks. Each takes a couple of minutes, and each catches a different kind of error.
- Spend matches the money that left. The Spend column total should equal the card statements and invoices for the month, net of Google's credits: $2,640 in the sample. If the tracker is lower, a source is missing a row; if it is higher, something was counted twice.
- Jobs match the job software. Completed jobs across all sources, 45 in the sample, should equal the job software's count of completed and paid jobs from leads that arrived that month. A gap usually means jobs with no source recorded, which belong in the Unknown row rather than nowhere.
- Google's leads match the export. Charged leads minus credited ones in the Leads export, 25 in the sample, should equal the Local Services row once repeat callers are merged.
- Five tags survive a spot check. Pick five tagged calls at random, open the recordings or transcripts, and confirm each tag. If more than one of the five is wrong, fix the prompt and re-run the month's tagging before reading any figure.
A month that fails any of the four goes back for fixing before anyone reads the keep, watch or cut column. The second check is the easiest to fail, because a source field left blank on a busy day leaves no trace anywhere else.
Ten minutes a week keeps the tracker honest
Monthly clean-up of a messy month is miserable. Ten minutes a week is not. On Monday, take last week's call summaries, run the tagging prompt, paste the rows into a Calls tab and ring back any Unknown that is still open. On Friday, mark each marketplace lead Hired, Lost or No reply, and pull completed jobs from the job software. Five weeks after month end, re-open the previous month, because late jobs and Google's lead credits will have landed. Put the three tasks in the diary with the day and the person's name beside each. A tracker that depends on someone remembering will be accurate for six weeks.
Move the money: a 30-day test after the first month
Run one change at a time and judge it against the table. For the sample firm, the first change is the cheapest: answer the missed calls. An AI receptionist at roughly $41 a month for 45 conversations (Jobber's Receptionist is $29 including 30 conversations, then $0.79 each) answers the five calls that went unanswered in business hours. If three of them book at the average $460, completed jobs rise from 11 to 14, revenue to $6,440 and spend to $1,291. Local Services Ads then cost $92 per completed job and 20% of revenue, down from 25%, with no change to the ad budget.
The second change is a cap. Halving Angi to $310 should save $310 and, at the same booked rate, lose about $342 of gross profit, so on paper it costs $32 a month. Do it only if capacity is the constraint, and record in the sheet that the cap began that month, so a drop in leads is not blamed on something else.
Ask AI for the monthly summary, then check it
Once the sheet is complete, a summary helps the owner read it quickly. Paste the table and give firm rules:
Here is last month's lead-source table. Do not recalculate: copy my numbers exactly.
Columns: Source, Spend, Leads, Booked, Completed, Revenue, Cost per completed job, Share of revenue.
Write:
1. The source with the highest share of revenue.
2. Any source with fewer than 10 leads (too small to judge).
3. The one source I should look at first, in two sentences.
4. Three questions I should check before acting.
A typical reply (illustrative) names Angi, says it has the highest cost per completed job at $124, flags the directory as too small, and asks whether Angi leads were answered fast enough. What to fix: $124 is Angi's cost per booked job, not per completed job, which is $155. The model read the wrong column. This is why you copy numbers from the sheet and check one row by hand every month. If the assistant gets a figure wrong, the question list is still useful; the numbers are not.
Tracking plumbing lead costs: questions answered
What counts as a plumbing job when I work out cost per job?
Use completed and paid jobs, not leads or even bookings. A booked job that cancels or never pays cost you the lead fee and the visit slot. Count by the month the lead arrived, so a September quote that completes in November is credited to September's source.
How do I know which source a phone call came from?
Use a separate tracking number per source, or the line the customer dialled, and ask 'How did you hear about us?' when there is no tracking. An AI call summary can record the answer, but it should tag Unknown when nobody said, instead of guessing.
Why is my cost per lead low but my cost per job high?
Usually because few leads were reached, few booked, or few paid. Cheap marketplace leads often reach several firms at once, so speed decides who gets the booking. Look at the reached and booked columns for that source before blaming the price.
How many months of data do I need before cutting a source?
Three, unless the source is clearly over your limit with plenty of leads. A source that sends eight leads a month can swing wildly. Add three months together, keep the same definition of a job, and cut only when the rolling figure still fails.
Further reads
- AI SEO for Plumbers: Get Named by ChatGPT and Google AI Overviews — A free source: being named by AI search answers.
- Getting More Reviews After Every Job With AI Follow-Ups — Reviews that feed the cheapest source in the table.
- AI Answering Service for Plumbers: Rosie, Goodcall, Smith.ai or Jobber? — Answer the calls the leads cost you.
- Buying AI Lead Generation for Roofing: Pay-Per-Appointment or Retainer? — Compare pay-per-appointment and retainer deals for roofing on real published prices, cost per held inspection, contract terms and red flags.
- Handyman Leads: Thumbtack, Angi and Bark Compared on Cost per Booked Job — Thumbtack, Angi and Bark compared on how they charge, what refunds exist and cost per booked job, plus AI prompts to screen leads and reply fast.
- How Much Does Bark Charge for Leads? Credits, Cost per Job, AI Replies — What Bark charges per lead, how to turn credits into a cost per job won, and a reply routine with AI that keeps that number down.
- AI Marketing for Plumbers: A Worked 12-Month Posts and Offers Calendar — A worked 12-month calendar for a five-van plumbing firm: frozen pipes, boiler checks, heater age and drain season, with AI drafts and a review step.
- Boiler Replacement Leads: Follow Up in Minutes Using AI — Follow-up timings for boiler replacement leads, AI first-reply examples, quote-visit booking wording and a three-message chase that still sounds like you.
- AI Tools and AI Development: The Complete 2026 Guide — the AI hub, including every tutorial in the AI-for-business series.
Sources: Google Ads Help pages on Performance Max with pay-per-lead goals, the Local Services Ads transition and supported categories; Local Services Help pages on how leads work and automated lead credits; CallRail pricing; Quo pricing; Jobber Receptionist page; Smith.ai AI Receptionist pricing; Thumbtack pro page. Angi and directory prices were not available to read, so they come from your own statements. Checked October 2026.