Cold email has a reputation problem. The reputation is mostly deserved, because most cold email is spam with a personalization token — "Hi {{first_name}}, I noticed you work at {{company}}." Anyone who has received one knows exactly what it is the moment they read it. The delete reflex is instantaneous.
The problem is not cold email itself. The problem is that doing cold email correctly — with genuine research, a specific hook, and a relevant offer — requires time that scales linearly with volume. Write 10 good cold emails: takes 2 hours. Write 200 good cold emails: takes 40 hours. For a solo founder, that 40 hours is 40 hours not spent building the product. So the choice becomes: send bad email at volume, or send good email at a rate too slow to matter.
The middle path is AI-personalized outreach at scale. This is the actual system I built. Here is how it works.
The Architecture
n8n is the orchestrator. Every workflow in this system lives in n8n, self-hosted on a GCP compute instance. The sequence is:
- Trigger: A new row is added to the lead Google Sheet. The sheet has columns for: first name, last name, company name, role title, website, and a "context" field — a one-sentence note about why this person is relevant. The context field is the key. It is what the AI actually uses to personalize.
- n8n reads the row and extracts company name, role, and context. It then runs a basic validation check — if context is empty or company is missing, the workflow routes to a "needs review" queue instead of proceeding. Garbage in equals garbage out. The validation step is not optional.
- HTTP Request node calls the Claude API with a structured prompt. The system prompt and user prompt are separated. The system prompt defines Claude's role and constraints. The user prompt injects the specific lead data.
- Claude returns a 3-paragraph email body. n8n captures the output text. The subject line is generated separately using a second, shorter Claude call with a subject-line-specific prompt — this keeps subject lines crisp and prevents the main email generation from optimizing for length over subject quality.
- Gmail node sends the email from the outreach domain, with the lead's email address pulled from the sheet. The email is logged back to the sheet — timestamp, subject line used, Claude's output — so every send is traceable.
- Wait node fires before processing the next lead. This is the rate limiting mechanism.
The System Prompt Philosophy
The system prompt is where most implementations go wrong. People treat Claude like a content farm — give it a template and tell it to fill in the blanks. The output reads like a template with the blanks filled in. That is not personalization. That is mad-libs.
The 1Commerce system prompt does not give Claude a template. It gives Claude a role and a constraint. The current system prompt, compressed:
You are writing the opening email a thoughtful founder would send after spending 10 minutes researching this person. You are not selling. You are opening a conversation. The email must reference something specific about this person's company or role — not generic praise, a specific observation. The first paragraph is the hook: one specific thing you noticed. The second paragraph is the bridge: why that thing is relevant to what you do. The third paragraph is the ask: one low-friction next step. Maximum 150 words total. Do not use the word "synergy." Do not say "I hope this finds you well." Do not open with "My name is."
The constraint list matters as much as the instruction. Claude defaults to certain patterns — pleasantries, caveats, filler phrases — that are the death of a cold email. The system prompt explicitly prohibits them. Specificity is the deliverability hack. An email that reads like a human wrote it gets opened. An email that reads like a template gets deleted, and its domain gets flagged.
Rate Limiting and Domain Warming
Sending volume is the part that founders skip and then wonder why their email lands in spam. Cold email at volume from a fresh domain will get that domain blacklisted within days if you don't warm it correctly.
The rules are simple and non-negotiable:
- New domain: start at 10–20 emails per day, maximum.
- Increase by 10 emails per day each week for the first two weeks.
- At week three, you can operate at 50 emails per day safely from a single domain.
- Never exceed 100 emails per day from a single domain without additional infrastructure.
In n8n, this is handled with a Wait node set to a fixed interval — currently 12 minutes between sends. At that rate, the workflow processes 50 leads across a standard 10-hour window. A counter variable in the workflow tracks daily send volume and stops the workflow if the daily limit is reached before the queue is exhausted. The remainder processes the following day. This is not elegant engineering. It is a practical rate limiter that costs zero dollars and has worked without failure.
Domain warming also means sending some real email from the domain before the outreach campaign starts — reply to newsletters, send test messages to accounts you control, sign up for a few services. You want the domain to have a human activity pattern before you send outreach at any volume.
What the Numbers Look Like
In the 1Commerce context, this engine drives two outreach streams: prospecting for consulting clients (the Operating Excellence Bundle — workflow and automation consulting for small business operators) and partnership outreach to potential distribution partners for UnifyOne and InkVault.
Benchmarks from the first 30 days of operation:
- Open rate: 38–44% on AI-personalized sends, compared to an 18–22% industry average for generic cold email. The personalization hook — Claude referencing a specific detail about the company or role — is the primary driver of this spread.
- Reply rate: 9–11% on personalized sends, versus a 2–4% industry average for batch-and-blast campaigns. Replies include both positive responses and "not the right fit" — both are useful signals.
- Positive reply rate: approximately 4–5% — meaning 4 to 5 out of every 100 emails sent result in a substantive conversation. At 50 emails per day, that is 2–3 qualified conversations per day.
- Cost per email sent: Claude API cost for a 150-word output is fractional — approximately $0.002 per email at current API pricing. 1,000 emails costs roughly $2 in AI compute, plus the infrastructure cost of the n8n instance ($12/month regardless of volume).
What Breaks It
Four things reliably break this system:
Bad lead data. If the context field is empty, Claude generates a generic email that reads like every other cold email. The system prompt cannot compensate for missing information. Lead quality is upstream of everything. A smaller, well-researched lead list outperforms a large, shallow one every time.
Domain skipping. If you skip the warming period and send 200 emails on day one from a new domain, your domain reputation is gone. The emails land in spam. The damage is not easily reversed. Do not skip the warm-up. There is no shortcut here.
Prompts that are too long. When the system prompt is verbose and the user prompt injects a lot of context, Claude's output tends toward length. A 300-word cold email does not get read. The 150-word hard limit in the system prompt is there because without it, Claude will write 250 words by default. Enforce the limit explicitly, and validate output length before sending — n8n can truncate and re-call if the output exceeds your target.
A bad offer. This is the most important failure mode. No outreach engine — no matter how well personalized, no matter how well delivered — fixes a product that people do not want. The engine drives the conversation. The offer closes it. If open rates are high and reply rates are low, the email is working and the offer is failing. Diagnose correctly before you iterate on the wrong variable.
The Honest Caveat
This is a system, not magic. It still requires a real offer. No outreach engine fixes a bad product.
I want to be precise about what this system does and does not do. It does not replace sales judgment. It does not identify which prospects are worth contacting — that is still a human decision that requires understanding your ICP, your offer, and the landscape your prospect operates in. It does not write emails that close deals on their own. What it does is compress the time cost of the top-of-funnel: the research synthesis, the first-draft writing, the sequencing and scheduling.
The goal is not to replace sales. It is to give a solo founder the leverage to do in one hour what a three-person SDR team does in a week. To run outreach at a volume and quality level that would otherwise require headcount — without the headcount. For a solo operation in Revenue Activation phase, that leverage is the difference between prospecting as a full-time job and prospecting as a morning workflow that runs while you build the product.
That is the system. Build the lead list carefully. Write the system prompt precisely. Warm the domain patiently. Let n8n handle the sequencing. Review replies the same morning they come in. Iterate on the offer, not the engine, if numbers are low.
One hour of setup, one hour per week of maintenance, 2–3 qualified conversations per day. For a solo founder, that is enough to move.