Skip to main content

Bought Leads vs. Direct Mail: The Margin Math Roofers Skip

Emily Crawford, Home Maintenance Editor··33 min readRoofing Lead Generation
On this page

Two roofers in the same metro can spend the exact same $10,000 on marketing in a month and walk away with wildly different bank balances. One bought shared leads from an aggregator and netted maybe a job and a half after everybody fought over the same homeowner. The other mailed a tight list of aging roofs in three ZIP codes and booked four inspections that turned into two signed jobs at full margin. Same spend. Different math. The difference was never the channel. It was that one of them actually ran the numbers and the other one guessed.

The question almost every owner asks is the wrong one: "What's a good cost per lead?" Cost per lead is a vanity number. It tells you almost nothing about whether you made money. A $35 lead that converts at 3% and gets discounted to win is more expensive than a $300 lead that converts at 30% and signs at full price. You cannot compare bought leads to direct mail by staring at the price tag on a lead. You have to push both all the way down to the only line that matters: dollars of gross profit left in your pocket per dollar spent to acquire the job, after you pay for the sales time it took to close it.

We're going to build that worksheet from the ground up. Real cost categories, real conversion math, the hidden costs on both sides that quietly eat your margin, and a side-by-side comparison you can drop your own numbers into. By the end you'll be able to tell, for your specific market and your specific close rate, which channel earns and which one is a slow leak.

Why "cost per lead" lies to you

A lead is not a job. A lead is a chance at a conversation. The entire industry quotes cost per lead because it's the easiest number to put on a pricing page, and because it makes cheap channels look brilliant and expensive channels look insane. It hides four things that decide whether you actually profit:

  1. How many leads it takes to get one signed job. This is your conversion rate, and it varies more between channels than the lead price does.
  2. How much sales labor each channel burns. A lead you have to call seven times before they answer costs you real payroll. A referral that calls you ready to sign costs you almost nothing.
  3. What you have to give up to win. Shared and aggregated leads are shopping you against three other roofers. That pressure shows up as discounts, freebies, and shaved margin.
  4. What the job is actually worth in profit, not revenue. A $14,000 job at 22% gross margin and a $14,000 job at 42% gross margin are not the same job, and the channel often determines which one you get.

Until you fold all four of those into the number, you are comparing the sticker price of a lottery ticket to the sticker price of a different lottery ticket. So let's define the one metric that survives all of it.

Get attribution right or every other number is fiction

Before you can trust a single figure in your worksheet, you have to know which job came from which channel. This sounds obvious and almost nobody does it cleanly. A homeowner gets your postcard on Tuesday, sees your truck in the neighborhood Thursday, googles you Friday, and fills out a bought-lead form Saturday because that's the link that was in front of them. Who gets credit? If you tag that as a bought lead, you just made your mail look worse than it is and your lead vendor look better than it is — and you'll shift budget the wrong direction next quarter.

Three habits fix most attribution problems:

  1. A unique phone number or QR code per channel. Put a tracking number on the mail piece that's different from the number on your bought-lead landing page and different from the one on your yard signs. Now an inbound call self-identifies. This is cheap and it's the single highest-leverage tracking move you can make.

  2. Ask every caller "how did you hear about us" and log it the same way every time. Free-text answers are useless at the end of the month. Give your setter a fixed pick-list: mail, bought lead, referral, door-knock, repeat, yard sign, web. One field, always filled.

  3. Tag the job in your CRM the day it's booked, not at month-end. Memory decays fast and a salesperson reconstructing attribution from memory will guess in favor of whatever channel they personally like. Capture it at the source.

When a job genuinely has two touches — mail warmed them, a bought-lead form closed them — pick a rule and apply it consistently. A defensible default is first-touch credit for what made them aware (the mail) because that's the spend that created the opportunity. Whatever you choose, the point is consistency: an imperfect rule applied the same way every month still lets you compare channels honestly, while perfect logic applied inconsistently does not.

The only metric that matters: fully loaded cost per acquired job

Forget cost per lead. The number you actually run your business on is cost per acquired job (CPA) — the total cost to put one signed contract on the books — and then you compare that against the gross profit of the job you signed. The ratio of profit to CPA is your true return.

Here is the chain, channel-agnostic:

Media/list cost
+ Production cost (printing, design, lead platform fees)
+ Sales labor to work the responses
+ Discounts / concessions given to close
= Total acquisition cost for the channel

Total acquisition cost / Jobs signed = Cost per acquired job (CPA)

Gross profit per job - CPA = Net contribution per job
Net contribution / CPA = Return on acquisition spend

Notice what's in there that a lead-cost comparison leaves out: sales labor and concessions. Those two lines are where the real difference between bought leads and direct mail lives. Let's build each channel's full stack, then run them against each other.

Building the bought-leads cost stack

Bought leads come in roughly three flavors, and the flavor changes the math more than the price does.

  • Exclusive leads. Sold to one contractor. Highest price (commonly mid-hundreds of dollars each in competitive storm markets), but you're not in a bidding war the second you call.
  • Shared leads. Sold to three to five contractors simultaneously. Cheaper per lead, but you are racing the clock and the homeowner is fielding multiple calls. Speed-to-lead becomes everything and margin pressure is built in.
  • Aggregator/marketplace and "appointment" leads. You pay per lead or per booked appointment from a third-party platform that ran the ads. Quality swings hard month to month and you don't control the source.

The full bought-lead cost stack looks like this:

Cost component What it actually is
Lead price The headline per-lead or per-appointment fee
Bad-lead waste Wrong numbers, renters, tire-kickers, out-of-area, duplicates you still paid for
Speed-to-lead labor Someone has to call within minutes, every time, or shared leads die
Quote/inspection labor Drive time, ladder time, estimate writing for every lead that lets you on the roof
Concession cost Discounts and freebies to win a shopped homeowner
Platform/CRM overhead Integration fees, monthly minimums, the staff time to manage the feed

The two that surprise people are bad-lead waste and concession cost. Let's price them.

Bad-lead waste is a real line item

No lead vendor delivers 100% workable leads. Disconnected numbers, people who filled out a form to win a gift card, renters who can't authorize work, addresses two counties away, and the same homeowner sold to you twice. Even after credits — and good vendors do credit obvious junk — a chunk of what you paid for never had a chance.

If you buy 100 shared leads and 25 are unworkable after credits, your effective lead price just went up by a third, because the 75 real ones are carrying the cost of the 25 dead ones. Always compute your effective cost per workable lead, not the rate-card price:

Effective cost per workable lead = Total spent on leads / Number of actually-workable leads

Speed-to-lead labor is the silent killer

Shared leads decay in minutes. The data on this is brutal and consistent across industries: the odds of reaching and qualifying a web lead drop off a cliff if you don't respond fast, and they fall further with every passing hour. In practice that means a salesperson or setter chained to instant notifications, calling within five minutes, every time, nights and weekends included after a storm.

That is payroll. If you pay a setter $22/hour fully burdened and it takes them, on average, 45 minutes of calling, texting, and chasing across multiple attempts to get one shared lead to either book or bow out, that's about $16.50 of labor per lead before anyone climbs a ladder. On 100 leads that's $1,650 you won't see on the vendor invoice.

Concession cost: the bidding-war tax

This is the one roofers underprice the most. When a homeowner is talking to four roofers because the lead was sold four times, you are not selling — you are bidding. Bidding compresses margin. Maybe you knock $600 off to match a competitor. Maybe you throw in gutter guards or a ridge-vent upgrade. Maybe you eat part of the deductible's worth of value through "upgrades" to look competitive (more on the compliance line around that below). Every one of those is a real dollar off your gross profit, and it's caused by the channel.

If shopped leads cost you an average of $500 in concessions per signed job versus near-zero on a warm mail response, that $500 belongs in the bought-lead column. It's as real as the lead fee.

Worked example: shared bought leads

Let's run a clean month. You buy 100 shared storm leads at $90 each.

Line Value
Leads purchased 100
Lead price $90
Gross lead spend $9,000
Unworkable after credits 22 (junk, renters, out-of-area, dupes)
Workable leads 78
Effective cost per workable lead $115
Speed-to-lead + setter labor $16.50 x 100 calls worked = $1,650
Inspections booked 31
Inspection/estimate labor $35/hr x 2 hrs x 31 = $2,170
Jobs signed 9
Conversion (signed / workable) 11.5%
Concession cost $500 x 9 = $4,500
Total acquisition cost $9,000 + $1,650 + $2,170 + $4,500 = $17,320
Cost per acquired job (CPA) $17,320 / 9 = $1,924

Now the profit side. Say your average storm job is $13,500 revenue. On shopped, margin-compressed work your gross margin lands around 28% (you gave concessions, remember). Gross profit per job is about $3,780.

Net contribution per job = $3,780 gross profit - $1,924 CPA = $1,856
Nine jobs x $1,856 = $16,704 net contribution for the month
Return on acquisition spend = $16,704 / $17,320 = 0.96x

You roughly doubled your acquisition spend in gross profit dollars, then handed half of it back. The channel works, but it's thin, and it's thin specifically because of the two hidden lines — labor and concessions — that the $90 sticker price never showed you.

Change two assumptions and watch it swing. Buy exclusive leads instead — no bidding war — and your concession cost might drop to $150 a job and your margin recover to 38%. Your lead price triples to $270, but look at the whole stack before you judge.

How to vet a lead vendor before you wire money

The bought-lead column's biggest swing factor is vendor quality, and you can't see it from a sales call. Questions to ask before you commit a budget, and the answers that should make you walk:

  • "How many contractors does a shared lead go to?" If they dodge or say "it varies," assume the worst. Four-plus means heavy bidding pressure baked into your concession line.
  • "What's your credit policy and what's the typical credit rate?" A vendor confident in quality will name a clear policy for disconnected numbers, renters, duplicates, and out-of-area. No policy means you eat 100% of the junk.
  • "Where do these leads come from?" Their own ads? A network you can't see? Co-registration forms where the homeowner thought they were entering a sweepstakes? Co-reg leads convert terribly. You want leads from intent — someone searching "roof leak repair near me" — not from a gift-card form.
  • "Can I pause instantly?" After a storm you want to scale up; in a dry month you want to shut the spigot without a 30-day notice burning cash.
  • "What's the exclusivity and what's the de-dupe window?" Some vendors resell the same homeowner weeks later. Know the rules.

Run a small test buy before a big commitment — a few hundred dollars, tracked through your worksheet — and judge on cost per acquired job and concession load, never on the leads' headline price. A vendor whose leads are 30% cheaper but convert at half the rate and force double the discounting is the more expensive vendor.

Speed-to-lead is a system, not a vibe

If you're going to buy shared leads, the response system is non-negotiable, because the math collapses if you call late. Build it like a process:

  • Instant notification to a phone, not an email someone checks twice a day.
  • A defined cadence — call immediately, text if no answer, call again within the hour, then a structured follow-up sequence over the next several days. Most signed bought-lead jobs come from persistence, not the first dial.
  • Coverage for nights and weekends after a storm. Storm leads arrive when people are home and upset, which is exactly when an unstaffed phone bleeds money.
  • A measured contact rate. Track what percentage of workable leads you actually reach a live person on. If it's under half, your cadence or your staffing is the leak, and no vendor change will fix it.

Building the direct-mail cost stack

Direct mail flips the cost structure. You pay a lot up front for volume and you get a low response rate, but the responses are warmer (nobody else got the postcard with your phone number), there's no bidding war, and you keep your margin. The risk moves from "per-lead waste" to "did the whole drop land at all."

Cost component What it actually is
List cost Renting or buying the mailing list — and this is where targeting lives
Creative/design Postcard or letter design (often a one-time or amortized cost)
Printing Per-piece print cost, falls fast with volume
Postage The biggest variable; depends on class and format
Response handling labor Answering inbound calls, booking inspections
Inspection/estimate labor Same as bought leads — drive, climb, write

Notice what's missing versus bought leads: no per-lead waste compounding, and crucially, little to no concession cost, because a mail respondent reached out to you specifically and isn't actively quoting three competitors at the same instant. That single difference often decides the whole comparison.

The numbers that drive mail economics

Direct mail lives and dies on three levers:

  1. Cost per piece (CPP). All-in: list + print + postage + amortized design. For a standard roofing postcard mailed in decent volume, all-in CPP commonly lands somewhere in the low-to-mid cents-to-dollar range depending on size, postage class, and quantity. Get a real quote; don't guess.
  2. Response rate. The share of recipients who call or fill out the QR/landing page. Cold saturation mail to a broad area runs well under 1%. A tight, well-targeted list to the right homes runs meaningfully higher. The U.S. Postal Service and the trade association data both put direct mail response rates above most digital channels, but "above digital" still means a low single-digit percentage at best on cold lists — plan for it.
  3. Response-to-job conversion. Of the people who call, how many sign? Mail respondents convert better than shared leads because they self-selected and you're not in a four-way bid.

Worked example: targeted direct mail

Let's spend roughly the same money so the comparison is fair. You mail 15,000 pieces at an all-in $0.60 CPP.

Line Value
Pieces mailed 15,000
All-in cost per piece $0.60
Total mail spend $9,000
Response rate 0.8%
Responses (calls/forms) 120
Response handling labor $22/hr x ~0.5 hr each = $11 x 120 = $1,320
Inspections booked 60
Inspection/estimate labor $35/hr x 2 hrs x 60 = $4,200
Jobs signed 15
Conversion (signed / response) 12.5%
Concession cost $100 x 15 = $1,500
Total acquisition cost $9,000 + $1,320 + $4,200 + $1,500 = $16,020
Cost per acquired job (CPA) $16,020 / 15 = $1,068

Profit side. Same $13,500 average job, but because you weren't in a bidding war your gross margin holds at 40%. Gross profit per job is $5,400.

Net contribution per job = $5,400 - $1,068 CPA = $4,332
Fifteen jobs x $4,332 = $64,980 net contribution
Return on acquisition spend = $64,980 / $16,020 = 4.06x

Stop and look at what moved. Same $9,000 of media spend. The bought-lead month netted about $16,700. The mail month netted about $65,000. The mail didn't win because postcards are magic — it won on two lines: conversion held up (warm, non-shopped responses) and margin held up (no bidding war). Those two numbers did almost all the work.

But — and this is the honest part — that mail example assumed a 0.8% response and a tightly relevant list. Mail the wrong 15,000 homes and your response halves, your booked inspections halve, your jobs drop to seven, and your CPA doubles to over $2,200. Mail is a leverage bet on list quality. Get the list wrong and it's the worst channel in the building. Get it right and nothing touches it on margin.

The mail mechanics that quietly decide your CPP

The all-in cost per piece in the example hides choices that move your economics by 30% or more. Know the levers:

  • Format and size. A standard postcard mails cheaper than an oversized one, which mails cheaper than a letter in an envelope. Bigger pieces get more attention but cost more per impression — test, don't assume the expensive piece wins.
  • Postage class. Marketing mail (the bulk rate) is far cheaper than First-Class but slower and requires minimum volumes and presort work. First-Class lands faster and forwards/returns undeliverables so you can clean your list, but you pay for it. After a storm, the speed of First-Class can be worth the premium; for an evergreen aging-roof campaign, bulk usually wins on cost.
  • Volume breaks. Print and postage prices step down at quantity thresholds. Mailing 5,000 and mailing 25,000 are very different per-piece economics. This tempts roofers into mailing bigger, broader lists to chase the price break — which is exactly the trap, because a cheaper piece sent to the wrong roof is still wasted.
  • Address hygiene. Running your list against the Postal Service's address-correction standards before you drop cuts undeliverables, which are pure waste. Every piece that bounces is postage you lit on fire.

Why list quality beats everything else in mail

Repeat after me: in direct mail, the list is the campaign. The creative matters at the margins; the offer matters; but the list decides whether you're talking to people whose roofs are due or wasting postage on homes that re-roofed two years ago. A mediocre postcard to a great list beats a beautiful postcard to a bad list every time.

The default lists most roofers buy are demographic or geographic — "homeowners in these ZIPs, home value above X, owned five-plus years." That's a blunt instrument. Home age is a weak proxy for roof age because roofs get replaced on their own clock: a 40-year-old house might have a three-year-old roof, and a 12-year-old house might be on its original, now-failing builder-grade shingles. "Owned five years" tells you nothing about when the roof was last touched. You're paying postage to spray a neighborhood and hoping enough of the roofs happen to be due.

The upgrade is to filter that list by signals that actually correlate with a roof being near end-of-life: estimated roof age and storm exposure for the specific address. That's a different kind of list, and it's where the conversion leverage from earlier in the worksheet comes from.

Testing mail without betting the quarter

Don't drop 30,000 pieces on a hunch. Test in tranches:

  1. Start with 3,000-5,000 to a single well-defined list and measure response, cost per response, and cost per acquired job through the full worksheet.
  2. Split-test one variable at a time — same list, two offers, or two formats — so you learn what actually moved the needle.
  3. Mail the same list a second time before you judge it. Response often climbs on the second and third touch as your name gets familiar. A one-and-done drop underrepresents what a sustained program would do.
  4. Scale only what proved out. Once a list-and-offer combination shows a CPA you can live with, that's when you buy the volume break — not before.

The side-by-side, on one screen

Metric Shared bought leads Targeted direct mail
Media spend $9,000 $9,000
Hidden waste 22 dead leads baked in Whole drop rides on list quality
Sales/setter labor $1,650 $1,320
Inspection labor $2,170 $4,200
Concession cost $4,500 $1,500
Total acquisition cost $17,320 $16,020
Jobs signed 9 15
Cost per acquired job $1,924 $1,068
Gross margin held ~28% ~40%
Net contribution ~$16,700 ~$65,000
Return on spend 0.96x 4.06x

Now the caveats that keep this honest, because the table makes mail look like a slam dunk and it isn't always:

  • Bought leads are faster. You can buy 100 leads tomorrow morning. A mail drop takes one to three weeks to design, print, deliver, and start ringing the phone. After a hail event, speed has real value, and bought leads buy speed.
  • Mail is lumpier. A bad list, a bad month, a drop that lands during a heat wave when nobody's thinking about their roof — and you're sitting on $9,000 with thin returns. Bought leads, for all their flaws, are a steadier trickle.
  • The examples are illustrative, not promises. Your conversion, your margins, and your market are different. The structure of the math is what transfers, not the specific outputs.

The real answer for most established contractors isn't either/or. It's bought leads for speed and storm-chasing immediacy, mail for margin and territory ownership, and you run the worksheet on both every quarter to see which one is actually earning right now.

Break-even and sensitivity: stress-test the decision

A single month's outputs can fool you. The smarter move is to find each channel's break-even and then see how sensitive your profit is to the inputs you're least sure about.

Find your break-even jobs per spend

Your channel breaks even when net contribution hits zero — when the gross profit from the jobs you signed exactly equals everything you spent to sign them. Rearranged:

Break-even jobs = Total channel spend / Gross profit per job

Using the mail example: $16,020 total spend divided by $5,400 gross profit per job means you need about 3 jobs just to break even, and you signed 15 — comfortable. Using the bought-lead example: $17,320 divided by $3,780 gross profit per job means you need about 4.6 jobs to break even, and you signed 9 — thinner cushion. The bought-lead channel has to work nearly twice as hard relative to its profit per job to clear the same hurdle, because its margin is compressed and its total cost is loaded with concessions.

Sensitivity: which input hurts most when it moves

Pick your two shakiest assumptions and flex them plus or minus a realistic amount. For most roofers those are conversion rate and gross margin, because they swing the hardest and you control them the least precisely.

Scenario Bought leads Targeted mail
Base case 0.96x 4.06x
Conversion drops 25% jobs 9 to ~7; return slips below break-even jobs 15 to ~11; still strongly profitable
Margin drops 5 points thin to near-zero drops but stays well above 1x
Conversion up 25% approaches 1.5x climbs past 5x

Read the pattern, not the exact decimals: the mail channel in these examples is resilient — it stays profitable even when its inputs sag — while the bought-lead channel is fragile, sitting close enough to break-even that a bad month or a slow phone tips it into a loss. That fragility is itself a finding. A channel that only works when everything goes right is a channel you should run small and watch closely, not the one you bet the year on.

The one-page decision rule

After all of this, the decision rule for most established contractors compresses to a few lines:

  • If you need volume now (post-storm, slow pipeline) and can staff a fast phone, buy leads — exclusive over shared whenever the margin math supports the higher price.
  • If you're protecting margin and own a territory over a season, mail — to the tightest list of genuinely-due roofs you can build.
  • Run both, attribute cleanly, and re-rank by net contribution per dollar every quarter.
  • Put your incremental energy into targeting, because it's the only lever that improves both channels at once.

The costs both columns hide from you

Four line items get left out of almost every roofer's napkin math. Leaving them out is exactly why the napkin math lies.

1. Sales labor is a cost of the channel, not overhead

Most owners file salesperson time under "overhead" and never assign it to a channel. That's a mistake. A channel that requires seven dials and three no-show inspections per signed job is more expensive than one that requires two calls and one inspection, and you'll never see it unless you track sales hours per signed job by channel. Time-track it for one month. The result usually reorders your channel rankings.

2. No-show and dead-end inspections

Not every booked inspection happens, and not every inspection that happens leads to a quote-worthy roof. Drive time and ladder time on a roof that turns out to be five years old and fine is pure cost with zero revenue attached. Bought leads tend to generate more of these because the homeowner had no specific reason to think their roof was due — they just filled out a form. Targeting changes this, which is the whole point of the next section.

3. The discount you didn't notice you gave

Concessions hide. "I threw in the upgraded underlayment" feels like service; it's a margin event. "I matched their other quote" feels like winning; it's a margin event. Track concessions as a real number per signed job, per channel. Shopped-lead channels will show a concession line three to five times bigger than warm-response channels, and that gap is frequently the entire ROI difference between the two.

4. Lifetime value and referrals

A full-margin, well-served mail customer who wasn't beaten down on price is more likely to refer a neighbor and more likely to call you for the gutter job next year. A homeowner you won by being the cheapest of four bidders bought you on price and will leave you on price. Lifetime value isn't easy to put in a monthly worksheet, but if you're choosing a channel strategy for the year, the channel that produces price-loyal customers compounds against you over time.

Where the real leverage is: don't mail (or call) the wrong roofs

Go back to both worked examples and find the single number that swung the result hardest. It wasn't lead price. It was conversion, and conversion is mostly a targeting problem. Both channels punish you for chasing roofs that aren't due. Bought leads make you pay for tire-kickers. Mail makes you pay postage to reach homes with a brand-new roof. The contractors who win either channel are the ones who get in front of roofs that are actually near end-of-life or storm-worn — because those homeowners convert, and they convert without a fight.

This is where knowing which roofs are due, house by house changes the entire equation. If you could mail only the homes whose roofs are aging out of their service life, or only the homes a recent hail core passed over, your response rate climbs, your dead-end inspections fall, and your CPA drops on both channels at once. You're spending the same money against a denser pool of real prospects.

This is the gap RoofPredict is built to close. It reads aerial imagery to estimate a roof-age range for individual addresses — a range, not a precise install date, because you can't read an invoice off a satellite — and it models storm exposure per roof, so you get the odds that a given home took meaningful hail or wind, not a county-wide "there was a storm somewhere" flag. You can use it to enrich your own CRM or mailing list, then rank addresses so your mail drop or your call list targets the roofs the storm wore out plus the roofs simply aging out. It is not a lead-buying service and it doesn't hand you a homeowner ready to sign — it tells you which doors are worth the postage and the windshield time.

Honest limits, because the margin math only works if the inputs are honest: a roof-age estimate is a range, and a storm model gives you probability, not proof. Some homes you target will have had a roof replaced last spring that the imagery hasn't caught up to. Some modeled hail paths will have spared a particular roof. You still have to inspect. What targeting buys you is a list where a far higher share of doors are genuinely due — which is exactly the lever that turned the mail example from a $1,068 CPA into a 4x return instead of a 2x. Better targeting helps the bought-lead column too: if you must buy leads, buy in the storm footprints and age clusters your data says are real, and skip the ones that aren't.

A documentation workflow that protects the margin you fought for

Winning the job at full margin is only half the battle on storm work. If the homeowner is going to file an insurance claim, sloppy documentation is where margin leaks back out — through re-inspections, supplements you should have caught up front, and disputes that drag out your cash. Tight documentation protects the profit the channel math just earned you. Here's a clean, compliant workflow.

What you, the roofer, may do: inspect the roof, photograph and document the damage thoroughly, and write an accurate, Xactimate-aligned estimate to repair the work within your scope. You hand that documentation and estimate to the homeowner. The homeowner files their own claim. The insurer decides coverage. That's the lane, and it's a perfectly good lane.

What you may not do — the do-not-say list — because it crosses into unlicensed public adjusting in most states:

  • Don't negotiate, adjust, or "handle" the claim for the homeowner for a fee.
  • Don't interpret the policy or tell the homeowner what is or isn't covered.
  • Don't promise a specific payout, a specific approval, or that the claim "will go through."
  • Don't promise the deductible is waived, absorbed, eaten, or "taken care of." The deductible is the homeowner's obligation; advertising it away is illegal in many states and is straight-up insurance fraud as a rebate scheme.
  • Don't advertise a "free roof."
  • Don't represent the homeowner against the insurer.

Stay on the document-and-estimate side and you capture all the value without the legal exposure. A field documentation checklist that holds up:

  1. Address and date stamp on every photo set. Wide context shot of the whole house first.
  2. All elevations and all slopes photographed, even undamaged ones — absence of damage on one slope is evidence too.
  3. Test squares (commonly a 10x10 marked area) photographed with hail-strike counts visible where applicable, so the documentation speaks for itself.
  4. Collateral damage: soft metals, vents, gutters, downspouts, screens, AC fins, painted surfaces. These corroborate a hail event and belong in the photo record.
  5. Close-ups of individual strikes or wind-lifted/creased shingles with a coin or chalk circle for scale.
  6. Date the photos to the storm. Tie your inspection to the actual event date and the modeled storm path for that address. This is exactly where per-roof storm data earns its keep — it lets you note that a verified hail core passed over the property on a specific date, which strengthens the factual record you hand the homeowner.
  7. Write the estimate to actual scope in line with prevailing pricing data. Document, don't editorialize. You're stating facts about your repair scope, not arguing coverage.

That record is the homeowner's to use however they choose. You documented thoroughly, you wrote an accurate estimate, and you stayed in your lane — and the margin you won at the sale doesn't bleed out in re-inspections later.

Put both channels in context: referrals and door-knocking

Bought leads and direct mail are paid acquisition. They're not your only options, and judging them in a vacuum overstates how good either one is. Run the same worksheet on your other channels so you're allocating against the real field.

Referrals are almost always your lowest cost per acquired job and your highest margin, because the prospect arrives pre-trusted and isn't shopping you against anyone. The catch is you can't buy volume on demand — referral flow is a function of how many happy customers you've banked, which loops back to the lifetime-value point: every full-margin job you win cleanly today seeds referral pipeline tomorrow. Track referrals in the worksheet too, even though the "spend" is mostly your service quality and a referral incentive. When you see how cheap they are, you'll fund the things that produce more of them.

Door-knocking in a verified storm path is the classic restoration play, and it competes directly with bought leads on the same homeowners. Its "media cost" is near zero, but its sales-labor cost is enormous — a rep can burn a full day for a handful of conversations. The math hinges entirely on door-to-conversation and conversation-to-inspection rates, which is, again, a targeting problem: knocking a street the storm data says took a real hail core is a completely different day than knocking a street that just looks promising. The same per-roof storm and age signals that sharpen a mail list also tell a canvassing crew which blocks are worth the shoe leather, so the rep spends the day on doors that are actually due instead of guessing house by house.

The honest ranking for most contractors, lowest cost-per-job to highest, tends to run: referrals, then targeted mail or warm exclusive leads, then door-knocking in a good footprint, then shared bought leads. But "tends to" is doing real work in that sentence — your actuals decide it, which is the entire reason to run the worksheet instead of trusting a ranking someone handed you.

Run your own numbers: the worksheet

Forget the example outputs. Here's the worksheet to build with your real data. Pull one quarter of actuals and fill it in for each channel.

Step 1 — Media and production cost

  • Total spent on leads or mail (list + print + postage + design + platform fees) = A

Step 2 — Workable volume

  • Bought leads: workable leads after junk/credits. Mail: responses (calls + form fills). = B
  • Effective cost per workable response = A / B

Step 3 — Sales labor

  • Fully-burdened hourly rate of setters/salespeople x total hours spent working this channel's responses (calling, booking, driving, inspecting, estimating) = C
  • Track this for real for one month. Do not estimate it.

Step 4 — Concessions

  • Total dollars of discounts, free upgrades, and price-matches given on jobs signed from this channel = D

Step 5 — Jobs signed

  • Signed contracts attributable to this channel = J

Step 6 — The verdict

Total acquisition cost = A + C + D
Cost per acquired job (CPA) = (A + C + D) / J
Average gross profit per job from this channel = Revenue x gross margin %
Net contribution per job = Gross profit per job - CPA
Return on spend = (Net contribution per job x J) / (A + C + D)

Step 7 — Compare and decide

  • Run it for every channel: bought exclusive, bought shared, mail, plus your referrals and door-knock for context.
  • Rank by net contribution per dollar spent, not by cost per lead and not even by CPA alone. A higher-CPA channel can still win if its margin and conversion are strong enough.
  • Re-run quarterly. Storm seasons, list fatigue, and vendor quality all drift.

A few benchmarks to sanity-check your inputs, with the loud caveat that your market is your market:

  • If your bought-lead conversion (signed/workable) is under 8%, your concessions are probably high and your speed-to-lead is probably slow. Fix those before you blame the vendor.
  • If your mail response is under 0.4% on a list you thought was good, your targeting is off — you're mailing roofs that aren't due. That's the leverage point.
  • If your concession line is more than ~10% of revenue on any channel, you're buying jobs on price, and that channel's true ROI is worse than your spreadsheet shows until you put that number in.
  • If sales labor per signed job is wildly higher on one channel, that channel is hiding cost in your payroll, not your marketing budget.

What pros get wrong

After enough of these worksheets, the same five mistakes show up:

They compare cost per lead instead of cost per job. Already covered, but it's the original sin and it never stops happening.

They don't assign sales labor to channels. Payroll gets dumped into one overhead bucket, so the channel that secretly eats the most selling time looks free. Time-tracking by channel for 30 days reorders most contractors' priorities.

They ignore concessions because discounts don't feel like spend. A $600 price match is identical to a $600 marketing invoice in its effect on your bank account. Track it as spend.

They mail or buy too broad. Saturation mail to "everyone in the ZIP" and buying every lead in a 40-mile radius both fail for the same reason: most of those roofs aren't due. Narrow to the homes where age and storm exposure say the roof is actually near end-of-life, and every downstream number improves.

They judge a channel on one month. Mail especially is lumpy. One drop is a coin flip; a quarter of drops is data. Don't kill a channel — or fall in love with one — on a single month's results.

The bottom line

Bought leads and direct mail are tools, and the winner depends entirely on numbers you control: how warm the lead is when it reaches you, how much sales time it burns, how much margin you give up to close it, and — above everything — whether the roof was actually due in the first place. Run the full worksheet, not the cost-per-lead shortcut. Assign sales labor and concessions to the channel that caused them. And spend the bulk of your energy on the lever with the most leverage: getting in front of the right roofs, so both channels convert better and bleed less. Do that, and the choice between mail and bought leads stops being a guess and becomes a number you can defend.

FAQ

What's a good cost per lead for roofing?

There isn't one, and chasing a target cost per lead is how roofers lose money. A cheap shared lead that converts at 3% and forces you to discount is more expensive than a pricey exclusive lead that converts at 30% at full margin. Compare cost per acquired job after sales labor and concessions, then compare that against the gross profit of the job you actually signed. Cost per lead is a sticker price; cost per acquired job is the real number.

How do I calculate cost per acquired job?

Add your media/list cost, your production or platform fees, the fully-burdened sales labor spent working that channel's responses, and the dollars of discounts or free upgrades you gave to close those jobs. Divide that total by the number of contracts you signed from the channel. That figure is your cost per acquired job. Then subtract it from the average gross profit of those jobs to see what each job actually contributed.

Why does direct mail often beat bought leads on margin?

Two reasons that show up in the math. First, a mail respondent reached out to you specifically and usually isn't actively quoting three other roofers at the same moment, so you give up far fewer concessions and your gross margin holds. Second, warm self-selected responses tend to convert better than shared leads that were sold to several contractors. Lower concessions plus higher conversion is most of the ROI gap. Mail only wins, though, when the list is well targeted.

Are exclusive leads worth the higher price over shared leads?

Often yes, once you run the full stack. Exclusive leads cost much more per lead, but you're not in a four-way bidding war, so concessions shrink and margin recovers, and you waste less sales labor racing the clock. Build the worksheet both ways. The higher lead price can be more than offset by fewer discounts and a higher close rate. Don't decide on the per-lead price alone.

What response rate should I expect from roofing direct mail?

Plan conservatively. Cold saturation mail to a broad area typically runs well under 1%. A tight, well-targeted list aimed at homes whose roofs are genuinely aging out or that took storm damage can run meaningfully higher. Direct mail generally outperforms most digital channels on response rate per the Postal Service and trade data, but that still means low single digits at best on cold lists. If your response is under about 0.4% on a list you believed in, your targeting is the problem, not the medium.

How does targeting change the ROI of either channel?

Targeting is the single biggest lever in both channels because conversion swings the result more than lead price does. Reaching roofs that are actually near end-of-life or storm-worn raises your response and close rates and cuts dead-end inspections, which lowers your cost per acquired job for the same spend. Mailing or calling the wrong roofs is the most common reason a channel underperforms. Enriching your list with roof-age and per-roof storm signals concentrates your spend on doors that are genuinely due.

Can RoofPredict tell me the exact age of a roof?

No, and any tool claiming an exact install date from imagery is overselling. RoofPredict estimates a roof-age range for an address from aerial imagery and models storm exposure as a probability per roof, not a certainty. You use that to rank which homes are most likely due so your mail or call list is denser with real prospects. It does not replace an inspection, and some homes will have a newer roof the imagery hasn't caught. It improves your targeting odds; it doesn't hand you a signed job.

Should I run bought leads and direct mail at the same time?

Most established contractors should run both and let the quarterly worksheet decide the mix. Bought leads buy speed, which matters right after a storm when you want volume immediately. Mail protects margin and builds territory ownership over time but takes weeks to land and is lumpier month to month. Track cost per acquired job and net contribution for each channel separately, rank by net contribution per dollar spent, and shift budget toward whatever is actually earning that quarter.

How do I document storm damage without crossing into illegal claims handling?

Stay strictly on the document-and-estimate side. You may inspect, photograph all slopes and collateral damage, mark test squares, tie the inspection to the actual storm date, and write an accurate Xactimate-aligned estimate for your repair scope, then hand it to the homeowner. You may not negotiate or handle the claim for a fee, interpret what the policy covers, promise a payout or approval, promise the deductible is waived or absorbed, advertise a free roof, or represent the homeowner against the insurer. The homeowner files and the insurer decides coverage.

How often should I recalculate channel ROI?

At least quarterly, and after every major storm event. Vendor lead quality drifts, mailing lists fatigue, storm seasons change demand, and your own close rate moves as your sales team changes. A channel that earned last quarter can turn unprofitable this quarter without the headline numbers changing much, because the hidden lines, concessions and sales labor, move underneath. Re-run the full worksheet on real actuals, never on a single month, and rebalance your spend toward whatever is currently producing the most net contribution per dollar.

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 Storm Prediction Centerspc.noaa.gov
  4. NOAA National Centers for Environmental Information - Storm Events Databasencdc.noaa.gov
  5. National Weather Serviceweather.gov
  6. USPS - Direct Mail Marketing Resourcesusps.com
  7. Federal Trade Commission - Advertising and Marketing Basicsftc.gov
  8. Texas Department of Insurance - Public Adjusterstdi.texas.gov
  9. U.S. Bureau of Labor Statistics - Roofersbls.gov
  10. OSHA - Fall Protection in Constructionosha.gov
  11. U.S. Census Bureau - American Housing Surveycensus.gov
  12. International Code Council - International Residential Codeiccsafe.org
  13. Small Business Administration - Marketing and Salessba.gov
  14. RoofPredictroofpredict.com

Related Articles