Cold outbound that researches first and refuses to guess

Source, open and follow up as three stages, with enrichment, a model judge, a send gate, and reply detection that stops a sequence by reading the reply.

Role
System design and build
Period
2026
Status
In production
Stack
  • n8n
  • Apify
  • Firecrawl
  • Prospeo
  • Gemini
  • Supabase
  • AWS SES
Outbound engine: source, open, follow up Workflow diagram. Steps: Buying signals (ad activity · hiring posts); Qualify for free (ICP rules · competitors); Find a decision-maker (scrape → paid lookup); Draft with evidence (3+ anchors · real offers); Model judge (failover across models); Requeue, don't reject (a timeout is not a verdict); Send gate (one owner · cooldown · cap); Cold email (touch 1); Follow-ups (touches 2–5 · 18h floor); Reply detection (attributed by content). Connections: Buying signals to Qualify for free; Qualify for free to Find a decision-maker; Find a decision-maker to Draft with evidence; Draft with evidence to Model judge; Model judge to Requeue, don't reject [no answer]; Model judge to Send gate; Send gate to Cold email; Cold email to Follow-ups [day 2+]; Reply detection to Follow-ups [stop]. 1 · SOURCE 2 · OPEN 3 · FOLLOW UP no answer day 2+ stop Buying signalsad activity · hiring posts Qualify for freeICP rules · competitors Find a decision-makerscrape → paid lookup Draft with evidence3+ anchors · real offers Model judgefailover across models Requeue, don't rejecta timeout is not a verdict Send gateone owner · cooldown · cap Cold emailtouch 1 Follow-upstouches 2–5 · 18h floor Reply detectionattributed by content
Nothing is sent without evidence and a judge’s approval. A model that does not answer sends the prospect back to the queue instead of rejecting them.

The problem

Business directories return storefronts without decision-makers, models invent proof when they have none, and without coordination one prospect can be emailed by two engines in the same week.

The system

  1. Sources on buying signals such as ad activity and hiring posts rather than business listings, and qualifies for free before any paid lookup.
  2. Enriches through a scraping waterfall, then a paid decision-maker lookup with key-pool failover and a budget check before every metered call.
  3. Drafts only with evidence: at least three personalisation anchors counted in the body, only offers that exist, no invented clients or results.
  4. A model judge with failover reviews every draft. Replies, including auto-replies relayed by the mail provider, are attributed by their content and stop the sequence.

Key decisions

Content is evidence; an index is a hope

WhyMatching replies to prospects by item position silently attributed replies to the wrong people.

Trade-offMore parsing for bounces and out-of-office messages.

An empty model response is not a verdict

WhyTreating a timeout as a rejection permanently discarded good prospects.

Trade-offA requeue path with a retry limit.

Check the budget before every metered call

WhyA check at start-up passed on the first call and let the ninth spend the monthly cap.

Trade-offOne extra API read per call.

Results

  • Named decision-maker coverage more than doubled once paid enrichment went live
  • Every send path shares the same gate, cooldown and daily cap
  • A judge regression bank built from real drafts

What I’d do next

A separate sending domain, and reply-rate analytics per source feeding back into sourcing.