“We already tag every job with a lead source.”
That is the source somebody typed at booking. This adds what that source went on to collect, and which campaign sat behind it — neither of which the field can hold.
For Housecall Pro
Match paid jobs to the campaigns and calls behind them, and rank channels on collected revenue rather than booked work.
No API key Nothing to install in Housecall Pro No card required
The gap
Booked is not paid, and paid is not profitable. Your marketing report stops at booked, which is the least useful of the three.
What was sold, to whom, and for how much.
The click, the keyword, the call, and what each one cost.
The file
Three things carry the match: who, how much, and when. Anything else is optional and only changes how the report can be sliced.
The customer on the job. Phone first in this trade — residential work is booked by call far more often than by form.
What was actually paid, not what was booked. A cancelled or written-off job is not revenue and should not credit a channel.
Whichever is consistent with how you close your books.
Separates a diagnostic visit from a full replacement so the two do not average.
Step by step
Written for somebody with Housecall Pro open in the next tab. Report names vary by edition, so each step says what to look for.
One row per job with the customer's contact detail, the amount collected and a date. Look for the export that lists money received rather than work scheduled.
Residential replacement work closes slowly enough that a quarter of data will only show you the quick jobs.
Phone or email on each row is what makes the file matchable at all.
Column mapping is suggested and confirmed by you, with manual mapping always available.
Google Ads, Local Services Ads, Meta, or your call tracking provider — whichever you run.
What comes back
Revenue by channel, the count of sales behind each figure, and an honest bucket for the ones nobody could trace. Sample figures, from the worked example on the HVAC Companies page — not from a Housecall Pro account.
| Channel | Share | Sales | Revenue |
|---|---|---|---|
| Google Ads | 38 | $241,400 | |
| Meta Ads | 24 | $61,600 | |
| Email marketing | 19 | $46,200 | |
| Direct / Unknown | 63 | $164,300 |
Unmatched sales stay in Direct / Unknown. They are never spread across the paid channels to make the total look better.
The argument
The gap between a booked job and money in the account is where residential trades lose the thread. Jobs get cancelled, rescheduled into oblivion, cut down on site, or completed and never paid. If a channel's jobs cancel at twice the rate of another's, booked revenue will rank them identically and be wrong.
Exporting what was collected rather than what was booked is a one-column decision that changes the answer. It also makes the report reconcilable to your own accounts, which is the difference between a marketing number and a number you will actually repeat to somebody.
Residential systems fail on their own schedule. A homeowner gets a diagnostic in spring, decides to nurse it through the summer, and replaces in autumn when it fails properly. The advertisement that produced that customer ran five months before the revenue.
Any tool that measures inside a window will credit the September branded search and score the April campaign as a cost with no return. Matching on the customer makes the five-month gap irrelevant: the same person appears in both files, so the match is made and the revenue is credited to the period the enquiry came from.
Residential trades earn most of their money from customers they already have. A first visit leads to a repair, then a maintenance plan, then eventually the replacement. Treating each of those as a separate conversion triple-counts the marketing and makes cost per job look better than it is.
Matching on the customer keeps one person as one acquisition with all their revenue attached. The headline number usually goes down and becomes correct, which is the trade this product exists to make.
There is no tag, no script, no connected app and no permission to grant. The inputs are two CSVs you can export and inspect before uploading either of them.
Because the method reads records kept for billing rather than a tag that had to be running at the time, you can analyse a period that has already finished. Most operators start by uploading last year, because it is the fastest way to find out whether the exercise tells them anything.
Residential trades get a meaningful share of work from review sites and home services marketplaces, which charge per lead or take a commission and report their own performance. That spend sits beside paid search in the budget and has never been compared with it on a common measure.
Upload the marketplace's lead export as a source file and it is ranked on collected revenue exactly like a Google campaign. Operators are frequently surprised in both directions — sometimes the marketplace is the best value in the mix, sometimes it is buying them jobs they would have won anyway.
Either answer is worth having before the annual renewal conversation, which is usually conducted on the marketplace's own figures.
Fair questions
That is the source somebody typed at booking. This adds what that source went on to collect, and which campaign sat behind it — neither of which the field can hold.
Individually. The customer behind them is not, once the repeat work is attached to the original acquisition, which is precisely what the match does.
It is two file uploads. The first report takes about as long as the export does.
Paid jobs or payments: a customer phone or email, the amount collected, and a date.
Collected. Cancellation rates differ by channel, and booked revenue hides that.
Yes, and they credit the channel that produced the customer the first time.
Twelve months minimum for residential replacement work.
Yes, with a job type column, so diagnostics and replacements are judged separately.
No. It works from a CSV export, so there is nothing to authorise.
Yes — the LSA export is a source file and ranks beside paid search.
Upload the marketplace's lead export as a source file and it ranks on revenue like anything else.
They are shown as Direct / Unknown and never redistributed.
Encrypted in transit and at rest, isolated per workspace, deletable in one click, DPA available.
Yes, with a technician column, though the more common cut is by job type and by channel.
Export each payment as its own row against the same customer. They all credit the original channel.
Yes, if you upload both the enquiry file and the paid-jobs file. In residential replacement work the lag is usually the most surprising number on the first report.
Yes. Export what was collected, including finance proceeds, as rows against the customer.
Yes, with a job type column, so unpaid return visits do not distort a channel's revenue.
By trade
What the report looks like once the export is in, written for each one.
Other systems
Running more than one system, or comparing? The method is the same and the columns are not.
Housecall Pro and the other product names and logos on this page belong to their owners and are shown to identify the software a file comes from. CloseRev is not affiliated with or endorsed by them, and connects to none of them: it reads a file you export.
Start today
Nothing to install in Housecall Pro, no API key, and no need to have been tracking anything until now. Last year works as well as this month.