AI Workflow Automation
Fully automated GTM outbound engine
The signal-driven cold-outbound engine we build for revenue teams: it researches, segments, and drafts, and a person spends 30 minutes on a Monday reviewing every send.
- of human time per week
- 30 min
- of sends human-reviewed
- 100%
Signal prospecting
Job postings, technology adoption, community, news, alert feeds.
Segment-aware generation
Written per ideal customer profile, not one template at a list.
Learning loop
Targeting and messaging improve from every campaign.
Scheduled execution
Configured per sequence for deliverability.
- human decides
Human review before send
Drafts land in the sending platform. Nothing goes out unreviewed.
What the team runs today
Everything a GTM team spends its week on, prospect research, segmentation, personalised drafting, scheduling, runs headless. The human contribution is 30 minutes on a Monday, reviewing and approving every send: human oversight by construction.
This is AI Workflow Automation in practice.
Common inPrivate equity portfolio companies
Inside the engine
Three scheduled jobs, the products each step calls, and the two points where a person decides. This is the build, drawn the way it gets handed over.
- Agent step
- A person decides
- Guard, stops the run
Build the week's outbound
Monday 06:00GitHub Actionsweekly-outbound.yml
- 00
Expire cold backlog
Leads that were never loaded are dropped after two weeks, before a euro is spent on more. A hiring signal goes stale fast, and writing to a role that closed reads worse than silence.
- 01
Discover signal
Hiring intent from live job postings, plus funding and growth news from alert feeds, each item classified by a model before it is trusted.
- TheirStack
- Google Alerts
- Hacker News
- Serper
- Claudeclassify
- !
Credit budget guard
Worst-case cost is priced before the first paid call. Over the monthly ceiling, or credits exhausted mid-run, the pipeline stops and says so instead of quietly spending.
- Slackalert
- 02
Qualify and route to a segment
Size and role filters, domain de-duplication, a permanent exclusion list, and a check against everyone already contacted. What survives is routed to the segment whose message fits it.
- Neondedup
- 03
Enrich the contact
The buyer, then the trigger: funding stage and headcount growth, paid for once per company rather than once per contact. Every address is verified before it is used.
- Apollopeople
- Apollocompany
- NeverBounce
- 04
Write the sequence
One email per contact off the segment's template, opening on that company's own signal, plus two variants to test and a follow-up sequence where every step is a new angle. Length, subject and banned-phrase checks run on each draft.
- Claudedraft
- 05
Grade it, then rewrite it
A stronger model reviews each draft as a cold-email and deliverability specialist: it scores the draft and rewrites it. Above threshold it can load, below it is held for attention.
- Claudereview
- 06
Stage the campaign as a draft
One campaign per segment, created as a draft and never activated by code. Each contact's email rides along as a per-lead variable, with the sender's signature and a visible opt-out.
- Instantly
- 07
A person reads and activates
The one human step in the build: about 30 minutes on a Monday, reading the week's campaigns and switching on the ones that should go. Until that click, the week's work has been sent to nobody.
- Instantlyactivate
Handle every reply
Every 3 hours, weekdaysGitHub Actionsreply-watch.yml
- 01
Poll the inbox
New inbound messages are stored before any model call, so an outage delays a reply instead of losing one.
- Instantlyinbox
- Neon
- 02
Classify and draft the answer
Interested, not now, wrong person, opt-out. Each reply is classified and an answer is drafted in the sender's own voice. Anything that fails retries on the next run.
- Claudeclassify
- A
Opt-out
Suppressed across every mailbox and mirrored to our own records. No draft, no reply, never contacted again.
- Instantlyblock list
- B
Everything else
The draft is posted to the sales channel with the thread, the classification, and two buttons.
- Slack
- 03
Approve and send, or decline
One tap, from a phone. Only that tap sends the mail, on the original thread, through an endpoint that exists for exactly this.
- Slackapprove
- Vercelendpoint
- 04
Move the deal
An engaged contact, and only an engaged contact, is written to the CRM at the right stage.
- HubSpot
Measure, and kill what fails
FridayGitHub Actionsmonitor.yml
- 01
Pull the week's numbers
Sends, opens, replies, bounces and mailbox warmup scores, per campaign and per segment.
- Instantlyanalytics
- Neon
- 02
Kill rules
Every segment carries a number written down in advance: a minimum volume, and the reply rate it has to clear. Below it, the segment is called dead rather than nursed.
- 03
Pick the winning variant
The two variants are compared on replies, not opens, and the winner sets how next week is written.
- 04
Deliverability alarm
A bounce rate or a warmup score outside its threshold raises an alert the same day. Domain reputation is the one asset this system cannot rebuild quickly.
- Slackalert
- 05
Friday digest
Outbound, CRM, search and pipeline data are read together and written up as one short brief: what moved, what to stop, what needs a decision.
- Claudewrite-up
- HubSpot
- Search Console
- Slackdigest
- 06
The judgement calls
Which segment to retire, which wedge to fund, when to change the offer. The system brings the evidence and the deadline, a person makes the call.
One shared state, not three scripts
Neon Postgres behind a Vercel APIEvery job reads and writes the same records: companies, contacts, outreach, signals. A contact can only ever be at one place in the funnel, a run that dies halfway resumes from the state it stored, and nobody is discovered, paid for, or emailed twice.
- discovered
- enriched
- draft
- reviewed
- loaded
- sent
- exits
- dropped
- unsubscribed
What the engine is not allowed to do
These are properties of the build, not policies somebody has to remember. Each one is code that runs whether anybody is watching or not.
Never sends unprompted
Campaigns are created as drafts. No code path activates one, so the only way an email leaves is a person clicking send.
Never spends past the ceiling
Worst-case data cost is priced before the first paid call, and the run aborts rather than exceed the month's budget.
Honours an opt-out immediately
Suppression is written to the sending platform first, so it holds across every mailbox and every future campaign.
Pauses, never activates
The monitor can stop a failing campaign on its own authority. Starting one is reserved for a person.
Loses nothing on failure
Inbound is stored before it is processed, and every stage retries from stored state on the next run.
Leaves a trail
Every draft, rewrite, score and kill decision is recorded, so any send can be explained afterwards.
The loop closes. Friday's read, the winning variant, the dead segments, the deliverability picture, is what Monday's run targets and writes against. The engine gets better at its job every week without anyone rewriting it.
Other work
Have a workflow like these?
Bring yours. We will map where AI creates real leverage and what it takes to build it, maintainably.
You speak with the people who would build the system. No sales pressure, and an honest read either way.