Ticket size, not call count
Rank channels by invoiced value so large jobs stop being averaged into invisibility.
Marketing attribution for Plumbers
Match invoiced jobs to the calls and ads behind them, and separate the drain clears from the repipes.
$208,000 65% of $320,000 paid
The blind spot
Emergency plumbing produces a lot of calls and a very wide range of tickets. A blocked toilet and a sewer line replacement arrive through the same ad, and cost per lead cannot tell them apart.
What you get
Rank channels by invoiced value so large jobs stop being averaged into invisibility.
See which channels bring emergencies and which bring scheduled, higher-margin work.
No tracking numbers to provision, no app for the crew. Two exports.
A worked example
Not impressions, not leads, not cost per click. Closed revenue, by the channel that produced it, for a period you choose — with the portion we could not trace shown rather than quietly shared out across your paid channels.
| Channel | Sales | Revenue | Share | % |
|---|---|---|---|---|
| Google Ads | 96 | $163,200 | 51% | |
| Meta Ads | 21 | $25,600 | 8% | |
| Email marketing | 14 | $19,200 | 6% | |
| Direct / Unknown | 88 | $112,000 | 35% |
Emergency search is where most plumbing ad budget goes, and it produces the most calls. It also produces the smallest average ticket, because someone with water on the floor wants the cheapest fix that works today.
The jobs that pay — repipes, sewer lines, water heater replacements, commercial contracts — often come from different searches and convert more slowly. Measured on call volume they look like poor performers, which is how budget ends up concentrated on the lowest-margin work available.
Lead resellers and directories all report the leads they sent. Matching those lists against your own invoiced jobs produces a single number per source that sums to the work you actually did — rather than several vendor reports that each claim the same customer.
Because only exact phone or email matches count automatically, a source claiming a customer it never sent has nothing to stand on.
A burst pipe at eleven at night and a bathroom repipe booked three weeks out arrive through the same brand and often the same campaign. One converts in minutes at a modest ticket; the other is quoted, compared and decided over weeks at many times the value.
Cost per lead treats them identically and therefore systematically favors emergency keywords, which are cheap to convert and cheap to serve. That is a real part of the business and it is not where the margin is.
Ranking on invoiced revenue already puts the money where it is. A job-type column mapped as Product / service makes the split explicit: emergency and planned revenue each get their own line, with how much of each traces to a channel, rather than a blended average that describes neither.
Plumbing is a repeat trade. A household that calls once and is treated well calls again, and eventually asks for the water heater, the repipe or the bathroom. That sequence is worth a multiple of the first call and is credited to nobody.
Because the match is on the customer, every later invoice credits the channel that produced them the first time. Channels that bring households rather than one-off emergencies stop looking equivalent, and on most books that reorders the list.
The unattributed share tends to be large, and it should be. Plumbing is a trade where a neighbor's recommendation, a van seen in the street and a twelve-year-old relationship genuinely produce work, and none of that can be traced to an advertisement. Reporting it as Direct and Unknown rather than distributing it across the paid channels is what makes the rest of the table believable.
The second common finding is that emergency keywords dominate the job count and underperform on revenue per job, while planned-work keywords look expensive per lead and carry the margin. Neither of those is a reason to switch a campaign off; both are reasons to bid and budget for them separately, which almost nobody does because almost nobody has ever seen the two numbers side by side.
Why it matters
"We generated 400 leads" invites an argument. "This channel closed $186,400 last quarter, here is the reconciliation" ends one. The teams that can show closed revenue by channel are the teams that get the next increase approved, because they are asking with evidence rather than with conviction.
Killing spend is politically harder than adding it, because someone always owns the channel being cut. A number that reconciles to the sales export takes the argument out of the room — you are not overruling a colleague's judgment, you are reading the same ledger they are.
Platform-reported conversions do not reconcile to revenue, and eventually someone in finance notices. Reporting built from your own closed-sales export starts from the number finance already trusts, which is why it holds up when it is checked.
Because this reconciles exports rather than tracking visitors, it works on months that have already closed. You are not instrumenting now to learn something in ninety days — you can answer for last quarter today, which is usually when the question is being asked.
Honest answers
They will appear as unmatched leads, which costs nothing against your limit — only invoiced jobs count. Seeing which channel produces shoppers rather than customers is usually the point.
They show as Direct / Unknown, which is honest. Repeat work is valuable and worth measuring; crediting it to this month's ads is not.
That works. Any layout, any column order — a phone or email, an amount and a date is all the match needs.
Pricing
The price here is the price on the invoice, plus any sales tax that applies — no per-call, per-minute or per-form fees. Growth usually fits residential and commercial plumbing contractors — thirteen months of history to compare a month to the same month last year, and a PDF you can put in front of whoever holds the budget.
A business scaling ad spend
$49/mo
billed monthly
Questions
Anything else? Talk to us — a person answers, usually the same day.
Completed, invoiced jobs: customer phone or email, the amount, and the date.
Yes — map a job-type column as Product / service and the report breaks down by it.
Yes, and the ticket differences make the channel picture clearer, not muddier.
No. If you already use them, that export is one of the two files.
Upload their lead export as the lead file. Their claims are then checked against jobs you actually invoiced.
Yes. Nothing had to be installed at the time.
Yes, either invited to your workspace or from their own Agency account.
Invoiced job rows. Lead and call rows do not count.
Yes, with a job-type column mapped as Product / service, and you should — emergency and planned revenue behave very differently.
Yes, and they credit the channel that produced the customer originally rather than counting as new acquisitions.
Collected, where you can. Cancellation and write-off rates are not uniform across channels.
No, but plumbing converts on the phone, so a call export is usually the strongest second file.
Because word of mouth and repeat work genuinely are a large share of a plumbing book. The report says so rather than assigning that revenue to a paid channel to make the numbers look better.
Completed jobs or invoices: a customer phone or email, the amount, and a date. Job type is optional; mapped as Product / service, it is the breakdown most worth adding, because it separates emergency work from planned work.
If it exports jobs or invoices with a contact detail, an amount and a date, yes. There are written guides for ServiceTitan, Jobber and Housecall Pro, and the method is the same for anything else.
Yes, by mapping a technician column as Product / service (one extra breakdown per import). The report then shows revenue by technician and how much of it traces to a channel, which keeps a technician's conversion from being mistaken for a channel difference.
Only what was collected appears. The channel is credited with the money that actually arrived and nothing more, so a source that produces customers who do not pay through is not flattered by the amount originally invoiced.
Only if one of their details appears in both files. A number that is in the lead file links, and so does an email; a number that is in neither does not match at all, and the job stays in Direct / Unknown. There is no near-match and nothing is guessed, so asking for an email at booking is what recovers most of these.
Nearby
Match installed equipment and invoiced work to the calls and ads that produced them, so the channel that fills your install schedule is obvious.
See how it worksMatch completed jobs and their revenue to the calls and campaigns that produced them, from a routine pump-out to a full system replacement.
See how it worksMatch completed jobs and the revenue collected to the calls, insurer programs and referral partners that produced them.
See how it worksWhere your sales already are
Export completed jobs and match them to the campaigns and calls that produced the customer — including the estimate that sat for four months.
What to exportMatch paid jobs to the campaigns and calls behind them, and rank channels on collected revenue rather than booked work.
What to exportExport invoices from QuickBooks Online, upload your call and lead records beside them, and see revenue by channel — from the ledger rather than from a guess.
What to exportCallTrackingMetrics attributes the contact. Match those contacts against your sales export and rank channels on the money rather than on the volume.
What to exportExport completed jobs, upload the calls and leads beside them, and rank your marketing on invoiced work instead of on booked calls.
What to exportExport your jobs, upload the calls and leads beside them, and rank channels on what was charged rather than on what was booked.
What to exportExport invoiced jobs, upload your calls and leads beside them, and get revenue by channel — with the trade that earned it as a cut of its own.
What to exportExport invoices from Kickserv, upload the leads behind them, and find out which marketing produced work rather than calls.
What to exportExport invoices from FieldPulse, upload the leads behind them, and see which channels produce work that closes.
What to exportExport invoices from ServiceM8, upload the leads behind them, and find out which marketing paid for itself.
What to exportExport invoices from Tradify, upload the leads behind them, and see which channels produce work rather than price comparisons.
What to exportExport your Angi leads, match them against the jobs you invoiced, and find out what a won job actually cost.
What to exportExport customers and paid invoices from Thryv, match them on the customer, and see what each source produced in money you received.
What to exportFrom the blog
Multi-crew home and field services businesses run on phone calls and job management software, not on web forms. Which means the standard marketing dashboard is measuring the smallest part of the business and missing where the money actually is.
Read the articleGoogle's Local Services Ads charge for the phone call, not the click, and they hand you the caller's number with the invoice. It is the easiest channel in the budget to attribute to closed revenue. Almost nobody does, because the lead inbox is not where the reports live.
Read the articleBefore you blame the matching algorithm, look at how phone numbers are stored on each side. Extensions, country codes, leading zeros and a spreadsheet that decided a number was maths — this is where most attribution quietly fails.
Read the articleStart today
Upload two exports and see your real revenue by channel in minutes. 14 days free, no card.