Skip to content

Commit fe8b91d

Browse files
committed
hir-103: add 10-template cold email pack
Adds templates/ at repo root with 10 production-tested cold email templates across 5 categories: sales (3), recruiting (2), partnership (2), warm-intro (2), follow-up (1). Each is a markdown file with YAML front-matter (subject, persona, use_case, deliverability_notes, variables) and a plaintext body under 120 words with one CTA. Closes the long-standing "Email templates for common use cases" TODO in the root README and links to the new directory. Templates use the same {{variable}} syntax as the in-app campaign builder so they paste directly into /dashboard/campaigns/new. Spam-word check across all 10: zero hits in subjects and bodies.
1 parent ba0b4aa commit fe8b91d

12 files changed

Lines changed: 426 additions & 1 deletion

File tree

README.md

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,9 +56,16 @@ before running the same commands.
5656

5757

5858

59+
# Email templates:
60+
61+
A curated, production-tested template pack lives in
62+
[`templates/`](templates/) — sales, recruiting, partnership, warm-intro,
63+
and follow-up. Each is plaintext, under ~120 words, with a single CTA and
64+
deliverability notes. See [`templates/README.md`](templates/README.md) for
65+
how to load one into a campaign.
66+
5967
# Move the needle TO-DO list:
6068

61-
- [x] Templates for popular email needs i.e "onboarding for SaaS" — see `/templates`
6269
- [ ] Integration with GHL / N8N
6370

6471
# Content TO-DO list:

templates/README.md

Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
# Coldflow templates
2+
3+
A small, opinionated library of cold email templates for the use cases that
4+
actually drive replies. Plaintext, under ~120 words, one CTA per email.
5+
6+
These are content — markdown files you copy into the campaign builder. They
7+
are not loaded by the app at runtime. For the in-app picker (`Browse
8+
templates` button), see `src/lib/templates/catalog.ts`.
9+
10+
## Index
11+
12+
### Sales (3)
13+
- [`sales/saas-pain-point.md`](sales/saas-pain-point.md) — open with a concrete
14+
symptom of the problem your product solves.
15+
- [`sales/agency-case-study.md`](sales/agency-case-study.md) — lead with a peer
16+
outcome, not a pitch.
17+
- [`sales/founder-direct.md`](sales/founder-direct.md) — founder-to-buyer
18+
honesty trade for early-stage selling.
19+
20+
### Recruiting (2)
21+
- [`recruiting/passive-candidate.md`](recruiting/passive-candidate.md) — first
22+
touch to a happy, employed engineer.
23+
- [`recruiting/founder-hiring.md`](recruiting/founder-hiring.md) — founder
24+
reaching out for the first or second engineer.
25+
26+
### Partnership (2)
27+
- [`partnership/integration-proposal.md`](partnership/integration-proposal.md)
28+
scoped product integration pitch.
29+
- [`partnership/co-marketing.md`](partnership/co-marketing.md) — joint post,
30+
webinar, or list swap.
31+
32+
### Warm intro (2)
33+
- [`warm-intro/mutual-connection.md`](warm-intro/mutual-connection.md) — when
34+
a shared contact has agreed to be named.
35+
- [`warm-intro/event-followup.md`](warm-intro/event-followup.md) — convert a
36+
conference/dinner conversation into a real thread.
37+
38+
### Follow-up (1)
39+
- [`follow-up/no-reply-bump.md`](follow-up/no-reply-bump.md) — single bump on
40+
a non-replier with a soft "give me an out" CTA.
41+
42+
## Format
43+
44+
Each template is a `.md` file with YAML front-matter and a plaintext body:
45+
46+
```yaml
47+
---
48+
id: sales_saas_pain_point
49+
name: SaaS — Pain Point Opener
50+
category: sales
51+
persona: Who you are when you send this
52+
use_case: When this template wins
53+
deliverability_notes: |
54+
What to keep, what to swap, what trips spam filters.
55+
subject: Noticed {{specific_signal}} at {{company}}
56+
variables:
57+
- first_name
58+
- company
59+
- specific_signal
60+
---
61+
62+
Hi {{first_name}},
63+
64+
...body...
65+
```
66+
67+
`{{variable}}` placeholders match the syntax used by the in-app campaign
68+
builder (see `src/lib/templates/catalog.ts`). Replace them per-recipient
69+
before sending.
70+
71+
## How to load into Coldflow
72+
73+
Coldflow's MVP supports a single-step sequence with per-recipient
74+
personalization. There is no separate "CSV upload" — the recipient list is
75+
pasted into a textarea on the new-campaign page.
76+
77+
1. **Start a new campaign** — go to `/dashboard/campaigns/new` (page source:
78+
[`src/app/(frontend)/dashboard/campaigns/new/page.tsx`](../src/app/(frontend)/dashboard/campaigns/new/page.tsx)).
79+
2. **Pick a connected sender** under *Send from*. If none are connected, set
80+
one up at `/dashboard/email-accounts` first.
81+
3. **Paste recipients** into the *Recipients* textarea. One per line, comma,
82+
or semicolon. Optional `Name <email>` form is parsed by
83+
[`src/lib/recipientParser.ts`](../src/lib/recipientParser.ts), so a
84+
pasted CSV column works directly.
85+
4. **Copy the template** — open the chosen file in this folder, copy
86+
`subject:` into the *Subject* field and the body (everything below the
87+
second `---`) into the *Body* field.
88+
5. **Verify variables** — the form lists every `{{placeholder}}` it detected
89+
under *Variables in this template*. Match them against the front-matter
90+
`variables:` list.
91+
6. **Create campaign** — Coldflow queues the emails through the configured
92+
sending limit (see `src/app/api/email-queue/process/route.ts`).
93+
94+
If you want the template available in the in-app *Browse templates* picker
95+
instead of one-off copy/paste, add an entry to `TEMPLATES` in
96+
[`src/lib/templates/catalog.ts`](../src/lib/templates/catalog.ts) and the
97+
catalog test will enforce that every `{{variable}}` is declared.
98+
99+
## Deliverability notes that apply to every template
100+
101+
- Send plaintext. No tracking pixel, no signature image, no link in send #1
102+
unless the recipient asked for one.
103+
- Personalize the variable that carries the email — the "specific signal" or
104+
"specific conversation detail" line. Generic versions get filtered.
105+
- Stay under 120 words. Longer reads as marketing.
106+
- Reply-bumps go on the same thread (`Re: {{previous_subject}}`), not a new
107+
one. Coldflow's silent-reply follow-up handles this automatically; see
108+
`Pending follow-ups` on the dashboard.
109+
- One CTA per email. If you want two, send two emails.
110+
111+
## Contributing
112+
113+
New templates welcome. Keep the front-matter shape consistent, run a quick
114+
spam-word pass before opening a PR, and aim for "useful as-is to a real
115+
sender" over "clever".
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
---
2+
id: follow_up_no_reply_bump
3+
name: Follow-up — No-Reply Bump
4+
category: follow-up
5+
persona: Anyone whose first cold email got opened but no reply, 4–7 days later
6+
use_case: Single follow-up to a non-replier. Shorter than the first send, with a softer ask designed to surface "wrong person / wrong time" rather than push for a meeting.
7+
deliverability_notes: |
8+
Send as a Reply-All to the original thread (Re: subject), not a new thread —
9+
Gmail groups it and reply rates roughly 2x. Don't repeat the original pitch;
10+
call out the silence and offer an out. Avoid "just bumping this up", "did you
11+
see my last email" — both read as pushy. Under 80 words.
12+
subject: "Re: {{previous_subject}}"
13+
variables:
14+
- first_name
15+
- previous_subject
16+
- original_topic
17+
- sender_name
18+
---
19+
20+
Hi {{first_name}},
21+
22+
Following up on the thread below — figured I'd give you an out rather than chase.
23+
24+
A one-line reply works:
25+
26+
1. "Yes, send more" — and I'll send the short version
27+
2. "Wrong person" — and I'll stop and find the right one
28+
3. "Not now, ask me in {{original_topic}} months" — and I'll set a reminder
29+
30+
Whichever it is, no offense taken. Easier for both of us than a third email.
31+
32+
— {{sender_name}}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
---
2+
id: partnership_co_marketing
3+
name: Partnership — Co-Marketing
4+
category: partnership
5+
persona: Marketing lead or founder proposing a content / webinar / list swap with a non-competing peer
6+
use_case: Cold open to a complementary brand offering a specific co-marketing motion (joint post, webinar, newsletter swap).
7+
deliverability_notes: |
8+
Pick ONE format and propose it concretely. "Let's do something together" is dead
9+
on arrival. Mentioning your audience size up front sets honest expectations.
10+
Avoid "amazing", "huge opportunity". Under 120 words. Single CTA.
11+
subject: {{my_company}} + {{their_company}} — joint {{format}}?
12+
variables:
13+
- first_name
14+
- my_company
15+
- their_company
16+
- format
17+
- my_audience_size
18+
- shared_audience
19+
- sender_name
20+
---
21+
22+
Hi {{first_name}},
23+
24+
Our audiences overlap more than you'd expect — {{shared_audience}} reads both of us.
25+
26+
Concrete pitch: a joint {{format}}. We bring {{my_audience_size}} on the {{my_company}} side; happy to do the heavier lift (drafting, design, scheduling) so it's mostly a yes/no decision on your end.
27+
28+
I'll send a one-page outline before any commitment, so you can see exactly what would go out and where. If the angle isn't right, kill it — no hard feelings.
29+
30+
Worth 20 minutes next week to talk through it?
31+
32+
— {{sender_name}}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
---
2+
id: partnership_integration
3+
name: Partnership — Integration Proposal
4+
category: partnership
5+
persona: Founder or partnerships lead proposing a product integration with a complementary tool
6+
use_case: Cold open to a peer company suggesting a real, scoped integration. Strongest when you can name the shared customer who'd use it.
7+
deliverability_notes: |
8+
Lead with the shared customer or use case — vague "let's partner" notes get ignored.
9+
Be specific about who builds what. Skip the words "synergy", "ecosystem", and
10+
"strategic". Under 120 words. One clear next step (intro call), no marketing fluff.
11+
subject: {{my_product}} ↔ {{their_product}} integration?
12+
variables:
13+
- first_name
14+
- my_product
15+
- their_product
16+
- shared_customer_signal
17+
- integration_shape
18+
- sender_name
19+
---
20+
21+
Hi {{first_name}},
22+
23+
Quick proposal: an integration between {{my_product}} and {{their_product}}.
24+
25+
{{shared_customer_signal}} is the wedge — we hear it from users every week and so do you, based on what shows up in your support threads.
26+
27+
Concretely: {{integration_shape}}. Should be a couple of days of work on our side; maybe similar on yours. We'd co-launch and split the post.
28+
29+
Worth a 30-minute call to see if the shape works on your end? If your team already has something in flight here, I'm happy to step out of the way.
30+
31+
— {{sender_name}}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
---
2+
id: recruiting_founder_hiring
3+
name: Recruiting — Founder Hiring Eng #1
4+
category: recruiting
5+
persona: Solo or small-team founder hiring their first or second engineer
6+
use_case: Founder-to-engineer cold note. Trades polish for substance — what they'll actually build and why it matters. Best at seed / Series A.
7+
deliverability_notes: |
8+
Don't oversell — engineers smell it. Be specific about the problem space, not the
9+
funding number. Avoid "rocketship", "unicorn", "10x". Plaintext, under 120 words.
10+
No calendar link in send #1; let them ask for one.
11+
subject: First eng hire at {{my_company}} — your work caught my eye
12+
variables:
13+
- first_name
14+
- candidate_specific_work
15+
- my_company
16+
- what_were_building
17+
- why_now
18+
- sender_name
19+
---
20+
21+
Hi {{first_name}},
22+
23+
Founder of {{my_company}} here. {{candidate_specific_work}} is exactly the kind of taste I'm trying to hire — most generalists I've talked to can't do that part.
24+
25+
We're building {{what_were_building}}. {{why_now}} — and the next six months are the part where the right second person changes the whole company.
26+
27+
I'm not going to pretend it's a sure thing. But it's real work, real users already, and you'd own a meaningful chunk of the surface area.
28+
29+
Open to a 30-minute call to walk through it? If not, no worries — I'd still take any pointers on people you'd hire for this.
30+
31+
— {{sender_name}}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
---
2+
id: recruiting_passive_candidate
3+
name: Recruiting — Passive Candidate
4+
category: recruiting
5+
persona: Hiring manager or in-house recruiter reaching out to a happy, employed engineer
6+
use_case: First touch to a passive candidate. Designed to respect their time and earn a reply even from a "not looking" state.
7+
deliverability_notes: |
8+
Lead with one specific thing from their work — generic "I came across your profile"
9+
reads as bulk mail and lands in Promotions. Disclose comp range up front; missing
10+
it is the #1 reason passives ignore recruiter mail. Keep under 120 words.
11+
subject: {{role_title}} at {{company}} — open to a chat?
12+
variables:
13+
- first_name
14+
- candidate_signal
15+
- role_title
16+
- company
17+
- team_focus
18+
- comp_range
19+
- sender_name
20+
---
21+
22+
Hi {{first_name}},
23+
24+
{{candidate_signal}} is the reason I'm writing — that's the exact shape of work my team is hiring for.
25+
26+
We're looking for a {{role_title}} at {{company}}. Team is small, ships weekly, and is focused on {{team_focus}}. Comp range is {{comp_range}} plus equity, fully remote.
27+
28+
Even if you're happy where you are, I'd love 20 minutes to swap notes and tell you what we're building. Worst case you walk away with context for whenever the timing's right.
29+
30+
Reply with a day that works and I'll send a couple of times.
31+
32+
— {{sender_name}}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
---
2+
id: sales_agency_case_study
3+
name: Agency — Case Study Wedge
4+
category: sales
5+
persona: Agency principal or BDR selling done-for-you services to a similar-shape buyer
6+
use_case: Cold open that leads with a peer outcome, not a pitch. Strongest when the case study company is one tier ahead of the prospect.
7+
deliverability_notes: |
8+
Lead with the peer name, not the offer. Replace {{case_study_company}} with a real
9+
customer (with permission). Avoid the phrases "100%", "best price", and "act now".
10+
120-word cap. One soft CTA, no calendar link in send #1.
11+
subject: How {{case_study_company}} hit {{outcome_metric}}
12+
variables:
13+
- first_name
14+
- company
15+
- case_study_company
16+
- outcome_metric
17+
- service_area
18+
- timeline
19+
- sender_name
20+
---
21+
22+
Hi {{first_name}},
23+
24+
We worked with {{case_study_company}} on {{service_area}} and they hit {{outcome_metric}} in {{timeline}}. Their team looked a lot like yours at {{company}} a year ago.
25+
26+
Not pitching — just thought the playbook might be useful context for whatever you're already running.
27+
28+
If a 20-minute walkthrough of what worked (and what we'd do differently) is interesting, reply with a day that's good and I'll send a couple of times. If you'd rather just see the writeup, say "send the writeup" and I will.
29+
30+
— {{sender_name}}

templates/sales/founder-direct.md

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
---
2+
id: sales_founder_direct
3+
name: Sales — Founder Direct
4+
category: sales
5+
persona: Founder selling early — under 100 customers, willing to do the work themselves
6+
use_case: Personal note from a founder to a target buyer. Trades polish for honesty. Best at small ACVs where the founder is still the best closer.
7+
deliverability_notes: |
8+
Plaintext only. No tracking pixel, no signature image. The "I built this" framing
9+
carries the email — avoid corporate phrasing. Skip words like "solution", "leverage",
10+
"synergy". Stay under 120 words; longer reads as marketing.
11+
subject: Built this for teams like {{company}}
12+
variables:
13+
- first_name
14+
- company
15+
- product_name
16+
- core_use_case
17+
- my_company
18+
- sender_name
19+
---
20+
21+
Hi {{first_name}},
22+
23+
Quick one — I'm the founder of {{my_company}}. Built {{product_name}} after watching three teams burn weeks on {{core_use_case}} the hard way.
24+
25+
Still small enough that I do onboarding personally and ship fixes the same week. I'd rather lose you than oversell, so if it isn't a fit I'll say so on the call.
26+
27+
Worth 20 minutes this week or next? If now isn't the moment, totally fine — happy to circle back in a quarter.
28+
29+
— {{sender_name}}

templates/sales/saas-pain-point.md

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
---
2+
id: sales_saas_pain_point
3+
name: SaaS — Pain Point Opener
4+
category: sales
5+
persona: SaaS founder or AE selling into product/engineering teams
6+
use_case: Cold open to a buyer where you've spotted a concrete symptom of the problem your product solves.
7+
deliverability_notes: |
8+
Keep it under 120 words. No links in the first send (calendar offered as text).
9+
Avoid the words "free", "guarantee", and "limited time". One question, one CTA.
10+
Personalize {{specific_signal}} per recipient — generic versions get filtered.
11+
subject: Noticed {{specific_signal}} at {{company}}
12+
variables:
13+
- first_name
14+
- company
15+
- specific_signal
16+
- pain_outcome
17+
- product_name
18+
- sender_name
19+
---
20+
21+
Hi {{first_name}},
22+
23+
Saw {{specific_signal}} at {{company}} — usually that means {{pain_outcome}} is showing up somewhere in the week. We hear it most from teams that grew past the point where one person could hold the whole flow in their head.
24+
25+
{{product_name}} fixes the part nobody wants to own: the boring middle of the pipeline that breaks quietly until a customer notices.
26+
27+
Worth 15 minutes to see whether the shape of your problem matches what we usually see? If it doesn't, I'll say so and we both move on.
28+
29+
— {{sender_name}}

0 commit comments

Comments
 (0)