LeadForge
LiveReplaces a full-time SDR and $300–500/month in tooling with a self-optimizing pipeline that sources, scores, enriches, and reaches out to funded startups — free sources only, humans approve every send.
The problem it solves
Outbound prospecting burns 20+ SDR hours a week on research, email hunting, and follow-up tracking. The standard automation stack — Apollo for data, Hunter for emails, Instantly for sending — runs $300–500 a month before a single reply lands. Worse, volume-first automation actively hurts: it floods the funnel with unqualified leads and pattern-guessed emails, and the bounce rate quietly destroys sender reputation — the one asset outbound can't buy back.
LeadForge's founding thesis is written into its scoring engine: 100 real buyers a day beat 10,000 junk leads. Everything optimizes Revenue > Meetings > Replies > Quality > Quantity, in that order.
What I built
A streaming pipeline that runs continuously: ~40 free-source scrapers ranked by a quality-weighted bandit fill a buffer; each processing cycle drains it through noise filtering, dedup, 0–100 revenue scoring, a hot-lead fast lane, zero-cost contact enrichment, LLM composition, and guarded multi-provider sending. Replies come back through an IMAP poller, get classified into 11 intents, and feed follow-up sequences. A live Next.js Command Center shows the funnel, deliverability, source ROI, and the reply inbox in real time — and a five-squad AI build org maintains the codebase itself under human-merge-only governance.
Sources
+ Noise Filter
0–100 Score
Waterfall
Guarded Send
Reply Loop
Key features
- Budget flows to what converts — a quality-weighted bandit scores every source on qualified + contactable + decision-maker yield (decision-makers count 2×). Sources that produce measured-zero conversions get starved; proven converters get floored so they can't be accidentally starved.
- 74% contactability at $0 in data APIs — enrichment waterfall: team-page scraping → pattern-email generation → strict DNS-MX validation → live SMTP handshake, with a port-25 circuit breaker for hostile networks.
- AI outages never stop outreach — one LLM gateway with a 4-tier chain (Claude CLI → local Ollama → metered Haiku API → deterministic templates) that is architected to never raise: a down backend degrades quality, never availability.
- Replies handled like a human would — an 11-intent classifier (auto, unsubscribe, not-the-person, referral, no, objection, meeting, pricing, interested, later, unknown) that strips quoted history and signatures in 5 languages before classifying, with precedence rules so an out-of-office beats a co-occurring "sounds good".
- Self-growing infrastructure — auto-discovers new ATS job boards and caches them, maintains a learned query bank with its own explore/exploit bandit (20% exploration), and runs a nightly self-improvement loop over send outcomes.
System internals
| Component | What it does |
|---|---|
| scrapers/ | ~40 source scrapers behind one registry with per-source circuit breakers, rate limiters, and priorities. A goal-file noise gate filters junk before anything is stored. |
| enrichment/ | Revenue scoring into tiers (PRIORITY ≥78 · STRONG ≥62 · STANDARD ≥45), decision-maker discovery with title-authority ranking, ICP gating, entity resolution, and semantic dedup (sentence-transformer cosine, 0.92 threshold). |
| mailer/ | Provider-routed sending (Gmail API / SMTP / Brevo) with idempotency keys, send-window gating, preflight checks, bounce parsing, failure classification, 5 drip sequences, and the breakup email as a non-skippable step. |
| ai_services/ | The single LLM gateway (4-tier fallback), reply/lead intent classifiers, personalization, and a self-improve loop — with prompt caching and auto-truncation keeping token cost near zero. |
| tracker/ | SQLite (WAL) with 27 tables. Lead lifecycle: scraped → qualified → queued → contacted → replied → call_booked → proposal → won/lost. "Already contacted" truth lives in the send ledger, not a status string. |
| jobs/ | A parallel job-postings subsystem — 10,000+ postings tracked across Ashby, Greenhouse, Lever, and more, dual-routing hiring signals into lead scoring. |
| workflows/ | A visual workflow engine: 30 defined workflows, 3,800+ recorded runs with full node-level event logs. |
| build org | Five AI build squads (acquisition, enrichment, outreach, UI, platform) plus an architect with veto power, a read-only data-health auditor, and a regression gate — agents open PRs, only humans merge. |
Tech stack
Impact — live database numbers
Reliability & safety engineering
- Sender-reputation guardrails: 100 emails/day hard cap · 1 email per domain · send-window gating · cooldowns between sends and batches · an automatic bounce-halt breaker that stops all sending when the bounce percentage crosses its threshold · a persistent suppression list.
- Human-gated by charter: AI drafts, humans approve sends. The agent build org can open PRs but never merge; arming the build engine requires a double opt-in and a hard daily build cap.
- Never-raise LLM layer: every gateway method catches and degrades — composer falls to templates, scorer and intent classification fall to rules. The system has run whole days on rules alone without stopping.
- Non-destructive persistence: lead saves are merge-upserts after a documented incident where a naive INSERT OR REPLACE wiped enrichment fields on every re-scrape. Nothing downstream is ever silently overwritten.
- Failure isolation everywhere: per-source circuit breakers and quarantine (3 consecutive failures → 30-minute bench), bounded retries with backoff on providers, and a port-25 breaker that switches verification to MX-only on networks that block SMTP.
Decisions worth talking about
The bandit rewards quality, not volume
Each source's score is success-rate × speed × quality-yield, where quality-yield counts qualified leads, verified emails, and decision-makers at double weight. The war story that forced this: one source produced 1,070 leads across 23 runs with zero qualified — and was outranking the best source on raw volume. Measured-zero converters now get starved to a 0.35 multiplier; proven converters get floored at 0.85 so a bad week can't kill a good source. Unmeasured sources keep an exploration prior of 0.8 until they've earned ~10 runs of confidence.
Resolve domains by MX, not by .com
Startup domains lie. The resolver sweeps nine TLDs (.com, .ai, .io, .app…) and accepts a candidate only if it has real MX records — because the .com is often parked while the company actually lives on the .ai. Before this rule, pattern emails were being generated against domains that couldn't receive mail at all.
Guessed emails earn zero score
Pattern-generated addresses that haven't survived a live SMTP handshake get exactly zero contactability points, and a weak unnamed inbox is not treated as an email channel at all — role inboxes cap at 0.3 confidence. Topline numbers look worse; the bounce rate says it's worth it.
Contact forms verified by GET, not HEAD
Single-page apps happily return 200 for any path, inflating "has a contact form" counts. The detector fetches the actual body and requires real form markers before claiming a contact channel exists — and treats a 405-on-GET as a valid POST-only endpoint rather than a failure.
The breakup email always sends
Sequence data shows the final "closing the loop" touch consistently earns the highest reply rate. It's wired as a non-skippable step in every sequence, regardless of prior engagement. Counterintuitive, entirely data-driven.