Businesses are OUR prospects. Doozer-awareness scoring (claimed + postcard engagement + leads we deliver + live site) ranks who is warm enough to pitch Doozer+. The Internal Affairs Division of LeadBuilder.
includes/doozer-prospects.php. Shipped v2.2.416-417. The strategic payoff of all the tracking: it turns postcards + claims + the leads-we-deliver into a ranked list of who is warm enough to close on Doozer+. Jon's flywheel, made visible: they know us → we send them value (leads) → we make the right offer → free becomes Doozer+.
businessDoozerAwareness($bizIdOrRow) → score + component breakdown + status. Weights live in doozerAwarenessWeights() (one place to tune):
| signal | pts | why |
|---|---|---|
claimed the listing (admin_email set) |
+40 | they acted, they know us — biggest |
scanned our postcard (thanksio_events scan) |
+18 | engaged with our mail |
| postcard delivered | +6 | mail physically reached them |
each postcard sent (thanksio_sends) |
+3 (cap 9) | touches |
each lead WE delivered (nbmn_lead_requests.routed_to_business_id) |
+12 (cap 40) | we give value — the strongest "we have something to offer" |
| live Doozer site | +4 | inventory exists |
Status: paying owner (businessIsPremiumOwned) → customer (not a lead — a save/expand target). Else hot (≥55) / warm (≥25) / cold.
doozerHotLeads($opts) — candidate set = businesses we've TOUCHED (mailed OR delivered a lead OR claimed); never-touched businesses are not leads. Scored, ranked hottest first, customers excluded by default. $opts: niche, state, limit, min_score, include_customers. Admin at Intelligence → Hot Leads (Doozer+) (admin-prospects.php): score bars, the "why" breakdown, and Postcard / Manage quick actions. CLI dz prospects [do=hot|score b=].
doozerProspectAction($row) returns action + channel + urgency (now|soon|later) + reason. The channel rule (Jon): getting leads + email → email the claim invite; getting leads + NO email → mail a postcard STAT (these sort to the top — leads with no inbox = money on the table); mailed already + still no email → call the phone; claimed + free → Doozer+ pitch (email else mail). SMS is OUT (regulatory). Facebook Messenger via official page = future. doozerHotLeads sorts urgency-first. doozerProjectedClaim($row) = projected claim % (heuristic until real outcomes; getting-leads ×3.5, scanned ×2 over a ~4% cold baseline) — sharpens as claim/convert rates by niche+market accrue (feed from the postcard Format-performance panel).
doozerProspectsPipeToLeadBuilder() (admin "Sync to LeadBuilder"; dz prospects do=pipe) upserts each prospect into lb_leads (in the LeadBuilder DB via nbmnLeadGetDb), source doozer_internal, intent doozer_plus_prospect, under a synthetic "Doozer Internal Sales" lb_site, one lb_visitor per business (reuses nbmnLeadEnsureLbSite/Visitor). score_factors carries doozer_business_id, awareness, projected %, signals, and next_action/channel/urgency. Idempotent (upsert by site+visitor+source). Internal prospects now live inside LeadBuilder proper.
Distinct from Machi (machi.md): Machi = OUTBOUND NEED ("who to mail next"); this = CONVERSION READINESS + the exact next move. NEXT: campaign/niche/market response comparison to auto-weight targeting ("mechanics claim 20% more → mail more mechanics"); FB Messenger channel; cross-sell Keeper/agency to customer-status businesses.
Ties to [[project_monetization_plan]], [[the-observed-world]] CLAIM→EARN, the [[feedback_right_offer_right_audience]] rule, and ai-postcards tracking.