Roofing CRM Mining: Turn Old Estimates and Past Customers Into Booked Jobs
On this page
Every roofing company is sitting on a pile of money it already paid to acquire. It is in the CRM. It is the 600 estimates you wrote that never closed, the 1,400 repair customers you helped years ago and never called again, the storm leads from three seasons back that went quiet, and the homeowners who told you "not right now" in a year when their roof actually was fine. You spent gas, payroll, ad budget, and ladder time to get every one of those records. Then most of them went cold and stayed cold.
Mining that database is the highest-margin sales motion a roofer has, and almost nobody does it well. The math is brutal in your favor: there is no cost-per-lead, no third party reselling the same homeowner to four competitors, and the people in your CRM already know your truck, your crew, and your name. What follows is a working playbook for pulling jobs out of records you already own. It covers how to clean and segment the data, how to figure out which old estimates and past customers are actually due now, the exact sequences and scripts to run, how to measure it, and the legal and operational traps that quietly kill these campaigns. The goal is simple: stop renting your next job from a lead site when you can pull it out of your own filing cabinet.
Why your CRM out-earns every other channel
The first thing to understand is that a roofing customer is not a one-time event. A roof is a 15-to-30-year asset attached to a person who keeps living in the house, knows neighbors with similar roofs, and will eventually need gutters, a repair, a skylight, ventilation work, or a full replacement. Most roofers treat the relationship as transactional: close the job, cash the check, move on. That habit is why a contractor with 2,000 past customers will still spend $4,000 a month on shared leads to find strangers.
Look at the unit economics honestly. A bought lead from an aggregator costs somewhere in the $30 to $100+ range per lead, not per job, and it is frequently sold to multiple contractors at once. You compete on speed-to-call and price, your close rate sits in the low double digits if you are good, and you have no relationship to lean on. A record already in your CRM cost you nothing today. The homeowner has met you. If they got an estimate from you two years ago, they have your number in their phone. If you replaced a neighbor's roof, you have a referral hook. The acquisition cost is sunk; everything you book is nearly pure contribution margin against your fixed overhead.
There is also a trust gap that no cold channel closes. A homeowner who buys a roof is making one of the larger discretionary purchases of their life, and the dominant emotion is fear of being ripped off. A name they recognize clears that fear faster than any ad. The U.S. Bureau of Labor Statistics tracks roofing as a trade with meaningful demand and turnover; the constant in a high-churn, weather-driven business is that your database is the one asset that compounds while crews, reps, and lead vendors come and go.
So the strategy is not complicated. It is disciplined. The companies that win at this do four things relentlessly: they keep the data clean, they segment it so they call the right people at the right time, they run sequences instead of one-off blasts, and they measure cost-per-booked-job so they keep doing what works. The rest of this breaks each of those down.
The three buckets hiding in your database
Before you touch a phone or a postcard, you have to know what you actually have. Almost every roofing CRM contains three distinct populations, and they need completely different treatment. Mixing them is the most common reason these campaigns flop — you cannot send the same message to someone who never bought and someone who did.
Bucket one: unsold estimates (the bid graveyard)
These are homeowners you inspected and quoted who did not buy from you. This is usually the largest bucket and the most emotionally loaded for owners, because each one represents work your team already did for free. Inside this bucket are several very different situations, and you must split them:
- No-decision / went quiet. They never said no; they just stopped responding. Life got busy, the spouse wasn't on board, the timing was wrong. These are warm.
- Lost on price. They chose a cheaper bid. Worth knowing, because the cheaper roof may now be three years older and the homeowner may have learned a lesson.
- Lost the job to a competitor entirely. They re-roofed with someone else. These are mostly dead for a re-roof but alive for repairs, maintenance, and referrals — and they are excellent records to date so you know roughly when that new roof goes back into the cycle.
- Repair-only quotes that should have been replacements. You quoted a patch, they took it, and the underlying roof was already near end of life. These age into replacements fast.
- Insurance/storm estimates that stalled. They had storm damage, started a claim, and it fizzled — denied, under-scoped, or the homeowner gave up. A new storm or a second look can revive these.
Bucket two: past customers (the people who already paid you)
These are gold and the most neglected. A homeowner who paid you once and was happy is the single warmest prospect in roofing. The bucket splits by what you did:
- Repair customers. You did a $400 to $2,500 fix. The roof that needed a repair is, by definition, aging. A large share of repair customers are 2 to 6 years from a replacement when you meet them.
- Partial / single-slope / supplement jobs. You replaced part of the roof, or did storm work on one elevation. The rest of that roof is the same age.
- Full replacements from years ago. Not due again for a long time, but they are your referral engine and your maintenance/warranty book, and they will eventually need gutters, attic ventilation, or a tune-up.
- Property managers, landlords, and repeat commercial. One relationship, many roofs. These records are worth a phone call every single quarter, not a postcard.
Bucket three: orphaned and dead-weight records
Every CRM accumulates junk: duplicates, bad numbers, renters who moved, addresses that sold, and "leads" that were never real. You are not going to monetize these, but you have to identify and quarantine them so they do not poison your metrics or get you in trouble with do-not-call rules. We deal with this in the data-hygiene section, but flag it now: a meaningful slice of any old database is unworkable, and pretending otherwise wrecks your numbers.
Here is a quick reference for how the buckets differ in approach:
| Bucket | Typical size | Warmth | Primary motion | Lead message |
|---|---|---|---|---|
| Unsold — went quiet | Large | Warm | Call + email/text | "Picking back up where we left off" |
| Unsold — lost on price | Medium | Medium | Call + mail | "Roof's older now; let's re-look" |
| Unsold — storm/insurance stalled | Medium | Warm after a storm | Call, timed to weather | "New storm in your area; worth a re-inspect" |
| Past — repair customers | Large | Hot | Call (named tech if possible) | "Checking in on that repair" |
| Past — old full replacements | Large | Warm | Mail + referral ask | "Maintenance + know anyone" |
| Property managers / repeat | Small | Hot | Direct relationship calls | "Your quarterly walkthrough" |
| Orphaned / dead | Varies | None | Quarantine + suppress | None |
The entire game is matching the right motion to the right bucket. A blast to all of them at once is how you burn a list and learn nothing.
Step one: clean the data before you spend a dollar
Dirty data is where most reactivation campaigns die before they start. You cannot run a clean sequence on records with missing phone numbers, wrong addresses, and unclear history. Plan to spend real time here; it is unglamorous and it is the difference between a campaign that books jobs and one that wastes a week.
Pull and consolidate
Export everything: your CRM, any old spreadsheets, the estimating software, the shoebox of business cards if that is where some of your repair history lives. Roofers commonly have customer history fragmented across an estimating tool, a CRM, QuickBooks, and a canvasser app. Get it into one place — even a single spreadsheet — so you can see the whole picture per address.
De-duplicate by address, not by name
In roofing, the property is the unit of value, not the person. People move; roofs don't. De-dupe on a normalized street address. The same house may appear three times: once as a 2019 estimate, once as a 2021 repair, and once as a 2023 storm lead. Collapsing those into one record tells a story — this homeowner has engaged with you three times and never re-roofed, which makes them a strong target — that you would miss if they stayed as three rows.
Standardize the fields that matter
For each record, you want a minimum viable schema. Do not over-engineer it; these eight fields do almost all the work:
- Normalized property address
- Homeowner name and best contact (phone, email)
- Last interaction date
- Interaction type (estimate / repair / replacement / storm / inquiry)
- Outcome (won / lost-price / lost-competitor / no-decision / quoted-only)
- Dollar value (quoted or paid)
- Roof notes (material, approximate age or install date if known)
- Consent / contact status (OK to call, email opt-in, DNC flag)
Validate contactability
Run phone numbers and addresses through a cheap validation pass. Disconnected numbers, addresses that have since sold (county records and the postal address-change data will tell you), and bounced emails all get flagged. A record where the homeowner sold the house is not dead — it is a new opportunity, because the new owner inherited an aging roof and a prior estimate on file telling you that roof's history. But you treat it as a fresh contact, not a warm one.
Score data confidence honestly
Tag every record High / Medium / Low confidence based on how complete and current it is. You will work High first. Be ruthless: a record with no phone, no email, and a five-year-old address is Low, and you should not let it inflate your "reactivation list size" so you can feel good about a big number. A clean list of 700 is worth more than a dirty list of 3,000.
A realistic outcome of a first cleanup on a 2,500-record database: maybe 1,600 are workable, 600 are Low-confidence salvage projects, and 300 are quarantine. That 1,600 is your campaign. Now you segment it.
Step two: segment by who is actually due now
Cleaning tells you who you can reach. Segmentation tells you who is worth reaching this month. The instinct is to sort by last interaction date and call the most recent first. That is a mistake. Recency tells you who is easiest to reach; it does not tell you whose roof is due. The right sort combines three signals.
Signal one: time since the roof was last addressed
A roof has a life. Asphalt shingle — the dominant residential material — typically runs roughly 15 to 25 years depending on product grade, ventilation, install quality, and climate, per industry references like the Asphalt Roofing Manufacturers Association and the NRCA. That gives you a usable mental model:
- A homeowner you quoted but didn't sell five years ago has a roof that is five years older than it was. If it was 14 then, it is 19 now — squarely in replacement range.
- A repair customer from four years ago had a roof old enough to need a repair. Add four years.
- An old full replacement you did 18 years ago is approaching the back end of its life — that customer is moving from "referral source" back into "prospect."
The key insight that almost every roofer misses: your old estimates appreciate. The bid graveyard gets more valuable every year, because every roof in it ages toward the buy window while you ignore it. An estimate that was premature in year one is ripe in year four.
Signal two: roof age you can actually verify
"Add five years to my old note" is a guess, and your old notes are inconsistent. This is where a lot of CRM mining stalls — you have 1,600 addresses and only vague intuition about which roofs are genuinely near end of life versus which were re-roofed by a competitor and are now young. Calling a homeowner whose roof was replaced two years ago by someone else is a wasted dial and a slightly embarrassing one.
You have a few ways to sharpen this:
- Your own notes, where you recorded material and condition. Inconsistent but free.
- County and assessor records for permits. A re-roof permit pulled after your estimate tells you the house re-roofed — flag it for repairs/referrals, not replacement.
- Aerial-imagery roof-age tooling that estimates a roof's age as a range from overhead imagery, so you can re-grade a stale address without driving to it.
That last one is worth dwelling on because it directly solves the bid-graveyard problem. More on it in the data section below.
Signal three: storm exposure on that specific roof
A roof's calendar age is one driver; what the weather did to it is the other. Two identical 16-year-old roofs three miles apart can be in very different shape if a hail core clipped one and missed the other. Hail and high wind accelerate failure and also open the door to an insurance-supported repair or replacement. The National Weather Service and NOAA's Storm Prediction Center publish storm reports and hail data, and the Insurance Institute for Business & Home Safety (IBHS) documents how hail and wind degrade asphalt shingles. The practical move: when a storm rolls through, your first call list should be the CRM records inside that storm footprint — especially the stalled-insurance and went-quiet estimates. You are not cold-calling a neighborhood; you are calling people who already know you, whose roofs you already have on file, in the exact area that just got hit.
Putting the three signals together: a priority score
You do not need data science. A simple weighted score, computed in a spreadsheet, ranks your list well enough to drive a quarter of calling:
| Factor | Points |
|---|---|
| Roof estimated/known to be 18+ years (range) | +30 |
| Roof 14–17 years | +18 |
| Prior interaction was a repair (roof was already failing) | +15 |
| Inside a recent hail/wind footprint | +25 |
| Stalled insurance/storm claim on file | +15 |
| Went quiet / no-decision (never said no) | +12 |
| Lost on price (price-shopper, may now value quality) | +6 |
| Re-roof permit pulled after your estimate (someone else did it) | -40 |
| Address has since sold | reset to "new contact" track |
Sort descending, work top-down. The roofs scoring 50+ are your this-week list. The negatives drop out of the replacement campaign and into the referral/maintenance track. This single sort is what separates a contractor who "called some old leads and it didn't really work" from one who books three jobs off a Tuesday.
Where RoofPredict fits: re-grading the bid graveyard without driving it
The hardest part of the segmentation above is signal two — knowing which of your old addresses actually have a roof that is due now, versus one a competitor already replaced. Your notes are stale, your guesses are rough, and you are not going to drive 1,600 addresses to eyeball shingles. This is the specific problem RoofPredict was built to solve, and it is the natural fit inside a CRM-mining program.
RoofPredict takes a list of addresses — your CRM export works fine — and returns, per house, a roof-age range estimated from aerial imagery plus storm physics modeled on that specific roof: how hail and wind actually loaded that roof, rather than only whether a storm passed through the ZIP. Practically, that lets you do two things you cannot do with your CRM alone:
- Re-grade every stale address. Feed in your unsold estimates and old repair customers. The houses whose roofs now read 18–22 years jump to the top of your call list; the houses a competitor already re-roofed read young and drop out, so you stop wasting dials and stop the awkward call to someone with a two-year-old roof.
- Layer storm reality onto the list. After a hail event, you can see which of your own past contacts had roofs that the storm actually wore on — so your first calls go to homeowners who know you and whose roofs took the hit, rather than a random canvass of strangers.
A few honest limits, because overselling this helps no one. The roof age is a range, not an exact install date — it tells you who is in the buy window, not the day the shingles went on; you still confirm condition with an inspection. The storm model gives you odds, not proof — it points you at the roofs most likely worn out, and the actual damage finding comes from your tech on the ladder, not from a forecast. It does not measure the roof (that is what EagleView, HOVER, and Roofr do — a different job) and it does not read warranty paperwork or pull permits for you. What it does is turn a cold pile of old addresses back into a ranked, current list of which roofs are due — which is exactly the input a CRM-mining campaign is missing. It is not a lead service; the homeowners are already yours. It just tells you which of them to call first.
Used this way, RoofPredict is the bridge between "I have 1,600 old records" and "here are the 180 whose roofs are most likely due this season." The rest of your campaign — the sequences and scripts below — does the converting.
Step three: build the reactivation sequences
A single call or a single postcard is not a campaign; it is a coin flip. Reactivation works on sequences — a planned series of touches across phone, text, email, and mail, spaced over weeks, each with a reason to reach out. Different buckets get different sequences. Here are the ones that earn their keep.
Sequence A: unsold estimates that went quiet (warm)
These people never said no. Your job is to reopen the conversation without sounding like a desperate vendor chasing a sale. The frame is "following up on the roof we looked at," because that is literally true and it is a service frame, not a sales frame.
- Day 1 — Call. Reference the specific prior estimate. "It's been a couple years since we looked at your roof — wanted to check where things landed and whether it's time to take another look." If no answer, leave a real voicemail and send a follow-up text within minutes.
- Day 1 — Text (if you have consent). "Hi [Name], it's [You] at [Company]. We quoted your roof back in [year] — your roof's a couple years older now and I'd be glad to do a quick re-check, no charge. Want me to swing by?"
- Day 3 — Email. Short. The old roof is older; offer a complimentary re-inspection; one clear call to action.
- Day 7 — Call again. Different time of day than the first call.
- Day 14 — Mailed piece. A postcard or letter that references the prior visit and includes a roof-age/condition angle. Mail still works on homeowners, especially older ones who ignore unknown numbers.
- Day 30 — Final call + "close the loop" text. "Don't want to keep bugging you — if now's not the time, no problem, I'll check back next year." That last line books a surprising number of "actually, let's do it" responses because it removes pressure.
Sequence B: past repair customers (hot)
This is the highest-yield sequence in the whole program and the most underused. You have a relationship and a paid invoice. Use it.
- Day 1 — Personal call, ideally from the tech or salesperson who did the original repair. "Hey [Name], [You] from [Company] — we patched that valley/flashing for you back in [year]. Wanted to check it's still holding up and see how the rest of the roof is doing." This call closes at rates a cold lead never touches, because you are calling as the person who already helped them.
- Day 2 — Text recap with an offer for a free maintenance check.
- Day 10 — Email with a seasonal maintenance angle (pre-storm-season or pre-winter check).
- Day 21 — Referral ask, separate from the sale: "Even if your roof's fine, if a neighbor's looks rough, send them my way."
Sequence C: storm-stalled / insurance claims that fizzled (event-triggered)
Do not run this on a calendar. Run it when a storm hits the area. These homeowners started down the road once and stopped.
- Trigger — a hail or wind event in their area. Pull all stalled-storm records inside the footprint.
- Day 1 — Call. "We saw the storm came through your area again. Last time we looked at your roof for storm damage and it didn't get fully resolved — worth me coming back out to document the current condition?"
- Day 3 — Email with a plain-language note: you will inspect and document the current condition; the homeowner files with their own carrier; the carrier decides coverage.
- Day 7 — Call. Tighten the offer to a specific inspection window.
A hard rule on this sequence: keep your language clean. You document conditions and write estimates. You do not handle, file, manage, or negotiate the homeowner's insurance claim, you do not promise approval, and you say nothing about deductibles. The claim stays between the homeowner and their carrier. State insurance regulators and the rules around public adjusting are strict here, and several states treat a roofer acting as a claims advocate as a violation. "We'll document the damage and give you the facts to take to your carrier" is both true and safe. Anything that sounds like "we'll get your claim approved" or "we'll cover your deductible" is neither.
Sequence D: old full replacements (referral + maintenance, low cadence)
Long cadence, light touch, twice a year. A spring "pre-storm-season roof check" and a fall "before-winter check" email or mailer, plus a standing referral ask. These customers rarely buy a roof from you soon, but they generate referrals, gutter and ventilation add-ons, and they re-enter the buy window as their roof ages — and your CRM is the only thing tracking when that happens.
Cadence and channel rules that actually matter
A few hard-won operating rules across all sequences:
- Lead with the phone for warm records. Texts and emails support the call; they do not replace it for someone who already knows you. A real human voice from a name they recognize is the whole advantage.
- Space touches; don't stack them. Five touches over 30 days reads as persistent. Five touches in three days reads as a stalker and gets you blocked.
- Every touch needs a reason. "Just checking in" is weak. "Your roof is two years older," "a storm came through," "it's pre-winter," "we're in your neighborhood Thursday" — these are reasons.
- Always offer the off-ramp. "If now's not the time, I'll check back next year" keeps the record warm instead of burning it.
- Log every outcome the same day. A sequence is only as good as the notes it generates. We get to measurement next.
Scripts and message templates
Reps freeze on reactivation calls because it feels like admitting the first attempt failed. Give them words. Here are tested frames you can adapt — keep them conversational, not read-aloud robotic.
Voicemail, unsold estimate (keep under 20 seconds): "Hi [Name], it's [You] with [Company]. We looked at your roof back in [year] and I wanted to follow up — your roof's a few years older now and I'd be happy to do a quick no-cost re-check. Give me a call back at [number], or I'll try you again later this week. Thanks, [Name]."
Text, repair customer: "Hi [Name], [You] from [Company]. We fixed that [leak/flashing] for you in [year] — just checking it's holding up. Happy to do a free once-over on the whole roof while I'm in the area. Want me to stop by this week?"
Email subject lines that get opened: "Quick check on your roof, [Name]" / "Your roof is [X] years older now" / "Following up from [year] — your roof" / "Storm came through [neighborhood] — worth a look?"
Reactivation email body (unsold): "Hi [Name] — a while back, in [year], we came out and put together an estimate for your roof. Roofs don't get younger, and yours is a few seasons older now, so I wanted to offer a complimentary re-inspection. No pressure and no charge — I'll document the current condition and give you a straight answer on where it stands. Reply here or call [number] and I'll find a time that works. — [You], [Company]."
Storm re-engagement, claims-safe language: "We're back in [neighborhood] after the recent storm. We'll inspect your roof, document any storm damage with photos, and give you the report. If there's damage, you take that to your insurance carrier — they decide coverage, and the claim is always between you and them. We're just the ones who put the facts in your hands."
The off-ramp line, every sequence: "And if the timing's not right, totally fine — I'll make a note to check back with you next year. I just didn't want your roof to be the one nobody followed up on."
Notice what these never do: they never promise an insurance outcome, never mention a deductible, never claim a roof is damaged before an inspection, and never present a storm forecast as proof of damage. They offer a re-look and put the homeowner in control. That keeps you out of trouble and, not coincidentally, makes you sound trustworthy.
Step four: measure cost-per-booked-job, not vanity numbers
Reactivation campaigns die when nobody can prove they worked. "We called some old leads" is not a result. Track a tight funnel per campaign so you know what to repeat. The metrics that matter:
| Metric | What it tells you | Healthy direction |
|---|---|---|
| Workable records contacted | Reach | Higher = list is contactable |
| Connect rate (live conversation) | Data quality + call effort | 25–40% of dials over a sequence |
| Re-inspection booked rate | Offer strength | % of connects who say yes |
| Inspection-to-estimate rate | Roof actually due | High here validates your scoring |
| Estimate-to-close rate | Sales execution | Compare to your cold close rate |
| Cost per booked job | The only number that matters | Should crush your bought-lead CPL |
| Revenue per 100 records | Database value | Track over time to prove the asset |
The single most important comparison is cost-per-booked-job from reactivation versus cost-per-booked-job from bought leads. Reactivation has almost no media cost — it is payroll time on the phones plus some postage. If a rep spends a week on the priority list and books four re-roofs, the cost per job is a fraction of a season of aggregator leads, and you will see it in black and white once you track it. That number is what gets an owner to make CRM mining a permanent weekly habit instead of a one-time "let's clean up the old leads" project.
Two measurement traps to avoid. First, do not measure on first touch. A sequence pays off on touch three to five; if you judge it after the day-one calls you will quit too early. Second, attribute referrals back to the campaign. A maintenance call to an old replacement customer that produces no job but a neighbor referral that closes is a win for the campaign, and if you only count direct closes you will undervalue the past-customer bucket and stop calling the people who feed you referrals.
A worked example: 90 days on a 2,500-record database
To make this concrete, here is a realistic run on a mid-size residential roofer's database. Numbers are illustrative — your mileage varies with market, season, and execution — but the shape is what to expect.
Starting database: 2,500 records across five years.
After cleanup: 1,600 workable, 600 low-confidence, 300 quarantined. De-duped by address; 240 records collapsed into existing properties (multiple interactions per house).
After segmentation and scoring: Re-grading roof age across the workable list (notes + permits + aerial roof-age ranges) surfaces 410 properties scoring 50+ — roofs likely in the buy window. Of those, 120 are unsold-quiet estimates, 140 are past repair customers, 60 are storm-stalled, 90 are old replacements aging back in. A separate flag drops 70 addresses that pulled re-roof permits after your estimate (someone else did it) into the referral track.
Campaign execution over 90 days:
- Repair-customer sequence (140 records, hot): high connect rate, named-tech calls. Books ~22 re-inspections, ~14 estimates, closes ~6 jobs (mix of re-roofs and large repairs).
- Unsold-quiet sequence (120 records, warm): books ~16 re-inspections, ~11 estimates, closes ~4 re-roofs.
- Storm-stalled sequence (60 records, fired after a real hail event): books ~12 inspections, documents damage on ~8, closes ~3 jobs as homeowners pursue claims with their carriers.
- Old-replacement referral track (90 records, low cadence): 0 direct roofs, but ~3 neighbor referrals close, plus a handful of gutter/ventilation add-ons.
Rough result: ~17 jobs closed plus referral spillover, from records the company already paid to acquire, with cost limited to phone time and postage. Run against a few thousand dollars a month of bought leads, the cost-per-job comparison is not close. And the database is now cleaner and re-scored for next quarter, which is the compounding part.
The point of the example is not the exact figures. It is the discipline: clean, segment, score, sequence, measure. Skip any one step and the whole thing underperforms.
Common mistakes that quietly kill CRM mining
Most roofers who "tried calling old leads and it didn't work" made one or more of these errors. Each is fixable.
Blasting one message to the whole list. Sending the same email to unsold estimates, past customers, and dead records makes every message generic and wrong for most recipients. Segment first, always.
Sorting by recency instead of roof age. Calling the freshest records first feels productive but ignores the entire thesis: old estimates appreciate. The five-year-old bid graveyard is often your ripest bucket. Sort by who is due, not who is newest.
Calling people whose roofs a competitor already replaced. Without re-grading roof age, you waste a chunk of every campaign on houses that re-roofed years ago. A permit check or an aerial roof-age pass removes those and saves the rep's energy for live opportunities.
One touch and quit. A single call books almost nothing. The job lives in touch three to five. Owners who let reps make one round of calls and declare the database "tapped out" are leaving most of the money on the table.
Treating past customers as closed. The repair customer from four years ago is the warmest prospect in roofing and the most ignored. If your only past-customer touch is a holiday card, you are funding lead vendors to find strangers while your warmest list gathers dust.
Ignoring consent and contact rules. Old records can carry stale or absent consent. Calling cell phones and texting without the right permissions, or hitting numbers on the federal Do Not Call registry, creates legal exposure under the Telephone Consumer Protection Act and FTC telemarketing rules. Existing-customer and prior-business-relationship exemptions exist but are narrower than people assume and have time limits. Build DNC screening and consent tracking into the data step; do not bolt it on later.
Over-promising on storm and insurance. The fastest way to turn a good reactivation campaign into a regulatory problem is sloppy claims language. Document and inform; never handle, file, negotiate, or guarantee. No deductible talk. The homeowner owns the claim.
Not logging outcomes. If reps do not record what happened on each touch the same day, your next campaign starts blind again, and you can never compute cost-per-job. The notes are the asset; protect them.
Letting the database rot between campaigns. CRM mining is not a one-time cleanup. It is a quarterly habit. Roofs age 90 days every quarter; new estimates and repairs flow in; storms hit. The list that was picked-over in March has fresh ripe records by July if you keep it current.
Choosing tools without overbuilding
You do not need an enterprise stack to mine a database. You need a place to store records, a way to run sequences, a way to dial and text compliantly, and a way to re-grade roof age. Many roofers run the whole thing on a roofing-specific CRM plus a spreadsheet for the first cleanup. A few practical notes:
- CRM. Roofing-specific CRMs handle the estimate/job/repair history natively and usually support tags, pipelines, and basic sequences. If yours does, use it; if it is a mess, a clean spreadsheet beats a dirty CRM for the first pass.
- Dialing and texting. Use a tool that supports DNC scrubbing and consent records. Compliance is a feature here, not a nicety.
- Email/mail. Simple email automation plus a postcard vendor covers the multichannel touches. Mail still pulls with homeowners who ignore unknown calls.
- Roof-age re-grading. Permit lookups (free, slow) or an aerial roof-age tool (fast, address-list-driven) to re-score the bid graveyard. This is the step that turns a stale list into a ranked one.
- Measurement. A single funnel sheet per campaign. Don't overthink the dashboard; track the seven metrics above and the cost-per-job comparison.
Resist the urge to build a giant automation before you have proven the motion by hand. Run one segment manually, prove the cost-per-job, then automate the parts that repeat.
A repeatable quarterly cadence
The roofers who win at this stop treating it as a project and make it a rhythm. A workable quarterly cadence:
- Week 1 — Refresh and clean. Pull new records since last quarter, de-dupe, validate contacts, update consent/DNC flags.
- Week 1–2 — Re-score. Re-grade roof age (notes, permits, aerial ranges), apply the priority score, fold in any recent storm footprints.
- Week 2 — Build the call list. Top of the score, split by bucket, assign to reps with the right script per bucket.
- Weeks 2–6 — Run the sequences. Phone-led for warm and hot buckets, mail and email supporting, storm sequence fired on real events. Log every outcome daily.
- Week 7 — Measure and decide. Compute cost-per-booked-job per bucket, compare to bought-lead cost, double down on the buckets that paid, and note which scripts converted.
- Ongoing — Maintain. Keep new estimates and repairs flowing into the system tagged correctly so next quarter's list is already half-built.
Do that four times a year and the database stops being a graveyard and becomes a renewable pipeline — one you own outright, that works in storm seasons and dead ones alike, that no aggregator can resell out from under you. That is the entire promise of CRM mining: your next job is already in your book. You just have to know which record it is, and call them before someone else re-roofs the house.
FAQ
What does CRM mining mean for a roofing company?
CRM mining is the practice of systematically working the customer and prospect data you already own — unsold estimates, past repair and replacement customers, and stalled storm leads — to book new jobs without buying leads. For roofers it means cleaning the database, segmenting it by who is actually due for roof work now, and running phone-led sequences to re-engage those people. Because the records were already paid for, every job booked is high-margin compared to a purchased lead.
Why are old, unsold roofing estimates worth following up on?
Because roofs age while estimates sit. An estimate you wrote five years ago is attached to a roof that is now five years older and likely closer to or inside the replacement window. The homeowner already met you and has your number. Unsold estimates appreciate over time — the bid you wrote too early often becomes ripe a few years later. Sorting your old estimates by current roof age, not by how recent the estimate is, surfaces the ones worth calling today.
How do I figure out which past customers actually need a roof now?
Combine three signals. First, time: add the years elapsed to whatever roof age your notes implied — a repair customer from four years ago had an aging roof four years ago. Second, verifiable roof age: use your notes, county permit records, or an aerial roof-age estimate that returns an age range per address to re-grade stale records and drop houses a competitor already re-roofed. Third, storm exposure: prioritize records inside recent hail or wind footprints. Score each record on those factors and call the highest scores first.
How is mining my CRM different from buying roofing leads?
Bought leads are strangers, frequently resold to several contractors at once, with no relationship and a low close rate. CRM records are people who already know your company, cost nothing additional to contact, and are not being shopped to your competitors. The close rate on warm past customers and unsold estimates is far higher than on shared cold leads, and the cost per booked job is a small fraction of a season of aggregator fees. CRM mining is pipeline you own rather than rent.
What sequence of touches works best to re-engage a cold roofing lead?
For warm records, lead with the phone. A typical sequence over 30 days: a call and supporting text on day one, an email on day three, a second call at a different time on day seven, a mailed postcard around day 14, and a final call with a no-pressure off-ramp around day 30. Each touch needs a reason — the roof is older, a storm came through, it is pre-winter — and you should always offer to check back next year if the timing is wrong, which keeps the record warm instead of burning it.
How does RoofPredict help with mining old estimates and past customers?
RoofPredict takes a list of addresses — your CRM export works — and returns a roof-age range per house from aerial imagery, plus storm physics modeled on that specific roof. That lets you re-grade a stale database without driving it: houses whose roofs now read 18 to 22 years rise to the top of your call list, while houses a competitor already re-roofed read young and drop out. After a storm, you can see which of your own past contacts had roofs the storm likely wore on. The roof age is a range, not an exact date, and the storm model gives odds, not proof — you still confirm condition with an inspection. It is not a lead service; the homeowners are already yours.
How should I handle insurance and storm language when re-engaging past customers?
Keep it strictly to documentation. You inspect the roof, document storm damage with photos, and hand the homeowner the report; the homeowner files with their own carrier, and the carrier decides coverage. Never say you will handle, file, manage, or negotiate the claim, never promise approval, and never discuss the homeowner's deductible. Several states treat a roofer acting as a claims advocate as unlicensed public adjusting, and deductible promises can be fraud. 'We'll document the damage and give you the facts to take to your carrier' is both accurate and safe.
Are there legal rules about calling and texting old leads?
Yes. The Telephone Consumer Protection Act and FTC telemarketing rules govern calls and texts, including the federal Do Not Call registry. Exemptions for existing customers and prior business relationships exist but are narrower and more time-limited than many assume, and texting cell phones generally requires consent. Build Do Not Call screening and consent tracking into your data-cleanup step, use a dialing tool that supports scrubbing, and document opt-ins. Treat compliance as part of the workflow, not an afterthought.
How do I measure whether a database reactivation campaign actually worked?
Track a tight funnel per campaign: workable records contacted, connect rate, re-inspections booked, inspection-to-estimate rate, estimate-to-close rate, and the number that matters most — cost per booked job. Compare that cost-per-job against your bought-lead cost-per-job; reactivation usually wins decisively because it carries almost no media cost. Don't judge results after the first touch, since sequences pay off on touch three to five, and credit referrals generated by past-customer calls back to the campaign so you don't undervalue your warmest bucket.
How often should I run CRM mining campaigns?
Treat it as a quarterly rhythm, not a one-time cleanup. Each quarter, refresh and clean new records, re-score roof age and storm exposure, build the prioritized call list, run the sequences for four to six weeks, then measure cost-per-job and double down on what worked. Roofs age every quarter, new estimates and repairs flow in, and storms hit, so a list that felt picked-over in spring has fresh ripe records by summer if you keep it current.
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
- Asphalt Roofing Manufacturers Association — asphaltroofing.org
- National Roofing Contractors Association (NRCA) — nrca.net
- Insurance Institute for Business & Home Safety (IBHS) — ibhs.org
- NOAA Storm Prediction Center — spc.noaa.gov
- NOAA Storm Events Database — ncdc.noaa.gov
- National Weather Service — Thunderstorm & Hail Safety — weather.gov
- FTC — National Do Not Call Registry — ftc.gov
- FTC — Complying with the Telemarketing Sales Rule — ftc.gov
- FCC — Telephone Consumer Protection Act Rules — fcc.gov
- Texas Department of Insurance — Hail Damage — tdi.texas.gov
- National Association of Insurance Commissioners — Consumer Resources — naic.org
- U.S. Bureau of Labor Statistics — Roofers — bls.gov
- International Code Council — Roof Assemblies (IRC Chapter 9) — iccsafe.org
- RoofPredict — roofpredict.com
Related Articles
How to Re-Engage Old Roofing Leads That Went Cold (and Find the Ones Due Now)
Your cold-lead list isn't dead money. Here's the full system to clean it, rank it by which roofs are actually due now, and win the jobs hiding in your own CRM.
How Many Roofs in a City Need Replacing? A Contractor's Method for Estimating the Real Number
A working estimator's approach to sizing roof-replacement demand in any city: how to turn housing counts, age curves, and storm history into a defensible annual number you can plan crews and routes around.
How to Get Roofing Jobs Without Insurance or Storm Work
Storm chasing is feast or famine and insurance work is somebody else's decision. Here's how to build a roofing business on retail jobs you actually control.