“Kickserv already shows revenue by customer.”
It does. It cannot show which advert produced the customer, because that happened before the customer existed.
For Kickserv
Export invoices from Kickserv, upload the leads behind them, and find out which marketing produced work rather than calls.
No API key Nothing to install in KickservNothing to install No card requiredNo card
CloseRev reads a Kickserv export of invoices — the customer's phone or email, the amount and the date — and matches it against the calls, forms and ads that produced the job. For a small contractor the gap between a booked call and a paid invoice is wide, and only the invoice side settles which marketing is worth keeping. Invoices with no traceable lead are reported as Direct / Unknown.
Last checked against Kickserv's own documentation on September 24, 2026.
The gap
Every channel reports leads. Only your invoices know which of those leads turned into money.
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.
On the customer record. In the trades the phone number is the reliable key.
What was billed and collected, not the estimate. Estimates measure your quoting, not your marketing.
When the work was billed. For jobs that ran across weeks, the invoice date is the stable one.
Repair, install, maintenance. The difference in value between them is usually larger than the difference between channels.
Step by step
Written for somebody with Kickserv open in the next tab. Report names vary by edition, so each step says what to look for.
One row per invoice with a customer contact detail, the total and a date. An estimate is an intention.
Small trades have lumpy months. A short file ranks channels on which one happened to catch a big install.
Call tracking first, plus the website form, search ads and any marketplace or directory you pay for.
A channel's cost is spread across everything it sent, including the leads that went nowhere.
The join runs on the phone and the email, normalised, and everything unmatched stays visible.
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 Plumbers page — not from a Kickserv account.
| Channel | Share | Sales | Revenue |
|---|---|---|---|
| Google Ads | 96 | $163,200 | |
| Meta Ads | 21 | $25,600 | |
| Email marketing | 14 | $19,200 | |
| Direct / Unknown | 88 | $112,000 |
Unmatched sales stay in Direct / Unknown. They are never spread across the paid channels to make the total look better.
The argument
Small contractors have a revenue distribution with a long tail: dozens of small repairs and a handful of installs worth more than all of them together.
In a one-month file, whichever channel produced the install wins by an order of magnitude, and the conclusion is noise rather than signal.
Six months is the practical floor, and a year is better. The report shows the median job as well as the total by channel, because those two numbers disagreeing is itself the finding.
Where job type is in the export, splitting repair from install removes most of the distortion outright.
A homeowner who liked the plumber calls the plumber again. Over two years, repeat work is often the largest single line in a small contractor's book.
Attributed to nothing, it disappears into Direct / Unknown and makes every paid channel look worse than it is. Attributed to the original channel with no thought, it makes them look far better.
The report separates first jobs from subsequent ones and leaves the judgement to you, with the number in front of you rather than assumed.
That number is also the honest argument for the more expensive channel: a source whose customers come back twice is worth paying more for at the front.
A small contractor's phone rings from a van decal, a map listing, a search advert and a neighbour, and none of those produce a form submission.
Every one of them lands in the same place — the phone — so without tracking numbers there is nothing to join on and the report is mostly Direct / Unknown.
The fix is cheap: distinct tracked numbers on the website, on the vehicles and on any paid listing. One change makes every subsequent report worth reading.
Until that exists, the report states the size of the untracked bucket rather than guessing a distribution across the channels that do have data.
Lead marketplaces sell the same enquiry to several contractors and bill whether or not you win it. The cost per lead is known; the cost per job never is.
Matching invoices back to marketplace leads gives the only number that matters, which is what a won job actually cost once the losses are included.
Contractors who run this usually find one marketplace is defensible and another is not, where the cost-per-lead figures were nearly identical.
The same method applies to any channel that bills for contact rather than for outcome, which is most of them.
It also settles the argument about response time. Where a marketplace lead only converts when it is called within minutes, the invoice file shows it, and the fix is an operational one rather than a change of channel.
Fair questions
It does. It cannot show which advert produced the customer, because that happened before the customer existed.
Small is where it matters most: a single misjudged channel is a larger share of the budget.
Then the report will show that, and the size of it is worth knowing before you buy anything else.
No. It reads a file you exported; your schedule and customer records are not reachable from here.
Invoices with a customer contact detail, the total and a date.
An estimate is an intention. Ranking marketing on intentions rewards whichever channel produces the most optimistic ones.
Six months at minimum, because one large install can otherwise decide the ranking.
They are reported separately from first jobs, so the decision stays yours.
Yes, on cost per won job rather than cost per lead, which is the comparison they are not built to lose.
Direct / Unknown unless the decal carries a tracked number. That is worth fixing and cheap to fix.
Yes, where the export carries a job type, and it removes most of the distortion from a lumpy file.
Both are normalised and matched. The report shows which key joined.
Yes. Two exports and a spreadsheet's worth of leads is the whole exercise, and it takes about twenty minutes.
A contact detail, an amount and a date, plus a job type if you include one. No addresses required, no notes, no card data. Encrypted in transit and at rest and deleted with the import.
Revenue per acquired customer by source, first and repeat work apart, median alongside total, and everything unmatched kept visible.
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.
Kickserv 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 Kickserv, no API key, and no need to have been tracking anything until now. Last year works as well as this month.