How to Score ZIP Codes for Roofing Direct Mail (So You Stop Wasting Postage)
On this page
Every roofer who has ever run direct mail has the same quiet story. You picked a ZIP code that "felt good" — maybe it was near a job you liked, maybe the houses looked nice, maybe a competitor's yard sign showed up there. You dropped 10,000 postcards, spent four to six grand all-in, and got back a handful of calls and one or two jobs. The math technically worked, barely, so you did it again. And the second drop did worse.
The problem was never the postcard. It was the ZIP code. You mailed a polygon the Postal Service drew for sorting mail, not a list of roofs that are actually due to be replaced. Inside that ZIP were neighborhoods built in 1974 with original-ish roofs, neighborhoods built in 2019 with roofs nobody will touch for fifteen years, three subdivisions that already got hammered by a hailstorm two springs ago, and a strip of rentals where the owner lives two states away and will never call you. You paid the same 70-odd cents to reach every one of them.
Scoring ZIP codes — and the carrier routes inside them — is how you stop paying flat postage for wildly different odds. The goal is simple to say and harder to do well: spend your mail budget where the density of due roofs is highest, where the people who own those roofs can and will pay, and where you can actually service the work profitably. Below is the full workflow I'd hand a sales manager who has a list of ZIPs, a mail budget, and no idea which ones to hit first. It covers the data that actually moves response rate, a weighted scoring model you can build in a spreadsheet this afternoon, how to drop from ZIP down to the carrier-route and address level (where the real money is), how to read storm exposure honestly, and the mistakes that quietly torch budgets.
Why ZIP-level thinking is the first mistake
A ZIP code is a mail-routing construct. The five-digit ZIP exists to move letters efficiently, and ZIP boundaries follow delivery logistics, not housing stock, not roof age, not income, not anything you care about as a roofer. A single suburban ZIP routinely contains 8,000 to 25,000 households spread across decades of construction and several income tiers. Treating it as one unit is like quoting a roof by the county it sits in.
Three layers exist under the ZIP, and you want to understand all of them:
- The 5-digit ZIP (e.g., 75070). Your coarsest unit. Useful for budgeting and high-level prioritization, useless for precision.
- The carrier route (e.g., 75070-C012). The actual loop one mail carrier walks or drives. Typically 400 to 800 deliverable addresses. This is the unit the Postal Service prices around for saturation mail, and it is the unit where neighborhoods — and therefore roof cohorts — start to line up. A carrier route is often a single subdivision or a coherent slice of one.
- The address / parcel. One roof. The only unit that is actually true.
The single biggest lever in roofing direct mail is moving your decision from the ZIP down to the carrier route, and ideally to a filtered address list. Everything in the scoring model below can be computed at the ZIP level to triage your market, then recomputed at the carrier-route level to decide where the postcards actually go. Score ZIPs to pick your battles; score carrier routes to win them.
Saturation vs. targeted mail (and why it changes your whole model)
There are two ways to buy roofing mail, and they reward different scoring strategies.
Saturation mail (USPS calls the consumer version EDDM — Every Door Direct Mail) means you hit every address on a carrier route. You don't buy a list; you buy the route. It's the cheapest per-piece postage you can get because the carrier already walks every door. The tradeoff: you can't cherry-pick within the route. So with saturation, your scoring job is to find routes where a high share of homes are due — because you're paying to hit all of them regardless.
Targeted mail means you buy a filtered list — specific addresses that match criteria (homeowners, single-family, built before a certain year, income band, etc.) — and mail only those. Higher postage per piece, much tighter aim. Here your scoring job extends down to the household: you can skip the new construction and the absentee-owned rentals even when they sit next door to a perfect prospect.
Most serious roofing mail programs use both: saturation on routes that score extremely high (where filtering would only remove 10–15% of homes anyway, so why pay for the list), and targeted lists on routes that are good-but-mixed (where filtering removes the dead weight). Your scoring model tells you which bucket each route falls into. We'll come back to this.
The five things that actually predict a roofing response
Before building a score, you have to know what you're scoring on. After enough drops, the variables that move the needle for roofing sort into five buckets. Rank them roughly in this order of importance, because that ranking becomes your weighting later.
- Roof age / cohort — how likely the roofs are at or past the end of their service life.
- Storm exposure — whether recent wind/hail events plausibly accelerated wear on those roofs.
- Ownership & home type — owner-occupied single-family vs. rentals, condos, HOAs, new builds.
- Ability to pay — income, home value, and equity that make a $14k–$30k project realistic.
- Serviceability & competition — can you crew it profitably, and how crowded is the route already.
Let's take each one seriously, because the quality of your data inside each bucket is what separates a model that works from a horoscope.
1. Roof age and the cohort problem
Roof age is the strongest single predictor of whether a homeowner is in the market, and it's the hardest to get cleanly. An asphalt shingle roof has a service life that depends on the shingle (3-tab vs. architectural vs. designer), the climate, the slope, the ventilation, and the install quality. As a planning rule of thumb most contractors use a 15-to-30-year band for asphalt, clustering around 18–25 for typical architectural shingles in a normal climate. The point isn't the exact number; it's that roofs replace in cohorts.
Here's the cohort logic that makes neighborhoods so scoreable: a subdivision built in 1998 got most of its original roofs installed within a two-year window. Those roofs then age together. Twenty-odd years later — adjusted for whatever storms passed through — a meaningful share of that subdivision hits end-of-life within the same few years. That is why a single carrier route can suddenly become a goldmine: it's a cohort coming due all at once. And it's why the year-built distribution of a route matters more than the median income.
Where do you get roof age? You have a few imperfect options, and the honest answer is that none of them gives you an exact install date for a given house:
- Year built (county assessor / parcel data). Widely available, cheap or free, and a decent proxy for the original roof. Its giant weakness: it tells you nothing about reroofs. A 1985 house may be on its third roof, installed in 2016. Year built systematically over-estimates roof age on older homes and is most reliable on homes 12–22 years old that likely still wear their original roof.
- Permit data. Some jurisdictions publish reroof permits. When available, this is gold — an actual reroof date. Coverage is wildly inconsistent by county, and plenty of reroofs happen without a pulled permit, so absence of a permit doesn't mean absence of a reroof.
- Aerial / satellite imagery analysis. Newer roofs look different from old ones from above — granule loss, streaking, patching, color uniformity, and the visible material all carry signal. Imagery-derived roof-age estimates have become genuinely useful for marketing prioritization. The critical honesty point: imagery gives you a range, an estimate with a confidence band, not a birth certificate. "This roof reads as roughly 16–22 years old" is the right shape of an answer. Anyone selling you an exact install year off a satellite photo is overselling.
The practical move: use year-built as your baseline cohort signal at the ZIP and route level, and layer imagery-derived roof-age ranges and any permit data on top to correct it — especially to down-rank homes that look like they've already been reroofed. You don't want to mail the guy who replaced his roof eighteen months ago; he's your worst possible recipient.
2. Storm exposure (and staying on the right side of the line)
Wind and hail accelerate roof aging and create legitimate restoration demand. A route full of 17-year-old roofs that just took golf-ball hail is a very different opportunity than the same route in a calm year. So storm exposure is a real and important scoring variable.
It's also where roofers get themselves in trouble — both with bad data and with bad messaging. Let's handle data first, then the legal line.
Reading storm data honestly. Hail and wind reports come from a few public sources: the NOAA Storm Prediction Center storm reports, the National Weather Service, and NCEI's Storm Events Database. There are also commercial hail-verification datasets (radar-derived hail swaths and "hail contour" maps) that estimate maximum hail size by location. Two cautions that separate pros from rookies:
- A storm report is a point, not a polygon. A single golf-ball hail report logged near a town does not mean every roof in that ZIP got hit. Hail falls in narrow, streaky swaths — one street can be shredded and the next over untouched. Radar-derived swath data helps, but it's a probability surface, not proof of damage on any given roof. Treat storm data as odds, not certainty.
- Recency and size both matter. A marginal pea-sized event from four years ago is noise. A significant wind or hail event in the last 6–24 months on an aging cohort is the strongest possible setup for a mail drop.
So storm scoring is really: did a significant event recently overlap a route whose roofs were already old enough to be vulnerable? The intersection is the gold — old cohort plus fresh storm. Old cohort with no storm is still a solid age play. Fresh storm on brand-new roofs is mostly a waste.
The compliance line — read this twice. When storm and "insurance" enter your marketing, there is a bright legal boundary in most states, and crossing it is unlicensed public adjusting. Here is the safe frame and the do-not-say list. A roofer may inspect a roof, document damage thoroughly with photos, and prepare an accurate repair estimate (Xactimate-aligned) for their own scope of work. The homeowner then files their own claim, and the insurer decides coverage. That's the lane. On your mail and in your pitch you must not:
- promise or imply a "free roof" or that insurance "will" pay;
- promise a specific payout, approval, or that a claim will be covered;
- say the deductible will be waived, absorbed, eaten, or "taken care of" (that's illegal in most states and is insurance fraud / a deductible-rebate violation);
- offer, for a fee, to negotiate, adjust, "handle," or "fight" the claim on the homeowner's behalf, or interpret their policy or coverage.
Those are the moves that get licenses pulled and trigger state Department of Insurance actions (Texas's TDI and others have been explicit about this). The safe, effective message is documentation and inspection: "Storms moved through your area. We'll inspect your roof, document any damage in writing with photos, and give you an honest estimate. If you choose to file, that's between you and your carrier." That captures the exact same intent without stepping over the line. Your storm scoring tells you where to send that honest message; it never becomes a promise of a payout.
3. Ownership and home type
You are selling a $15k–$30k owner decision. That means your ideal recipient is an owner-occupant of a single-family detached home. Several categories drag down a route's score hard:
- Renter-occupied / absentee-owned. The person at the mailbox can't authorize the work, and the owner who can isn't reading your postcard. High rental share is a major negative.
- HOAs / townhomes / condos with shared roofs. The roof decision is collective, made by an association and its management company, on a totally different sales cycle. Not a direct-mail-to-the-homeowner play.
- New construction. Already discussed — roofs under ~8–10 years old are dead weight for a replacement pitch.
- Manufactured/mobile homes. Different roof systems, different economics; usually screen out unless you specialize.
Ownership data (owner-occupied flag, absentee-owner flag) comes from parcel/assessor records and from list vendors. On a targeted list you can filter these out address by address. On saturation/EDDM you can't filter — so a route's ownership mix becomes a route-level score input: a 90%-owner-occupied subdivision is saturation-friendly; a route that's 40% rentals should be a targeted-list play or skipped.
4. Ability to pay
A due roof on a house whose owner can't finance $18k isn't a lead. Three signals, roughly in order:
- Home value. From assessor data or AVM estimates. Higher-value homes correlate with the equity and income to fund a reroof, and often with higher-ticket material choices.
- Household income. Census ACS data gives you income at the ZIP and (via block group) sub-ZIP level; list vendors model it per household.
- Estimated equity / length of ownership. Long-tenure owners with substantial equity are far easier to close, especially with financing.
A caution on over-indexing here: the wealthiest ZIPs aren't automatically the best. Very high-end areas often have newer or recently-maintained roofs, more out-of-warranty premium materials (tile, metal, slate) you may not install, and more competition. The sweet spot for asphalt reroofs is usually solid middle-to-upper-middle neighborhoods with aging cohorts — enough money to pay, old enough roofs to need it. Score income as a qualifier (is it above a floor?) more than a maximizer.
5. Serviceability and competition
The last bucket is operational, and roofers skip it constantly. Two questions:
- Can you service this route profitably? Drive time, supplier distance, permitting friction, and labor pool all affect your cost to deliver. A route 55 minutes away with a slow permit office quietly eats your margin even if the leads are good. Tight geographic clustering of your mail also makes your install schedule denser and your trucks more efficient — another reason carrier-route targeting beats scattershot ZIP mailing.
- How crowded is the route already? If three other roofers are pounding the same subdivision after a storm, your response rate and your close rate both drop. Sometimes the second-best route with no competition out-earns the best route with five competitors.
Building the scoring model: a weighted system you can run in a spreadsheet
Now assemble the five buckets into a single score. The model is deliberately simple — a weighted sum that produces a 0–100 score per ZIP (and later per carrier route). Simple beats fancy here because you'll actually maintain it, and because you can see exactly why a route ranks where it does.
Step 1: Pick your weights
Weights should reflect that roof age and storm exposure are the strongest predictors, with the rest acting as qualifiers and tie-breakers. A solid starting allocation for a storm-active market:
| Factor | Weight | What it captures |
|---|---|---|
| Roof-age cohort | 30 | Share of homes in the due band (year-built + imagery-derived range, minus recent reroofs) |
| Storm exposure | 25 | Significance + recency of wind/hail overlapping an aging cohort |
| Ownership / home type | 15 | Owner-occupied single-family share; penalty for rentals, HOAs, new builds |
| Ability to pay | 15 | Home value / income above a floor; equity |
| Serviceability & competition | 15 | Drive time, crew capacity, competitive density |
| Total | 100 |
In a calm (non-storm) market, shift storm's 25 toward roof-age, e.g., 45/10. In a pure storm-restoration push right after a major event, you might run 25 age / 40 storm. The model bends to your strategy; the structure stays the same.
Step 2: Normalize each factor to a 0–100 sub-score
For each factor you need a 0–100 number so the weights are comparable. Examples of how to score each:
- Roof-age cohort sub-score. Compute the share of homes on the route whose roofs fall in your due band (say 16–28 years of effective age). If 60% of homes are in-band, that's a strong cohort. Map share to score, e.g.: <15% in-band = 20; 15–30% = 45; 30–50% = 70; 50%+ = 90+. Subtract for confirmed recent reroofs.
- Storm sub-score. Build a simple matrix: significant hail (≥1.25") in last 12 months on an aging cohort = 90; moderate event in last 24 months = 60; old/marginal event = 25; nothing = 0–10. Decay it by time since the event.
- Ownership sub-score. Owner-occupied single-family share, lightly penalized for rental/HOA/new-build share. 90%+ owner-occ SFH = 90; 70% = 60; below 55% = 30.
- Ability-to-pay sub-score. Score as a floor-and-band: below your minimum (can't fund the project) = 20; comfortably in the sweet-spot band = 80; ultra-high-end where roofs are newer/premium and you don't install the material = 50.
- Serviceability sub-score. Start at 80, subtract for drive time over a threshold, subtract for known competitive saturation, add a little for routes adjacent to jobs you already have.
These cutoffs are starting points. The first time you score routes you've already mailed, you'll calibrate the bands against your real results — which is the whole point.
Step 3: Compute the weighted score
The formula is just:
Score = 0.30(age) + 0.25(storm) + 0.15(ownership) + 0.15(pay) + 0.15(service)
Step 4: Worked example
Three carrier routes in the same metro:
| Route | Age | Storm | Own | Pay | Service | Weighted score |
|---|---|---|---|---|---|---|
| A — 1999 subdivision, recent hail | 88 | 85 | 90 | 80 | 75 | 84.0 |
| B — 2017 build, same hail swath | 25 | 80 | 92 | 85 | 80 | 57.3 |
| C — 1996 subdivision, no recent storm, far away | 85 | 10 | 88 | 70 | 45 | 57.3 |
Route A is the obvious first drop — old cohort and fresh storm. Notice B and C tie at 57.3 for completely different reasons: B has new roofs the storm couldn't wear out (the storm score is wasted on roofs nobody's replacing), while C has a perfectly aged cohort but no storm catalyst and a serviceability drag. That tie is the model doing its job — it's telling you these are both "maybe" routes you'd test small, not flagship drops. And it shows why you can't score on storm alone: B looks storm-hot but is age-cold, so it doesn't deserve flagship spend.
This is also where the saturation-vs-targeted decision falls out. Route A at 84 with 88 age and 90 ownership is an EDDM saturation candidate — almost everyone there is a fit, so don't pay for a list. Route C, if you mail it at all, should be a targeted list filtered tightly to the oldest owner-occupied homes to overcome the missing storm catalyst and the drive-time cost.
From ZIP to route to address: where the real lift lives
The model above works at any geographic grain. The discipline that separates pros is running it twice:
- ZIP pass (triage). Score your whole market at the ZIP level using readily available data (Census income, broad year-built distributions, storm overlays, your serviceability map). This sorts dozens of ZIPs into A/B/C tiers and kills the obvious losers fast. Don't mail off this pass — it's too coarse.
- Carrier-route pass (decision). Inside your A and B ZIPs, drop to carrier routes. Now the cohorts resolve: that B-tier ZIP probably contains two A+ routes (an aging subdivision) and four nothing-routes (new builds and apartments). Score the routes, and mail the top ones. USPS publishes carrier-route counts and demographics, and EDDM tools let you see deliverable counts per route.
The payoff is concrete. Say a ZIP has 12,000 homes and an average score that looks mediocre. Mailing all 12,000 costs you real money for a blended-mediocre response. But four carrier routes inside it — 2,400 homes — are aging cohorts scoring in the 80s. Mail those 2,400, skip the other 9,600, and you've cut spend by 80% while raising expected response rate. Same postcard, same budget, far better outcome. That's the entire economic argument for scoring in one paragraph.
When you go targeted, the address pass adds one more filter layer: within a chosen route, suppress new construction, absentee-owned, and confirmed-recent-reroof addresses. Now every piece you pay for is an owner-occupied, single-family, aging, in-territory roof. That's as tight as direct mail gets.
A fuller worked territory example
Abstract weights are easy to nod along to and hard to apply, so let's walk a realistic metro the way a sales manager actually would. Say you service a suburban county with 22 ZIP codes you can reach inside your drive-time threshold. Round one is the ZIP triage pass. You pull median household income (Census ACS), a rough year-built distribution per ZIP, and a storm overlay from the last 24 months. You're not trying to be precise yet — you're trying to eliminate. Four ZIPs are dominated by post-2015 construction; they go to the bottom regardless of income because the cohort isn't due. Three ZIPs sit past a 50-minute drive and have nothing special to justify the travel; they're parked. Two ZIPs are mostly apartments and HOAs; parked. That leaves about 13 ZIPs worth a closer look, and three of those clearly took a significant hail event last spring. Already, before spending a dollar, you've cut your working set roughly in half on data you got for free.
Round two is the carrier-route pass on those 13 ZIPs. Here's where it gets interesting and where most roofers stop too early. Take one mixed ZIP that scored a mediocre 58 at the ZIP level — the kind of ZIP a lazy program either blankets or ignores. Drop into its carrier routes and the average dissolves into a bimodal picture: two routes are a 1997–2000 subdivision (aging cohort, 90%+ owner-occupied, in your sweet-spot value band) scoring in the mid-80s, three routes are 2016+ construction scoring in the 20s, and the rest are a strip of rentals and a townhome HOA scoring in the 30s. The ZIP "average" of 58 described none of these routes. If you'd mailed the ZIP, you'd have spent 70% of your budget on roofs nobody's replacing. Instead you mail the two 80s routes — call it 1,300 homes — and ignore the other 4,000. Same postcard, a fraction of the spend, and a response rate pulled up by the cohort instead of dragged down by it.
Now layer the three storm ZIPs. One of them has a route that's a 1999 subdivision sitting right under the heaviest part of the hail swath — that's your flagship drop, the age-and-storm overlap that scores in the high 80s. Another storm ZIP looks hot on the overlay but its routes are mostly newer builds; the storm score is real but it's landing on roofs too young to wear out, so those routes stay middling. The model keeps you honest: it won't let a dramatic hail map talk you into mailing new roofs.
The output of this two-round process is a ranked list of maybe 9–14 carrier routes, each tagged saturation or targeted, totaling whatever your budget covers. That ranked, bucketed route list is the actual deliverable. Everything upstream existed to produce it.
Sourcing the data without overpaying
People assume scoring requires expensive software. Most of it doesn't. Here's where each layer comes from and what it costs in practice.
- Income and demographics — U.S. Census ACS, free, available down to the block-group level (a sub-ZIP grain that roughly aligns to a few carrier routes). Good enough for the ability-to-pay floor.
- Year built, home value, ownership — county assessor/parcel data. Many counties publish it free; others sell bulk extracts cheaply. List vendors also bundle these fields, which is usually the path of least resistance if you're buying a targeted list anyway.
- Storm events — NOAA SPC storm reports, NWS, and the NCEI Storm Events Database are all free. Radar-derived hail swath/contour products are commercial but inexpensive relative to a mail drop, and worth it in a storm-heavy market.
- Carrier-route counts and saturation eligibility — USPS EDDM tools show deliverable counts per route at no cost; this is how you size a saturation drop.
- Roof-age range and per-roof storm modeling — the hardest layer to do yourself, and the one purpose-built tools exist for. This is the gap RoofPredict fills, covered below.
The spreadsheet that ties it together can be Excel or Google Sheets. You don't need a data scientist. You need a tab per geographic grain (ZIP, then route), one column per sub-score, the weighted-sum formula, and the discipline to update it each cycle. The model's value comes from running it consistently, not from sophistication.
Timing and seasonality
When you drop matters almost as much as where. A few timing rules that experienced programs follow:
- Storm drops are time-sensitive but not instant. Immediately after a major hail event, homeowners are flooded with door-knockers and storm-chaser mail, and many are still in shock. There's often a sweeter window a few weeks out, once the chaos settles but well before memories fade and before the busy season's capacity fills. Don't be the 40th identical "storm damage" postcard in the box on day three.
- Age-cohort drops favor the shoulder seasons. Late winter into early spring, and again in late summer into fall, tend to be planning windows for homeowners thinking about a non-emergency reroof. You also want your own crews to have capacity to convert the leads — mailing hard right when you're already booked out eight weeks wastes response.
- Respect your fulfillment capacity. Scoring tells you where the demand is; your crew calendar tells you how much of it you can serve. Mailing more than you can install on time generates bad reviews and cancellations. Size each drop to the schedule.
Building the offer and the piece (briefly)
Scoring decides who gets mail; the piece decides what happens when they open it. Two principles tie back to the data:
- Match the message to the route's reason for scoring high. An age-cohort route gets a message about a roof reaching the end of its service life and a free, honest inspection. A storm route gets the documentation message — you'll inspect, photograph, and write an accurate estimate, and the homeowner decides whether to file. Sending a generic "we do roofs" piece wastes the precision you built upstream.
- Make the offer a low-friction next step, not a hard sell. A free inspection or a roof-age/condition report converts far better than "call for a quote," because the homeowner on an aging roof already suspects they're due and wants a no-pressure read. Multi-touch sequences (a first piece, then a second to non-responders 2–3 weeks later) lift total response meaningfully; budget for the follow-up rather than a single one-shot blast.
And the line worth repeating because it ends businesses: keep every claim on the documentation-and-estimate side. No "free roof," no promised payout or approval, no waived or absorbed deductible, no offer to handle or negotiate the claim. Inspect, document, estimate, hand it to the homeowner. That message is fully effective and fully legal.
Where RoofPredict fits in this workflow
The hardest, most time-consuming part of everything above is the roof-age and storm layers at the route and address level — and that's the part generic list vendors do worst. List vendors are great at year-built, income, and ownership; they're weak on actual roof condition and on storm modeled per roof. That gap is exactly where RoofPredict is built to help.
RoofPredict reads aerial imagery to estimate a roof-age range per address — not an exact install date, a range with a confidence band, which is the honest shape of the answer — and models storm exposure per roof rather than per ZIP, so you're looking at which specific roofs a storm plausibly wore out instead of assuming a whole polygon got hit. Then it enriches your own CRM or mailing list with those signals. It's not a lead-buying service and it won't hand you a name to call cold; it ranks the doors, routes, and lists you already work so your crews and your postcards target the roofs that are aging out plus the roofs a storm accelerated.
In the scoring model, that means your two heaviest-weighted factors — roof-age cohort (30) and storm exposure (25) — stop being rough proxies off year-built and a county-wide hail report, and become per-roof estimates rolled up to the route. You still bring ownership, income, and serviceability from your list vendor and your own operational knowledge; RoofPredict sharpens the age and storm layers that decide whether the cohort is genuinely due.
Honest limits, because they matter: a roof-age range is still a range — some homes will read older or newer than they are, and imagery can't see a roof under heavy tree cover or tell you install quality. Storm modeling gives you odds a roof was affected, never proof; the only proof is a physical inspection. Use the data to decide where to spend postage and which doors to knock — not to make a promise on a postcard. The inspection still happens on the roof.
List hygiene and suppression — the quiet multiplier
A perfectly scored route can still waste money if the underlying address data is dirty. Two homes get mailed where one household lives, the new owner moved in and the records lag, the address is vacant, or you mail a customer you reroofed last year. None of that shows up in your score — it shows up in your cost. Build these suppressions into every targeted drop:
- Your own customer list. Suppress anyone you've already reroofed and anyone with an open estimate. It's the cheapest list you'll ever build and the most embarrassing one to skip — nothing erodes trust like a "your roof is getting old" postcard landing on the roof you installed eighteen months ago.
- Recent-reroof addresses. Where permit data or imagery flags a fresh roof, suppress it. These are your single worst recipients on an age-cohort drop.
- Vacancies and undeliverables. USPS flags vacant and undeliverable-as-addressed records; mailing them is pure waste. Run your list against current delivery-point data.
- Do-not-mail and repeat non-responders. If a household has ignored four touches across two campaigns, stop paying to reach them and reallocate that slot.
A related discipline is frequency capping by household across campaigns, not only within one drop. The right cadence is a small number of well-spaced touches to a tightly scored audience, not the same postcard every three weeks to a route you mailed last quarter. Over-mailing a great route turns it into an annoyance and quietly drags your brand. Track, per household, how many pieces it has received this year, and let the score plus the touch count decide whether it earns another.
Finally, keep a "reasons we skipped" log. When you exclude a route or an address, jot why — too new, too far, too many rentals, already reroofed, competitor-saturated. Over a year that log becomes its own dataset; it tells you whether your cutoffs are too aggressive or too loose, and it stops you from re-litigating the same routes every cycle from scratch.
Calibrating the model against real results
A scoring model you never check against outcomes is just a confident guess. The loop that makes it actually good:
- Tag every mail piece with its route and its score band (A/B/C) before you drop.
- Track response by band, broken out rather than blended. You want calls-per-thousand and, more importantly, jobs-per-thousand and revenue-per-thousand-mailed for each band.
- Compare to your break-even. Compute your true cost per thousand mailed (design + print + postage + list, all in). Divide by your average job margin to get the jobs-per-thousand you need just to break even. Now you can see which bands clear it and by how much.
- Re-weight. If your A-band isn't beating your B-band, your weights or your cutoffs are wrong — usually the roof-age or storm sub-scores are mis-calibrated. Adjust and re-run.
A simple results table after a few drops might look like this:
| Score band | Mailed | Calls | Jobs | Revenue | Rev / 1,000 |
|---|---|---|---|---|---|
| A (80–100) | 6,000 | 41 | 9 | $171,000 | $28,500 |
| B (60–79) | 6,000 | 22 | 4 | $74,000 | $12,333 |
| C (<60) | 4,000 | 7 | 1 | $17,000 | $4,250 |
If your all-in cost is ~$650 per thousand and your average job nets, say, $5,000 margin, the A-band is wildly profitable, the B-band is solidly positive, and the C-band barely breaks even — so next cycle you shift budget out of C and into more A-band routes (and test whether tightening C to a targeted list lifts it). The numbers above are illustrative, not benchmarks — your market's response will differ — but the structure is exactly how you should reason about it. The model isn't "set it and forget it"; it's a hypothesis you sharpen every drop.
A repeatable workflow, start to finish
Here's the whole thing as a checklist you can run each mailing cycle:
- Define the territory. List every ZIP you can service profitably (your serviceability map). Kill anything past your drive-time/margin threshold now.
- ZIP triage pass. Pull Census income, broad year-built distribution, and storm overlays per ZIP. Score and sort into A/B/C tiers. Set the C-tier ZIPs aside.
- Carrier-route pass on A/B ZIPs. Drop to routes. Pull deliverable counts, route-level ownership/age mix, and per-route storm overlap. Layer in per-roof age and storm data where you have it. Score every route.
- Bucket each top route: saturation or targeted. High score + high owner-occ + high in-band share → EDDM saturation. Good-but-mixed → targeted filtered list. Marginal → small test or skip.
- Build the address list (targeted routes). Filter to owner-occupied single-family; suppress new construction, absentee owners, recent reroofs, HOAs/condos. Cap to budget, oldest cohorts first.
- Match message to data — and stay in your lane. Age-only routes get a "your roof's getting up there, here's an honest inspection" message. Storm routes get the documentation message — inspect, document in writing with photos, give an honest estimate, homeowner decides whether to file. Never promise payout, approval, a waived deductible, or a free roof.
- Tag, drop, and track by score band. Calls, jobs, and revenue per thousand, per band.
- Calibrate. Compare bands to break-even, re-weight, and reallocate next cycle's budget toward what cleared.
What pros get wrong
A few failure patterns worth calling out, because they're common and expensive:
- Mailing the whole ZIP "to be safe." This is the original sin. You're not being safe; you're diluting your budget across new builds, rentals, and recently-reroofed homes. Tighter is cheaper and better.
- Chasing only the storm, ignoring the cohort. A storm on new roofs produces almost nothing. The opportunity is storm intersecting an aging cohort. Score both; reward the overlap.
- Trusting year-built as roof age. On older homes it's badly wrong because of reroofs. Correct it with imagery-derived age ranges and permit data, or you'll keep mailing people who replaced their roof two years ago.
- Treating a hail report as a hail map. One report is a point. Hail falls in streaks. Use swath/contour data and treat it as probability, not proof — and never put "you have damage" on a postcard for a roof you haven't seen.
- Over-indexing on income. The richest ZIP isn't the best ZIP. Middle-and-upper-middle aging neighborhoods usually out-earn the trophy areas for asphalt reroofs, with less competition.
- Never calibrating. If you can't tell me your revenue-per-thousand by score band, you don't have a model, you have a vibe. Track it.
- Crossing the compliance line for short-term response. "Free roof" and "we waive your deductible" lift response and can end your business. Keep the message on documentation and honest estimates. It works, and it's legal.
The one-paragraph version
Stop mailing ZIP codes. Score them, then drill to carrier routes and addresses. Weight your score toward the two factors that actually predict a reroof — how aged the roof cohort is and whether a recent storm plausibly wore those specific roofs out — then qualify on ownership, ability to pay, and your own serviceability. Mail saturation where almost everyone's a fit and targeted lists where they're mixed. Tag every piece with its score, track revenue per thousand by band, and re-weight every cycle. Get your roof-age and storm layers down to the per-roof level — that's the part generic lists miss and where tools like RoofPredict earn their keep — keep every claim on the safe side of the documentation line, and your postage starts landing on roofs that are genuinely due instead of on a polygon the Postal Service drew to sort the mail.
FAQ
What's the difference between scoring a ZIP code and scoring a carrier route?
A 5-digit ZIP is a mail-routing area that can hold 8,000–25,000 households spanning decades of construction and several income tiers — too coarse to mail off directly. A carrier route is the actual loop one carrier covers (roughly 400–800 addresses) and usually lines up with a single subdivision or coherent neighborhood, so roof-age cohorts resolve at that level. Score ZIPs to triage your market into A/B/C tiers, then re-score the carrier routes inside your best ZIPs to decide where postcards actually go.
Which factors should I weight most heavily when scoring for roofing?
Roof-age cohort (how many homes are in the due band) and storm exposure (whether a recent significant wind/hail event overlapped an aging cohort) are the two strongest predictors — give them the most weight, often around 30 and 25 out of 100. Ownership and home type, ability to pay, and serviceability/competition act as qualifiers and tie-breakers at roughly 15 each. In a calm market, shift weight from storm toward roof age; right after a major storm, do the reverse.
Is 'year built' a reliable way to estimate roof age?
Only partially. Year built is a decent proxy for the original roof and is most reliable on homes roughly 12–22 years old that likely still wear their first roof. Its big weakness is reroofs: an older home may be on its second or third roof, so year built systematically overstates roof age on older houses. Correct it with permit data where available and with aerial-imagery-derived roof-age ranges, and down-rank any home that looks recently reroofed.
Can I tell which specific roofs are due from a satellite image?
You can estimate a roof-age range per address from aerial imagery — granule loss, streaking, patching, color uniformity, and visible material all carry signal — but you get a range with a confidence band, not an exact install date. Treat it as a strong prioritization signal that sharpens your roof-age scoring, not as proof. Tree cover can hide a roof, and imagery can't judge install quality. The only proof of condition is a physical inspection.
How should I use storm/hail data without overstating it?
Pull events from NOAA's Storm Prediction Center, the National Weather Service, and NCEI's Storm Events Database, and supplement with radar-derived hail swath/contour data. Remember a storm report is a point, not a polygon — hail falls in narrow streaks, so one street can be hit and the next untouched. Score on the intersection of a significant, recent event (last 6–24 months) with an aging cohort, and treat the data as odds a roof was affected, never as proof of damage on any given home.
Should I use EDDM saturation mail or a targeted address list?
Use your score to decide per route. On routes that score very high with high owner-occupancy and a high share of in-band roofs, EDDM saturation is cheaper because filtering would only remove a sliver of homes anyway. On good-but-mixed routes (meaningful rental, new-build, or recent-reroof share), buy a targeted list filtered to owner-occupied single-family homes and suppress the dead weight. Many strong programs run both, route by route.
What can I legally say about insurance on a roofing postcard?
Keep it on the documentation and estimate side. You may say you'll inspect the roof, document any damage in writing with photos, and provide an honest, accurate repair estimate — and that the homeowner decides whether to file with their carrier. You may not promise or imply a free roof, a specific payout or approval, that a claim will be covered, or that the deductible will be waived/absorbed. Negotiating, adjusting, or 'handling' a claim for a fee, or interpreting the homeowner's policy, is unlicensed public adjusting in most states.
How do I know if my scoring model is actually working?
Tag every mail piece with its route and score band before dropping, then track calls, jobs, and revenue per thousand mailed by band rather than as one blended number. Compute your true all-in cost per thousand and your break-even jobs-per-thousand. If your A-band isn't clearly beating your B- and C-bands, your weights or your roof-age/storm cutoffs are mis-calibrated. Adjust and reallocate budget toward the bands that clear break-even each cycle.
Are the wealthiest ZIP codes the best targets?
Usually not. Very high-end areas often have newer or recently maintained roofs, more premium materials like tile, metal, or slate that you may not install, and heavier competition. Income is best used as a floor — can the owner fund a $15k–$30k project — rather than a maximizer. The sweet spot for asphalt reroofs tends to be solid middle-to-upper-middle neighborhoods with aging roof cohorts: enough money to pay, and roofs old enough to need replacing.
Where does RoofPredict fit into a direct-mail scoring workflow?
It sharpens the two heaviest-weighted, hardest-to-source factors: roof age and storm exposure. RoofPredict estimates a roof-age range per address from aerial imagery and models storm exposure per roof rather than per ZIP, then enriches your own CRM or mailing list with those signals so it ranks the doors, routes, and lists you already work. It is not a lead-buying service and won't hand you cold names. You still bring ownership, income, and serviceability from your list vendor and your operations; ranges are ranges and storm odds are odds, so the physical inspection still happens on the roof.
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
- Every Door Direct Mail (EDDM) — usps.com
- USPS Carrier Route Information and Mailing Standards — pe.usps.com
- NWS Storm Prediction Center — Storm Reports — spc.noaa.gov
- NCEI Storm Events Database — ncdc.noaa.gov
- National Weather Service — Hail — weather.gov
- Insurance Institute for Business & Home Safety (IBHS) — Hail — ibhs.org
- NRCA — National Roofing Contractors Association — nrca.net
- U.S. Census Bureau — American Community Survey — census.gov
- Texas Department of Insurance — Public Adjusters — tdi.texas.gov
- FTC — Truth in Advertising — ftc.gov
- International Code Council — International Residential Code (IRC) — codes.iccsafe.org
- OSHA — Fall Protection in Residential Construction — osha.gov
- Bureau of Labor Statistics — Roofers Occupational Outlook — bls.gov
- RoofPredict — roofpredict.com
Related Articles
How to Find Commercial Buildings With Aging Roofs: A Field Playbook for Contractors
The practical methods commercial roofers use to find buildings whose roofs are quietly aging out, before the property manager calls three competitors.
How to Clean a Roofing Mailing List (So Your Mail Actually Lands and Your Crews Knock the Right Doors)
Most roofing mailing lists are 20-40% dead weight before the first postcard prints. Here is the exact workflow pros use to scrub, verify, and rank a list so mail lands and crews knock roofs that are actually due.
Direct Mail Benchmarks for Roofing Companies: Response Rates, Costs, and ROI That Actually Hold Up
The response-rate numbers, cost ranges, and break-even math roofing companies need to judge a mail campaign honestly, plus how to mail the right roofs.