Skip to main content

How to Clean a Roofing Mailing List (So Your Mail Actually Lands and Your Crews Knock the Right Doors)

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

A roofing mailing list is the single most expensive line item that nobody audits. You will spend money on the data, money on design, money on print, money on postage, and money on the follow-up calls and door-knocks the mail is supposed to trigger. Then a third of the pieces hit vacant lots, renters, deceased owners, P.O. boxes that route nowhere, or the same household three times under three spellings of the same name. The post office eats the bad ones quietly, your phone stays quiet, and you conclude that direct mail does not work for roofing.

Direct mail works fine. Dirty lists do not.

I have watched a 40,000-piece storm campaign go out with roughly 11,000 undeliverable or wasted records baked in. At a fully loaded cost of around 70 cents a piece by the time you count data, design, print, and First-Class-equivalent postage, that is close to $7,700 set on fire before a single homeowner read a word. Cleaning that list took about a day of focused work and a few small tools. The math on list hygiene is not subtle.

What follows is the workflow my best operators use to take a raw, ugly, multi-source roofing list and turn it into something deliverable, deduplicated, suppressed, and ranked by which roofs are actually worth a stamp. It is written for someone who runs the campaign, not someone who theorizes about it. Expect concrete field names, real failure modes, worked numbers, and the parts most contractors skip.

Why roofing lists rot faster than most

Every industry deals with stale mailing data. Roofing has a few problems that make it worse.

You buy from too many sources. A typical roofer's list is a Frankenstein of a county property-records pull, a skip-traced storm-track export, a homeshow sign-up sheet, three years of old estimates that never closed, a purchased "new mover" file, and whatever a sales rep typed into a spreadsheet at a kitchen table. Each source has its own format, its own idea of what a "name" field is, and its own age.

Roofs and ownership both turn over. The U.S. Census Bureau's American Community Survey consistently shows that a large share of households move each year, and that churn is concentrated in exactly the kind of suburban single-family neighborhoods roofers target. The U.S. Postal Service processes tens of millions of change-of-address records annually. A list that was clean 14 months ago is meaningfully stale today.

Storm files are the dirtiest of all. When a hail or wind event hits, half the industry buys the same skip-traced polygon export within 72 hours. Those files are assembled fast, often from thin sources, and they are heavy on phone-append junk, P.O. boxes, and owner names that no longer match the parcel.

You target by roof, but you mail by household. The thing you actually care about, the roof and its age and what the storm did to it, is not a field in most mailing lists at all. So even a perfectly deliverable list can be 100% accurate and still mostly worthless if every roof on it is six years old and nowhere near due.

That last point is the one this whole piece builds toward. Deliverability gets your mail into the box. Relevance gets you the call. Most contractors stop at deliverability. The best ones rank.

The two definitions of "clean" (and why you need both)

When people say "clean my roofing list," they usually mean one of two very different things:

  1. Deliverable. The address is real, standardized, current, and the post office will carry the piece to a mailbox that exists. This is hygiene: deduplication, address standardization, move updates, suppression of bad records.
  2. Relevant. The household behind the address is someone you actually want to reach: an owner (not a renter), a roof old enough or storm-worn enough to be due, in a neighborhood you can crew, not already a customer or a known dead end. This is targeting.

A list can be perfectly deliverable and completely irrelevant. It can also be highly relevant and 30% undeliverable. You need both passes, and you need them in the right order, because some relevance filters (like owner-occupancy) also improve deliverability, and some hygiene steps (like move-update) can change who the relevant party even is.

The rest of this is organized as a sequence. Run it in order.

The cleaning sequence, top to bottom

Here is the full pipeline at a glance. Each step has its own section below.

  1. Consolidate every source into one table with consistent columns.
  2. Profile the raw data so you know what you are dealing with.
  3. Parse and standardize names and addresses.
  4. CASS-certify and correct the addresses against postal data.
  5. Deduplicate at the household and individual level.
  6. Run NCOALink move-update to catch people who moved.
  7. Suppress the records you should never mail.
  8. Append and verify the targeting signals (owner-occupancy, roof age range, storm exposure).
  9. Score and rank, then cut the list to a budget.
  10. Build a seed and suppression file, then set up feedback so the list gets cleaner every cycle.

Do not reorder steps 4 through 7. Standardize before you dedupe (so duplicates actually match), dedupe before move-update (so you do not pay to update three copies of the same record), and move-update before suppression (so you catch the "moved, no forwarding" cases the post office flags).

Who runs which step

You do not need to own every tool. Most contractors split this work three ways, and knowing the split saves you from buying software you do not need:

  • Your mail house or list processor handles CASS, NCOALink, and the postal mechanics. These require licensed access to current USPS data, so it rarely makes sense to do them in-house unless you mail at very high volume. Hand them a standardized file and they return a certified, move-updated, ZIP+4-coded list.
  • You (in a spreadsheet or list tool) handle consolidation, profiling, suppression logic, customer matching, and scoring. These are your business rules, nobody else knows which ZIPs you can crew or which homeowners you bid last month.
  • A relevance-data vendor supplies the signals your list does not carry: owner-occupancy from parcel data, roof-age ranges, and per-roof storm exposure.

The failure mode is assuming the mail house does all of it. They do not. A mail house will happily CASS-certify a list that is 30% renters and young roofs, mail it, and bill you, because deliverability is their job and relevance is yours. Owning that boundary is most of what separates a sharp campaign from an expensive one.

Step 1: Consolidate everything into one table

Before you can clean anything, get every record into a single flat file with one row per record and a consistent set of columns. CSV is fine. A spreadsheet is fine for lists under ~50,000 rows; past that, move to a database or a list-processing tool because spreadsheets start truncating, mangling leading zeros in ZIP codes, and corrupting on save.

Define a minimal column set and force every source into it:

Column Notes
source Where this record came from (county2024, storm_aug, homeshow, old_bids)
source_date When you got it; critical for staleness scoring
first_name Parsed, not "John & Mary"
last_name
address1 Street number + street
address2 Unit/apt/suite, separated
city
state Two-letter
zip Keep as text; preserve leading zeros
zip4 Empty for now; CASS fills it
owner_occupied Empty for now
year_built If you have it from county data
roof_age_range Empty for now
storm_score Empty for now

The two most-skipped columns are source and source_date. Without them you cannot tell a fresh county pull from a four-year-old bid list, and staleness is one of the strongest predictors of bad data. Tag every record at import.

The leading-zero trap. ZIP codes like 02134 and 07030 lose their leading zero the instant a spreadsheet treats the column as a number. Format the column as text before pasting, or import the CSV with the ZIP column explicitly typed as text. A stripped leading zero turns a deliverable address into a CASS failure.

Step 2: Profile the raw data before you touch it

Never start scrubbing blind. Spend 20 minutes profiling so you know where the rot is. This tells you which steps will matter most and gives you a baseline to measure against.

Run these quick counts on the raw file:

  • Total rows vs. rows with a non-empty address1. The gap is junk.
  • Distinct addresses vs. total rows. The gap is your rough duplicate load.
  • Records missing city, state, or ZIP. These fail CASS unless recoverable.
  • P.O. Box count. Search address1 for "PO BOX", "P.O.", "BOX ". Roofs are not on P.O. boxes.
  • Obvious renter/multi-unit signals. Count rows with "APT", "UNIT", "#", "STE".
  • Owner-name anomalies. Count last names containing "LLC", "TRUST", "INC", "BANK", "PROPERTIES", "HOA". These are often not owner-occupied.
  • Staleness. Bucket records by source_date: under 6 months, 6-18 months, over 18 months.

Write the numbers down. A representative raw roofing list often profiles something like this:

Metric Raw count % of total
Total rows 40,000 100%
Blank/garbage address 1,600 4%
Duplicate households (est.) 5,200 13%
P.O. boxes 900 2.25%
Apartment/unit markers 3,400 8.5%
LLC/Trust/Bank owners 2,100 5.25%
Source older than 18 months 7,000 17.5%

Those categories overlap, so you cannot simply add them up, but it is not unusual to find that 25-40% of a raw list is either undeliverable or off-target before any real cleaning. Knowing that up front keeps you from blaming the creative when the response rate is low.

Step 3: Parse and standardize names and addresses

Parsing is the unglamorous step that makes everything downstream work. Matching engines compare standardized strings; if your data is not standardized, duplicates do not collide and good addresses get flagged as bad.

Names

Roofing lists are full of joint and messy owner names. You will see:

  • SMITH, JOHN & MARY
  • John and Mary Smith
  • SMITH JOHN R TRUSTEE
  • Smith Family Trust
  • JOHN SMITH JR

Decide on a salutation strategy and parse to support it. For most roofing direct mail, a household-level greeting beats a wrong first name. "Dear Smith Household" or "To the homeowner at 142 Birch Lane" never misfires; "Dear Trustee" does. Split into first/last where you confidently can, flag the rest as household-level, and strip suffixes (JR, SR, III), titles (TRUSTEE, ESTATE OF), and the joined second name into separate fields rather than leaving them in the name string where they break matching.

Addresses

Standardize to the postal format before certification. The goal is consistency so the certification engine and the dedupe engine see the same thing:

  • Street suffixes to standard abbreviations: STREET to ST, AVENUE to AVE, BOULEVARD to BLVD.
  • Directionals consistent: N, S, E, W, NE, NW.
  • Unit designators standardized: APARTMENT to APT, SUITE to STE, separated into address2.
  • Remove stray punctuation, double spaces, and trailing notes a rep typed into the address line ("blue house", "back unit", "call first").

You do not have to do this by hand. A CASS-certified processor (next step) does most of it. But pre-cleaning the obvious garbage, especially rep notes jammed into address fields, raises your match rate and lowers your no-hit count.

Step 4: CASS-certify and correct the addresses

This is the load-bearing step for deliverability. CASS (Coding Accuracy Support System) is the USPS certification standard that mail-processing software is tested against. Running your list through CASS-certified software does several things at once:

  • Validates each address against current USPS delivery-point data.
  • Corrects fixable errors (wrong ZIP, misspelled street, missing directional).
  • Standardizes to the official postal format.
  • Appends ZIP+4 and the delivery-point code, which you need for automation-rate postage discounts.
  • Flags undeliverable addresses so you can pull them before printing.

Why you cannot skip it: the USPS only grants automation postage discounts on mail that carries a valid, CASS-certified barcode. Skipping CASS means paying full retail postage on every piece, which on a large drop dwarfs the cost of certification. Beyond the discount, CASS is simply how you learn which of your addresses are real.

Reading the results codes

CASS and the related DPV (Delivery Point Validation) process return status codes. The ones that matter most for a roofing list:

Code/flag Meaning What to do
DPV confirmed (Y) Address is a real, deliverable delivery point Keep
DPV no-match (N) Address not found in USPS data Suppress or hold for manual review
DPV with vacant flag Confirmed address, but USPS shows it vacant Strong suppress candidate (no roof decision-maker there)
CMRA flag Commercial Mail Receiving Agency (a mailbox store) Not a residence; suppress for owner-occupied campaigns
Missing secondary (DPV S/D) The building exists but the unit info is missing or wrong Multi-unit; usually a renter situation, low priority

The vacant flag is gold for roofers and almost nobody uses it. A vacant property has no resident making a roof decision and frequently no clear owner to receive your mail. Suppressing vacants alone can shave a few points off a list and the response you lose is essentially zero.

A note on CASS currency: USPS requires the underlying data to be current for certification to be valid. If you are using a tool, make sure its postal data is recent; if you are using a mail house, they handle this. Stale CASS data quietly degrades your results.

Step 5: Deduplicate at two levels

Duplicates are where roofing lists bleed the most money, because the multi-source problem guarantees overlap. The same house shows up in your county pull, your storm file, and your old-bids list, three times, under "John Smith," "J & M Smith," and "Smith Family Trust."

Dedupe in two passes, after standardization so the strings actually match.

Household dedupe

Match on standardized address (address1 + address2 + ZIP+4). Every record that resolves to the same delivery point is the same household. For most roofing mail you want one piece per household, so collapse these to a single record. When you collapse, keep the best version: prefer the record with an owner-occupied flag, the freshest source_date, and a real human name over a trust/LLC name.

Individual dedupe

Within or across households, the same person can appear at multiple addresses (they moved; you have both). Match on name + the strongest address you trust. This matters less for a single drop and more for suppression and for not double-counting when you measure response.

Fuzzy matching, carefully

Exact-match dedupe misses "142 Birch Ln" vs "142 Birch Lane" if you did not standardize, which is why standardization comes first. After standardization, most duplicates are exact matches on ZIP+4 and delivery point. Use fuzzy/approximate matching sparingly and review the borderline cases, because aggressive fuzzy logic merges two genuinely different households (two units, a duplex, adjacent lot numbers) and you lose a real prospect. A safe default: auto-merge on identical ZIP+4 + delivery-point code, manually review anything matched only by name similarity.

A worked example: a 40,000-row list that profiled at ~13% duplicate households drops to about 34,800 unique households after this step. At 70 cents a piece, removing 5,200 duplicates saves roughly $3,640 on this single drop, and it stops the embarrassing problem of one homeowner getting three identical postcards and concluding you are desperate.

NCOALink is the USPS-licensed change-of-address process. You submit your list, it is matched against the official COA database covering roughly the past four years of moves, and it returns updated addresses for people who moved and filed a forwarding order, plus flags for moves where no forwarding address is available.

Why this matters for roofers specifically: your county property pull lists the owner of record, but ownership and occupancy lag. People sell, move, and the records take months to catch up. NCOA catches a meaningful slice of "this person no longer lives here" before you waste postage.

Move-update returns a few outcomes you handle differently:

NCOA result Meaning Action
Moved, new address provided Person filed a forwarding order Update address; reconsider relevance (new ZIP may be out of your service area)
Moved, left no forwarding Gone, no new address Suppress the person; the property may still be a target under new ownership
No move found Still there as far as USPS knows Keep

There is a roofing-specific subtlety here. You target the roof, which does not move, but you mail a person, who does. If the NCOA result says the owner moved away with no forwarding, the house is still standing and its roof is still aging, you just no longer know who owns it. That record should flow into your re-acquisition logic (get a fresh owner name for that parcel) rather than simply being deleted. This is exactly the kind of gap that owner-occupancy and parcel-level data, covered below, fill.

Compliance note: USPS move-update requirements apply to certain mailing classes and discounts. If you mail at automation or presort rates, processing your list through an approved move-update method within the USPS-required window is generally a condition of those rates. Your mail house or list processor handles the certification; just know that skipping it can disqualify your discount and means you are mailing known-stale addresses.

Step 7: Suppress what you should never mail

Suppression is subtractive cleaning: removing records you could technically mail but should not. This is where targeting starts to blend with hygiene. Build each of these as a named suppression file so you can reuse it next campaign.

Suppress list checklist

  • Undeliverable / DPV no-match from CASS. Already flagged in Step 4.
  • Vacant-flagged properties. No decision-maker home.
  • P.O. boxes and CMRAs. A roof is not on a P.O. box. (Keep a P.O. box only if it is the only contact you have for a known parcel and you are willing to take the lower hit rate.)
  • Renters / non-owner-occupied. A tenant cannot authorize a roof. More on detecting these below.
  • Business / LLC / institutional owners when you are running a residential campaign. (Flip this for a commercial campaign.)
  • Out-of-area ZIPs. Anything outside the ZIP codes you can realistically crew. Be honest about drive time.
  • Existing customers, unless the campaign is intentionally a re-engagement or maintenance offer. Mailing a fresh roof a "your roof may be due" postcard burns trust.
  • Active jobs and recent estimates. A homeowner you bid last week should not get a cold prospecting piece.
  • Do-not-mail / opt-outs. Maintain this religiously (see compliance below).
  • Deceased / estate flags where available, handled tactfully; mailing "ESTATE OF" a roofing offer is a bad look and rarely converts.

Detecting renters without a clean owner-occupancy field

If you do not have a reliable owner-occupied flag yet, you can infer renter likelihood from cheap signals:

  • Owner mailing address differs from the property address. County records often carry both. If the tax bill goes somewhere other than the house, the owner probably does not live there: classic landlord pattern.
  • Unit/apartment markers in the address (APT, UNIT, #) skew heavily renter.
  • Owner name is an LLC, trust, or "PROPERTIES"/"RENTALS" entity.

These are heuristics, not certainties, so weight them rather than hard-deleting. The clean version is to append a real owner-occupancy signal, which is the first part of the next step.

Step 8: Append and verify the targeting signals

Now the list is deliverable. This step makes it relevant. Three signals matter most for roofing, in rough order of impact: owner-occupancy, roof age, and storm exposure.

Owner-occupancy

The difference between a property owner and an owner-occupant is the difference between someone who can say yes to a roof and someone who cannot. Append a real owner-occupied flag from parcel/assessor data where you can. At minimum, derive it from the owner-mailing-address-vs-property-address comparison described above. An owner-occupied residential list will out-convert a mixed list by a wide margin, because every renter you mail is a guaranteed zero.

Roof age, as a range, not a date

This is the signal that separates a mediocre roofing list from a great one, and it is the one almost no purchased list contains.

You cannot know the exact installation date of a roof from the outside, and any vendor who claims to is overselling. What you can responsibly estimate is a roof age range from a combination of signals: the home's year_built from county data, permit history where it is available, and modern aerial-imagery analysis that can flag visible wear and surface change over time. The honest output is a band, "this roof reads as roughly 18-24 years old," not "installed March 2003."

Why a range is the right unit: asphalt shingle service life varies with material grade, slope, ventilation, sun exposure, and storm history. Two identical houses built the same year can have roofs a decade apart in remaining life because one was re-roofed after a hailstorm and one was not. A range respects that uncertainty and still tells you what you need to know: is this roof plausibly due? A roof in a 5-9 year band is not your target. A roof in a 20-25 year band, or a younger roof with heavy storm exposure, is.

If you only have year_built, use it as a crude proxy, but understand its limits. Year built tells you when the first roof went on. It says nothing about the re-roof that happened in year 16. That blind spot is exactly why imagery-derived wear estimates beat birth-year math.

Storm exposure, as odds, not proof

The second high-value signal is what the weather actually did to each roof. Public hail and wind data exists. NOAA's Storm Prediction Center and the National Weather Service publish storm reports and warnings; the broader research on hail and wind impact from organizations like the Insurance Institute for Business and Home Safety (IBHS) explains why a given hail size or wind speed does what it does to shingles.

The naive version of storm targeting is to draw a polygon around a reported hail event and mail everyone inside it. That over-mails, because hail is famously patchy. The better version models exposure per roof: which specific addresses sat under the worst of the cell, given hail size, wind direction, and the roof's own characteristics. The output is a probability, an odds that this particular roof took meaningful damage, not a guarantee. Treat it as a ranking input, not a promise.

This is also where you keep your messaging honest, which matters legally as much as it does for conversion. Covered next.

Step 9: Score, rank, and cut to budget

Now combine the signals into a single score so you can mail the best records first and stop when the budget runs out. The point of ranking is that you almost never have the budget to mail everyone, so mail the most-due roofs first.

A simple, transparent scoring model beats a black box you cannot explain to your sales manager. Here is a starting framework; tune the weights to your market.

Signal Weight High score when...
Roof age range 35 Range is near or past typical service life
Storm exposure odds 30 Roof sat under a significant recent hail/wind cell
Owner-occupied 20 Confirmed owner-occupant
Neighborhood density 10 Many due roofs nearby (route efficiency)
Data freshness 5 Recent, high-confidence source

Neighborhood density deserves a mention because it is a pure roofing edge. A door-knock or a yard-sign campaign is far more efficient when due roofs cluster. Twenty due roofs on one street is a route; twenty due roofs scattered across a county is a gas bill. Scoring for density, even crudely (count of high-score roofs within the same carrier route or subdivision), makes your crews' day more profitable.

Once scored, sort descending and cut to your budget. If you can afford 18,000 pieces, mail the top 18,000 scores and hold the rest. You now have a defensible list: every piece is going to a deliverable, owner-occupied address attached to a roof that is plausibly due. That is a fundamentally different campaign than blasting a raw 40,000-record file.

A worked end-to-end example

Starting raw list: 40,000 records from five sources.

Step Records removed Remaining
Blank/garbage addresses 1,600 38,400
CASS undeliverable + vacant 2,300 36,100
Household dedupe 4,900 31,200
NCOA moved-no-forwarding 1,100 30,100
P.O. box / CMRA suppress 700 29,400
Renter / non-owner-occupied 5,800 23,600
Out-of-area + existing customers 2,100 21,500
Roof age clearly not due (young roofs) 4,000 17,500

You went from 40,000 "prospects" to 17,500 real ones. If your budget only covered 18,000 pieces anyway, you did not lose reach, you removed waste and freed the postage that would have hit vacant lots and renters to instead reach due roofs. The expected response per thousand on the clean 17,500 will beat the raw 40,000 handily, and your crews stop knocking five-year-old roofs.

The cost math, spelled out

It is worth putting real dollars on this, because the cleaning effort always looks optional until you cost the alternative. Take the same campaign at a fully loaded ~70 cents per piece (data, design, print, postage, blended).

Scenario Pieces mailed Cost Pieces hitting a deliverable, owner-occupied, due roof
Mail the raw 40,000 40,000 $28,000 ~17,500 (44%)
Mail the cleaned 17,500 17,500 $12,250 17,500 (100%)

Both campaigns put the same number of pieces in front of real, due roofs. One costs $28,000 and one costs $12,250. The cleaning bought you the same reach for $15,750 less, and that is before counting the second-order savings: fewer wasted follow-up calls, fewer crews dispatched to non-existent prospects, and no homeowner getting three duplicate cards. Even if cleaning tools and a few hours of labor cost you a few hundred dollars, the return is not close. This is why the operators who treat list hygiene as overhead lose to the ones who treat it as the campaign.

There is a subtler win, too. A cleaner list raises your response rate as well as lowering your cost, because the denominator (pieces mailed) shrinks while the numerator (real prospects reached) holds. If 17,500 due roofs return 35 booked inspections, that is 2.0 per thousand on the clean list versus 0.875 per thousand if you had spread the same 35 across 40,000 pieces. Your cost per booked inspection drops by more than half. When you report results upstairs, that ratio is what gets the next campaign funded.

Where RoofPredict fits in this workflow

Most of the steps above, CASS, NCOA, dedupe, suppression, are address-hygiene work that a good mail house or list-processing tool already does well, and you should use them for that. Where roofing lists fall down is the relevance layer in Step 8: owner-occupancy is patchy, roof age is usually missing entirely, and storm exposure, when present, is a crude polygon.

That relevance layer is what RoofPredict is built for. It takes a contractor's own list, the one you just cleaned, and enriches each address with two signals that purchased lists do not carry:

  • A roof-age range per address, derived from aerial imagery analysis rather than a guessed install date. The output is an honest band (for example, an estimated 17-23 year range), so you can filter to roofs that are plausibly aging out and skip the ones that clearly are not.
  • Storm physics modeled per roof, not per polygon, so you get an odds that a specific roof took meaningful hail or wind damage given the cell that passed over it, rather than a blanket "everyone in this circle."

Used together with neighborhood density, that lets you rank doors and build routes around the roofs the storm wore out plus the roofs aging out on their own. It is enrichment for the list and CRM you already own, not a lead-buying service and not a replacement for your data hygiene, you still run CASS and NCOA. And the honest limits hold: a roof-age range is a range, not a birth certificate, and a storm score is a probability, not proof of damage. Anyone who sells you certainty on either is selling you something that does not exist. What you get is a sharply better answer to the only question that matters for a roofing mailer: which of these roofs is actually due?

The moment a roofing mailer touches storms and insurance, copy starts drifting into territory that gets contractors fined. Your list can be perfect and your postcard can still get you in trouble. Keep the messaging on the right side of the line, and bake those rules into how you write to a storm-scored list.

Here is the framing that keeps you safe. A roofer may inspect a roof, document damage thoroughly with photos and measurements, and prepare an accurate, Xactimate-aligned estimate to repair the roof. The roofer hands that documentation and estimate to the homeowner. The homeowner files with their insurer, and the insurer decides coverage. That is a legitimate, valuable service and a perfectly good thing to advertise.

What a roofer may not do, for a fee, is negotiate or "handle" the homeowner's claim, interpret their policy or what is covered, or represent the homeowner against the insurance company. In most states that is unlicensed public adjusting, and it is exactly what aggressive storm-chaser mail crosses into.

The do-not-say list for storm mail

When you write to a storm-scored segment, keep these off the postcard, the door-hanger, and the rep's script:

  • "We handle your claim" / "We deal with the insurance company for you."
  • "Free roof" / "You pay nothing" / "$0 out of pocket."
  • "We'll get your claim approved" / any promise of a specific payout or approval.
  • "We waive / absorb / eat your deductible." (Waiving or rebating a deductible is illegal in many states and is insurance fraud framing everywhere.)
  • "Your insurance will cover this" stated as a certainty.
  • Any interpretation of what the homeowner's policy covers.

What you can say instead

  • "Recent storms moved through your area. We provide a free, no-obligation roof inspection and document any damage we find."
  • "If we find storm damage, we give you a detailed, photo-backed repair estimate you can use however you choose."
  • "You decide whether to file with your insurer. We focus on documenting your roof accurately."

Notice the difference. The compliant version sells documentation and an honest estimate, which is real value and which a storm-exposure score helps you target. The non-compliant version sells a claims outcome you are not licensed to deliver. Your storm-modeled list tells you which roofs likely qualify for a closer look; it never tells you a claim will be approved, and your mail should never imply otherwise.

This is more than risk-avoidance. The honest pitch converts better with the kind of homeowner who actually pays their bills, and it keeps you out of the regulatory crosshairs that have shut down storm-chaser operations in several states.

Compliance for the mail itself

Beyond the storm-specific rules, ordinary direct mail carries a few obligations worth knowing.

  • Honor opt-outs. If a homeowner asks to stop receiving your mail, suppress them permanently. Maintain a do-not-mail list and apply it every campaign. This is both good practice and, for some channels, a legal requirement.
  • Phone and text rules are stricter than mail. If your campaign appends phone numbers for follow-up calling or texting, you are in Telephone Consumer Protection Act and Do-Not-Call territory, which is a far heavier compliance load than postal mail. The Federal Trade Commission and the FCC enforce these. Scrub appended phone numbers against the National Do Not Call Registry before any cold calling, and get real consent before texting.
  • Truth in advertising. The FTC's general rule, claims must be truthful and substantiated, applies to roofing mail like everything else. "Roughly 20-year-old roofs in your neighborhood may be nearing replacement" is defensible. "Your roof is damaged and your insurance will pay" is not.
  • Identify yourself. Put a real company name, license number where your state requires it, and a real return address on the piece. Beyond being required in many jurisdictions, it lifts response, because homeowners trust mail from a findable local business over an anonymous postcard.

The mistakes pros make (and how to avoid them)

After enough campaigns you see the same self-inflicted wounds. Here are the ones that cost the most.

Cleaning once and reusing the list for a year. A list decays continuously. Re-run CASS and NCOA before every drop, not once. The incremental cost is small; the stale-mail waste is not.

Deduping before standardizing. If you dedupe raw strings, "142 Birch Ln" and "142 Birch Lane" survive as two records and you mail the house twice. Standardize first, always.

Trusting year_built as roof age. Birth year is when the first roof went on. It misses every re-roof since. A 1998 house that was re-roofed after a 2019 hailstorm has a five-year-old roof, and you do not want to knock it. Imagery-derived wear estimates exist precisely to catch this.

Mailing the whole polygon after a storm. Hail is patchy. Mailing everyone inside a reported hail circle over-mails the lucky houses and dilutes your response rate. Model exposure per roof and rank.

Keeping renters because "more is better." Every renter you mail is a guaranteed zero who still costs full freight. Owner-occupied filtering is one of the highest-return cleaning steps and the most commonly skipped.

No suppression of existing customers. Mailing a customer whose roof you installed last spring a "your roof may be due" card makes you look like you do not know your own book. Suppress your active and recent customers unless the campaign is intentionally for them.

Letting the spreadsheet eat the ZIP codes. Leading-zero ZIPs silently corrupt and fail CASS. Keep ZIP as text, end to end.

No feedback loop. If you do not record who responded, who was already a customer, who returned the mail, and who asked to stop, your next list is exactly as dirty as this one. Cleaning is a cycle, not a one-time event.

Build the feedback loop so the list improves every cycle

The last step is the one that compounds. Every campaign produces data that should make the next list cleaner.

Capture and route these outcomes back into your suppression and scoring:

  • Returned mail (USPS "return service requested"). Print it on the piece. Every returned envelope is an address your data said was good and was not, feed it straight to suppression.
  • Responders. Tag who called, who booked, who closed. Over time this teaches your scoring model what a real prospect looks like in your market.
  • Opt-outs and "stop mailing me." Permanent suppression, no exceptions.
  • Sales-rep field notes. When a crew knocks and finds a brand-new roof your data called "due," that is a correction. When they find an obvious renter, that is a correction. Get those notes back into the database instead of losing them on a clipboard.

Keep a permanent, growing suppression file (opt-outs, returns, known-bad addresses, existing customers) and a permanent seed file of your own addresses and a few colleagues' so you can confirm the drop actually mailed and see what landed. Run both against every future campaign. A roofer who does this for four campaigns has a list that is dramatically cleaner and better-targeted than a competitor buying a fresh raw file each time, at a fraction of the cost.

A one-page checklist you can run

Pin this next to the campaign calendar.

  1. Consolidate all sources into one table; tag source and source_date.
  2. Profile the raw file; record duplicate %, P.O. box %, stale %.
  3. Parse names (household-level greeting is safe) and pre-standardize addresses.
  4. CASS-certify; correct addresses; append ZIP+4; pull DPV no-match and vacant.
  5. Dedupe to one record per household; keep the freshest, owner-named version.
  6. Run NCOALink; update movers; route moved-no-forwarding into re-acquisition.
  7. Suppress: vacants, P.O. boxes/CMRAs, renters, out-of-area, customers, opt-outs.
  8. Append owner-occupancy, a roof-age range, and per-roof storm odds.
  9. Score and rank; mail the most-due roofs first; cut to budget.
  10. Build seed + suppression files; capture returns, responders, opt-outs, field notes; repeat.

Clean the address so the mail lands. Clean the relevance so it lands on a roof that is actually due. Do both, every cycle, and direct mail stops being the channel you blame and starts being the one you scale.

When you are ready to add the roof-age range and per-roof storm signals to a list you have already scrubbed, that is the gap RoofPredict is built to fill, enriching your own list and CRM with which-roofs-are-due intelligence, with the limits stated honestly: a range, not a date, and odds, not proof.

FAQ

How often should I clean my roofing mailing list?

Re-run address hygiene (CASS standardization and NCOALink move-update) before every single drop, not once a year. A meaningful share of households move annually, and ownership records lag occupancy, so a list that was clean three months ago is already decaying. The incremental cost of re-running CASS and NCOA per campaign is small compared to the postage you waste mailing addresses that went stale. Your suppression file (opt-outs, returns, customers) and relevance signals (roof age, storm exposure) should also be refreshed each cycle.

What is CASS certification and do I really need it?

CASS (Coding Accuracy Support System) is the USPS certification standard that mailing software is tested against. Running your list through CASS-certified processing validates each address against current postal data, corrects fixable errors, standardizes formatting, appends ZIP+4 and delivery-point codes, and flags undeliverable addresses. You need it for two reasons: the USPS only grants automation postage discounts on mail carrying a valid CASS barcode, and it is how you learn which of your addresses are actually real before you spend money printing.

They solve different problems. CASS checks whether an address is real, correctly formatted, and deliverable. NCOALink checks whether the person still lives there. NCOALink matches your list against the USPS change-of-address database (roughly the last four years of moves) and returns updated addresses for people who filed a forwarding order, plus flags for those who moved with no forwarding address. Run CASS first to clean the addresses, then NCOA to catch the movers. For roofing, NCOA is especially useful because property records list the owner of record, which often lags who actually lives in the home.

Should I remove renters from my roofing list?

For a residential replacement or storm campaign, yes. A tenant cannot authorize a roof, so every renter you mail is a guaranteed non-responder who still costs full postage and print. If you do not have a clean owner-occupancy field, infer renter likelihood from signals like the owner's tax-mailing address differing from the property address (a landlord pattern), apartment or unit markers in the address, and owner names that are LLCs or property-management entities. Weight these rather than hard-deleting, and append a real owner-occupancy flag when you can.

How do I deduplicate a list pulled from multiple sources?

Standardize first, then dedupe, otherwise duplicates do not match. After CASS standardization, dedupe at the household level by matching on the standardized address plus ZIP+4 and delivery-point code, collapsing all records at the same delivery point to one and keeping the freshest, owner-named version. Then optionally dedupe at the individual level by name plus trusted address. Auto-merge only on identical delivery points; manually review records matched only by name similarity, because aggressive fuzzy matching can wrongly merge two real households like a duplex or adjacent lots.

Can I really know the age of a roof from a mailing list?

Not exactly, and you should distrust any vendor that claims an exact install date. What you can responsibly estimate is a roof-age range from a combination of the home's year built, permit history where available, and aerial-imagery analysis that detects visible wear over time. The honest output is a band, for example an estimated 18 to 24 years, not a precise date. A range is the right unit because shingle service life varies with material, slope, ventilation, sun, and storm history. Year built alone is a weak proxy because it only reflects the first roof and misses any re-roof since.

How should I target a list after a hailstorm without over-mailing?

Do not mail the whole reported hail polygon. Hail is patchy, so a blanket circle over-mails the houses the cell missed and dilutes your response. Instead, model storm exposure per roof: which specific addresses sat under the worst of the cell given hail size, wind direction, and roof characteristics. Treat the result as odds that a given roof took meaningful damage, not proof, and use it as a ranking input alongside roof age and owner-occupancy. Rank the list and mail the highest-exposure, most-likely-due roofs first.

You can say a storm moved through the area, that you offer a free, no-obligation inspection, and that if you find damage you will provide a detailed, photo-backed repair estimate the homeowner can use however they choose, with the homeowner deciding whether to file. What you cannot say, in most states, is that you will handle or negotiate their claim, get it approved, promise a specific payout, waive or absorb their deductible, advertise a free roof, or interpret what their policy covers. Those cross into unlicensed public adjusting or insurance-fraud framing. Sell the documentation and the honest estimate; let the homeowner file and the insurer decide coverage.

Do direct-mail compliance rules apply differently if I add phone numbers?

Yes, and the rules get much stricter. Postal mail is relatively lightly regulated, but the moment you append phone numbers for cold calling or texting, you are under the Telephone Consumer Protection Act and Do-Not-Call rules enforced by the FTC and FCC. Scrub appended numbers against the National Do Not Call Registry before any cold call, and get genuine consent before texting. Penalties for calling and texting violations dwarf anything on the mail side, so treat appended phone data as a separate, higher-risk channel.

How does RoofPredict fit with the cleaning steps I already do?

It sits on top of them, not instead of them. You still run CASS, NCOALink, deduplication, and suppression for address hygiene through your mail house or list tool. RoofPredict adds the relevance layer that purchased lists lack: it enriches your own already-cleaned list and CRM with a roof-age range per address (from aerial imagery, expressed as a band rather than a date) and storm physics modeled per roof (as odds of meaningful damage rather than a blanket polygon). That lets you rank doors and routes around the roofs that are actually due. The limits are stated plainly: a range is not an install date, and a storm score is a probability, not proof of damage.

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. USPS CASS (Coding Accuracy Support System)postalpro.usps.com
  2. USPS NCOALink Move Updatepostalpro.usps.com
  3. USPS Delivery Point Validation (DPV)postalpro.usps.com
  4. U.S. Census Bureau, Geographical Mobility / Migrationcensus.gov
  5. NOAA Storm Prediction Centerspc.noaa.gov
  6. National Weather Service Storm Reports and Warningsweather.gov
  7. Insurance Institute for Business and Home Safety (IBHS), Hailibhs.org
  8. National Roofing Contractors Association (NRCA)nrca.net
  9. Federal Trade Commission, Truth in Advertisingftc.gov
  10. FTC National Do Not Call Registrydonotcall.gov
  11. FCC Telephone Consumer Protection Act (TCPA) Rulesfcc.gov
  12. Texas Department of Insurance, Public Adjusterstdi.texas.gov
  13. USPS Business Mail 101 (Move Update and Addressing)usps.com
  14. RoofPredictroofpredict.com

Related Articles