|
| 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". |
0 commit comments