Contracts, not inspections
Rank channels by contract value so a source producing few large jobs wins properly.
Marketing attribution for Roofing Contractors
Match signed and installed contracts to the leads and ads that produced them, across a sales cycle that often runs months.
$540,000 60% of $900,000 paid
The blind spot
Roofing leads are expensive, most inspections do not convert, and the ones that do convert are worth twenty thousand dollars or more. Judging channels on lead volume in that market is close to guessing.
What you get
Rank channels by contract value so a source producing few large jobs wins properly.
An inspection in spring signed after an autumn storm still matches the original ad.
Only exact matches count, so a lead reseller cannot claim a homeowner it never sent.
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 | 19 | $342,000 | 38% | |
| Meta Ads | 9 | $153,000 | 17% | |
| Email marketing | 3 | $45,000 | 5% | |
| Direct / Unknown | 21 | $360,000 | 40% |
Free-inspection offers produce leads cheaply and convert poorly. A channel that generates a hundred inspections and four contracts is worse than one generating twenty inspections and eight, and no cost-per-lead report will tell you that.
Matching signed contracts back to their original lead source ranks channels on the only number that matters — installed contract value — and usually reorders them substantially.
A homeowner researches roofing in May, does nothing, then signs in October after a storm. The click is five months old, the cookie is gone, and any platform-reported attribution has expired.
Because the match is on the homeowner rather than a session, the October contract is still credited to the May lead. It also means a season that has already ended can be analyzed properly, which for a weather-driven trade is the only way to compare years.
A storm-restoration roof and a retail replacement are different products with different cycles, different margins and completely different acquisition. Storm work arrives in a concentrated burst driven by weather and canvassing; retail work is a considered purchase researched over months.
Running them through one report produces an average job value and an average cycle that describe neither, and it makes the advertising look wildly effective in a storm year and broken in a quiet one.
A job-type column mapped as Product / service separates them so retail demand generation can be judged on its own terms — which matters most in exactly the years when there is no storm to carry the number.
On an insurance job the homeowner is the customer and the carrier sets the amount. Approved scope, supplements and depreciation all move the final figure after the sale, sometimes months after.
That makes contracted value a poor measure and collected revenue the honest one. Exporting what was actually collected also keeps the report reconcilable to the company's own accounts, which is what makes it survive a conversation with the owner.
A payer column mapped as Product / service separates insurance work from retail so the two are never blended, and shows how much of the self-funded retail revenue traces to a channel at all.
Most roofing companies run both a media budget and a field operation — canvassers, storm chasers, door knockers — and the two are managed by different people, measured in different units and never priced against each other. The field team reports doors knocked and appointments set; the marketing budget reports leads and cost per lead.
Neither reports collected revenue per dollar spent, which is the only comparison that could settle how the next hundred thousand should be split between them.
Adding a canvassed list to the lead file, each row tagged as canvassing, puts the field operation on exactly the same axis as paid search. The answer may be uncomfortable in one direction or the other, and it is more useful than the argument it replaces.
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
That lands in Direct / Unknown, which is correct and worth quantifying. Crediting canvassing to your Meta budget would make the paid figures meaningless.
Export whichever figure you want to rank on — contract value, approved claim, or your own revenue. The report ranks consistently on what you provide.
Combine their exports into the lead file, each row tagged with the reseller as its source. Matching them against signed contracts is the fastest way to work out which reseller is worth renewing.
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 storm-restoration roofing 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.
Signed or installed contracts: homeowner phone or email, the contract value, and the date.
As long as your data covers. There is no attribution window, because there is no cookie involved.
Yes — compare any two ranges, including the same quarter last year, which is the only fair comparison in this trade.
Yes: a territory column mapped as Location, or a crew column mapped as Product / service (one extra breakdown per import).
No. Lead exports from your ad platforms or resellers work as the second file.
Leave them out of the sales file. Every row in it is counted as a sale and uses the monthly record limit, and there is no status filter. The conversion view comes from the other side: leads per channel in the lead file sit beside signed contracts in the report.
Yes, from their own Agency account with a workspace for your company.
Contract rows analyzed in a calendar month. Lead rows do not count.
Yes, with a job-type column mapped as Product / service. It is the most important cut on a roofing report.
Collected. Supplements and depreciation move the number after the sale.
Yes — add the canvassed list to the lead file, tagged as canvassing, and it ranks against paid channels on revenue.
Yes, by mapping a crew or salesperson column as Product / service (one extra breakdown per import).
Two years if you can, so a storm year and a normal year are both represented.
Yes. Door-knocked contacts go into the lead file beside your other sources, each row tagged as canvassing, and are ranked on collected revenue next to every paid channel.
Yes, if both the inquiry file and the invoiced-jobs file are uploaded. Retail replacement routinely runs a quarter or more behind the inquiry.
Yes, exported as further rows against the same homeowner and credited to the original channel.
The window and the expectations. With a few dozen contracts a year, read a full season rather than a month, and use the output as an order of sources. A small contractor is typically choosing between a listing, a paid campaign and word of mouth, and a ranking across a year answers that adequately.
Word of mouth lands in Direct / Unknown unless you upload a list of the people it produced. If you keep a referral log, add it to the lead file, tagged as referrals, and run the report again; if you do not, that is the finding — the channel you believe in most is the one you are not recording. Nothing is inferred to fill the gap.
In a trade this weather-driven, a month means very little on its own. Compare it with the same month last year, which is the only comparison holding the season constant. If a channel trails its own history for a full season, act on it. If it trails last month, you are probably just reading the weather.
Both jobs match the same number, and each is credited automatically to the earliest inquiry carrying it; a shared number is not sent to review. When both people found you through the same channel, that is correct. Where it may not be, an email on each row helps, because email is checked before phone.
Monthly through the season, and once more at the end of it. Retail replacement closes slowly, so each month adds contracts from inquiries in earlier quarters. The end-of-season run is the one worth sitting down with, because it is the first view where a whole storm-and-retail cycle appears in a single report.
Nearby
Match signed jobs and their value to the calls and campaigns that produced them, including the work that follows a roof.
See how it worksMatch installed replacement jobs to the appointments, canvassing and ads that produced them.
See how it worksMatch your invoiced jobs to the calls and ads that produced them, and find out which channel is actually paying for the trucks.
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 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 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 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 exportExport your Angi leads, match them against the jobs you invoiced, and find out what a won job actually cost.
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 articleAdd up what your agencies and platforms claim and you have sold the same thing several times over. Nobody is lying. Here is why double counting is structural, how to run the reconciliation meeting, and what to change in the contracts so it stops recurring.
Read the articleStart today
Upload two exports and see your real revenue by channel in minutes. 14 days free, no card.