Ranked by invoice value
A channel that produces four replacements beats one producing forty service calls, and the report says so.
Marketing attribution for home services companies
Match your invoiced jobs to the calls and ads that produced them, and find out which channel is actually paying for the trucks.
$323,100 68% of $475,200 paid
The blind spot
The phone rings all day. Some of those calls are a $28,000 system replacement and some are a filter someone could have bought online, and your ad report treats them identically.
What you get
A channel that produces four replacements beats one producing forty service calls, and the report says so.
Compare August to August, not just to last month, so a summer spike is not mistaken for a winning campaign.
No numbers to provision, no app for the crew. Two exports from what you already run.
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 | 54 | $218,600 | 46% | |
| Meta Ads | 29 | $66,500 | 14% | |
| Email marketing | 17 | $38,000 | 8% | |
| Direct / Unknown | 71 | $152,100 | 32% |
Home services has the widest spread between a small job and a large one of almost any local industry. A drain clear and a sewer line replacement come from the same phone number and the same ad, and averaging them together tells you nothing you can act on.
Ranking channels by invoiced value rather than call count usually reorders them. It is common for a channel producing a third of the calls to produce most of the revenue, and for the channel everyone assumed was best to be producing volume at the bottom of the ticket range.
A furnace that fails in January produces a call within the hour, and click-based attribution handles that case fine. The problem is the other half of the business: the quote given in October that is approved in March, the maintenance customer who comes back for a replacement two years later.
Because CloseRev matches on the customer rather than a browser session, both cases work the same way. The March approval is credited to the ad that produced the October call, which is usually the difference between a channel looking break-even and looking like your best one.
Almost every home services company runs two economies at once. Service calls are frequent, small and easy to attribute: somebody has a problem today and calls today. Replacements are rare, large and slow, and they are where the year's profit actually is.
The awkward part is that the same campaign produces both. A keyword that generates cheap emergency calls looks excellent on cost per lead and may produce almost no replacement revenue; a keyword that generates a handful of expensive inquiries looks wasteful and may carry the quarter.
Ranking channels on invoiced revenue rather than on jobs booked separates them without anybody having to guess. It is also why a job-type column is worth adding to the export: with it, the report can rank channels twice and show that the two rankings are not the same list.
Two findings come up again and again. The unattributed share is larger than expected — commonly a third or more — because repeat customers, neighbors and van signage genuinely do produce work that no advertisement can be credited with. Reporting that honestly is the point; spreading it across the paid channels would make every other number on the page untrustworthy.
The second is that the channel producing the most jobs is rarely the channel producing the most revenue. That is not a reason to switch anything off. It is a reason to bid differently, because the two keyword sets are doing different jobs and have been funded as though they were the same one.
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
Any layout works. You need a customer phone or email, the invoiced amount and a date — most systems' invoice or job-completion report already produces exactly that.
Then it should show as Direct / Unknown rather than being credited to whichever ad ran that month, which is what most tools do. Repeat work is a real and valuable channel; it just is not paid media, and mixing them makes the paid numbers useless.
Good — its export is one of the two files. A call tracker tells you the call came from Google Ads; CloseRev tells you that call became a $28,400 replacement.
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 HVAC, plumbing, roofing and remodeling companies — 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: a customer phone number or email, the amount, and the date. ServiceTitan, Housecall Pro, Jobber and similar all produce this as a standard report.
Yes — map a job-type column as Product / service and the report shows revenue by job type, with how much of each traces to a channel. It does not rank channels within each job type.
Yes, with a location column mapped as Location: revenue by service area, with the attributed share of each. A crew can be mapped as Product / service instead. The breakdown does not rank channels inside each area.
Compare any two ranges, including the same month last year. Comparing August only to July in this business tells you about the weather, not about your marketing.
No. No numbers, no minutes, no per-form fees. That is the main reason the bill is predictable compared with a call-tracking platform.
As far as your exports go. Nothing had to be installed at the time, so last year's season can be analyzed today.
Email catches many of these, because both files are matched on phone and email. A different number with no email in common does not match at all: there is no near-match, and the sale stays in Direct / Unknown rather than being guessed at.
Yes, either invited into your workspace or from their own Agency account.
Yes, with a job-type or business-unit column mapped as Product / service. It is the single most useful breakdown to add, because service and replacement revenue behave so differently.
Yes. Export the renewals as further rows against the same customer and they credit the channel that produced them originally.
If the email matches, the job is credited normally. If neither the number nor the email appears in both files, there is no match and the job stays in Direct / Unknown. Nothing is assumed, and exporting both a phone and an email on each row is what recovers most of these.
Not as a figure in the report. A sale is credited to its inquiry however long the quote took, but the report does not calculate the gap between the two dates. Both dates are in your own two files, so the lag can be worked out from them, and in replacement work it is worth doing once.
Any that exports jobs or invoices with a customer contact detail, an amount and a date. There are written guides for ServiceTitan, Jobber and Housecall Pro.
Yes, and a trade column is the thing to add. Plumbing, electrical and HVAC have different tickets and different buying urgency, and a single blended cost per job across all three is a figure no branch manager can act on.
Very little. A trade with large replacement jobs is lumpy by nature, and one quiet month is usually variance rather than decline. Compare the same period across two years before moving budget, and look at the job count beside the revenue.
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 signed and installed contracts to the leads and ads that produced them, across a sales cycle that often runs months.
See how it worksMatch invoiced jobs to the calls and ads behind them, and separate the drain clears from the repipes.
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 exportExport paid invoices and match them to the campaigns that produced the customer — including the recurring work that follows.
What to exportMatch paid jobs to the campaigns and calls behind them, and rank channels on collected revenue rather than booked work.
What to exportSupermove already reports revenue by referral source. This adds the campaign behind it — and prices bought leads against your own advertising.
What to exportSmartMoving reports on the sources it holds. This adds the campaign behind them and ranks every lead vendor on invoiced work.
What to exportExport invoices from GorillaDesk, upload the leads that produced them, and rank marketing on the account rather than on the first job.
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 Arborgold, upload the leads behind them, and rank marketing on completed work rather than on requests for a quote.
What to exportExport invoices from FieldPulse, upload the leads behind them, and see which channels produce work that closes.
What to exportExport signed contracts from MarketSharp, upload every lead source behind them, and rank channels on contract value.
What to exportExport sold jobs from improveit 360, upload the leads behind them, and read each source against the stage where it fails.
What to exportExport Birdeye conversations as your lead file, match them against closed revenue, and find out what the widget and the listings are worth.
What to exportExport the leads your campaigns produced, match them against closed sales, and find out which campaigns produced revenue rather than form fills.
What to exportExport your lead ads, match them against closed sales, and find out which campaigns produced customers rather than contact details.
What to exportExport your call records, match them against closed sales, and find out which sources produced calls that became invoices.
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 signed work from Roofr, upload the leads behind it, and rank channels on contracts rather than on how many roofs you measured.
What to exportExport invoices from Contractor Foreman, upload the leads behind them, and rank marketing on the project rather than on the deposit.
What to exportExport billed services from Briostack, upload the leads behind them, and rank channels on what their accounts were actually worth.
What to exportExport billed applications from RealGreen, upload the leads behind them, and rank channels on the season rather than on the sign-up.
What to exportExport your conversations, match them against closed sales, and find out what texting actually produced.
What to exportExport your submissions, match them against closed sales, and find out which forms and which sources produced revenue.
What to exportExport collected work from JobNimbus, upload the leads behind it, and rank channels on the stage that actually pays.
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 your Thumbtack leads, match them against paid jobs, and find out which categories and which job sizes are worth being in.
What to exportCapture Yelp calls and requests as leads, match them against closed sales, and separate what the ads added from what the listing would have brought anyway.
What to exportExport your WhatConverts leads, match them against your invoices, and see where the recorded values and the real ones part company.
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 articleFor a business that sells by phone, a missed call is a lead that was paid for and then dropped. It also quietly rewrites channel ROI: the channel whose callers ring after hours looks weaker than it is. Here is how to measure missed calls and callback speed from a call log, and how to report them without inventing revenue.
Read the articleStart today
Upload two exports and see your real revenue by channel in minutes. 14 days free, no card.