The problem
I was the first commercial hire at Viggle, selling an AI video API to studios, apps and resellers. Researched cold email is slow to write by hand. A language model writes a plausible email in seconds. The risk is that plausible is not the same as true.
What I built
Four scheduled agents on Claude, HubSpot, Apollo and Clay. They source accounts, rank each one with a brief that cites its sources, draft first touches and follow ups for my approval, and log every step to HubSpot before the next one starts.
- Source
- Qualifybrief with URLs
- Drafta source per claim
- Draft gatemechanical rules
- Account gateCRM history
- I send
Source
Agents look wide for companies that fit, and skip any that are already in the CRM under another name.
Qualify
Each account gets a verdict card with the URLs behind it. If they would have to add a new feature to use the product, the account is parked, not emailed.
Draft
First touches and follow ups, written with a source beside every factual sentence. A sentence with no source becomes a question instead.
Example:
“Switching is just a new base URL and a key.”has no source, so it can’t go in as a claim.Draft gate
Code, not judgment, blocks a draft on length, banned phrases, unsourced numbers and cost claims.
Example:
“Renders finish in 30 seconds.”blocked: a number with no source behind it.Account gate
Code checks the CRM history: disqualified, already contacted, a draft already waiting, a promise made, a reply received.
I send
Nothing sends itself. I read each draft and send it, and the CRM logs it before anything else happens.
What broke
In September, a line in my outreach said switching to us was just a new base URL and a key. It wasn’t true: our API has its own request format and a create then poll flow. Around the same time, a customer quote carried forward inside a CRM note turned out to exist in no primary source.
The rule I made: every factual sentence in a draft needs a source beside it, or it becomes a question. A quote inherited from another note does not count as sourced.
Then I turned the rule into code. The draft gate blocks on length, banned phrases, unsourced numbers and cost assertions. The account gate blocks on CRM history: disqualified, already contacted, a draft already waiting, a promise made, a reply received. I published a version as outbound-gates, with a fictional product and 50 tests. Nothing in it sends email.
Checking my own checks
I wrote three quality checks for AI drafted first touches, then scored each draft before comparing it with what I actually sent. Only one check, whether the close matches the email’s angle, predicted the edits I make. The other two tested whether a fact was unique to the account. I was judging whether it was relevant.
Under the old drafting rules, 0 of 14 first touches went out unedited and 12 needed heavy edits. Under the current rules, 15 of 35 went out unedited, 17 with light edits and 3 with heavy ones.
How replies are counted. Companies with at least one reply written by a person, divided by companies emailed minus hard bounces. Counted from Gmail threads logged to HubSpot, Jul 14 to Oct 29, 2026. Excludes auto replies, helpdesk acknowledgements, bounces, inbound leads and existing customers. Includes replies that said no.