Engagement / OpenHands · Contract

Agentic BD,
built end to end.

Two AI systems replaced 39 hand-run HubSpot cadences, one drafts outbound overnight, one answers reps live in Slack. A human still approves every send.

0cadences audited
0contacts orchestrated
0fork/star signals enriched
0agentic systems, one CRM
HubSpotREO.devApolloFirecrawlClaudeLangGraphFastAPIGCP Cloud Run

01 · The Scene

Nobody knew which companies were even worth working.

39 HubSpot cadences. Reps copy-pasting skill outputs into templates by hand. Nothing flipped a contact to PQL automatically, so the whole pipeline downstream was guessing. The brief from Clarke Shipley: turn an overworked HubSpot setup into a system that scores, triages, enriches, and drafts on its own.


02 · The Reframe

Foundation before sequence agents.

The original plan jumped straight to sequence agents. Auditing all 39 cadences showed the order was wrong: without viability scoring and triage, agents personalize emails to the wrong people. Foundation first.

F1

Viability Scoring

Every company scored Red / Yellow / Green overnight. Reps know where to spend Apollo credits.

F2

Cold-Lead Triage

New contacts auto-routed nightly, hobbyists to DevRel, technical titles to Sales. No noise in Sales views.

F3

Contact Enrichment

Phone, mobile, LinkedIn filled on working contacts only. A timestamp stops credits burning on re-checks.

F4

PQL Automation

PostHog webhook flips lifecycle stage and sets pql_tier. The missing piece, nothing flipped PQL before.

F5

Draft Pre-Population

An agent writes a personalized draft into the CRM overnight. Reps review and approve instead of writing cold.


03 · System 1
Autonomous · runs itself overnight

The Stark Agent.

Fork or star the repo at 2am. By morning a researched, personalized draft is waiting in the CRM, a rep only has to approve it.

45–60 minmanual research + draft, before
3–5 minagent draft + SDR approval, after
0emails auto-sent, human keeps the send
Signal in
GitHub fork / starReo.dev intent
Agent core
ResearchGitHub · Firecrawl · Reo · LinkedIn
Personalizehook · angle · confidence
Draft3 subjects · humanness gate
ValidateMillionVerifier · 5 dedup guards
Claude Sonnet 4.6 · Gemini fallback
Draft out
HubSpot draftApollo 4-step cadenceSlack #sdr-outbound
Deliverability layer · built + monitored
Email validationWarm-up poolSender rotationSPF · DKIM · DMARCInbox-placement monitor
🔒 Nothing sends until an SDR clicks approve in Apollo

A signal comes in, four sources get researched, Claude turns that into a hook and a confidence score, and the draft writes back to HubSpot with a 4-step Apollo cadence queued behind it. The SDR reviews in Slack and sends, the agent never touches a mailbox.

A drafted email is worthless if it lands in spam. So the send path sits on infrastructure I built and monitor: an email-validation layer that verifies every address before enrollment, and a dedicated warm-up system that ramps sender reputation and watches inbox placement across the sending pool.

The engineering underneath

Research pulls GitHub (repos, forks, pinned via GraphQL), Firecrawl (company tone), Reo.dev (fit), LinkedIn (title). Email writes 3 subject variants and runs a humanness gate that rejects generic openers and regenerates once. Claude falls back to Gemini on auth errors, rate limits, or malformed JSON.

5 dedup guardrails run before any draft: do-not-contact flag · already in HeyReach · already in a live Apollo sequence (checked live) · AI review already pending/sent · prior verified send.

3 scheduled jobs on Cloud Run keep it self-healing: cadence scheduler (08:00 IST daily) · reply poller (every 4h, Apollo has no webhook) · reconcile sweep (06:00 IST nightly, syncs drift when an SDR edits Apollo directly).

Deliverability is its own layer: addresses run through a validation service before enrollment, and a warm-up system ramps sender reputation with SPF / DKIM / DMARC aligned and inbox placement monitored, so volume scales without tanking the domain.


04 · System 2
Interactive · answers in the thread

The GTM Copilot, Iris.

A rep asks in Slack, “who's worth reaching out to this week?”, and Iris researches, checks the CRM, and drafts, without anyone leaving the thread.

25/25on its regression eval suite
11tools the agent can reach for
~22smedian answer, kept warm
Slack thread · Socket Mode
↑ answers  ·  asks ↓
Research
research_developerdeep_research
CRM
hubspot_lookuphubspot_searchapollo_contact_statusreo_list_developers
LangGraph ReAct ↺
Iris
Claude Sonnet 4.6
picks tools · reasons · calls again
Web
web_searchextract_url
Outreach
draft_emailprepare_stark_agent_run
Memory
remember_user_fact
Reflection criticClaude Haiku checks deep research + drafts before they post
🔒 Write gateCRM writes stage but never fire without a passphrase reply

A LangGraph ReAct agent decides which of 11 tools to call, remembers the thread so follow-ups don't re-run expensive searches, and shares its research + email code with the Stark Agent, so live answers and the overnight pipeline never disagree about the same developer.

The engineering underneath

Reflection critic: high-stakes output (deep research, drafted emails) gets a second pass from Claude Haiku, did it answer, cite real sources, stay concise, before it posts.

Write gate: the one line Iris can't cross alone is writing to HubSpot or Apollo. She stages the write; it only fires after a rep replies with a passphrase in-thread.

Runtime: Slack Bolt over Socket Mode (no public URL), on Cloud Run kept warm so a reply never waits on a cold start. Every question, tool call, and latency logged to Postgres to tune on what reps actually ask.


05 · Two Systems, One CRM

Autonomous and interactive, sharing a brain.

Stark AgentIris
TriggerGitHub fork / star, overnightA rep asks in Slack, mid-day
ModeAutonomous, runs itselfInteractive, answers in-thread
Reasoning6-layer linear pipelineReAct loop over 11 tools
Human gateSDR approves the draft in ApolloPassphrase reply before any CRM write
Shared brainOwns the research + email codeImports the same code, one opinion

06 · Impact
Cadences audited39
Replaced by1 system
Ben Solari

Reports into Ben Solari, CRO at OpenHands, who owned the engagement and had final sign-off. LinkedIn ↗

Available as a reference on request

Clarke Shipley

Clarke Shipley at OpenHands, the day-to-day stakeholder I build with. LinkedIn ↗

Available as a reference on request

The rep's job becomes review-and-approve.

← Back to the systems