Skip to main content

How to Track Roofing Marketing ROI by Channel (Without Lying to Yourself)

Michael Torres, Storm Damage Specialist··31 min readRoofing Sales & Growth
On this page

Ask ten roofing owners what their marketing ROI is and you'll get ten shrugs followed by a number that's really just a guess. The honest answer for most companies is "I don't know, but the phone rings." That's fine when you're spending $4,000 a month on one channel. It is a slow-motion disaster when you're spending $40,000 across six channels and three of them are quietly losing money.

The problem isn't that owners are lazy. It's that roofing has a uniquely hostile measurement environment. Your sales cycle can run from a same-day storm-chase signature to a nine-month "we'll do it in the spring" stall. A single job can touch a yard sign, a Google search, a postcard, a neighbor's referral, and a retargeting ad before anyone signs. Your average ticket is high enough that one lost attribution call distorts the whole month. And a big slice of your revenue may not even come from the original sale, it comes from supplements and recoverable depreciation recovered weeks later on the same roof.

So when a marketing vendor hands you a dashboard that says "$38 cost per lead," you're looking at the least useful number in the building. Cost per lead tells you what it costs to make a phone ring. It tells you nothing about whether that phone call turns into a signed contract, whether that contract collects in full, or whether the channel that produced it is worth re-funding next quarter.

What follows is the measurement system actual operators use to answer the only question that matters: for every dollar I put into a channel, how many dollars of collected gross profit come back, and how long do I wait for them? We'll cover the attribution that survives the real world, the math that separates cost-per-lead from cost-per-win, the tracking infrastructure that makes it possible, and the specific traps that make roofing numbers lie.

Why roofing ROI is harder to measure than almost any other trade

Before building the system, you have to respect why the naive version breaks. Five forces work against you.

The cycle is bimodal, not average. A plumbing emergency closes in hours. A roofing lead is two completely different animals wearing the same costume. Storm/insurance work can close in days. Retail replacement ("my roof is 22 years old and finally leaking") routinely takes 60 to 270 days from first contact to signature, because the homeowner is shopping, saving, and stalling. If you measure a channel's ROI 30 days after spend, you'll conclude your retail channels are garbage when they're actually just slow. You have to measure with the cycle, not against it.

Revenue arrives in two waves. The contract value is wave one. Supplements, change orders, and recoverable depreciation are wave two, and on insurance work wave two can be 15 to 40 percent of the total. A channel that produces insurance-heavy jobs looks weaker at signature and stronger at final collection. If your ROI math stops at "contract signed," you systematically undervalue your storm channels.

Attribution is multi-touch and physical. Unlike e-commerce, half your touches happen offline: a door-knock, a yard sign a neighbor saw, a postcard on the fridge for three weeks. You cannot cookie a fridge. So you need deliberate capture mechanisms (unique numbers, QR codes, a disciplined intake question) or those touches vanish.

The homeowner lies, and so does the rep. Not maliciously. The homeowner genuinely doesn't remember whether they found you on Google or saw the truck. The rep types "referral" because it's the first option in the dropdown and they want to get to the next appointment. Self-reported source data is the single largest source of garbage in roofing CRMs.

Small numbers, big swings. A residential roofer might close 12 to 30 jobs a month. With that volume, one $24,000 job attributed to the wrong channel moves that channel's ROI by a visible margin. You need enough time and discipline to let the law of large numbers help you, and you need to know which conclusions your sample size can actually support.

None of these are reasons to give up. They're the design constraints. A measurement system that ignores them produces confident, wrong numbers, which is worse than no numbers at all.

The metric stack: from cost-per-lead up to return on collected gross profit

Think of channel measurement as a stack. Each layer is more useful and harder to capture than the one below it. Most companies stop at layer two. The money is in layers four and five.

Layer Metric What it answers Why it's not enough alone
1 Spend by channel What did I pay? Means nothing without output
2 Cost per lead (CPL) What does a phone ring cost? Ignores lead quality entirely
3 Cost per qualified lead What does a real opportunity cost? Ignores close rate and ticket size
4 Cost per acquisition (CPA / cost-per-win) What does a signed job cost? Ignores margin and collection
5 Return on collected gross profit (ROAS on GP) How many margin dollars come back per dollar spent? The real answer

Here's why each jump matters, with numbers.

Suppose two channels both report a $50 cost per lead. Channel A is paid search. Channel B is a shared lead marketplace. Identical CPL, so a lazy owner funds them equally. Now walk up the stack.

Channel A: of 100 leads, 70 are qualified (right service area, real roof, real intent). Of those, 25 percent close. Average ticket $14,000, gross margin 35 percent. So 100 leads cost $5,000, produce 17.5 wins, $245,000 in revenue, ~$85,750 in gross profit. Return on collected GP: roughly 17x.

Channel B: of 100 leads, 40 are qualified (the rest are tire-kickers, wrong area, or sold to four other contractors). Of qualified leads, 12 percent close because you're racing three competitors. Average ticket $11,000 (price-shoppers), margin 30 percent because you discounted to win. So 100 leads cost $5,000, produce 4.8 wins, $52,800 revenue, ~$15,840 GP. Return on collected GP: roughly 3.2x.

Same cost per lead. One channel returns five times the margin of the other. If you'd budgeted on CPL, you'd have starved your best channel to feed your worst. This is the entire reason the stack exists.

The formulas, written out

Keep these on a card. Compute every one of them per channel, never blended.

  • Cost per lead = channel spend / leads from that channel
  • Qualified-lead rate = qualified leads / total leads
  • Cost per qualified lead = channel spend / qualified leads
  • Close rate = won jobs / qualified leads
  • Cost per win (CPA) = channel spend / won jobs
  • Average collected revenue per win = total collected (contract + supplements + depreciation) / wins
  • Gross profit per win = average collected revenue per win × gross margin %
  • Return on collected gross profit = (gross profit per win × wins) / channel spend
  • Payback period = days from spend to the point cumulative collected GP from that cohort equals the spend

That last one, payback period, is the metric almost nobody computes and the one that tells you whether you can afford to scale. A channel with 8x return that takes 40 days to pay back is a money printer you can lean on. A channel with the same 8x return that takes 210 days to pay back will bankrupt you if you scale it faster than your cash can float it. ROI and cash flow are different questions.

A full worked P&L for one channel, start to finish

Formulas are abstract until you run real money through them. Here's a complete trailing-90-day picture for a single channel, Direct Mail to due-roof addresses, the way it should sit on one row of your tracker.

You mailed 9,000 pieces across three monthly drops. Print and postage ran $0.62 a piece, the address list and design amortized to $0.08 a piece, so all-in mail cost was $0.70 each, $6,300 total. Here's the funnel that came back:

Stage Count Conversion from prior stage
Pieces delivered 8,820 98% (180 undeliverable)
Responses (QR scans + tracked calls + forms) 159 1.8% response rate
Qualified opportunities 104 65% of responses
Appointments set 81 78% of qualified
Inspections completed 68 84% of appointments
Signed jobs (wins) 22 32% of inspections

Now the money. Average signed contract was $13,800. Of the 22 jobs, 14 were insurance/storm work that carried a second wave: supplements and released depreciation added an average of $4,100 to those 14 jobs, $57,400 in wave-two collected dollars. So total collected revenue was (22 × $13,800) + $57,400 = $303,600 + $57,400 = $361,000. At a 33 percent gross margin, that's about $119,130 in gross profit.

Walk the stack:

  • Spend: $6,300
  • Cost per lead (per qualified opportunity): $6,300 / 104 = $60.58
  • Cost per win: $6,300 / 22 = $286
  • Collected revenue per win: $361,000 / 22 = $16,409 (note this is higher than the $13,800 contract average, that gap is wave two)
  • Gross profit per win: $16,409 × 0.33 = $5,415
  • Return on collected gross profit: $119,130 / $6,300 = roughly 18.9x

Now notice what happens if you'd stopped at the contract. Without wave two, collected revenue is $303,600, gross profit about $100,188, and return drops to 15.9x. That three-point swing in reported ROI is the supplement and depreciation revenue your storm channels generate, and it's exactly the money a contract-only measurement throws away. The channel didn't get better between those two numbers, your accounting got more honest.

This is the row you want for every channel. One line each, trailing 90 days, all the way to return on collected gross profit, with wave two counted. Six or eight rows like this, sorted by that final column, is the entire decision.

First-touch, last-touch, and the multi-touch reality

Attribution is the fight over which channel gets the credit when several were involved. Pick the wrong model and you'll defund the channels that start deals while overpaying the ones that merely finish them.

Last-touch gives all credit to the final interaction before the lead came in. It's what most CRMs default to and it's seductive because it's easy. It's also how brand and top-of-funnel channels get murdered. The homeowner saw your truck for two years, finally got hail, Googled your name (a branded search), and called. Last-touch credits Google. The truck wrap, the yard signs, and the two years of being visible get zero. You cut the wrap budget, and six months later your "free" branded search dries up and nobody knows why.

First-touch gives all credit to the channel that created the lead. This is the right default for roofing, and it's worth being dogmatic about it. The first time a homeowner becomes aware of you and raises a hand is the touch you actually paid to manufacture. Everything after is conversion mechanics you'd have anyway. First-touch rewards the channels that generate demand, which is what you're trying to optimize.

Multi-touch splits credit across every interaction (linear, time-decay, or position-based / U-shaped). It's the most "correct" model and the hardest to run honestly in a trade where half the touches are offline and unloggable. For a company doing serious volume across many digital channels, position-based (40 percent first, 40 percent last, 20 percent spread across the middle) is a defensible compromise. For everyone else, the overhead exceeds the insight.

The operator's rule: make first-touch your source of truth and lock it. The instant a lead is created, stamp the originating channel and never let it change. Track last-touch as a secondary field for the conversion conversation, but never let a rep, a homeowner's faulty memory, or a CRM automation overwrite that first-touch stamp. The number-one cause of unmeasurable roofing marketing is a first-touch source that got silently rewritten three weeks later when someone re-opened the record and the dropdown defaulted to "referral."

Worked example of why first-touch wins

A homeowner's path: sees your wrapped truck in the neighborhood (touch 1, Truck/Brand) → three weeks later a hailstorm hits → searches "hail damage roof [city]" and clicks your map listing (touch 2, Local SEO) → fills nothing out, but a week later your retargeting ad reminds them (touch 3, Paid Social) → they finally call the tracked number on a postcard you'd mailed the whole block (touch 4, Direct Mail) → close, $19,000.

  • Last-touch credits Direct Mail with the entire $19,000. You conclude mail is your hero channel and the truck wrap is worthless.
  • First-touch credits the Truck/Brand presence, the thing that actually planted you in this person's head. More honest, and it protects the channel that's quietly seeding dozens of these.

Neither is perfectly "true." But first-touch makes better budget decisions because it funds demand creation. Last-touch funds the closer's tools and starves the demand. In a trade where demand creation is the hard part, that's the difference that matters.

Building the tracking infrastructure, channel by channel

Attribution theory is useless without capture mechanisms. You can't attribute a touch you never recorded. Here's how to instrument each channel so the data actually lands. The principle is the same everywhere: every channel needs a unique, unfakeable identifier that ties the response back to its source.

Phone calls: dynamic numbers and a real intake script

The call is where most roofing leads land and most attribution dies.

  • Use a unique tracked phone number per channel. A different number on your postcards, your yard signs, your Google profile, your paid ads, your truck. When it rings, the originating channel is known before anyone says hello, no homeowner memory required. Call-tracking platforms rotate numbers for web sessions so a website visitor from paid search sees a different number than one from organic.
  • Record calls and tag them. A ring is not a lead. Tag each call: qualified opportunity, price shopper, wrong area, existing customer, spam. Your CPL is meaningless until you strip the spam and the wrong-number calls out of the denominator.
  • Lock the intake question, but trust it second. Still ask "how'd you hear about us?" because it catches offline touches your numbers miss (a neighbor's word-of-mouth). But treat the tracked number as primary truth and the verbal answer as a tiebreaker, not the other way around.

Web forms: hidden fields that carry the source

Every form on your site should silently capture and pass along where the visitor came from.

  • Capture UTM parameters (source, medium, campaign) into hidden form fields so they ride into the CRM with the lead. A lead from utm_source=google&utm_medium=cpc&utm_campaign=hail-2026 arrives pre-labeled.
  • Capture the landing page and referrer too. "Filled out the form on the storm-damage page after arriving from Facebook" is a complete first-touch story.
  • Store all of it on the contact record at creation. If it isn't stamped at creation, it's gone.

Direct mail: QR codes, tracked numbers, and per-piece tracking

Mail is the channel owners most often write off as unmeasurable, and it's actually one of the most measurable if you instrument it.

  • Unique tracked phone number printed on the piece, separate from every other channel.
  • A QR code per campaign (or per household) that lands on a personalized page. A scan is a logged, timestamped, attributable event tied to that exact mail drop, and if the QR is per-address you know which household responded.
  • A personalized URL or a generic vanity URL for the people who type instead of scan.
  • Per-piece delivery tracking so you know what actually hit mailboxes and when, which lets you line up response spikes against delivery dates instead of guessing.

Done this way, a mail campaign produces a clean funnel: pieces delivered → QR scans + tracked calls → forms → appointments → signed jobs → collected revenue. That's a real ROI number, not a vibe.

Canvassing and doors: capture the knock

Field/door-to-door is brutal to attribute because the "lead" is a conversation in a driveway.

  • Equip canvassers with a mobile intake form so the moment of contact is logged: address, outcome, interest level, and a stamped "Canvassing — [rep name] — [date]" source.
  • Use a leave-behind with its own QR code so the homeowner who wasn't ready in the driveway but scans the flyer that night is still tied back to the canvass, not mis-credited to "website."
  • Log no-answers and not-interested too. A door route's true cost-per-win includes the 40 doors that said no, and you can't compute it if you only record the wins.

Referrals and repeat: don't let them inflate everything

Referrals are your best ROI and the easiest to over-credit, because reps love typing "referral."

  • Require the referrer's name. "Referral" with no name is almost always a lazy rep covering for "I don't know." A real referral has a person attached.
  • Separate "referral from a past customer" from "referral from a partner" (insurance agent, real estate, property manager). They have different costs and different scaling levers.

The through-line: each channel gets a unique identifier, and the identifier is captured by the system, not reconstructed from human memory later.

The one source field that decides whether any of this works

Everything above collapses if your CRM lets the source field drift. This is worth its own section because it's the failure mode that silently destroys most roofing measurement programs.

Here's how it dies in practice. A lead comes in from paid search, correctly stamped. Two weeks later the homeowner calls back, a different CSR opens the record, and the CRM's "lead source" dropdown re-defaults or the CSR re-selects it as "phone call." Now your paid-search channel is down one win and your "phone" bucket (which isn't even a channel) is up one. Multiply by a few hundred records and your entire attribution is noise.

The fix is structural, not behavioral. Don't ask reps to "be careful."

  1. First-touch source must be write-once. Stamped at lead creation, then immutable. No human and no automation can overwrite it. If you need to note a later interaction, that goes in a separate "most recent touch" field.
  2. The source value should be set by the capture mechanism, not a human dropdown wherever possible. Tracked number → channel. UTM → channel. QR scan → channel. Humans only fill the source for genuinely offline, unlabeled contacts (some referrals, some walk-ups).
  3. Audit weekly. Pull every lead with source = "other," "unknown," or blank. If that bucket is more than ~5 to 8 percent of leads, your capture is leaking and your ROI numbers are soft.
  4. Tie commission and lead-credit to the locked source, so reps have no incentive to fudge it.

If you take one operational change from all of this, make it this one: an immutable, capture-set, first-touch source. It's worth more than any dashboard.

How RoofPredict makes per-channel ROI a closed loop

This is the part most tools get wrong: they measure one slice. A call-tracking product knows your calls but not your jobs. Your CRM knows your jobs but not your spend. Your accounting software knows collected revenue but nothing about channels. You end up exporting three spreadsheets and reconciling them by hand at month-end, which is exactly why nobody does it.

RoofPredict is built to keep the whole chain in one place so the ROI number computes itself.

The lead pipeline with an immutable first-touch source. Every lead moves through a defined pipeline (new → contacting → appointment → inspected → won/lost), and the first-touch source is stamped at creation and locked, exactly the write-once discipline described above, enforced by the system instead of by hope. That single design choice is what makes the rest of the math trustworthy.

The results funnel, per channel, with cost attached. RoofPredict tracks the full funnel, delivered → views → form → calls → leads → wins, and ties cost-per-lead and cost-per-win to each channel. So you're not looking at a blended "marketing cost per lead." You're looking at the Direct Mail funnel versus the canvassing funnel versus paid versus referral, each with its own cost-per-win.

Actual versus estimate versus benchmark. Before a campaign runs, you get a cost quote up front. After it runs, the funnel shows what actually happened next to what was estimated and next to an industry benchmark. That three-way comparison is how you catch a channel that's drifting underwater before you've poured another quarter into it, and how you keep a vendor honest about what they promised.

Tracked mail proofs, microsites, and per-home QR, all instrumented. When you turn a target list into a mail campaign, every piece carries its own tracking, every targeted home gets a personalized microsite with a lead-capture form, and each home gets per-home and lookup QR codes. A scan or a form submit is a logged, attributed event tied back to the exact campaign and address, so the mail-and-microsite channel reports a real funnel instead of an estimate.

Field routes that log the knock. The canvassing side, door-knock routes, assigned canvassers, the mobile field app with next-stop, outcome forms, and a leave-behind QR, captures the field touch at the moment it happens, so canvassing gets a true cost-per-win including all the doors that said no.

Two-way CRM sync so the loop closes where your jobs already live. If you run HubSpot, ServiceTitan, JobNimbus, AccuLynx, Jobber, Housecall Pro, Salesforce, Pipedrive, Leap, Roofr, SalesRabbit, or CompanyCam, RoofPredict syncs both ways (plus Zapier and CSV). The first-touch source and the won/lost outcome stay consistent across systems, so the channel that generated a lead is still credited when the job closes in your production CRM weeks later. That's the exact break point where hand-rolled attribution usually snaps.

The honest limit: RoofPredict can only attribute what gets captured. If a homeowner saw your truck and you have no truck-tracking mechanism, that touch still lands in "referral" or "other." No platform fixes physics. What it does is remove the manual reconciliation and the source-field drift that make most roofers give up before they get a real number.

ROI starts before the spend: targeting changes the math

There's a quiet assumption buried in everything above, that the inputs to each channel are fixed and all you can do is measure the output. That's only half true. The single biggest lever on a channel's ROI isn't the creative or the offer. It's who you aimed it at. A direct-mail piece sent to 9,000 random addresses and the identical piece sent to the 9,000 addresses most likely to need a roof soon cost the same to print, but they don't return the same. Targeting moves the response rate, the qualified rate, and the close rate all at once, which compounds through the entire stack.

This is where measurement and acquisition meet. If you can rank the homes in your service area by how likely they are to need work, you can point your most expensive channels (mail, canvassing) at the top of that list and watch every downstream number improve before you've changed a word of copy. The honest version of this isn't magic prediction. It's two signals a roofer already trusts, combined: roof age and storm exposure.

Roof age is the dominant driver of replacement demand. An asphalt roof has a service life, and homes drift through age bands, recently done, mid-life, due, and overdue, as that life runs out. Knowing which band a home sits in tells you whether a replacement conversation is years away or overdue today. The honest limit: roof age is a range, not an exact date. You're working with "this roof is probably 18 to 24 years old," not "this roof was installed on a known date." That range is still enormously more useful than mailing everyone equally.

Storm exposure is the second signal. A home that sat under a verified hail swath has a different probability of a damage conversation than one that didn't. Again, honestly: a storm passing over a home is odds, not proof. A forecast or a historical hail track tells you a roof was exposed and may qualify for a look. It does not tell you the roof is damaged, and it absolutely does not tell you a claim will be approved, that's the carrier's call, not yours.

RoofPredict's targeting side scores every home in a service area on exactly these signals, roof-age band plus per-roof storm exposure, rolled into an opportunity score, and produces a ranked target audience house by house, each with a "why this home" evidence chain so you can see the reasoning behind the rank. You draw a territory on a hex map or import a CSV of addresses, filter to storm-hit blocks, and pull the due and overdue roofs to the top. Then you point your tracked, instrumented channels at that list: mail proofs and per-home microsites and QR to the due-roof addresses, field routes to the overdue blocks in the hail swath.

The measurement payoff is direct. When the input list is ranked instead of random, the same mail spend produces a higher response rate and a higher qualified rate, so cost-per-win falls and return on gross profit rises, before you've touched your attribution or your sales process at all. And because RoofPredict instruments those channels and stamps the locked first-touch source, you can actually see the lift in the funnel rather than assume it. Targeting and measurement aren't separate projects. The same platform that proves a channel's ROI is the one that improves it.

Wave two: counting supplement and depreciation revenue in channel ROI

Here's the revenue most channel-ROI math leaves on the floor. On insurance/storm work, the signed contract is only the first wave of money. The second wave is supplements (scope and pricing the carrier's original estimate missed) and recoverable depreciation (the held-back amount released after the work is documented as complete). On a storm-heavy book, wave two can be a large fraction of total collected dollars.

Why this matters for channel measurement: your storm channels (canvassing the hail swath, mailing the impacted blocks) produce insurance-heavy jobs, so a disproportionate share of their true value shows up in wave two. If your ROI math stops at the signed contract, you'll consistently underrate the exact channels that bring you the highest-total-value jobs. To measure storm channels fairly, your "collected revenue per win" must include supplements and released depreciation, beyond the original contract.

This is also the legal-line section, so let's be exact about what a roofing contractor may and may not do, because getting this wrong is far more expensive than any marketing mistake.

What a roofer may do: inspect the roof, document damage thoroughly with photos and measurements, and write an accurate, Xactimate-aligned repair estimate for their own scope of work. State the facts about that scope to the carrier. Hand a complete, well-documented estimate to the homeowner.

What a roofer may NOT do (this is unlicensed public adjusting in most states): negotiate, adjust, or "handle" the claim for a fee; interpret the homeowner's policy or what's covered; promise a specific payout or that the claim will be approved; promise the deductible is waived, absorbed, or gone; advertise a "free roof"; or represent the homeowner against their insurer. The homeowner files the claim. The insurer decides coverage. You document and estimate. Keep that line bright.

Within that line, RoofClaim, RoofPredict's integrated claim revenue-cycle side, helps you capture wave two so it shows up in your channel ROI:

  • Claim intake linked to the home, so the claim's eventual collected dollars roll back up to the same lead and the same first-touch channel.
  • Document upload with auto-classification and OCR for contractor and carrier estimates, photos, denial letters, and invoices, so the paperwork that supports a supplement is organized instead of scattered.
  • Opportunity detection that maps your estimate line items against a roofing knowledge base and flags missing scope, code-required items, and likely-missed supplement opportunities, each with an evidence anchor and pricing, so your estimate to the homeowner is complete and defensible. (It flags documentation gaps in your own estimate. It does not negotiate with anyone or interpret coverage.)
  • Recoverable-depreciation autopilot, a completion-evidence and final-invoice checklist so the held-back depreciation gets documented and invoiced instead of forgotten, which is pure wave-two revenue that otherwise evaporates.
  • Deductible tracking, supplement aging with a follow-up cadence, and packet-completeness scoring, all on locked, UPPA-gated, contractor-documentation-only templates (supplement packets, depreciation-release letters, deductible invoices, missing-docs letters, audit reports).

The point for measurement: when wave-two dollars are tracked against the originating job, your channel ROI finally reflects total collected value. A canvassing campaign that looked like 4x at contract signing might be 6x once supplements and released depreciation are counted, and now you'll fund it correctly.

Reading the numbers: what each ROI signal is actually telling you

You've got clean per-channel numbers. Now interpret them without fooling yourself.

Diagnose where a channel breaks, don't just rank it

A bad ROI number has a cause. Walk the funnel to find it.

  • High CPL, good close rate: the channel is expensive but produces real buyers. Maybe acceptable if the ticket and margin are high. Try to lower acquisition cost before killing it.
  • Low CPL, low qualified rate: you're buying cheap noise. Classic shared-lead-marketplace signature. The leads are cheap because they're worthless.
  • Good qualified rate, low close rate: the channel is fine; your sales process or speed-to-lead is the problem. Don't blame marketing for a sales miss.
  • Good close rate, low collected-per-win: you're winning by discounting, or these jobs are small. Margin, not volume, is leaking.
  • Everything good but long payback: a scaling/cash-flow constraint, not a quality problem. Scale it as fast as your cash float allows, not faster.

Ranking channels by a single ROI number hides all of this. The funnel breakdown tells you whether to fix the channel, fix the sales team, or cut the spend.

Respect your sample size

With 15 to 30 closes a month spread across six channels, some channels will have two or three wins in a given month. Do not make budget decisions on three data points. Roll channel ROI on a trailing 90-day (or even trailing-twelve-month) basis for low-volume channels, and only react to monthly numbers on your highest-volume channels. A channel that posted 0 wins this month off 5 leads is not dead; it's small. Patience is a measurement skill.

Match the measurement window to the cycle

Measure storm/insurance channels on a shorter window (they close fast) and retail/replacement channels on a longer one (they close slow). If you judge every channel on the same 30-day window, you'll cut every slow-closing retail channel right before its leads mature. Cohort your leads by month and watch each cohort fill in over time, rather than asking "what did this month's spend produce this month," which is almost never the right question for retail.

A 30-day rollout plan you can actually execute

Don't try to build the whole system at once. Sequence it.

Week 1, lock the source. Make first-touch source write-once in your CRM. Define your channel list (keep it under ten: Paid Search, Local SEO/Maps, Paid Social, Direct Mail, Canvassing, Yard Signs, Truck/Brand, Referral-Customer, Referral-Partner, Other). Audit your last 90 days of leads and quantify how much is sitting in "other/unknown." That number is your starting credibility gap.

Week 2, instrument capture. Stand up a unique tracked number per channel. Add UTM-capturing hidden fields to every web form. Put a QR + tracked number on your next mail drop. Add a source-stamping intake form to canvassers' phones. The goal is that no new lead can be created without a captured source.

Week 3, connect spend. For each channel, get monthly spend into one place: ad-platform spend, mail cost (print + postage + list), canvasser labor, sign costs. Allocate honestly, canvasser wages are a marketing cost when you're computing channel CPA. Now you can compute CPL and cost-per-win per channel for the first time.

Week 4, close the loop to collected dollars. Connect won/lost outcomes and final collected revenue (including supplements and released depreciation) back to the originating channel. This is where two-way CRM sync earns its keep, because the close often happens in your production system, not where the lead was born. Produce your first real return-on-gross-profit-by-channel report.

Then, every month after: review the funnel by channel, diagnose breaks, respect sample size, and reallocate. Cut nothing on month one of bad numbers; cut deliberately on quarter one of bad numbers.

The traps that make roofing ROI numbers lie

Even a well-built system gets gamed by reality. Watch for these.

  • Blended CPL as a headline metric. A single company-wide cost per lead is the number vendors love because it hides their worst channel inside your best. Never accept a blended number. Per-channel or it's noise.
  • Counting leads, not qualified leads. Spam calls, wrong-area inquiries, and existing customers all inflate the lead count and crush your apparent CPL in a good way that's totally fake. Strip them before you divide.
  • Self-reported source as primary truth. Covered above, it's the big one. Capture mechanism first, human answer second.
  • Ignoring the sales variable. A channel's ROI partly reflects how fast and well you worked its leads. Speed-to-lead under five minutes versus two hours can double a channel's close rate. Don't condemn marketing for a sales-ops failure.
  • Forgetting wave two. Stopping the revenue count at contract signing systematically undervalues storm/insurance channels. Count supplements and released depreciation against the originating job.
  • Reacting to small samples. Three wins is a story, not a statistic. Trailing windows for low-volume channels.
  • One window for all channels. Fast-closing and slow-closing channels need different measurement windows. A single window guarantees you misjudge half your portfolio.
  • Letting the source field drift. If "other/unknown" is north of ~8 percent of leads, your capture is leaking and every downstream number is soft. Audit it weekly.
  • Confusing ROI with cash flow. A high-ROI, long-payback channel can still sink you if you scale it past your float. Track payback period alongside return.

Get these right and your dashboard stops being decoration and starts being a steering wheel.

Putting it to work

The roofing companies that win the budget game aren't the ones with the cleverest ads. They're the ones who can say, with a straight face and real numbers, "Direct mail to due-roof addresses returns 6x on collected gross profit with a 50-day payback, canvassing the hail swath returns 5x including supplements, and the shared-lead marketplace returns 1.4x and we're cutting it Friday." That sentence is the whole job. Everything above exists to let you say it truthfully.

It starts with one discipline, an immutable first-touch source captured by the system, and ends with one number per channel, return on collected gross profit, with payback period beside it. In between is the unglamorous work of putting a unique identifier on every channel, stripping the junk out of your lead counts, counting wave-two revenue, and refusing to react to three data points.

RoofPredict was built to remove the parts of that work that make owners quit: it stamps and locks first-touch source on every lead, instruments mail and microsites and field routes so every response is an attributed event, runs the delivered-to-won funnel per channel with cost-per-lead and cost-per-win and actual-versus-estimate-versus-benchmark, and through RoofClaim ties recovered supplement and depreciation dollars back to the originating job and channel, on compliant, contractor-documentation-only templates that keep you on the right side of the line. With two-way sync to the CRM you already run, the loop closes where your jobs actually live. The result is the one report most roofers never get to see, what every channel truly returns, so you can stop funding the losers and pour fuel on the winners. See how the funnel and source tracking work at https://roofpredict.com/.

FAQ

What's the difference between cost per lead and cost per acquisition in roofing?

Cost per lead (CPL) is your channel spend divided by the number of leads that channel produced, basically what it costs to make a phone ring or a form submit. Cost per acquisition (CPA, or cost-per-win) is your channel spend divided by the number of signed jobs that channel produced. CPL ignores lead quality, close rate, and ticket size entirely, so two channels with identical CPL can have wildly different CPA. Always make budget decisions on CPA, and ideally on return on collected gross profit, not on CPL.

Should I use first-touch or last-touch attribution for my roofing leads?

Use first-touch as your source of truth. First-touch credits the channel that originally created the lead, which is the demand you actually paid to manufacture. Last-touch credits whatever happened right before the call, which systematically starves brand and top-of-funnel channels (truck wraps, yard signs, local SEO) and over-credits closing channels. Track last-touch as a secondary field if you want, but stamp first-touch at lead creation and lock it so it can never be overwritten.

How do I track ROI on direct mail for a roofing campaign?

Instrument every piece. Put a unique tracked phone number on the mailer (different from every other channel), add a QR code per campaign or per household that lands on a personalized page, include a typed-URL option, and use per-piece delivery tracking so you know what hit mailboxes and when. Then build the funnel: pieces delivered, QR scans plus tracked calls, forms, appointments, signed jobs, and collected revenue. That gives you a real cost-per-win for mail instead of a guess. RoofPredict instruments mail proofs, per-home microsites, and per-home QR codes this way automatically.

Why does my lead source data in the CRM look unreliable?

Almost always because the source field is being overwritten after lead creation. A lead comes in correctly tagged, then days later someone re-opens the record and the dropdown re-defaults or a rep re-selects a generic value like "phone" or "referral." The fix is structural: make first-touch source write-once and immutable, set it from the capture mechanism (tracked number, UTM, QR) rather than a human dropdown wherever possible, and audit your "other/unknown" bucket weekly. If that bucket is above roughly 8 percent of leads, your capture is leaking.

How long should I wait before judging a marketing channel's ROI?

Match the window to the sales cycle. Storm and insurance channels close fast, so a 30 to 45 day window is reasonable. Retail and replacement channels can take 60 to 270 days to close, so judging them on 30 days will make you cut your slow-but-profitable channels right before their leads mature. Cohort leads by month and watch each cohort fill in over time, and use trailing 90-day windows for low-volume channels so you're not reacting to two or three data points.

Should supplement and depreciation revenue count toward channel ROI?

Yes, when it's collected. On insurance and storm work, the signed contract is only the first wave of revenue. Supplements (scope and pricing the carrier's estimate missed) and released recoverable depreciation are a second wave that can be a large fraction of total collected dollars. Your storm channels produce insurance-heavy jobs, so if your ROI math stops at contract signing, you'll systematically undervalue them. Tie collected supplement and depreciation dollars back to the originating job and channel so your numbers reflect total collected value.

Can a roofing contractor advertise that they'll handle the insurance claim or waive the deductible?

No. Negotiating or handling a homeowner's claim for a fee, interpreting their policy or coverage, promising a specific payout or approval, promising the deductible is waived or absorbed, advertising a "free roof," or representing the homeowner against their insurer are generally unlicensed public adjusting and are prohibited in most states. What you may do is inspect, document damage thoroughly, and write an accurate Xactimate-aligned repair estimate for your own scope, then hand that complete estimate to the homeowner. The homeowner files the claim and the insurer decides coverage.

What's a good return on marketing spend for a roofing company?

Measure it as return on collected gross profit, not revenue, and expect it to vary widely by channel. Strong owned channels like referrals and well-targeted direct mail to due-roof addresses can return high multiples on gross profit, while shared lead marketplaces often return close to break-even after you account for low qualified rates, low close rates from competing with several other contractors, and the discounts you give to win price-shoppers. There's no single benchmark, the point is to compute it per channel and fund the winners while cutting anything near break-even.

How do I attribute leads from door-to-door canvassing?

Capture the knock at the moment it happens. Give canvassers a mobile intake form that logs address, outcome, interest level, and a stamped canvassing source the instant they talk to someone, and use a leave-behind with its own QR code so a homeowner who scans the flyer later still ties back to the canvass instead of being mis-credited to your website. Log the no-answers and not-interested doors too, because a route's true cost-per-win has to include all the doors that said no, rather than only the wins.

Why is one cost-per-lead number for my whole company misleading?

Because a blended company-wide CPL hides your worst channel inside your best. If your best channel runs $40 and your worst runs $90, a blended $55 looks fine while the $90 channel quietly loses money. Marketing vendors often prefer blended numbers for exactly this reason. Always break cost-per-lead and cost-per-win down per channel, strip out spam and wrong-area calls from the lead count first, and carry the analysis all the way to return on collected gross profit by channel.

The Roofline by RoofPredict

Stay Ahead of Roofing Market Changes

Join The Roofline by RoofPredict for weekly roofing intelligence: material price signals, storm demand, insurance and regulatory updates, sales tactics, and local contractor opportunities.

By signing up, you agree to receive The Roofline by RoofPredict. Unsubscribe anytime.

Sources

  1. National Roofing Contractors Associationnrca.net
  2. Insurance Institute for Business & Home Safety (IBHS)ibhs.org
  3. NOAA National Weather Serviceweather.gov
  4. NOAA Storm Prediction Centerspc.noaa.gov
  5. Federal Trade Commission: Advertising and Marketing Basicsftc.gov
  6. FTC Telemarketing Sales Ruleftc.gov
  7. Texas Department of Insurance: Public Insurance Adjusterstdi.texas.gov
  8. National Association of Insurance Commissioners (NAIC)naic.org
  9. International Code Council: International Residential Codeiccsafe.org
  10. U.S. Bureau of Labor Statistics: Roofersbls.gov
  11. U.S. Census Bureau: American Housing Surveycensus.gov
  12. OSHA: Fall Protection in Constructionosha.gov
  13. U.S. Small Business Administration: Marketing and Salessba.gov
  14. RoofPredictroofpredict.com

Related Articles