How to Measure Roofing Direct Mail Campaign Results (Without Fooling Yourself)
On this page
Ask ten roofing contractors how their last mail drop did and you'll get ten different answers, and most of them are wrong. One guy swears mail "doesn't work" because he dropped 5,000 pieces and the phone didn't ring the next morning. Another swears it's the only thing that works, because he closed a $14,000 job off a postcard and stopped counting there. Both of them are flying blind, because neither one actually measured the campaign. They reacted to it.
Direct mail is one of the few channels left where a roofer can buy access to specific houses, not impressions or clicks or whatever a digital agency is selling that month. But that precision is wasted if you can't read the result. A campaign that returns $3 for every $1 spent looks identical to a campaign that loses money if all you're watching is whether the phone rang. The difference shows up only when you measure the whole funnel, all the way down to dollars collected, and tie it back to the specific list and piece that produced it.
What follows is the way a contractor who runs mail as a real line item, not a hopeful experiment, actually measures it. The metrics, the tracking plumbing, the math, the attribution traps, and the honest break-even numbers that tell you whether to scale a drop or kill it. The goal is simple: at the end of a campaign you should be able to say, to the dollar, what it earned, and decide the next move from data instead of a gut feeling.
Why "did the phone ring" is the wrong question
The single biggest measurement mistake in roofing direct mail is judging a campaign on its first 72 hours. Mail is not a paid search ad. A homeowner who gets your postcard does not call the instant they read it. They set it on the kitchen counter, or pin it to the fridge, or toss it in the junk drawer, and then three weeks later a soft spot in the ceiling or a neighbor's new roof reminds them, and they dig it back out. Roofing is a considered, high-dollar, infrequent purchase. The response curve is long and lumpy.
If you measure on day three and conclude mail is dead, you'll kill campaigns that were about to pay. A meaningful chunk of mail-driven roofing calls arrive 21 to 60 days after the drop, and some arrive six months later when the roof finally fails. So the first rule of measurement is patience plus a tracking system that survives the wait. You cannot remember in October which mailer drove a call you got in August. The system has to remember for you.
The second mistake is the opposite of the first: counting one big job and declaring victory. Roofing tickets are large, so variance is huge. A single $20,000 full replacement can make a money-losing drop look profitable on paper, and a string of small repairs can make a winning list look weak. You need enough volume and enough discipline to look at the campaign as a cohort, not anecdotes. One job is a story. A drop of 5,000 with tracked responses is data.
The third mistake is measuring activity instead of outcomes. "We mailed 10,000 pieces" is an input, not a result. Pieces mailed tells you what you spent, nothing about what you earned. The whole point of measurement is to connect spend to revenue, and that connection only exists if you track the steps in between.
The funnel: every metric you should be capturing
Direct mail for roofing has a predictable funnel. Money goes in the top, jobs come out the bottom, and there are five or six gates in between where the campaign either holds up or leaks. Measure every gate, because that's how you find the leak. A campaign with a great response rate and a terrible close rate has a sales problem, not a mail problem, and the only way you'll ever know is by separating the two.
Here is the full funnel with the metric attached to each stage.
| Stage | What it measures | How to calculate it |
|---|---|---|
| Pieces mailed | Reach / spend | Count of addresses in the drop |
| Pieces delivered | Deliverability | Mailed minus returns / undeliverable |
| Responses (calls, forms, scans) | Raw demand created | Tracked inbound tied to the campaign |
| Response rate | Demand efficiency | Responses ÷ pieces delivered |
| Leads (qualified) | Real opportunities | Responses that are a homeowner with a real roof need |
| Appointments set | Sales engagement | Leads that booked an inspection |
| Inspections run | Field activity | Appointments your crew actually got to |
| Jobs sold (contracts) | Conversion | Inspections that signed |
| Close rate | Sales efficiency | Jobs sold ÷ inspections run |
| Revenue (contracted) | Top-line return | Sum of signed contract values |
| Cost per lead (CPL) | Lead efficiency | Total campaign cost ÷ qualified leads |
| Cost per acquisition (CPA) | Job-getting cost | Total campaign cost ÷ jobs sold |
| ROI / ROAS | The verdict | (Profit or revenue) relative to spend |
Don't let the length of that table scare you. You can run all of it on a spreadsheet with one row per campaign. What matters is that you capture each number, because each one answers a different question. Response rate tells you if the list and the piece are right. Close rate tells you if the sales process is right. CPA and ROI tell you whether to do it again. Skip a stage and you lose the ability to diagnose, which means next time you'll guess.
Response rate: the number everyone quotes and most people miscalculate
Response rate is the headline metric, and it's the one most contractors compute wrong. The honest formula is:
Response rate = (number of responses ÷ number of pieces delivered) × 100
Two things trip people up. First, the denominator should be pieces delivered, not pieces ordered. If you bought 5,000 addresses but 300 came back undeliverable or were bad addresses on a stale list, only 4,700 pieces actually had a chance to work. Using 5,000 understates your true response rate and makes a good list look mediocre. Second, the numerator should be responses tied to that drop, which means you need tracking that distinguishes this campaign from your website, your yard signs, and last quarter's mailer.
Now, what's a good response rate? Be skeptical of anyone quoting a clean industry-wide number, because it depends entirely on the list and the offer. The Association of National Advertisers and the Data and Marketing Association have reported house-list and prospect-list response rates for direct mail that vary widely by targeting quality, and roofing is a niche on top of that. As a working frame for residential roofing prospect mail:
- Cold, broad ZIP-code saturation mail: often well under 0.5%. You're paying to reach a lot of people who got a new roof last year and don't need you.
- Targeted prospect lists (older homes, right neighborhoods): commonly in the 0.5% to 1.5% range when the list and timing are good.
- Your own past customers and old estimates (house list): can run several times higher, sometimes a few percent, because they already know you.
- Tight post-storm targeted drops: can spike higher for a short window when need is acute, then fade fast.
The lesson buried in those ranges: response rate is mostly a list metric, not a piece metric. A beautiful postcard mailed to the wrong houses loses to an ugly one mailed to the right houses every time. Which is why the single highest-leverage thing you can do to lift response rate is sharpen who's on the list before you spend a dime on printing. More on that below.
One more nuance: track gross responses and qualified responses separately. Gross response includes the wrong numbers, the renters who can't authorize work, the "take me off your list" calls, and the tire-kickers. Qualified responses are homeowners with a real roof need in your service area. A 1% gross response that's half junk behaves very differently from a 0.7% response that's all qualified. The qualified number is the one that feeds your cost-per-lead math, so capture both and watch the ratio between them, because that ratio is itself a list-quality signal.
How to actually track responses (the plumbing)
You cannot measure what you don't capture, and "I'll just ask people where they heard about us" is not capture, it's hope. Front-desk staff forget to ask, homeowners misremember, and the data you get is garbage. Build real tracking into the piece itself so attribution happens automatically. Here are the methods, roughly in order of reliability.
Call tracking numbers
The workhorse. You assign a unique phone number to a specific mail campaign, forward it to your real line, and every call to that number is provably from that drop. Use a different tracked number for each distinct campaign or list segment so you can compare them. Modern call-tracking services also record calls (check your state's call-recording consent laws first) and let you tag whether a call was a real lead or junk, which gives you the gross-versus-qualified split for free. The one discipline required: make the tracked number the only number on the piece. If you also print your main line, half your responses leak to the untracked number and your data collapses.
Unique URLs, QR codes, and landing pages
Put a campaign-specific QR code and a short, memorable URL (a "vanity" path like yourcompany.com/oakridge) on the piece, pointing to a landing page built for that drop. Now every scan and every form fill is tagged to the campaign in your analytics. QR scanning is mainstream now, so this captures the younger homeowner who'd rather scan than call. Use UTM parameters on the URL so the visit shows up cleanly in your web analytics, and make sure the landing-page form writes the campaign name into your CRM automatically. A QR code also gives you a second data point even from people who don't convert: scans without calls tell you the piece got attention but the offer or page didn't close them.
Promo codes and "mention this card"
Lower-tech and lower-reliability, but useful as a backstop. A code the homeowner reads off the card ("mention OAK24 for a free inspection") lets you catch responses that come through your main line anyway. It depends on the homeowner remembering and your staff recording it, so treat it as supplementary, not primary.
A real intake script and a CRM field
No matter how good the automated tracking is, train whoever answers the phone to confirm the source and log it in a required CRM field. "Great, and I see you're calling about the postcard you got, is that right?" The campaign source should be a mandatory field on every new lead record so nothing gets created without it. This is the safety net that catches what the tracked number and QR code miss.
A simple campaign code system
Give every drop a short code that encodes the list, the piece, and the date, for example STORM-A-0624 for storm list version A dropped in June 2024. Stamp that code on the call-tracking record, the landing page, and the CRM source field. Now you can slice results by list, by creative, and by month without untangling anything. This costs nothing and pays off the first time you want to compare two lists head to head.
The principle behind all of it: attribution has to be designed into the campaign before it mails, not reconstructed after. If you're trying to figure out where leads came from after the fact, you've already lost most of the signal.
From responses to dollars: cost per lead, cost per job, ROI
Response rate tells you the campaign created demand. It does not tell you whether the campaign made money. For that you have to push the numbers down to cost per lead, cost per acquisition, and return on investment. This is where most roofers stop measuring, and it's exactly where the decision lives.
First, nail down total campaign cost. Be honest and include everything, because a CPL that ignores half the cost is a lie you'll regret when you scale it.
- List or data cost (purchased addresses, or the cost of building/enriching your own list)
- Design and copywriting (one-time, but amortize it if it's a big spend)
- Printing
- Postage (usually the biggest single line)
- Mail-house handling, sorting, and any address-verification (CASS/NCOA) processing
- Call tracking and landing-page costs allocated to the drop
Now the core formulas:
Cost per lead (CPL) = total campaign cost ÷ qualified leads
Cost per acquisition (CPA) = total campaign cost ÷ jobs sold
ROAS (return on ad spend) = contracted revenue ÷ total campaign cost
ROI = (gross profit from jobs − campaign cost) ÷ campaign cost × 100
The distinction between ROAS and ROI matters and a lot of contractors blur it. ROAS uses revenue and tells you the top-line multiple, useful for a quick read. ROI uses profit and tells you whether you actually came out ahead after the cost of doing the work. A roofing job at $12,000 in revenue might carry $3,600 in gross profit at a 30% margin. If you measure ROAS, that job looks like a monster against a $3,000 mail spend. If you measure ROI on profit, it's a much more sober picture. Always know which one you're quoting, and for go/no-go decisions, use profit.
A worked example
Let's run a realistic drop end to end so the math is concrete.
| Line | Value |
|---|---|
| Pieces mailed | 5,000 |
| Undeliverable / returned | 250 |
| Pieces delivered | 4,750 |
| Total campaign cost (list + print + postage + tracking) | $3,800 |
| Gross responses | 52 |
| Qualified leads | 33 |
| Appointments set | 24 |
| Inspections run | 21 |
| Jobs sold | 7 |
| Average contract value | $11,500 |
| Gross margin assumption | 32% |
Now the metrics fall out:
- Response rate (gross): 52 ÷ 4,750 = 1.09%
- Qualified response rate: 33 ÷ 4,750 = 0.69%
- Cost per lead: $3,800 ÷ 33 = $115 per qualified lead
- Close rate (jobs ÷ inspections): 7 ÷ 21 = 33%
- Cost per acquisition: $3,800 ÷ 7 = $543 per job
- Contracted revenue: 7 × $11,500 = $80,500
- ROAS: $80,500 ÷ $3,800 = 21.2× on revenue
- Gross profit: $80,500 × 32% = $25,760
- ROI on profit: ($25,760 − $3,800) ÷ $3,800 = 578%
That's a strong campaign, and now you know it cold. You also know exactly where it could break. If the close rate had been 15% instead of 33%, you'd have sold roughly 3 jobs, $34,500 in revenue, about $11,000 gross profit, and an ROI near 190% still positive, but the leak would clearly be in the sales process, not the mail. That diagnostic power is the entire reason to measure every stage instead of just the top and bottom.
Setting a break-even target before you mail
The best operators decide what "good" looks like before the drop, then measure against it. Working backward from break-even keeps you honest and stops you from rationalizing a loser after the fact.
Start from the contribution one job makes. If your average job is $11,500 at 32% gross margin, each job contributes about $3,680 in gross profit. To break even on a $3,800 drop, you need roughly one job ($3,680 is just under, so call it one solid job clears it). That's your floor. Anything beyond the first job is profit.
Now turn that into a target response. To sell one job you need, given the example funnel, about one inspection out of every three to close, about one appointment-to-inspection survival, and roughly two-thirds of qualified leads to book. Chain those backward and one job implies on the order of 4 to 5 qualified leads, which at a 0.69% qualified response rate implies you need roughly 650 to 725 delivered pieces just to break even. So a 4,750-piece delivered drop has a comfortable margin of safety, you're mailing about seven times the break-even volume.
This backward math is worth doing every single time because it converts a vague hope ("I think mail works") into a concrete threshold ("this list needs to produce 5 qualified leads or it lost money"). When the campaign closes out, you compare to the threshold and the decision makes itself: beat it by a wide margin, scale the list; miss it, change the list or the offer; land near it, test a variable and rerun. No drama, no gut calls.
One caution on break-even: don't set it on revenue. "I need $3,800 in revenue to break even" is wrong because the work itself costs money. Set break-even on gross profit so the threshold reflects what you actually keep.
The attribution traps that quietly ruin your numbers
Attribution is where good measurement goes to die. Here are the traps, and they're sneaky because each one makes your numbers look cleaner than reality, so you won't notice until you scale a decision built on a lie.
The leaky-number trap. You print both the tracked number and your main line. Homeowners call whichever they see first or already have saved, and half your responses land on the untracked line. Your tracked response rate looks terrible, you blame the list, and you kill a campaign that was actually working. Fix: one number per piece, the tracked one, period.
The multi-touch trap. A homeowner gets your postcard, then sees your truck in the neighborhood, then googles you and clicks an ad, then calls. Which channel "gets credit"? If every channel claims the job, your total attributed revenue exceeds your actual revenue and every channel looks better than it is. Pick a rule and apply it consistently, first-touch (the mailer that started it) or last-touch (the ad they clicked before calling), and know that mail is chronically under-credited by last-touch models because it's so often the first nudge. If you only run last-touch, you'll systematically undervalue mail and over-cut it.
The halo trap, in your favor this time. A good drop lifts your whole brand in that neighborhood. Neighbors who didn't get a card still call because they saw your sign in their friend's yard, and the conversation "everyone's using these guys" started with your mail. Strict attribution won't credit the mailer for those, which means mail's true ROI is usually higher than the tracked number. You don't have to model this precisely, but know it exists so you don't under-invest in a channel that's pulling more weight than the spreadsheet shows.
The recency trap. You measure 30 days out, book the result, and move on. But roofing's response curve has a long tail; jobs keep trickling in for months. Keep the campaign "open" in your tracking for at least 90 days, ideally six months, and update the row as late responses arrive. A campaign that looked break-even at day 30 can be clearly profitable at day 120.
The wrong-denominator trap. Covered above but worth repeating because it's so common: dividing by pieces mailed instead of pieces delivered understates response rate, and using revenue instead of profit overstates ROI. Get the denominators right.
The survivorship trap. You remember the campaigns that produced a big job and forget the ones that didn't. Without a written log of every drop, your memory keeps a flattering, false average. Log every campaign, winners and losers, in the same spreadsheet, so your baseline is real.
Comparing campaigns and running honest tests
Measurement is most valuable when it lets you compare and improve. The discipline is testing one variable at a time so you can actually attribute the difference. Change the list and the postcard and the offer all at once and you'll never know which one moved the needle.
The big levers, in rough order of impact on a roofing mailer:
- The list. Who you mail to swamps everything else. Old roofs in the right neighborhoods versus a broad ZIP saturation is the difference between a 1%+ response and a sub-0.3% response. Test list quality first.
- Timing. Season, and proximity to a relevant event like a storm, materially shifts response. A drop into roof-replacement season outperforms the same piece in deep winter.
- The offer. A specific, low-friction first step (a no-cost roof inspection and a written assessment) beats a vague "call us for roofing."
- The format. Oversized postcard versus letter versus a handwritten-style envelope changes open and read rates, and cost.
- The creative. Headline, photo, proof. Real, but it moves the needle less than the list. Don't obsess over the postcard while ignoring who gets it.
When you A/B test, split the list randomly so each variant mails to a comparable mix of houses, keep everything else identical, and make sure each version has enough volume to produce a readable result. With roofing's low response rates, a 500-piece test split into two 250-piece halves is too small, you might get 1 or 2 responses per side and learn nothing. You need enough delivered pieces per variant that a handful of responses isn't just noise. As a rough rule, if a variant produces fewer than ~8 to 10 qualified responses, treat the result as directional, not conclusive, and rerun at higher volume before betting on it.
Keep a running comparison table so the history compounds:
| Campaign code | List type | Delivered | Qual. resp. | Qual. resp. rate | Jobs | CPA | ROI |
|---|---|---|---|---|---|---|---|
| OAK-A-0324 | Targeted old roofs | 4,600 | 31 | 0.67% | 6 | $617 | 510% |
| ZIP-B-0424 | ZIP saturation | 8,000 | 22 | 0.28% | 4 | $1,425 | 160% |
| CRM-C-0524 | Past customers/old bids | 1,200 | 41 | 3.4% | 9 | $178 | 980% |
Look at that fictional-but-realistic table and the strategy writes itself: the past-customer house list crushes everything on efficiency, the targeted old-roof list is a solid profitable workhorse, and the broad ZIP saturation barely earns its keep. A contractor watching only "did we sell jobs" would see all three as successes. A contractor measuring CPA and response rate sees that one of them is quietly the best money in the business and another is a candidate to cut. That's the payoff of measurement: it turns three blurry impressions into a clear ranking and a clear next move.
Where the list comes from, and why it decides everything
Every metric in here points back to one root cause: the list. Response rate, CPL, CPA, ROI, they all swing more on who you mailed than on anything you can do to the postcard. So the highest-leverage way to improve your measured results is to improve the list before the next drop. Garbage in, garbage measured.
The usual roofing list sources each have a known weakness. ZIP-code saturation is cheap per piece but burns most of your budget on houses that don't need a roof, including the ones that got replaced last year, which you have no way to see from a ZIP list. Generic "homeowner" lists filtered only on year-built are blind to re-roofs, a house built in 1998 may have a five-year-old roof, and that home is dead weight on your list dragging down every metric. Buying year-built and treating it as roof age is one of the most expensive measurement errors in the trade, because it inflates your pieces while suppressing your response rate.
This is the gap where knowing the actual condition of the roof, house by house, changes the whole equation. Tools like RoofPredict read aerial imagery to estimate roof age as a range for individual addresses and layer in the storm history modeled per roof (more than "it hailed in this ZIP" — how wind and hail likely hit that specific roof), so the list you mail is weighted toward roofs that are genuinely aging out or storm-worn rather than every house on the block. It's honest about its limits: roof age comes as a range, not an exact install date, and storm exposure is expressed as odds, not proof a roof is damaged. But for direct mail, a range is exactly what you need, you're choosing which houses get a piece, not certifying a roof. Mailing the older, more storm-exposed half of a neighborhood and skipping the obvious new roofs can meaningfully lift your delivered response rate, drop your cost per lead, and, just as usefully, make your measurement cleaner because the list is built on a real signal instead of a proxy like year-built.
It also feeds the channel that almost always tests best in that comparison table above: your own book. RoofPredict can enrich a contractor's existing CRM and old-estimate list with roof-age and storm signals, so the past customers and lost bids whose roofs are now actually due float to the top of the mailing. Those house-list drops routinely post the lowest CPA and highest ROI you'll measure, because the homeowner already knows you. Measuring well is what reveals that the cheapest growth was sitting in your CRM the whole time; enriching the list with condition data is what lets you act on it.
None of this replaces measurement, it sharpens the input so the numbers you measure are worth measuring. A tighter list doesn't just earn more; it produces a cleaner read on what's working, which compounds every future decision.
A note on storm and claims content in your mail
If you mail into storm-affected areas, your measurement framework is the same, but your copy has legal guardrails worth knowing, because a piece that crosses the line can cost you far more than a low response rate.
A roofing contractor may inspect a roof, document damage with photos, and prepare an accurate, Xactimate-aligned estimate to repair their own scope of work, then hand that documentation to the homeowner. The homeowner files their own claim and the insurer decides coverage. That's the safe frame, and it's a genuinely strong offer: "we'll inspect your roof, document any storm damage thoroughly, and give you a written assessment you can use."
What your mailer must not say, because it can constitute unlicensed public adjusting or a deceptive offer in most states: don't promise to "handle" or "negotiate" the claim, don't promise a specific payout or approval, don't promise the deductible is waived, absorbed, or "gone" (waiving deductibles can be illegal), don't advertise a "free roof," and don't represent the homeowner against their insurer. Keep the mail on the documentation-and-estimate side, capture the real homeowner intent, and let the homeowner file and the insurer decide. Check your state's department of insurance rules, because the specifics vary. Measuring a storm campaign is identical to measuring any other, response, CPL, CPA, ROI, but a compliant offer is what keeps those measured jobs from turning into complaints.
Building the measurement system you'll actually use
All of this collapses into a workflow you can run on a spreadsheet and a CRM. Here's the sequence, start to finish, for one campaign.
- Before the drop, define the campaign. Assign a code (
LIST-VARIANT-DATE). Write down the list source, piece, offer, drop size, and total budgeted cost. Compute your break-even in jobs and your target qualified-lead count. This is your scorecard, set it now so you can't move the goalposts later. - Wire up attribution. Provision a unique tracked phone number, build a campaign landing page with a QR code and UTM-tagged vanity URL, and add the campaign code as a required source field in the CRM. One number on the piece. Test the QR code and the form before printing.
- Process the list. Run addresses through address-verification (CASS) and update-against-movers (NCOA) so you're not paying postage on dead addresses, this also gives you a clean delivered count. Record pieces ordered versus deliverable.
- Drop and date-stamp. Record the in-home date (when pieces actually land), not the day you sent them to the mail house. Your response curve is measured from the in-home date.
- Capture every response, tagged. Tracked calls, form fills, QR scans, and phoned-in promo codes all flow to the campaign record. Tag each response gross versus qualified as it comes in.
- Track the funnel forward. As leads become appointments, inspections, and signed jobs, keep updating the campaign row. Record contract value and your margin assumption per job.
- Hold the campaign open 90+ days. Keep logging late responses and jobs. Roofing's tail is long; don't book the final number too early.
- Close out and compute. Fill in response rate (on delivered), qualified response rate, CPL, close rate, CPA, ROAS, and ROI on profit. Compare to the break-even target you set in step 1.
- Decide. Beat target by a wide margin, scale the same list. Near target, change one variable and rerun. Below break-even, change the list first, the offer second, the creative last.
- Log it forever. Add the closed campaign to your master comparison table so your baseline gets more accurate with every drop. The table is the asset; individual campaigns come and go.
Run that loop a few times and something shifts: you stop arguing about whether mail "works" and start running a portfolio of lists you can rank by CPA. The bad lists get cut, the good ones get scaled, and your old CRM book quietly turns out to be the cheapest jobs you've got. That's not a marketing opinion anymore, it's a number you can point to.
The early-warning metrics that tell you a campaign is failing before the money does
The final ROI number is a lagging indicator. By the time you can calculate it, the drop is months old and the budget is spent. The operators who get good at this watch a few leading indicators that move early and predict the final result, so they can react while there's still time to adjust the next drop instead of just performing an autopsy on this one.
Delivered rate, day one. The moment your CASS and NCOA processing comes back, you know your deliverable count. If a list is throwing 8% or 10% undeliverable, that list is stale and your true cost per delivered piece just jumped before a single response came in. A clean, recently-updated list should return a low single-digit undeliverable percentage. A high one is your first signal that the data source is bad, and it tells you to find a better list before the next round.
Scan-to-call ratio. If your QR code is getting scanned but the calls aren't following, the piece earned attention and then lost the person. That usually means the offer or the landing page failed, not the list. It's a fixable problem and a cheap lesson: same list, better offer, rerun. Without a QR code you'd never see this signal at all, which is one more reason to put one on every piece.
Gross-to-qualified ratio. Watch what share of your raw responses are actual homeowners with a real roof need in your area. If two-thirds of your responses are renters, wrong numbers, and "remove me" calls, the list is mis-targeted even if the gross response rate looks fine. This ratio is a list-quality readout that shows up within the first couple of weeks, long before you know your final CPA.
Speed-to-first-response. Note how many days pass between the in-home date and your first qualified call. A list that produces nothing for three weeks and then trickles is behaving differently from one that pops in the first ten days, and the pattern tells you something about urgency. Post-storm and house-list drops tend to respond fast; cold prospecting tends to respond slow and long. Knowing the shape lets you set the right expectation instead of panicking on day five.
Appointment-to-inspection survival. Track how many booked appointments your crew actually keeps. If leads are booking but inspections aren't happening, you have an operations leak, no-shows, scheduling chaos, or reps not following up, and it's draining a campaign that the mail did its job on. This is a sales-and-ops metric, not a mail metric, but it sits inside the same funnel and a measured contractor catches it here instead of blaming the postcard.
None of these require fancy software. They're columns in the same spreadsheet, updated as the campaign runs. The discipline is looking at them weekly during the active window instead of waiting three months to find out the whole thing was off.
Seasonality and timing: reading results in context
A response rate means nothing without the calendar next to it. The same list mailed to the same houses with the same piece will produce wildly different numbers depending on when it lands, and if you don't record the season you'll misread your own history. A 0.5% response in deep winter might be a better result than a 0.9% in peak season, because you fought a harder headwind to get it. Always log the in-home month so your comparison table compares like to like.
Roofing demand tracks weather, equity decisions, and the school-and-holiday calendar that governs when families take on big home projects. Broadly, late spring through early fall is when replacement work peaks in most of the country, and storm season layers volatile spikes on top of that regional baseline. Mailing into a rising-demand window costs you the same per piece but converts more of it, which inflates your measured response rate for reasons that have nothing to do with how good your list or piece is. The fix is to keep timing as a tracked variable, not a hidden one. When you test a new list against an old one, mail them in the same window so timing isn't secretly doing the work you're crediting to the list.
There's a budgeting consequence here too. Because cost per acquisition swings with season, the same mail spend buys cheaper jobs in some months than others. A measured contractor weights spend toward the windows that historically produced the lowest CPA and pulls back when the calendar is working against them, rather than dropping a flat 5,000 pieces every month regardless. You can only do that if your master table has a timing column and enough history to see the pattern.
Tying mail results into your books, beyond a marketing spreadsheet
The last step most contractors skip is connecting campaign measurement to the actual financials. A marketing spreadsheet that says "578% ROI" is satisfying, but it only becomes a management tool when it reconciles with money that landed in the bank. Two adjustments make the numbers trustworthy enough to bet on.
First, measure on collected revenue and realized margin, not contracted revenue, once the jobs close out. A signed contract is a promise; a deposited check is a fact. Some contracts shrink in scope, some have change orders, some have collection problems. When you reconcile a campaign at the six-month mark, update the revenue line to what you actually collected and the margin to what the job actually earned after real material and labor cost, not your planning assumption. The ROI will move, sometimes down, and that honest number is the one you scale decisions on.
Second, account for lifetime value where it's real. A roof is a long-replacement-cycle product, so a single homeowner rarely buys twice soon. But a happy customer from a mailed job refers neighbors, leaves reviews that feed your other channels, and re-enters your CRM as a warm name for the next storm or the gutter and repair work in between. You don't need a precise lifetime-value model, but knowing that a mailed customer is worth somewhat more than the first job keeps you from under-investing in a channel that seeds future work. Be conservative here, don't inflate ROI with speculative future revenue, but don't pretend the relationship ends at the first check either.
When the campaign table reconciles to collected dollars and your CPA is computed on real margin, you've crossed from marketing reporting into operating data. That's the point where mail stops being a hopeful experiment and becomes a managed line item you scale or cut on evidence, the same way you'd manage any other part of the business.
The short version
Measuring roofing direct mail well comes down to a handful of disciplines that most contractors skip. Measure on pieces delivered, not ordered. Separate gross responses from qualified leads. Push the funnel all the way to jobs sold and dollars collected, well past "the phone rang." Compute ROI on profit, not revenue. Hold campaigns open for months because the response curve has a long tail. Track attribution with one tracked number per piece, a QR code, and a required CRM source field, designed in before the drop, not reconstructed after. Set a break-even target before you mail and judge against it without flinching. And remember that the list, not the postcard, decides almost everything, so the fastest way to improve your measured results is to mail the roofs that are actually due and skip the ones that aren't.
Do that, and the next time someone asks how your mail did, you won't tell a story. You'll quote a number, and you'll know exactly what to do next.
FAQ
What is a good response rate for a roofing direct mail campaign?
It depends almost entirely on the list. Broad ZIP-code saturation mail often comes in well under 0.5%, while a well-targeted prospect list of older homes in the right neighborhoods commonly runs 0.5% to 1.5%, and mail to your own past customers and old estimates (a house list) can run several times higher. Compute it on pieces delivered, not pieces ordered, and track qualified responses separately from gross responses, because a 1% response that's half junk is worse than a 0.7% response that's all real homeowners.
How do I track which mailer a phone call came from?
Use a unique call-tracking number assigned to each campaign and make it the only phone number on the piece, so every call to it is provably from that drop. Back it up with a campaign-specific QR code and vanity URL pointing to a landing page, a 'mention this card' promo code for calls that slip to your main line, and a required campaign-source field in your CRM that your intake person confirms on every call. Attribution has to be built into the piece before it mails, not guessed at afterward.
How long should I wait before judging a roofing mail campaign?
At least 90 days, and ideally six months. Roofing is a high-dollar, infrequent purchase, so the response curve has a long tail. A meaningful share of mail-driven calls arrive 21 to 60 days after the drop, and some come months later when the roof finally fails or a leak appears. Judging on the first 72 hours is the most common way contractors kill campaigns that were about to pay off. Keep the campaign 'open' in your tracking and update the numbers as late responses arrive.
How do I calculate ROI on a roofing mailer?
Use profit, not revenue. The formula is (gross profit from jobs sold minus total campaign cost) divided by total campaign cost, times 100. Total cost must include list, design, printing, postage, mail-house handling, and tracking. For example, if a $3,800 drop produces seven jobs averaging $11,500 at a 32% margin, that's $25,760 in gross profit, so ROI is ($25,760 minus $3,800) divided by $3,800, about 578%. Quoting ROI on revenue instead of profit overstates results because the work itself costs money.
What's the difference between cost per lead and cost per acquisition?
Cost per lead (CPL) is total campaign cost divided by qualified leads, and it tells you how efficiently the mail generated real opportunities. Cost per acquisition (CPA) is total campaign cost divided by jobs actually sold, and it tells you what it cost to win a customer. CPL measures the mail and the list; the gap between CPL and CPA reflects your sales process. If your CPL is low but your CPA is high, your leads are fine and your closing is the leak.
Should I count pieces mailed or pieces delivered when measuring response rate?
Pieces delivered. If you ordered 5,000 addresses but 250 came back undeliverable, only 4,750 had a real chance to generate a response. Dividing by 5,000 understates your true response rate and makes a good list look mediocre. Running your addresses through CASS verification and NCOA move-updating before mailing both cleans the list and gives you an accurate delivered count to use as the denominator.
Why does my past-customer list outperform my prospect mail?
Because the homeowner already knows and trusts you, so the response rate is several times higher and the cost per acquisition is much lower. Your own CRM, old estimates, and lost bids are often the cheapest jobs in your business, and good measurement is what reveals it. Enriching that list with roof-age and storm signals lets you mail the past customers whose roofs are now genuinely due, instead of mailing the whole book at once, which lifts response and keeps the numbers clean.
How does roof-age and storm data improve direct mail results?
List quality drives response rate more than anything you do to the postcard, and the common list weakness is using year-built as a stand-in for roof age, which is blind to re-roofs. Tools like RoofPredict estimate roof age as a range per address from aerial imagery and model storm exposure per roof, so you can weight the list toward roofs that are aging out or storm-worn and skip obvious new roofs. That lifts your delivered response rate, lowers cost per lead, and makes your measurement cleaner because the list is built on a real signal rather than a proxy. Roof age is a range, not an exact date, and storm exposure is odds, not proof of damage, but a range is exactly what you need to decide which houses get a piece.
What can a storm-restoration mailer legally say about insurance claims?
Keep the offer on the documentation-and-estimate side. A contractor may inspect a roof, document storm damage with photos, and prepare an accurate repair estimate for their own scope of work, then hand it to the homeowner, who files their own claim while the insurer decides coverage. Do not promise to handle or negotiate the claim, do not promise a specific payout or approval, do not say the deductible will be waived or absorbed, and do not advertise a 'free roof.' Those crossings can constitute unlicensed public adjusting or a deceptive offer. Check your state department of insurance rules, since specifics vary.
How big does a direct mail A/B test need to be to trust the result?
Big enough that a couple of responses isn't just noise. With roofing's low response rates, a 500-piece test split into two 250-piece halves might produce only one or two responses per side, which tells you nothing. As a rough rule, if a variant generates fewer than about 8 to 10 qualified responses, treat the result as directional and rerun at higher volume before betting real budget on it. Test one variable at a time (list, then timing, then offer, then format, then creative) so you can actually attribute the difference.
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.
Sources
- National Roofing Contractors Association — nrca.net
- USPS Every Door Direct Mail (EDDM) — usps.com
- USPS Business Mail Postage Prices — usps.com
- USPS NCOALink / Move Update — postalpro.usps.com
- USPS CASS Certified Address Matching — postalpro.usps.com
- Federal Trade Commission: Truth in Advertising — ftc.gov
- Association of National Advertisers (ANA / formerly DMA) — ana.net
- U.S. Small Business Administration: Marketing and Sales — sba.gov
- Insurance Information Institute: Filing a Homeowners Claim — iii.org
- National Association of Insurance Commissioners (state DOI directory) — naic.org
- Texas Department of Insurance: Roofers and Public Adjusters — tdi.texas.gov
- NOAA National Weather Service Storm Prediction Center — spc.noaa.gov
- U.S. Census Bureau: American Housing Survey — census.gov
- RoofPredict — roofpredict.com
Related Articles
How to Win Roofing Bids With Data, Not Discounts
Discounting trains your market to wait for a lower number. Here is the data-driven sales system roofers use to win bids without cutting price.
Red Flags a Roofing Lead Will Waste Your Time (and How to Qualify Out Fast)
A practitioner's field guide to the warning signs that a roofing lead is a dead end, plus a fast qualifying workflow that keeps your best hours on roofs that actually close.
How to Close Storm Damage Roofing Jobs Without Scare Tactics
Fear closes one roof and burns three referrals. Here is the documentation-first sales process that wins storm jobs while keeping you on the right side of the law.