How to Mine an Old Roofing Customer Database for New Jobs
On this page
Most roofing companies are sitting on a pile of money and treating it like a junk drawer. Every estimate you ever wrote, every repair you ever ran, every homeowner who called once and never booked — they are all still in your CRM, your QuickBooks, that spreadsheet on the shared drive, and the stack of carbon-copy invoices in the filing cabinet. Those people already know your name, already let you on their property, and in many cases already have a roof that is years closer to failing than it was when you last talked. That is the cheapest pipeline you will ever own, and almost nobody works it on purpose.
Mining an old database is not a marketing campaign you run once. It is a repeatable operation: pull the records, clean them, figure out which roofs are actually due now, reach out in the right order with the right message, and book the jobs that fall out. Done well, it produces work in the slow season, lowers your cost per booked job to almost nothing, and gives green sales reps warm doors instead of cold ones. Done sloppily, it gets you TCPA complaints, dead phone numbers, and a sales team that decides "the list is garbage" after two days.
Below is the full playbook — the data hygiene, the scoring logic, the sequences, the scripts, the compliance lines you cannot cross, and a worked 90-day example with real math. The whole thing is built so a two-truck shop and a 40-rep operation can both run it.
Why the old database beats every cold channel
Start with why this is worth your time before the slow season, not during it.
When you buy a shared lead, you are the fourth or fifth roofer to call that homeowner, you are a stranger, and you paid for the privilege. When you knock a cold street, most doors do not need you and the ones that do have no reason to trust the person standing on their porch. When you mail to a purchased list, you are paying postage to reach roofs that were replaced two years ago and roofs that are brand new, because the list has no idea which is which.
Your own database fixes the two most expensive problems in roofing sales at once: trust and targeting.
- Trust is already built. A past customer or a homeowner you bid two years ago recognizes your company name. Response rates on warm outreach run far higher than cold — you are reactivating a relationship, not starting one.
- You already paid the acquisition cost. The money to find these people is spent. Marginal cost to reach them again is a stamp or a phone call. That is the lowest cost per touch in your whole operation.
- You have ground truth most lists never have. You know what the roof looked like when you last saw it, what you quoted, what materials are up there, and sometimes the exact install date. No purchased list carries that.
The catch is that the value is buried. A 4,000-record database is mostly noise — duplicates, dead numbers, people who moved, roofs you already replaced and won't touch for 18 years, and a real but small set of homeowners who are due right now. The work is separating the few hundred jobs from the few thousand records. That is the mining.
There's a timing edge here too. A roof doesn't fail on a schedule, but it does cross a threshold — the point where a homeowner stops thinking "it's fine" and starts thinking "I should probably deal with this." If you are the roofer who shows up, by name, right as that thought forms, you win the job before they ever pull out their phone to search. Get there late and you're back to being one of three quotes a stranger collects. Mining your database well is largely about reaching people in that window — and because you can compute roughly when each roof enters it, you can plan your outreach around it instead of mailing the whole list and hoping.
What "old database" actually means — inventory your sources first
Before you score anything, you have to find everything. Most shops dramatically undercount what they have because it lives in five places. Pull from all of them:
| Source | What's in it | Why it matters |
|---|---|---|
| CRM (JobNimbus, AccuLynx, Leap, etc.) | Estimates, jobs, statuses, contact info | Your richest source; has stages and notes |
| Accounting (QuickBooks, etc.) | Everyone who ever paid you | Confirmed customers, real addresses |
| Email / phone | Inbound inquiries that never became records | The leakiest bucket — calls that never got logged |
| Old spreadsheets & door-knock apps | Canvassing lists, event leads, expo sign-ups | Often forgotten entirely |
| Paper | Carbon invoices, written estimates, the filing cabinet | Older than your software; the oldest roofs live here |
The paper and the pre-CRM spreadsheets are where the oldest roofs hide — and a roof you installed 14 years ago on paper is a more interesting prospect today than one you quoted last month. Budget a day to digitize the relevant paper into a single column-matched export.
Get everything into one flat file (CSV) with consistent columns. You are not building a database cathedral; you are building one clean list you can score and work. Aim for these columns at minimum:
- Full name, property address (street, city, state, ZIP), mailing address if different
- Phone(s), email(s)
- First contact date, last contact date
- Record type (unsold estimate / repair customer / full-replacement customer / inbound-only / canvass)
- Last known roof work (what you did or quoted, materials, date)
- Quoted amount and won/lost status
- Free-text notes
The three buckets hiding in your records
Every roofing database sorts into three buckets, and each one gets worked differently. Mixing them is the most common mistake — a script that works on a past customer sounds insane to someone you bid once and never heard from again.
Bucket one: unsold estimates (the bid graveyard)
These are homeowners you walked, measured, and quoted — who did not buy. This is usually the biggest and most overlooked bucket. People assume a lost bid is dead. It is not. A homeowner who got three quotes two years ago, picked the cheapest, and got a bad job — or got scared off by price and did nothing — still has that aging roof. You already have their measurements and your old number on file. The roof is two years older and the price of doing nothing has gone up.
Sort the bid graveyard by age of the estimate and age of the roof at the time you quoted. A roof you called "15-plus years, recommend replacement" three years ago is now an 18-year roof that someone else either fixed or didn't. Either way it is worth a touch.
Bucket two: past customers (the people who already paid you)
Split this in two, because the timeline is completely different:
- Repair customers. You did a small job — a few squares, a leak, some flashing. The rest of that roof is the same age it was, and a repair is frequently a signal the whole system is near end of life. These people liked you enough to pay you. Many are due for the full replacement now and would never think to call because they think the repair "fixed it."
- Full-replacement customers. You put a whole new roof on. That homeowner is not buying another roof for a long time on a standard asphalt system. But they are your best referral and maintenance asset, and if they moved, the new owner inherited a roof with a known install date — a clean record you can market to.
Bucket three: orphaned and dead-weight records
Inbound calls that never got a real record, expo badges, duplicates, people who moved, wrong numbers, and roofs you already replaced and won't touch for nearly two decades. Most of this is noise. A slice of it (the moved-out full-replacement homes, the never-followed-up inbound calls) is gold. You will surface that slice during cleaning and scoring; the rest you suppress so you stop paying to reach it.
Step one: clean the data before you spend a dollar
Do not skip this to "get to the selling." Every dirty record you mail or dial costs money and, on the phone side, can cost you a TCPA problem. Cleaning is where the list goes from "garbage" to "asset."
Consolidate into one file
Export all sources to CSV and stack them. Tag each row with its origin so you know later whether a record came from QuickBooks (confirmed payer) or an old canvass sheet (unverified). Origin tagging also tells you confidence — a QuickBooks record is far more reliable than a name scrawled on an expo list.
De-duplicate by address, not by name
This is the single most important hygiene rule and the one people get wrong. The roof belongs to the address, not the person. Names change (marriage, divorce, the homeowner died, the property sold). Roofs don't move. De-dupe and key everything on a normalized property address.
Normalize before you match: standardize "Street/St/St.", "Avenue/Ave", directionals (N/North), unit formats, and ZIP+4 where you can. A free pass through USPS address standardization (or a cheap validation tool) collapses "123 N. Main St" and "123 North Main Street" into one record. Otherwise you will mail the same roof twice and call it three times.
When two records share an address, keep the richest one and merge the notes. If the name differs, flag it — a name change at a known address often means the property sold, which is its own opportunity (new owner, known roof history).
Standardize the fields that matter
At minimum, force these into a consistent format:
- Roof event date — install or last-major-work date, real or estimated, even if it is just "~2011." This is the spine of your scoring.
- Record type — the three buckets above.
- Last-quoted roof age — what you assessed the roof at when you last saw it ("12–15 yr"). Keep it as a range; you were eyeballing it, not coring it.
- Last contact date and outcome (lost on price, ghosted, did the repair, full replacement, etc.).
Validate contactability and scrub the legal list
Before any outreach, clean the contact data and clear the compliance hurdles:
- Mail: run a National Change of Address (NCOA) update. People move; NCOA tells you who and where they went. This both kills wasted postage and creates opportunity — a homeowner who moved means a new owner at the old roof.
- Phone: validate numbers (line type, disconnected status) and — critically — scrub against the National Do Not Call Registry and your own internal do-not-contact list. More on the legal side below; it is not optional.
- Email: validate syntax and run a deliverability check so you are not torching your sending reputation on dead inboxes.
Score data confidence honestly
Give every record a simple confidence tag — High (confirmed payer, validated phone/address), Medium (old estimate, address validates, phone unverified), Low (paper scrap, no contact validation). You will spend your phone and door effort on High and Medium, and your cheap mail on the rest. Don't let a sales rep burn an afternoon dialing Low-confidence junk and then declare the whole list dead.
One more cleaning habit that pays off later: capture why each record went cold the first time, in a single coded field. "Lost on price," "went with a cheaper bid," "insurance fell through," "never answered," "wanted to wait a year." Those reasons drive your message. The homeowner who said "let me wait a year" three years ago is a different conversation than the one who went with the lowest bidder — and you can only personalize at scale if the reason is a field you can filter on, not a sentence buried in free-text notes you'll never read again. Spend the extra minute coding it now and your sequences write themselves.
Step two: score who is actually due now
A clean list is still just a list. Mining means ranking it so your team works the most-likely-to-buy roofs first. Three signals do almost all the work. None of them is certain on its own; together they tell you where the jobs are.
Signal one: time since you last touched that roof
The simplest, most reliable signal you already own. A homeowner whose roof you replaced 3 years ago is not buying. A homeowner you quoted 3 years ago and lost is very interesting — the roof aged, their last roofer may have flaked, and the cost of inaction climbed. Compute, per record:
- Years since the estimate (for the bid graveyard)
- Years since the repair (for repair customers — a 7-year-old repair on a roof that was already 12 means a ~19-year roof today)
- Years since the full replacement (for replacement customers — high number = approaching the back half of a standard asphalt life or a referral/resale play)
Signal two: roof age you can actually verify
Time-since-contact is a proxy. The real driver is roof age, and the honest version of roof age is a range, not a date. Even a perfect install record gives you a date for that work — it doesn't tell you whether a previous owner re-roofed before you ever showed up, or whether a section got redone.
For the bid graveyard especially, you wrote down a roof-age estimate when you quoted. Add the elapsed years. "12–15 years" assessed in 2021 is "15–18 years" in 2026 — squarely in the replacement conversation for asphalt. For records where you never assessed the roof (inbound-only, canvass), you have no age signal from your own files, and that is exactly where outside roof-age data earns its keep (next section).
Keep the honesty discipline: a roof age is a window, not a birthday. You are ranking probabilities, not making promises.
Signal three: storm exposure on that specific roof
Age tells you a roof is wearing out from time. Storms tell you a roof may have been worn out faster than its age suggests — or knocked into replacement territory by a single event. The two stack.
Here is the part most shops get wrong: a county-wide hail alert or a ZIP-level swath map is not storm exposure on a roof. Hail falls in narrow, uneven streaks; wind funnels down some streets and skips others. The home two doors down can take a beating while the one on the corner is fine. So the question is not "did it hail in this ZIP" — it is "what did the storm actually do to this address."
When you can pin storm history to the specific home — dated hail and wind events at that property — you can prioritize the records where age and impact line up. Those are your strongest re-roof conversations, and (handled correctly) the ones where a homeowner may have storm damage worth documenting. Stay disciplined on what you can claim: storm history points you at roofs to look at, not at guaranteed damage or a guaranteed claim. We will draw that line sharply in the claims section.
Combine the three into a priority score
You do not need data science. A transparent additive score a sales manager can explain in one sentence beats a black box. Example:
| Factor | Points | Logic |
|---|---|---|
| Roof age 18+ yr (verified or estimated) | 40 | Prime replacement window for asphalt |
| Roof age 14–17 yr | 25 | Worth a touch; aging in |
| Roof age 10–13 yr | 10 | Long-cadence nurture only |
| Repair customer (rest of roof untouched) | +15 | Whole system likely near end of life |
| Lost-on-price estimate, 2+ yr old | +15 | Roof aged, prior roofer may have flaked |
| Dated hail/wind event at this address since last contact | +20 | Age + impact = strongest conversation |
| Moved out (NCOA) — new owner at old roof | +10 | Fresh prospect, known roof history |
| High data confidence (validated contact) | +5 | Reachable, lower waste |
Sort descending. The top decile is your call-and-knock list this week. The middle is mail. The bottom is suppressed or held for a long, cheap nurture. Re-score quarterly, because age and storms keep moving — a record that scored 30 last year may cross 50 this year just by aging and catching a storm.
A word on calibrating the weights: the numbers above are a starting point, not gospel. Run your first cycle, then look at what actually converted. If 18-plus-year roofs booked at three times the rate of 14-17 year roofs, widen the gap. If storm records closed cold, dial that factor down for your market. The score is a tool to put your team on the right roofs first — let your own close data tune it. The one rule that holds everywhere: never let a single factor alone trigger a knock. A roof can be 20 years old and freshly replaced by someone else; a storm can clip a ZIP and miss a street. The score exists precisely because no one signal is trustworthy alone, and stacking them is what separates a real prospect from a wasted drive.
Where RoofPredict fits: re-grading the list without driving every roof
Here is the honest gap in everything above: your own files only carry roof age where you assessed it. For the inbound-only records, the old canvass names, the homes that sold to new owners, and frankly any record older than your memory of the roof, you are scoring half-blind. You could re-drive every address to eyeball the roof — that is days of windshield time you don't have — or you could pull the missing signal from data.
That is the specific job RoofPredict does. You hand it your cleaned, de-duped address list; it returns, per address, a roof-age range from aerial imagery and the storms that actually hit that specific roof — hail and wind modeled house by house, not a ZIP-level swath. In other words, it fills in Signals two and three on the records where your own files go dark, and it does it across the whole list at once instead of one drive-by at a time.
What that changes in practice: the bid graveyard gets re-graded (a roof you quoted at "12–15" five years ago gets a current read), the inbound-only and canvass records finally get an age signal they never had, and the moved-out homes get scored on the roof rather than on a stale relationship. You point the truck at the top of the re-scored list instead of guessing.
The honest limits, because a tight trade compares notes: roof age comes back as a range, not a birthday — aerial imagery can't tell you a previous owner re-roofed in a way that isn't visible, so treat it as a strong probability, not proof. Storm history is odds, not a guarantee of damage — it tells you which roofs to go look at, not which ones have a claim. It does not measure the roof (that's an EagleView/HOVER job) or read shingle brand. Used for what it is — a way to rank your existing list by which roofs are due — it turns a static database into a ranked work order without you driving a single street to find out.
Step three: build the reactivation sequences
Now you work the ranked list. Different buckets need different sequences, cadences, and channels. The unifying rule: lead with their roof, not your promotion. Nobody re-engages with "we're running a spring special." They re-engage when you tell them something specific and true about their roof.
Sequence A — unsold estimates that went quiet (warm)
These people invited you out once. You have history. Reference it.
- Touch 1 — Mail or email (specific). "When we looked at your roof in [year], we estimated it had about [X] years left. That puts it around [current range] now." One clear next step: a no-charge current look. No coupon language.
- Touch 2 — Phone (if DNC-clear), 4–7 days later. Reference the prior visit by name and address. "I'm following up on the estimate we did for you in [year] — wanted to see how the roof's holding up."
- Touch 3 — Mail, ~2 weeks later. A simple before/after or a one-line note that the roof is now in the window where small problems turn into deck damage.
- Touch 4 — Email/text, ~3 weeks. Last warm touch, then drop to long-cadence nurture (quarterly) if no response.
Sequence B — past repair customers (hot)
They already paid you and trusted you. The angle is the rest of the roof.
- Touch 1 — Phone first. These warrant a human call. "We fixed [the valley / that leak] back in [year]. The patch is holding, but the rest of the roof has kept aging — it's around [range] now. Want us to come give the whole thing a current look, no charge?"
- Touch 2 — Mail, days later if no answer. Photo of their repair if you have it; it proves you're real and you remember them.
- Touch 3 — Text/email, ~2 weeks. Light maintenance framing.
Sequence C — storm-stalled records (event-triggered)
For records where dated storm history lines up with an aging roof, or where a homeowner started down a storm path with you and it fizzled. This is the highest-value bucket and the one with the most legal landmines. Read the compliance section before you send a word.
- Touch 1 — Mail/email, factual. "Our records show your roof took a hail event on [date], and it's now around [age range]. We'd be glad to come document the roof's current condition so you have it on file." You are offering documentation, not a claim.
- Touch 2 — Phone (DNC-clear). Offer a free inspection and a written assessment they can keep.
- Touch 3 — Mail. Reinforce the free, no-obligation inspection.
Sequence D — full-replacement customers (referral + maintenance, low cadence)
They don't need a roof. They are your reputation engine.
- Annual maintenance check offer (gutters, sealant, a quick look) that keeps you on the roof and top of mind.
- Referral ask after any positive touch — a happy 5-year customer is the cheapest new lead you'll ever get.
- Resale watch: if NCOA shows the home sold, the new owner is a fresh prospect at a roof with a known install date — market to the address.
Sequence E — inbound-only records (the leakiest bucket)
These are the people who called once, asked a question, and never became a real record — no estimate, no job, often just a name and number scrawled on a message pad. Most shops never follow up because there's nothing to reference. But these are warm: someone who calls a roofer is rarely idly curious about their roof. Pull a roof-age read on the address (you have no assessment of your own), and if the roof is aging in, reach out as a courtesy: "You called us a while back about your roof — we never connected, and I wanted to follow up. We can come give it an honest look, no charge." Low effort, and a surprising number of these were people who got busy, called nobody else, and still have the same aging roof.
Cadence and channel rules that actually matter
- Match channel to confidence and bucket. Hot/High-confidence records earn a phone call. Warm records get mail + email. Low-confidence records get cheap mail only.
- Multi-touch beats one-and-done. A single postcard is a coin flip. A coordinated 3–4 touch sequence across channels is where reactivation actually happens. Plan the whole sequence up front, not touch by touch.
- Space touches 4–14 days apart. Tight enough to be a campaign, loose enough not to be a nuisance.
- Always honor opt-outs instantly, on every channel. One "stop" = suppressed everywhere, permanently.
The compliance lines you cannot cross
Mining a database means contacting real people, and roofing outreach runs into three bodies of rules. None of this is legal advice — get your own counsel — but you have to know the lines exist.
Phone (TCPA + Do Not Call). Before any call or text:
- Scrub the list against the National Do Not Call Registry and your internal do-not-call list. An established business relationship (a past customer or recent inquiry) can create a limited exemption window, but it is narrow and time-bound — do not assume it covers a 6-year-old estimate.
- Texting is heavily regulated. Marketing texts generally require prior express written consent. "I have their number from an old job" is not consent. Be very conservative with SMS to old records.
- Honor opt-outs immediately and keep records that you did.
Mail. The least regulated channel and your workhorse for old records — but still:
- Avoid deceptive or government-mimicking mailers; the FTC and many states police roofing solicitations, especially post-storm.
- Some states require specific disclosures on roofing solicitations after a declared disaster. Know your state.
Storm and insurance claims (the big one). This is where roofers get themselves in real trouble, and it deserves its own line below.
Storm records: capture the intent, stay on the right side of the line
The storm-stalled bucket is tempting to oversell, because a homeowner with an aging roof and a real hail event may genuinely have damage worth a carrier's attention. But there is a hard legal line between documenting a roof and handling a claim, and crossing it is unlicensed public adjusting in many states — a real enforcement risk, not a technicality.
What you may do, and what your outreach should offer:
- Inspect and document the roof's current condition with dated photos and notes.
- Write an accurate, Xactimate-aligned estimate for the repair or replacement scope you would perform.
- State the facts about your own scope of work.
- Hand the homeowner the documentation so they have it on file.
The homeowner files. The insurer decides coverage. You document the roof. Keep that division and you are on solid ground.
The do-not-say list — for your mailers, your scripts, and every rep on the phone:
- Do not say you'll "get the claim approved," "handle," "manage," "negotiate," or "fight the adjuster."
- Do not promise a payout, an approval, or "maximize the settlement."
- Do not say anything about the homeowner's deductible — not waived, not absorbed, not covered. In many states that is fraud.
- Do not advertise a "free roof," and do not call yourself a claims "specialist" or public adjuster.
The safe, honest frame in the field: "We'll document your roof thoroughly and give you a written estimate you can keep. If you decide to file, that's between you and your insurance company — they make the coverage call, not us." That captures the homeowner's real intent ("is my storm-aged roof something I can do something about?") and answers it on the side of the line you're allowed to stand on.
Scripts and message templates
Real copy beats theory. Adapt these to your voice; keep them specific and short.
Bid-graveyard mailer (Sequence A, Touch 1):
[Homeowner name] — back in [year], we gave you an estimate on the roof at [address] and figured it had roughly [X] years left. That puts it around [current range] now, which is right when small problems start turning into deck and interior damage. We'd be glad to come take a current look at no charge and tell you honestly where it stands — no pressure either way. — [Company], [phone]
Repair-customer call (Sequence B, Touch 1):
"Hi [name], this is [you] with [company] — we fixed [the leak / that valley] for you back in [year]. Just calling to check in: that repair holding up okay? ... Good. Here's why I'm calling — the patch is fine, but the rest of that roof has kept aging right along, and it's getting into the range where it's worth a full look. We're out in your area; can I have someone swing by and give you an honest read on the whole roof, no charge?"
Storm-record mailer (Sequence C, Touch 1 — compliant):
[Name] — our records show the roof at [address] is now around [age range], and the area took a hail event on [date]. We'd be glad to come document the roof's current condition and leave you a written assessment for your files. If there's storm damage, you'll have it in writing to do with as you choose — the decision and any insurance filing are entirely yours. — [Company], [phone]
Referral/maintenance touch (Sequence D):
"Hi [name], [you] with [company]. We put your roof on back in [year] — wanted to make sure it's still treating you well. We're doing free maintenance look-overs for past customers this month; want us to add you to the list? And if you know a neighbor whose roof has seen better days, send them our way — we take good care of our referrals."
Step four: measure cost-per-booked-job, not vanity numbers
Database mining lives or dies on the right metric. Open rates and "impressions" are noise. Track the chain that ends in cash:
| Metric | What it tells you |
|---|---|
| Records worked | Denominator for everything |
| Response rate (replies/calls back) | Is the message and targeting landing? |
| Inspections booked | Real top-of-funnel |
| Inspections → estimates | Are the roofs actually due? (validates your scoring) |
| Estimates → signed jobs | Close rate on warm pipeline |
| Cost per booked job | The number that matters |
| Revenue per record worked | Tells you what the database is worth |
The whole point of mining your own list is that cost per booked job should be a fraction of a purchased lead. Your only real costs are postage, a little phone time, and the inspections themselves. If you spend $1,200 mailing and dialing 600 records and book four re-roofs at $11,000 average, that's $300 cost per booked job against $44,000 in revenue. Compare that to paying $50–$300 per shared lead that four competitors also bought. Track it record by record so you can prove which buckets and which scores pay — and double down there next quarter.
A worked example: 90 days on a 3,000-record database
Make it concrete. A regional residential roofer pulls everything together and ends up with 3,000 raw records.
Cleaning (week 1).
- De-dupe by address: 3,000 → 2,450 unique properties.
- NCOA: 280 moved (flag the old addresses as new-owner prospects; update the movers' addresses).
- Phone validation + DNC scrub: 1,900 with a usable phone; 1,100 of those DNC-clear or covered by a recent established relationship.
- Suppress roofs replaced by them in the last 8 years: removes 360 from active outreach.
- Net workable: ~2,090 properties.
Scoring (week 1–2). Run the address list for roof-age range and per-address storm history, layer it onto the bucket and time signals, and apply the priority score:
- Top decile (~210 records), score 50+: aging roofs (18+ yr) with storm exposure or 2+ year-old lost bids. Phone + door, this week.
- Middle (~900), score 25–49: aging-in roofs, repair customers, warm bids. Mail + email sequence.
- Bottom (~980), score <25: newer roofs, low confidence. Quarterly nurture or suppressed.
Working it (weeks 2–12).
- Top 210 get a call + a knock + a mailer over three weeks. Say 30% reachable-and-receptive → 63 inspections booked; 70% of those produce an estimate → 44 estimates; 35% close → ~15 jobs.
- Middle 900 get a 3-touch mail/email sequence. Say a 4% response → 36 inspections → ~25 estimates → 30% close → ~7–8 jobs.
- Movers and new-owner addresses fold into the mail program for a long play.
The math.
- ~22–23 booked re-roofs from a 90-day push on records you already owned.
- At an $11,000 average, that's roughly $240,000–$250,000 in signed work.
- Direct outreach cost: postage on ~1,100 mail pieces (multi-touch), phone time, and inspection labor — call it $4,000–$6,000 all in.
- That is a cost per booked job under $300 against jobs worth eleven grand each — numbers no purchased-lead channel can touch.
The percentages above are illustrative, not a promise — your buckets, market, and close rate will move them. The point is the shape: a few hundred dollars of effort per booked job, from people who already know your name, while everyone else is paying per lead to fight over strangers.
Common mistakes that quietly kill database mining
- Treating the whole list as one list. Past customers, lost bids, and inbound-only records need different messages. One generic blast gets one generic (low) response.
- De-duping by name instead of address. You will double-mail roofs and miss that a property sold. Key on the roof's address.
- Skipping the DNC/TCPA scrub to "move fast." This is how a database-mining campaign turns into a complaint and a fine. Scrub first, always.
- One touch and quitting. Reactivation is a sequence. Most responses come on touch two, three, or four — shops that send one postcard and conclude "the list is dead" never gave it a chance.
- Leading with a coupon instead of their roof. "Spring special" is noise. "Your roof is now around 18 years" is a reason to call back.
- Selling claims you can't legally sell. Promising approvals, payouts, or a waived deductible on a storm mailer is the fastest way to turn a good campaign into a legal problem. Document, don't adjust.
- Scoring once and never again. Roofs age and storms hit. A record that scored low last year may be a prime job this year. Re-score quarterly.
- Letting reps "cherry-pick" the list. Give them the ranked list and have them work it top-down. A ranked list is the whole value; freelancing throws it away.
Choosing tools without overbuilding
You do not need a big tech stack to mine a database. You need, in rough order:
- One clean export. Your CRM plus QuickBooks plus the spreadsheets, stacked into a CSV. This is free and it is most of the battle.
- Address standardization + NCOA + DNC scrub. USPS tools and inexpensive list-hygiene services cover this. Non-negotiable before outreach.
- Roof-age + per-address storm data to re-grade the records where your own files are blind. This is the piece that turns a contact list into a ranked work list — it is the specific gap RoofPredict fills, and the alternative is driving every street yourself.
- A way to run multi-touch sequences. Most modern roofing CRMs (JobNimbus, AccuLynx, Leap) do mail/email/task sequencing; if yours doesn't, a basic email tool plus a printed-mail vendor plus a call list works fine.
- A simple tracking sheet that ties each booked job back to the record and the bucket, so you know what's paying.
Resist the urge to buy more than that. The database is the asset. Tools just help you work it faster.
A repeatable quarterly mining engine
The shops that win with this stop treating it as a one-off and make it a rhythm. A simple quarterly loop:
- Refresh the export — pull any new lost bids, completed repairs, and inbound calls from the last 90 days into the master file.
- Re-clean — NCOA and DNC scrub again (people move and register constantly).
- Re-score — every roof is 90 days older; pull fresh roof-age and storm data so records that crossed the threshold surface to the top.
- Work the top tier — phone and door the new high scorers, mail the middle.
- Measure — update cost-per-booked-job and revenue-per-record; note which buckets paid.
- Feed it back — today's lost bid is next quarter's warm record, so log everything cleanly the first time.
Run that loop four times a year and your database stops being a junk drawer and becomes a pipeline you own — one that produces work in the slow season, gives new reps warm doors instead of cold streets, and costs a fraction of every channel where you're a stranger paying to fight over the same homeowners as everyone else.
You already did the hard part: you earned these relationships and met these roofs. The roofs kept aging whether you called or not. Mining the database is just going back for the jobs you already half-won — and being the roofer who shows up first, by name, with something true to say about their specific roof. If you want the ranking step done across your whole list without driving every address, that is exactly what RoofPredict is for: hand it your cleaned addresses, get back which roofs are due, and point your crew at the top of the list.
FAQ
How old does a customer database need to be before it's worth mining?
Any database with records older than about two to three years is worth mining, and the older the better. The value is in roofs that have aged into the replacement window since you last talked. A lost bid from five years ago where you assessed the roof at 12-15 years is now an 18-20 year roof — a prime conversation. Even a 10-year-old paper file can hold roofs that are clearly due now.
Should I de-duplicate my list by name or by address?
Always by normalized property address. The roof belongs to the address, not the person — names change through marriage, divorce, death, and sale, but the roof stays put. De-duping by name double-counts roofs and hides the most useful signal of all: when a name changes at a known address, the property likely sold, which makes the new owner a fresh prospect at a roof with a known history.
Can I legally call or text old customers from my database?
Calling and texting are governed by the TCPA and the Do Not Call rules, so you must scrub against the National Do Not Call Registry and your internal do-not-call list first. An established business relationship can create a limited, time-bound exemption for past customers, but it is narrow — do not assume it covers a six-year-old estimate. Marketing texts generally require prior express written consent, which an old phone number on a job ticket does not provide. Honor every opt-out immediately and keep records. This is not legal advice; consult counsel for your state.
What's the difference between mailing my own database and buying a mailing list?
Your own database carries trust and ground truth a purchased list never will — these people know your name, you've been on the property, and you often know what the roof was when you last saw it. A purchased list is strangers with no roof-age signal, so you pay postage to reach new roofs and replaced roofs alike. Mining your own list also costs nothing to acquire, since you already paid to win those relationships.
How do I figure out which roofs in my old database are actually due now?
Score each record on three signals: time since you last touched that roof, the roof's current age as a range (your old assessment plus elapsed years, or an aerial roof-age read for records you never assessed), and whether dated storms have hit that specific address. Roofs in the 18-plus-year window, repair customers whose full roof kept aging, and aging roofs with a real storm event score highest. Rank the list and work it top-down.
My files only have a roof age where I personally assessed it. How do I score the rest?
That's the common gap — inbound-only records, old canvass names, and homes that sold to new owners have no roof-age signal in your files. Your options are to re-drive every address and eyeball the roofs, which is days of windshield time, or to pull a roof-age range from aerial imagery across the whole list at once. That second option is what RoofPredict does: hand it your cleaned addresses, get back a roof-age range and per-address storm history, and use it to fill the blanks before you score.
How many touches does it take to reactivate an old roofing customer?
Plan a coordinated three-to-four touch sequence across mail, email, and phone, spaced four to fourteen days apart — not a single postcard. Most responses come on the second, third, or fourth touch, which is why shops that send one mailer and conclude the list is dead never give it a real chance. Match the channel to the record: hot, high-confidence records earn a phone call; warmer records get mail and email; low-confidence records get cheap mail only.
What can I say about storm damage and insurance when I mail old customers?
You can offer to inspect and document the roof's current condition, write an accurate Xactimate-aligned repair estimate, and hand the homeowner that documentation for their files. You cannot say you'll get a claim approved, handle or negotiate it, promise a payout, advertise a free roof, or say anything about the deductible — that crosses into unlicensed public adjusting and, on the deductible, possible fraud in many states. The safe frame: you document the roof, the homeowner files, the insurer decides coverage.
What's a realistic cost per booked job from database mining?
Far below a purchased lead. Your only real costs are postage, a little phone time, and the inspections you run — there's no per-lead fee because you already own the relationships. Shops commonly land cost-per-booked-job in the low hundreds of dollars against re-roofs worth thousands each, versus paying fifty to three hundred dollars per shared lead that several competitors also bought. Track it record by record so you can prove which buckets pay.
How often should I re-work my database?
Run a quarterly loop: refresh the export with the last 90 days of lost bids, repairs, and inbound calls; re-clean with NCOA and DNC; re-score with fresh roof-age and storm data since every roof is now 90 days older and some crossed the threshold; work the new top tier; and measure cost-per-booked-job. Roofs age and storms hit continuously, so a record that scored low last quarter may be a prime job this one.
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) — nrca.net
- Asphalt Roofing Manufacturers Association — Roofing Life & Care — asphaltroofing.org
- Insurance Institute for Business & Home Safety (IBHS) — ibhs.org
- NOAA Storm Prediction Center — Storm Reports — spc.noaa.gov
- NOAA National Centers for Environmental Information — Storm Events Database — ncdc.noaa.gov
- National Weather Service — weather.gov
- FTC — National Do Not Call Registry — donotcall.gov
- FTC — Telemarketing Sales Rule (Business Guidance) — ftc.gov
- FCC — TCPA and Telephone Consumer Protection Rules — fcc.gov
- USPS — National Change of Address (NCOALink) — usps.com
- Texas Department of Insurance — Roof Damage & Public Adjusters — tdi.texas.gov
- National Association of Insurance Commissioners (NAIC) — naic.org
- International Code Council — International Residential Code — iccsafe.org
- RoofPredict — roofpredict.com
Related Articles
Which Suburbs Have the Oldest Housing Stock for Roofing (And How to Find Them)
How to find the suburbs and subdivisions where the most roofs are aging out, using free public data, build-out windows, and a repeatable ranking method, without buying a list you can't verify.
How to Update Old Roofing Leads With Current Roof Condition Data
Your old lead list is sitting on signed-roof money. Here is the practical workflow for re-scoring dead leads with current roof age and storm data, then working the ones worth calling.
How to Measure Roofing Direct Mail Campaign Results (Without Fooling Yourself)
Most roofers track the wrong number on their mailers. Here is how to measure response rate, cost per job, and true ROI on a roofing direct mail campaign the way a sharp operator does.