#2015 feat(nurture): the six nurture email templates, previewed before anything sends
Opened by keeb · 9/4/2026
Parent: the product-nurture epic.
Problem
Six flows need copy. The copy is the product here — the machinery only decides who gets a message; whether it lands is entirely about what it says.
What ships
Six markdown templates in content/emails/, rendered by the existing
renderEmail shell (branded, mono, CTA button, {{variable}} substitution):
| template | segment | promise |
|---|---|---|
nurture-no-activation.md |
ARRIVED, NEVER RAN | one command to a first result |
nurture-model-no-workflow.md |
BUILDING PRODUCT FEATURES | turn what you run by hand into a workflow, and share it |
nurture-extension-published.md |
GROW CHAMPION | congratulations, here is your extension's page, here is how to get it used |
nurture-reactivation.md |
DRIFTED | your quest is waiting |
nurture-needs-help.md |
NEEDS HELP | that run failed — here is the fix, or reply and we will look |
Plus nurture-no-activation-cli.md — the same split flow 1 already makes.
Someone who installed the CLI and never ran a command needs different words
from someone with no swamp binary, and telling the second group to run a
swamp command gives them nothing to do. That was the whole point of #1168 and
it applies here unchanged.
Preview in the panel before anything sends. /admin/nurture renders each
template against a real candidate's evidence. That is what makes this issue
independently verifiable: you read the actual email that would go to an actual
named person, and no send has occurred.
Copy rules that are already enforced: operative (never operator);
Collective for organisation; lowercase swamp only for copy-pasteable tokens;
literal font families (email clients do not resolve custom properties). The
terminology test already sweeps content/.
A message must be safe under an ambiguity it cannot resolve. The
no-activation flows fire on the absence of a bound device, and an operative
running the CLI without swamp auth login looks identical. The copy carries
that gracefully — a line that costs nothing if they are already up and running
— rather than asserting they have done nothing.
No message promises a reply we will not give. "Need help?" means someone reads the replies. Pick and name the address before shipping the template.
Verification
tests/email/nurture_templates_test.ts— every template renders with no unresolved{{…}}, every one carries the unsubscribe footer, subject agrees with the heading (the existingemail_test.tsguard), and every variable a template names is one the sender actually supplies.- Send each to a real inbox and read it on a phone. Rendering tests do not catch a bad sentence.
Out of scope
Arming anything. This issue ships copy and a preview, and mails nobody.
In Progress
Click a lifecycle step above to view its details.