# The Cold Email Formula (Agent 3 & Agent 7)

This is the actual email formula used by Agent 3 (Email Writer) and Agent 7 (Follow-up Sequencer), refined over many iterations. It's optimized for **reply rate and inbox placement**, not for looking impressive. If you clone this system, this file, not general cold-email advice, is what to put into your writer prompts.

Read [documentation.md](documentation.md) §3 first for *why* this is architected as "AI writes 3 fields, code assembles the rest." This file is *what those fields should contain*.

---

## The core idea

A cold email has to do two contradictory things at once: **prove you actually looked at this specific company** (or it reads as spam) while **staying inside a strict, repeatable structure** (or your writer will eventually generate something broken, off-brand, or too long). The resolution: let the model be creative in a small, bounded space; make everything else deterministic.

---

## The email structure (fixed skeleton, fresh wording per prospect)

1. **Greeting**, `Hi {FirstName},` when you have a verified real first name, else a neutral `Hello,`. Handle honorifics gracefully: "Dr. Anna Wolfe" should greet as "Hi Anna," not "Hi Dr,".
2. **Observation**, ONE sentence, max ~15 words, that proves you did real research: what you searched or saw, and who showed up instead of them. The subject line and this line must tell the *same* story, if your subject references AI search results, the opener should too.
3. **Why it matters to them**, 1-2 short sentences. The prospect is the hero of the sentence, not you. Talk about *their* customers, *their* missed opportunities. Plain words, never explain your methodology.
4. **What I would do for {company}**, 2 sentences max, naming something concrete and specific from your research (an actual page, an actual search term, an actual gap). This is the substance, the actual reason to reply.
5. **About me + proof**, exactly 2 sentences: (a) a one-line trust statement (who you are, what you do, reworded slightly every email so it never reads as copy-pasted), and (b) **one** specific, rotated result claim. Never stack multiple statistics in one email, one credible number beats three that read as a highlight reel.
6. **Call to action**, the goal is always to book a conversation, never to sell in the email itself. Keep a small rotating pool of CTA phrasings so no two emails read identically even at volume.
7. **Sign-off**, appended by code, never left to the model. Your name, your role, your company. (No personal phone number or photo in the body by default, that's a deliberate choice you can revisit once you have a real reply-rate baseline; adding contact detail up front tends to make an email read more like a sales blast.)

**Length target: 110-140 words. Roughly 7th-grade reading level. Short sentences. One sentence per line/paragraph, no wall-of-text blocks. No bullet lists in the first email. No links in the body** (a naked link is one of the more reliable ways to land in spam on a cold send).

---

## Subject lines: a fixed rotating set, not free-form

Free-form subject generation is a great way to eventually get something too clickbait-y, too vague, or too long. Instead, use a small set of **fixed presets** with the company name inserted:

```
Is {company} in [search engine]'s answers?      | [Search engine] doesn't mention {company}
{company} on Google vs. AI search               | Can AI find {company}?
What AI tells people about {company}            | {company} is missing from AI answers
[Search engine] recommends a competitor, not {company} | Quick question about {company} and AI search
Where {company} ranks when people ask AI        | {company}, invisible to AI search?
```

A few of these make a specific claim ("X doesn't mention you"), only use claim-form presets when your research *actually verified* the claim; otherwise fall back to a question form. Long company names should get shortened naturally ("Grand Living at The Grove" → "The Grove", strip trailing "of/at/in/the"). **Subject and body opener must tell the same story**, a mismatched subject/opener is the fastest way to look like a template.

---

## Hard bans (enforce these mechanically, not just in the prompt)

- Generic template phrases that scream "mail merge", anything that sounds like it was written once and reused for every recipient.
- Marketing jargon: leverage, boost, optimize, organic traffic, search intent, high-intent, visibility, digital presence, solutions, synergy, partnership.
- Emojis, ALL-CAPS, exclamation marks, "guaranteed," multiple stacked statistics, and, if you're an agency, **the names of your actual past clients** (say "a company in your space," never name names, unless a client has explicitly agreed to be a public reference).
- **Em dashes and en dashes are worth banning outright.** They're a well-known tell of AI-generated writing at this point, and stripping them mechanically after generation (find-and-replace with a comma) is cheap insurance even if your prompt already says not to use them.

---

## Follow-ups (Agent 7)

Send **in-thread**, not as a new email, this requires storing the original message's thread ID at send time and referencing it directly (see [documentation.md](documentation.md) §3, Agent 7, for the batching bug to avoid here). Three touches:

- **Day 3**, a short nudge (60-110 words). CTA options: propose two specific days, or offer to "send the findings either way."
- **Day 7**, new value, not just a bump (60-120 words). Reframe the ask, lower the commitment ("one call, if it's not useful you never hear from me again"), or redirect ("who's the right person to send this to instead?").
- **Day 14**, a polite breakup (45-80 words). Door stays open, no guilt, no pressure.

Fresh wording every time, same hard bans, subject line becomes `Re: {original subject}`.

---

## Verification layer (why every send gets checked twice)

Every email address gets run through an email-verification API (this build uses AbstractAPI Email Reputation) at **three checkpoints**: once at enrichment (picking the best of several candidates), once when the digest is built (so you never even see an option to send to a dead address), and once more at the moment of actually clicking send (cache-hit, so effectively free after the first check). Treat "deliverable" and "unknown/catch-all" as sendable; only "undeliverable" blocks a send. This single layer is responsible for most of the difference between "a cold outreach system" and "a bounce-rate disaster."

---

## Scaling past one mailbox

If you outgrow what one mailbox can safely send per day, add a second sending identity rather than pushing one mailbox past safe volume. Route prospects to a mailbox with a **sticky hash** (`hash(prospect_id) % 100 < WEIGHT`) so the same prospect always gets the same sender, this matters because a follow-up has to come from the same address as the original email or the thread breaks. Warm up any new mailbox gradually (send/receive normal volume for 1-2 weeks) before routing cold volume to it.

---

## Iteration notes (what didn't work, so you don't have to relearn it)

- **A rigid, fully-fixed template** reads as spam almost immediately, recipients (and spam filters) pattern-match on identical structure fast.
- **Fully unique, no-structure generation** solves the spam-pattern problem but reintroduces the "model forgets required elements" failure mode, and reviewing drafts becomes unpredictable.
- **Too many result bullets** reads as a highlight reel / pitch deck, not a personal note, cut to one credible number.
- **Too short** (sub-80 words) reads as thin and unconvincing, there has to be enough substance in the "what I'd do" line to justify a reply.
- **The balance that actually works:** a fixed skeleton (predictable, reviewable, gate-able) with genuinely fresh, specific creative content in a small number of fields (so it never reads as a template). This is the same "structure in code, judgment in the model" principle from [documentation.md](documentation.md), it shows up here first, because this is where it was learned.
