Outreach: Where the address came from decided everything
A campaign that learned the hard way that a plausible address is not a contact, and the guardrails that came out of it. Figures refresh from the send log.
Solo — pipeline, evidence corpus, guardrails, and every send · 2026
The problem
A job search and a sales pipeline are the same shape: find the people who could say yes, work out what to say, and get it in front of them without becoming the thing everyone deletes.
The first version optimized the wrong half. It got very good at deciding which roles were worth writing to, and then sent the messages to addresses it had constructed from a pattern.
Three quarters of them bounced. What the campaign taught, in a way no amount of reasoning would have, is that where an address comes from matters more than anything written inside the message.
Architecture
The only branch that matters is the first one: where did this address come from.
- A role clears the fit score before anyone looks for a contact
- Addresses published for this purpose are the only ones used
- Addresses published for a different purpose, like package metadata or a security inbox, are never used
- Pattern guesses are never used, after the first batch proved why
- Every address is MX verified over DNS, because there is no DNS in the sandbox
- A lint blocks dashes, third person hooks and any claim not in the evidence pack
- One contact per domain per day, because two in an hour reads as spam to the receiving server
- Nothing sends without my approval
Key decisions
Published addresses only, and the rule has no exceptions
Pattern inference produced a delivery rate in the twenties. Addresses published for the purpose of being contacted deliver in the nineties. The floor in the config sits at maximum confidence, which in practice means "a human published this, for this", and "none published" became a valid, common answer rather than a failure.
Published for something else is not published
Package manifests, security disclosure inboxes and commit logs are full of working addresses. They are published so somebody can report a bug. Using them for a job application burns the exact community the work is meant to build a reputation in, so the pipeline is not allowed to read them.
The lint enforces the voice, so the drafts cannot drift
No dashes, no exclamation marks, a banned phrase list, under a set word count, hooks in the second person, and every link and claim traceable to the evidence pack. It once caught an em dash the corpus itself was injecting into drafts. A style rule that lives in a prompt is a suggestion; the same rule in a linter is a property.
Similarity is measured, and a batch can be killed for it
One batch of 74 messages had 65 percent mean pairwise similarity across bodies. It was deleted before sending rather than tuned, and the replacement was named individuals at 36 percent. The number is a proxy for whether each message was worth the recipient’s minute.
The send path is guarded by counting, not by intent
Daily and per company caps counted from recorded sends, a suppression list checked before every send, never the same address twice, one contact per domain per day, and a weekday window. Every one of those is in code, because a rule that depends on remembering it at eleven at night is not a rule.
Numbers
- 95% — delivery, published addresses (the rule the campaign is built on)
- 58% — delivery, inferred addresses (early batches, before the rule; the gap is the finding)
- 507 — messages sent (running total, refreshed from the send log)
- 8 — replies (3 calls booked, 1 interview process)
- 0 — addresses guessed since the rule (none published is a valid answer)
Reply rate is the number that matters and it is low, at roughly 2 percent of delivered messages. Delivery is a floor, not a result: a message that lands and gets deleted counts as delivered. These figures move every week, so the page reads them from a file that a script refreshes from the send log rather than from a sentence written once. The comparison between channels is observational, not an experiment: the inferred batches went out first, to different companies, before several other things changed.