The Lead-Scoring Model
A 0–100 score that tells you who to call first, and why each weight is what it is
6 min read
Worked example below uses an invented business, city, and phone number for teaching only — not a real lead, not drawn from any real list.
Calling down a list in the order it happens to export is calling in random order. A score fixes that — but only if you understand why it's built the way it is, because a score you don't trust is a score you'll quietly stop using the first time it disagrees with your gut.
1. The four things being weighed, and why
The model sums four factors that a lead-generation professional actually weighs, then subtracts negatives:
SCORE (0–100) = PAIN + VALUE + FIT + REACH − NEGATIVES
- PAIN (up to ~32 points) — how strong is the web-status signal itself. This is weighted highest because it's the most direct evidence of the actual problem you solve. A business with a
noindextag or no site at all has a provable gap; a business with a merely dated-but-functional site has a much softer one. - VALUE (up to 30 points) — what does this category typically pay. A dental or legal practice supports a $1,500–3,000 build; a barber shop supports a $997 one. This isn't about which business deserves more — it's about matching your build effort to what the deal is actually worth, which is the entire logic behind the volume-play/value-play split in the next lesson.
- FIT (flat 20 points) — is this an in-market category you're actually set up to serve. Kept flat and simple on purpose: it's a yes/no gate, not a spectrum, so it doesn't need graduated scoring.
- REACH (up to 15 points) — does a local, direct number exist. A lead you can't actually reach a decision-maker through is worth far less regardless of how strong the other three factors are — reachability isn't a nice-to-have, it's the gate every other point has to pass through.
Grade bands: A = 85+ (build the demo before calling — call this week) · B = 70–84 (full call + email + SMS sequence) · C = 55–69 (light nurture only) · D = below 55 (skip).
2. The point table
PAIN (web status) VALUE (category ability-to-pay)
No real site (placeholder/social) 28 Dentist / medical / legal 30
Facebook-only 30 Plumber / trades / auto 18
Outdated real site 32 Restaurant / food 16
(noindex, or stale by the checklist in §3) Barber / nails / salon 12
Aging but real site 20
Dated but maintained template 12
"No link shown" on one directory 20 FIT = 20 flat (in-market category)
Modern, responsive site 0 REACH = 15 if a local direct number exists, 3 if toll-free/out-of-area
NEGATIVES: modern site already in place −40 · no working contact method −15 · known franchise −25
Notice "No link shown on one directory" scores lower (20) than "Facebook-only" or "placeholder page" (28–30), even though on the surface all three mean "no real site." That's the accuracy caveat from Module 2 built directly into the scoring, not just mentioned as a warning: a single directory failing to show a link is the least reliable of the three signals, so it earns fewer points until you've personally verified it.
3. The outdated-site checklist (for anything that already has a website)
Each signal below is a proxy for something a real visitor — or Google itself — would actually notice, which is why it's worth checking rather than eyeballing a site and guessing "looks old":
| Signal | Where to look | Outdated if… |
|---|---|---|
| Viewport meta tag | Page <head> | Absent or fixed-width — the site isn't mobile-responsive, and most local searches happen on a phone |
| Robots meta tag | Page <head> | Set to noindex — the site is functionally invisible on Google no matter how good it looks |
| Copyright year | Footer | Three or more years stale |
| Generator/CMS tag | Page <head> | An old page-builder version or a hand-coded static file, both signs nobody has touched the site in years |
| Dead-tech tells | Anywhere on the page | Defunct social-platform links, Flash, no HTTPS |
A site failing the viewport check or carrying noindex or showing a copyright year three-plus years old counts as Outdated = Yes. Free tools (a mobile-friendliness checker, a page-speed checker) do this per-URL without writing anything yourself; at real volume, most scraping platforms return the site URL so you can run a small script over the whole list at once.
4. Worked example — two invented leads, scored step by step
Lead 1 — "Marchetti's Auto Detail," a fictional shop in a fictional town. Facebook page only, no real site. Auto-services category. A local direct number on the listing. One recent review, no owner replies to reviews, not running ads, 34 total reviews.
PAIN (Facebook-only) = 30
VALUE (auto/trades) = 18
FIT (in-market category) = 20
REACH (local direct number) = 15
ENRICH (one recent review, +5;
no owner replies, +0;
no ads running, +0;
under 100 reviews, +0) = 5
NEGATIVES = 0
──────────────────────────────────────
TOTAL = 88 → Grade A
An 88 clears the A threshold — build this one's demo before you dial.
Lead 2 — "Ridgeline Barber Co.," also fictional. No website link shown on a single directory listing (unverified signal), barber category, a toll-free number is the only contact listed, no recent review activity, no ads.
PAIN ("no link shown," capped) = 20
VALUE (barber/salon) = 12
FIT (in-market category) = 20
REACH (toll-free/out-of-area) = 3
ENRICH (nothing recent to add) = 0
NEGATIVES = 0
──────────────────────────────────────
TOTAL = 55 → Grade C, right at the boundary
A 55 lands exactly on the C/D line — light nurture at most, and worth the 20-second Google verification from Module 2 before you spend any real time on it, precisely because its PAIN score rests on the least reliable signal in the model.
5. The optional sharpening layer
Once you're pulling review data alongside the basics, add: a recent review (+5), the owner replying to reviews (+5), the business running paid ads (+6), and 100+ total reviews (+4). Review activity is worth adding because it now outranks a bare website check as a "this business is alive and paying attention" signal — an owner who replies to reviews is an owner who'll answer a text about their website, too.
Score =
SWITCH(WebStatus, "none",30, "social",30, "placeholder",28,
"outdated",32, "aging",20, "maintained",12,
"modern",0, 20) // PAIN
+ SWITCH(CategoryTier, "high",30, "midtrade",18, "food",16, "low",12, 15) // VALUE
+ 20 // FIT
+ IF(LocalDirectNumber, 15, 3) // REACH
+ IF(RecentReview,5,0) + IF(OwnerReplies,5,0) + IF(RunsAds,6,0)
+ IF(Reviews>=100,4,0) // ENRICH
- IF(ModernSiteAlready,40,0) - IF(Franchise,25,0) - IF(NoContact,15,0) // NEGATIVES
→ cap 0–100
Up next
Choosing Where to Focus
Reading the score distribution to decide how to split your week
3 min