Discover
Companies matching an ICP (industry, size, geography, growth signals) from a pluggable search provider — deduplicated by domain, filtered off aggregators, sized against the profile.
[OK] discovery: 6 candidate(s) from provider 'exa'
[OK] dedupe: removed 1 duplicate result(s) by domain
Research
Homepage + careers subpages, individual job postings across boards, recent news. Marketing pages are never mined for “operational pain” — only hiring pages, because marketing copy describes the product, not the team's own manual work.
company:usepylon.com — 14 signals, 3 hypothesis(es)
sources: usepylon.com · builtin.com/job/customer-success-operations · jobs.ashbyhq.com/pylon-labs
Extract signals
Phrase families (not exact strings) catch “maintain accurate records in Salesforce”, “compile weekly closing status reports”, “follow up with carriers on missing paperwork”. Each signal stores the exact company language, source URL, date, confidence, and why it matters. Engineering roles are excluded — an engineer's “maintain data pipelines” is not repetitive ops.
{ "signal_type": "workflow", "workflow_category": "reporting",
"company_language": ["build the foundation for company-wide reporting and insights", "create dashboards"],
"source_url": "https://builtin.com/job/customer-success-operations/7909543", "confidence": "high" }
Hypothesise the workflow
1–3 opportunities per company, each with facts (observed, with signal ids), inferences (believed), and the hypothesis (what could be automated) kept strictly apart. Weak evidence produces “not a fit — insufficient evidence”, not a stretched story.
likely_workflow: pull data from systems → clean/combine → build report → distribute → answer follow-ups
automation_potential: high · buyers: COO, VP Operations, Head of Operations, CFO
Score 0–100
Pain intensity /20 · repetition /15 · labour savings /15 · automatability /15 · financial value /15 · evidence strength /10 · fit /5 · buyer access /5 — every dimension stores its reason. Conflicting sources cost evidence points. No fabricated dollar figures: value is qualitative and says so.
Pylon: 73/100 — pain 12 · repetition 9 · labour 8 · automatability 14 · value 11 · evidence 8 · fit 5 · buyer 5
Pick the buyer
Not the CEO by default. A configurable ranking per workflow (JSON, no code): sales research → CRO / VP Sales / Sales Ops / COO; support → VP CS / Head of Support; finance → CFO / Controller. If the top person has no reachable address, the next-ranked one is tried and the reason is recorded.
chosen: Head of Revenue Operations — matches 'revenue operations' priority for CRM data maintenance
(chosen after no email could be confirmed for: Sales Operations)
Verify the contact
Five honest states: verified · likely_valid · risky · invalid · unknown. “Verified” only when the mail server accepted the mailbox and the domain isn't catch-all. Pattern-inferred addresses are labelled as such and never dressed up as verified.
contact discovery: verified (jesse@…) — 2 candidate(s) checked via mailsso
contact discovery: unknown — 4 pattern(s) rejected by the mail server
Draft from evidence
First a personalisation brief (observed fact, signal, their exact wording, likely pain, hypothesis, buyer reason, sources). Then the email — hook in their language, one hedged inference, one hedged hypothesis, low-friction ask. No exclamation marks, no “revolutionise”, no fake familiarity.
subject: recurring reporting at Pylon
hook: I noticed Pylon has at least 5 open roles… puts "build the foundation for company-wide reporting and insights" on the team.
Evaluate
A separate agent scores specificity, evidence accuracy, personalisation, naturalness, relevance, clarity, value proposition, CTA, spam risk, hallucination risk. Below threshold → rejected before a human ever sees it.
evaluation: avg 10.0 · passed · spam low · hallucination low
(rejected in a live run: "Quoted phrase(s) not found in any collected source")
Human approves
The review screen shows company, person, why them, evidence, hypothesis, score, email, evaluation, sources — then Approve / Edit / Regenerate / Reject / Save. Sending is blocked server-side unless the message is approved and the address isn't invalid. Default sender writes to a local outbox; real SMTP is opt-in.
POST /outreach/{id}/send → 409 "Only explicitly approved messages can be sent"
Send & track
Timestamp, recipient, subject, provider, lead id — and a follow-up state machine (drafted → approved → sent → replied → meeting / not interested / bounced / no response) that suggests follow-ups to the human rather than firing them.
communication_events: sent · status_change: replied → meeting