PILLAR 2 · COLD EMAIL

Cold email, run like a factory

I owned the cold email program end to end: the campaigns, the copy process, the sending infrastructure, and the monitoring. Two systems did most of the work: a campaign pipeline operated through Claude Code, and a deliverability command center on top of EmailBison and EmailGuard.

EmailBisonEmailGuardClaude CodePythonSlack
[ Why Build Any of This ]

No platform actually does this out of the box

Someone reading this might reasonably ask why any of this needed to be built. The honest answer: there isn't a single platform, EmailBison included, that comes ready to run high-volume, multi-domain cold outbound end to end. Every tool solves a different slice of the problem:

That gap between "the platform sends the email" and "the program runs itself" is what everything on this page automates.

[ The Campaign Pipeline ]

Describe a campaign in a sentence, get a validated upload

What it is: a staged, deterministic pipeline I run in Claude Code, start to finish — not a vague "AI agent" freelancing its way through the task, but a defined sequence of steps with checkpoints. I describe a campaign in plain English ("target VPs of Marketing at mid-market SaaS"). The system pulls matching companies from our pre-scored database, checks the CRM for customers and open deals, finds the right people, matches each company to a pitch that has already won us customers, and writes a unique email for every person with about twenty AI writers running in parallel. Every email gets validated for banned words, length, and accuracy before upload. I approve at two points: the pitch angles, and the sample emails.

What it did for people: campaign turnaround went from days of list-building and copy-writing to a same-day process, without ever emailing a customer, an open deal, or someone another rep was actively working. The do-not-email rules run at three separate stages and cannot be skipped, which is what makes it safe to let AI do the volume.

flowchart TD
  Y[Campaign described in plain English] --> S1[Pull target companies]
  S1 --> S2[Check the CRM: customers, open deals]
  S2 --> S3[Find the right people]
  S3 --> S4[Match each company to a winning pitch]
  S4 --> H{{Human approves the pitch angles}}
  H --> S5[AI writes unique copy per person]
  S5 --> V[Validate: banned words, length, accuracy]
  V --> UP[Upload to the email platform]
    

Full detail on how this actually runs day to day, including the checkpoint system and the parallel AI writers: How I Run Email with Claude Code.

[ Outreach Philosophy ]

Every message should only make sense to the person reading it

There are two honest ways to run outreach, and I think most programs blur them together when they shouldn't.

Evergreen, templated campaigns. Some outreach is genuinely triggered by an event: a job change, a target account starts hiring for a specific role, a dinner in a specific city. Those campaigns should be templated on purpose. The trigger already did the personalization work; the message just needs to reference it clearly and consistently. Trying to make every job-change email "unique" adds writing overhead for zero benefit — the trigger itself is the relevance.

Fully programmatic, per-person copy. Cold email to a list is different. This is the system I never fully finished building, but it's where I think the category is headed: every email assembled from several independently-prompted lines, each fed by a different public data point about the person or company, composed into one message that wouldn't make sense sent to anyone else.

Not more AI slop — more surface area for relevance
The instinct is that "AI writes every line" means generic, hallucinated filler. The opposite is true if you constrain it correctly: instead of one model trying to write a whole personalized email in one shot, you break the email into lines, and each line gets its own narrow prompt and its own input variable. One line reacts to a trigger. One line reacts to something publicly true about the company. One line carries the actual pitch. A model that only has to nail one sentence, fed one clean variable, writes a much better sentence than a model asked to improvise an entire email from scratch.

Think of it the way personalized advertising already works: an ad platform doesn't write you a generic ad, it assembles one from your shoe size, your browsing history, your zip code. Nobody sees a "slop" ad; they see one that only makes sense pointed at them. There's no reason cold email, built on public firmographic and technographic data instead of ad-tech tracking, can't work the same way — a message that reads like it was written for one company, because it was.

The practical benefit isn't just relevance, it's deliverability: a genuinely unique email doesn't fingerprint as bulk the way a mail-merge template does, because there's no shared template for a spam filter to pattern-match across your whole list. And because each line comes from a distinct, isolated variable, you can run the loop backward: track which line, which variable, which persona combination drove a reply, and start tuning the inputs instead of guessing at copy. That's a recursive learning loop on messaging, not just an A/B test on subject lines.

I want to be honest about where this stands: I never fully shipped the extreme version of it, mostly time and energy, not belief. The campaign factory above is the version I did ship — one AI writer per person, working from a matched pitch angle — and it's a real step toward this, not the whole thing. The modular, multi-line, self-tuning version is the direction I'd take it next.

flowchart LR
  subgraph VARS["Independent variables, independently prompted"]
    V1[Trigger or signal
e.g. new hire, funding] V2[Public firmographic /
technographic fact] V3[Matched pitch angle] end V1 --> L1[Line 1: opening hook] V2 --> L2[Line 2: why this, why now] V3 --> L3[Line 3: the ask] L1 --> COMPOSE[Composed into
one unique email] L2 --> COMPOSE L3 --> COMPOSE COMPOSE --> SEND[Sent] SEND --> RESULT{Reply or
no reply?} RESULT -->|feed back| TUNE[Which variable + persona
combo worked?] TUNE -.-> V1 TUNE -.-> V2 TUNE -.-> V3 style TUNE stroke:#10b981,stroke-width:2px style COMPOSE stroke:#8b5cf6,stroke-width:2px
[ The Stack ]

The tools, and why those tools

The philosophy: Claude Code is the surface, the platforms are the backend

I don't operate email platforms directly. Claude Code is the surface operation: it's hooked up to Apollo, the CRM, and everything else in the stack, and that's where campaigns get built, leads get pulled, and copy gets written. EmailBison sits underneath, running the actual sends with all its webhooks, variables, and sequences, but nobody on the team needs to log into it. Reply handling and the actual human interfacing happen in Slack instead: a reply lands, and it shows up in a channel with the reply text and a one-click send button. That's not just faster than working out of the platform's own inbox — it's the moment a manager can read what an SDR is about to say and coach them right in the thread before it goes out, instead of finding out after.

flowchart TD
  CC[Claude Code — the surface] --> APL[Apollo]
  CC --> CRM[CRM]
  CC --> EB[EmailBison
webhooks, variables, sequences] EB -->|reply event| SL[Slack:
reply text + one-click send] SL -->|sends the reply| EB SL -.-> COACH[Manager coaches the SDR
live in the thread] style SL stroke:#8b5cf6,stroke-width:2px style COACH stroke:#10b981,stroke-width:2px

EmailBison: the sending platform

Why we used it: EmailBison is API-first. Everything the UI can do, the API can do, which matters when Claude Code is the one operating the program, not a person clicking through a dashboard. Three capabilities did the heavy lifting for us:

Why not SmartLead: we moved off it, and it wasn't a preference call. Its webhooks would silently drop replies, which is fatal when your whole reply pipeline depends on catching every one. Its pricing also charges by leads stored in the platform, so pointing a real CRM at it means paying to duplicate data you already own — and that cost scales with your CRM size, not your sending volume, so it gets expensive fast.

Why not Outreach or Apollo: those are built around a rep's own inbox for one-to-one selling. Cold outbound at volume needs dozens of dedicated sending domains spreading the load, which is a different category of infrastructure entirely.

We layered our own discipline on top: strict naming conventions, per-sender daily limits, and staggered send scheduling so volume ramps up instead of spiking and burning a domain.

EmailGuard: the early-warning system

How we used it: EmailGuard watched the health of the sending infrastructure itself, the layer beneath campaigns:

[ The Automations ]

Reply and bounce handling, end to end

Every event EmailBison fires (a reply, a bounce, a disconnected inbox) flows into one handler. It was built defensively: the same event can arrive in slightly different formats, so the handler understands every variant, and warmup chatter gets filtered out before anything is stored, because storing it would cost real database money for zero information.

The reply automation

The bounce automation

The infrastructure sweeps

flowchart TD
  EB[EmailBison event:
reply, bounce, or disconnect] --> PARSE[Defensive handler:
understands every format,
filters warmup noise] PARSE --> KIND{What kind
of event?} KIND -->|Reply| AI[AI classifies:
interested, auto-reply,
unsubscribe, wrong person] AI -->|Interested| SLACK[Team alerted in Slack,
one-click reply] AI -->|Unsubscribe / hostile| SUPP[Suppressed forever] KIND -->|Bounce| BTYPE{Bounce type?} BTYPE -->|Dead mailbox| BL[Blacklist:
never emailed again] BTYPE -->|Spam block| ALERT[Slack alert:
domain problem, not lead problem] BL --> CRMW[Status written
back to the CRM] KIND -->|Disconnect| RECHECK[Inbox recheck
+ Slack alert] subgraph NETS["Safety nets, because instant alerts miss things"] direction LR N1[Daily reply
reconciliation] N2[Daily bounce
batch] N3[Recurring disconnect
sweep] end NETS -.-> KIND style NETS stroke:#10b981 style KIND stroke:#8b5cf6,stroke-width:2px

Every dashboard view (domain health, provider-level analytics, placement tests, cohort comparisons) is broken down on the deliverability command center page.

Want systems like these at your org?

Contact Me 727-637-2778