Revenue, not calls
Rank on invoiced revenue, so a single high-value job is not averaged away by the noise around it.
Marketing attribution for gutter and siding companies
Match signed jobs and their value to the calls and campaigns that produced them, including the work that follows a roof.
$199,500 57% of $350,000 paid
The blind spot
Gutter cleaning and full siding replacement arrive through the same channels and are fifty times apart in value.
What you get
Rank on invoiced revenue, so a single high-value job is not averaged away by the noise around it.
Time between the advertisement and the invoiced revenue is irrelevant to the match, which is the reason this works where tag-based tracking does not.
Exact matches count; nothing weaker does on its own. That is deliberately conservative, because an invoiced revenue figure nobody can check is worth less than a smaller one they can.
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 | 49 | $105,000 | 30% | |
| Local service ads | 29 | $63,000 | 18% | |
| Meta Ads | 15 | $31,500 | 9% | |
| Direct / Unknown | 71 | $150,500 | 43% |
A homeowner who books a gutter clean this autumn is a strong candidate for a full replacement within two years, and no click-based tool connects the two.
Because the match is on the customer, the later job credits the channel that produced them originally — which turns low-value acquisition work into a measurable investment rather than a cost.
Exterior demand spikes after weather events, and a channel that looks exceptional in a hail month can be unremarkable the rest of the year.
Running specific date ranges separates event-driven revenue from baseline, so budget decisions are not made on two weeks of unusual demand.
This trade spans an enormous range of ticket sizes under one brand. A gutter cleaning or a short repair is a low-hundreds job booked in a day. A complete siding replacement with fascia and soffit is a five-figure exterior renovation decided over weeks against competing quotes.
Both arrive through overlapping searches and are recorded as one job each. The small work dominates the volume, looks excellent on cost per lead, and contributes a small fraction of the revenue; the large work looks expensive to acquire and carries the year.
Ranking on invoiced revenue, with a job-type column mapped as Product / service, separates them, so each half of the business is seen on its own revenue rather than through a blended average that consistently flatters the cheap half.
A great deal of siding and fascia work is sold to households who first hired the company for something trivial. Somebody cleans the gutters, notices rot, mentions it, and is trusted because they have already been on the roof and behaved well.
That progression is one of the most reliable sources of large work in the trade, and no conventional report credits the advertisement that produced the original cleaning job — it is scored against a two-hundred-dollar invoice and forgotten.
Because the match is on the customer, the later replacement credits the channel that produced the first visit. Channels that generate low-ticket volume stop looking like a commodity once the work they lead to is attached to them.
Storms, heavy leaf fall and hard winters all produce spikes in demand that have nothing to do with anything the marketing did. A channel that looks strong in the month after a storm is not necessarily a better channel; it was simply running when the phone rang.
Comparing consecutive months in this trade is therefore close to meaningless, and it is the comparison every advertising platform offers by default.
Uploading two or three years lets the report compare the same weeks across years, which removes weather as a confound and is usually the only way to tell whether an off-season campaign is genuinely working or simply being carried by conditions.
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
Which is why revenue rather than job count is the ranking, and why later jobs must credit the original channel.
Run the report on specific date ranges. There is no attribution window, so any period can be compared to the same period last year.
If it exports signed jobs to CSV, that is enough.
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. Starter usually fits gutter, siding and exterior contractors — one workspace, one seat, and everything that makes the number defensible from the first plan.
A single business getting started
$9/mo
billed monthly
Questions
Anything else? Talk to us — a person answers, usually the same day.
Signed jobs: a customer email or phone, the amount, and a date.
Yes — they credit the channel that produced the customer.
Yes, with a job-type column, so each one can be funded against its own invoiced revenue rather than a portfolio figure.
Yes — run the report on that date range.
No. Where you already have them, a tracked caller's number is a clean key and raises the match rate, but nothing requires tracking numbers — the quote requests exported from your ad platforms is enough to start.
Yes — customer records are encrypted both in transit and at rest, kept inside your own workspace, and removable on request. A DPA is available.
Yes. Those jobs were recorded because you billed for them rather than because anybody was tracking, so a finished year matches exactly as well as the current one.
Job rows analyzed in a calendar month. Rows in the lead file, calls included, do not count.
No. There is nothing to add to your website and nothing to authorize in your job management software; you send a CSV and inspect it first if you want to.
Yes. Most gutter, siding and exterior contractors begin with last year, because it is the cheapest way to find out whether the exercise tells them anything.
They stay unattributed and are printed as such, because an invoiced revenue figure that quietly absorbs what it cannot explain is not defensible.
Yes, with a job-type column mapped as Product / service, which shows replacement revenue apart from the volume of small work and how much of it traces to a channel.
Yes, credited to the channel that produced the original visit.
Yes, and in a weather-driven trade you should — upload two or three years so storms stop distorting the comparison.
Yes, with a payer column mapped as Product / service, so self-funded retail revenue is seen separately from claims.
Monthly once the mapping is saved, because it takes a few minutes. Read it quarterly, though: in a weather-driven trade a single month says more about rainfall than about advertising, and acting on it monthly will have you chasing noise.
Why a channel performed as it did. It shows which sources produced collected revenue and which did not; whether that is the advertisement, the landing page, the person answering the phone or the price is a question the numbers raise rather than settle.
Nearby
Match signed and installed contracts to the leads and ads that produced them, across a sales cycle that often runs months.
See how it worksMatch installed replacement jobs to the appointments, canvassing and ads that produced them.
See how it worksMatch accepted estimates and the revenue they earned to the campaigns that produced the homeowner, weeks after the quote.
See how it worksWhere your sales already are
Export completed jobs from AccuLynx, upload the leads that produced them, and rank marketing on signed work rather than on inspections booked.
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 collected work from JobNimbus, upload the leads behind it, and rank channels on the stage that actually pays.
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.