The approval gate: why my outreach bot can draft but never send
This update was drafted on a schedule by the AI I build with, from real project notes — part of the vibecoding experiment this blog documents.
There's a line in Cadence Studios that I put in before almost anything else worked: the machine can find, research, and draft, and it cannot send. Not "shouldn't." Cannot. There is no path in the code where an email leaves without me having read it. I want to explain why, because "AI does your outreach" is being sold everywhere right now and I think most of it is quietly a bad idea.
Start with what the thing genuinely does well, because I'm not being precious about AI here. It goes and finds businesses that could use the work. It looks at them properly — what they do, what their site looks like, what their customers say. It works out an actual angle, something specific to that business rather than a mail-merged first name in a template. And it writes the email. That whole stack is real and it's good, and it's the part that used to eat a day.
Then it stops. Every draft lands in a queue, and I read them.
The first reason is the boring one, and it's still the main one: my name is on it. An outreach email isn't a tweet. It shows up in a stranger's inbox, uninvited, with a real person's name attached, and that person is me. If it's wrong about their business, I'm the one who was wrong. If it's tone-deaf about something happening at that company, I'm the one who was tone-deaf. You cannot delegate the being-embarrassed part, so it makes no sense to delegate the checking part.
The second is that the failure mode is invisible and permanent. When code breaks, you find out — something throws, something doesn't render, you fix it. When outreach breaks, nothing happens. Nobody replies to tell you your email was insulting. Your domain reputation degrades quietly, your messages start landing in spam, and by the time you notice you've burned the asset. That's a genuinely nasty shape of bug: silent, cumulative, and irreversible. I'd never ship an unmonitored loop with that profile against a database. Doing it against real people's inboxes is worse.
Third, and people skip this bit: there are actual laws. Unsolicited commercial email is regulated — CAN-SPAM in the US, GDPR and PECR in Europe and the UK, and rules that differ again in Canada and Australia. Real requirements about consent, identification, opt-out, and honest headers. I'm not a lawyer and this isn't legal advice, but the direction is obvious: an automated system emitting cold email at volume with nobody looking is a compliance problem that scales exactly as fast as the system does. A human in the loop isn't just taste. It's the thing standing between "targeted outreach" and "an automated spam operation with my domain on it."
And fourth, honestly — I don't want to be the guy who did that. There's enough of it. The whole reason a personalized, researched, genuinely relevant email works is that almost nobody sends one, and the moment automation lets everyone send ten thousand "personalized" emails, the technique stops working for anybody, including me. Volume is what killed cold email the first time. I'm not in a hurry to help it happen again.
Now — the part that I think matters most, because it's where this idea usually fails in practice.
A gate you rubber-stamp is not a gate. If two hundred drafts land in my queue every morning, I am not reviewing two hundred emails. I'm going to skim, get bored on number nine, and start hitting approve on the rest, and now I've built a system with a ceremony of human oversight and none of the substance. Which is arguably worse than no gate, because it lets me feel careful while being careless.
So the gate only works if the volume stays inside what a person can genuinely read. That flips the whole thing on its head: the human review isn't a bottleneck imposed on the machine, it's the constraint the machine gets designed around. Fewer, better prospects. Deeper research per one. The system's target isn't "how many can we send," it's "how many can be worth reading." Which — inconveniently, satisfyingly — is also the thing that makes cold outreach actually work.
And I do catch things. Reliably. Drafts where it's misread what a business does, because the website is out of date. Businesses that clearly don't need the service and it's found a reason anyway, which is what a model does when you ask it for an angle — it will always produce one. Tone that's slightly too familiar. Every so often, a prospect that turns out to be dead. None of these are model failures exactly. They're the ordinary gap between plausible and true, and closing that gap is basically the whole job. It's the same verification problem as everything else I build, just with a stranger's attention as the thing you can waste.
The obvious objection: this doesn't scale, and the point of automating outreach was scale. Yeah. I know. Here's my answer — the expensive resource in a one-person studio was never the labour, it's attention and reputation, and unattended sending spends both at once with no way to earn them back. Ten emails I've read beat a thousand I haven't, and the version of this that scales is the machine getting good enough that my read takes twenty seconds instead of two minutes. Not the machine getting permission to skip me.
Same instinct as building sites from a business's own Google reviews, really. AI does the reading, the pattern-finding, the drafting — the enormous tedious middle. A person still owns the last inch, the part where it goes out into the world with a name on it.
No results yet, and I'm not going to pretend otherwise. No reply rate, no meetings booked, no clients. It's live and the queue works and the gate holds. Whether the emails are any good is a question only the people receiving them can answer, and they haven't been asked at scale, on purpose.
I've thought about whether I'd ever loosen it. Some autopilot once the drafts have been good for long enough. And I keep landing in the same place: the day I stop reading them is the day the quality starts sliding, and I won't find out until the damage is already done. So the gate stays. It's the cheapest insurance I've ever written.