| Business | Contact | Location | Trade | Website | Templates | Stage | Last Touch | Owner | Note | Bucket |
|---|
A lead is outreach-eligible when all four conditions are met: (1) email is verified — personal email preferred, info@ and contact@ addresses have 3-5x lower reply rates; (2) business is a local service trade with an active Google Maps presence; (3) at least 10 Google reviews exist, signaling an established operator who pays for services; (4) website gap is confirmed — either no website or only a Facebook page. Leads with a real website can still be outreach-eligible if the site is clearly low-quality, but require a differentiated pitch angle.
| Status | Meaning |
|---|---|
| Rendered | Preview site fully built and deployed to Cloudflare Pages. Safe to include in outreach email. Always verify the preview URL loads before hitting send. |
| Pending | Preview site queued for build or build failed. Do NOT include in any outreach — broken preview links kill reply rates. |
A lead can only move forward in rank, never backward (enforced by STATUS_RANK system). Manual override allowed if a lead is incorrectly marked.
Architecture is fully designed. Cloudflare KV stores status per lead. A _worker.js Pages Function receives Instantly webhooks (email_opened, reply_received, email_bounced) and updates KV. Dashboard fetches /api/status on load and applies overrides. Result: zero manual "Mark Sent" work — statuses update automatically as leads engage. Setup: ~6 hrs one-time. Prerequisite: KV namespace created + webhook secret configured.
Extend the assignee filter to surface a daily "Follow-Up Queue" view: all leads in status=sent OR replied, sorted by days-since-last-activity descending. Pinned to top of CRM as a banner. Each morning: open the queue, call top 10. Inspired by HubSpot's "No Activity in 30 Days" and Gong's deal-risk signals. Pure localStorage, no new infrastructure.
Nightly Claude Haiku job reads each lead's data + current status + notes + website_status and outputs a 0-100 fit score + recommended tier + 1-sentence pitch angle. Replaces static cohort scoring with dynamic re-scoring that improves as more deals close. Cost: ~$0.002/lead × 1,000 = $2/run. Build trigger: after 10+ closed deals so the model has real outcome data to learn from.
When reply-draft-bot classifies a reply, the bucket (🔥 HOT / ✅ INTERESTED / ⚡ OBJECTION / ❌ WRONG PERSON) appears as a colored badge on the lead row — visible without opening Gmail. Eliminates tab-switching to triage reply urgency. You know at a glance whether to call back in the next 10 minutes (HOT) or send a follow-up (OBJECTION). Also powers a one-click "Needs Response" filter. Requires Part 2 reply automation deployed (bucket field stored in KV alongside status). Build time: ~3 hrs.
A button on each lead row opens a 30-second call brief: owner name, trade, city, current website grade (no site / Facebook / real), Google rating + review count, preview URL (tap to open), reply bucket if available, and all saved notes. Everything needed for a confident opener before dialing — no tab switching. Higher close rate via personalized, confident cold call openers. Pure localStorage + manifest data, zero new infrastructure.
Persistent banner above the CRM table surfacing three bleeding-revenue categories: (a) Status = Sent, ≥48 hrs elapsed, no reply logged; (b) Status = Replied, ≥24 hrs elapsed, not yet Call Connected or later; (c) Status = Call Connected, ≥48 hrs elapsed, not Closed or Booked. Sorted by time-at-risk descending. Each morning: work the top 5 in 20 minutes. This is the free-revenue view — reactivating warm leads costs $0 vs. finding new cold ones. Pure localStorage + timestamp reads, no new infrastructure.