act · sequences and steps
Templates and variants
Message copy and what gets tested.
In Sequences and steps
A template is the reusable shape of a message: fixed lines, slots filled from the brief, the lead and the signal, and the rules a draft must obey. A variant is the same template with one thing changed. Templates are drafted in the founder's voice and every draft is logged with its prompt version, so the edits the founder makes become the best training data the system has.
sequence library → steps · the parts → templates · the words → next-best-action · the choice → contact policy · the limits
Slots, never guesses — A slot with no source stays empty or the line is cut. A made-up fact is worse than a weaker message.
One change per variant — Change the opener or the length, not both, or the result can't say which mattered.
Stamp every draft — Template id, variant and prompt version on every draft, sent or not.
in industry terms
Templates are message blueprints; variants are the A/B versions.
Sales tools call these templates with merge fields or snippets, and test variants inside a step. Here the template is filled by a model rather than a mail merge, so the prompt version is part of the template's identity: change the prompt and you have a new variant.
shape — Template · Purpose, slots, constraints, a good example, and the step types it may be used in.
version — Variant · The template with one axis changed: opener, length, proof, call to action, send time.
output — Draft · One filled message, stamped with template, variant and prompt version, then shipped, edited or discarded.
how it works
From a template to a sent message.
The draft step fills slots, writes in the founder's voice, checks the hard rules, and hands it to the founder. The founder's edit is recorded against the draft.
- Template — slots + rules
- Fill slots — brief, lead, signal
- Draft — voice, prompt v
- Rules check — no em dashes, no links
- Founder — ship, edit, discard
- Logged — edit distance, locus edits become preference pairs for the next prompt version
| Hard rule | Why |
|---|---|
| No em dashes | A brand rule in VibeDraft's drafting guidance |
| No links in X post bodies; links go in a reply | Posts without links reach further |
| No invented events, numbers or quotes | Everything factual comes from the brief, the signal or a tool result |
| No reaction bait closers ("agree?") | Banned in the drafting rubric |
| Lowercase voice, varied openers | From the founder's voice profile |
variant testing
The axes worth testing, one at a time.
Each axis is a knob for the experimentation engine. Randomize which slot a variant lands in, so timing never decides the winner.
| Axis | Example variants | Measured by |
|---|---|---|
| Opener | proof first · question first · claim first | reply rate |
| Length | 2 lines · 5 lines | reply rate, read time where known |
| Proof | with one sourced result · without | reply and click rate |
| Call to action | link in message · "want it?" first | click and join rate |
| Personalization | their words quoted · not quoted | reply rate; watch for "creepy" replies |
| Send time | within 2 h of signal · next morning | reply rate by signal age |
already running on posts
Drafts carry a variant type (claim, evidence, question) and a randomized slot.
the object
The template, and a variant.
The template is versioned; each variant points at its prompt version.
| Field | Type | What it holds |
|---|---|---|
template_id | string | tmpl.<step>.<name> |
version | integer | Bumped on any change to fixed lines, slots or rules. |
purpose | text | One line: what this message must get the person to do. |
step_types | list | Which step components may use it. |
slots | list | Variables it needs, each with its source and fallback. |
rules | list | Hard rules the draft must pass. |
example | text | One good filled message, for the model and for reviewers. |
variant.id | string | A, B… |
variant.axis | enum | opener · length · proof · cta · personalization · send_time |
variant.prompt_version | string | The exact prompt that drafts it. |
draft.decision | enum | shipped · shipped_edited · discarded |
| enum | hook · body · ending · none · rewrite |
one record, as data
{
"template_id": "tmpl.dm.brief",
"version": 1,
"purpose": "open their brief, then join the waitlist",
"step_types": [
"dm"
],
"slots": [
{
"name": "their words",
"source": "signal.raw_text",
"fallback": "paraphrase"
},
{
"name": "tracked_link",
"source": "step.tracked_link",
"fallback": "no link"
}
],
"rules": [
"no_em_dash",
"one_link",
"no_invented_facts",
"max_words_60"
],
"variants": [
{
"id": "A",
"axis": "opener",
"prompt_version": "dm-brief-v1a"
},
{
"id": "B",
"axis": "opener",
"prompt_version": "dm-brief-v1b"
}
]
}the catalog
Fourteen template variables and where each comes from.
Grouped by source: the brief, the campaign, the signal, the lead. Every slot has a fallback, and the fallback is never a guess.
{who} — Brief
The buyer
Who the product is for, as they'd describe themselves.
- from
- brief: who it's for
- fallback
- leave the placeholder; don't guess
{pain} — Brief
The pain it removes
The annoying thing they do today.
- from
- brief: pain
- fallback
- use their words from the signal instead
{product} — Brief
Product name
Your product's name.
- from
- brief
- fallback
- required
{core job} — Brief
What it does
A verb phrase that finishes "it…".
- from
- brief: what it does
- fallback
- required
{offer} — Campaign
The offer
The value line of the campaign's offer.
- from
- campaign offer
- fallback
- required
{tracked_link} — Campaign
Tracked link
A short link carrying the touch_id.
- from
- step.tracked_link
- fallback
- no link; never an untracked one
{their words} — Signal
Their words
A short quote of what they posted, to show you read it.
- from
- signal raw text
- fallback
- paraphrase, never invent
{trigger} — Signal
What happened
The trigger in plain words: launched, complained, asked.
- from
- signal trigger
- fallback
- required for cold steps
{signal_age} — Signal
How long ago
"yesterday", "this morning". Used rarely, and only when fresh.
- from
- signal posted_at
- fallback
- omit
{competitor} — Signal
Their current tool
The competitor they named.
- from
- signal or competitive analysis
- fallback
- omit the line
{first_name} — Lead
First name
Only when it's public and clearly theirs.
- from
- lead identity
- fallback
- no greeting name
{their product} — Lead
Their product
For founder leads: what they built.
- from
- lead enrichment brief
- fallback
- omit
{their site} — Lead
Their site
Their domain, for the brief offer.
- from
- lead identities
- fallback
- ask for it instead
{proof} — Brief
One line of proof
A real result, quote or number with a source.
- from
- brief: proof, evidence tier A or B
- fallback
- omit; never invent proof
illustrative example
The DM in Lead to waitlist, as a template.
Slots in braces. The founder sends it; VibeDraft drafts it.
tmpl.dm.brief v1 (step.dm + step.send_brief)
purpose: get them to open their brief, then join the waitlist
saw your post about {their words}. i ran {their site} through the tool i'm building
and it wrote up who pays for {their product} and where they hang out: {tracked_link}
if it's useful, there's a waitlist on the page. no worries if not.
rules: one link only, no em dashes, no invented facts, under 60 words
variants: A = as above · B = opens with the one most surprising line from their brieffailure modes
What goes wrong, and how to catch it.
How each one shows up, and the check that catches it before it costs a week.
| Failure | How it shows up | How to catch it |
|---|---|---|
| Placeholder leak | A message goes out with {first_name} in it | Rules check refuses any unfilled slot |
| Voice drift | Drafts stop sounding like the founder; edit distance rises | Track median edit distance per prompt version; roll back on a jump |
| Creepy personalization | "How do you know that?" replies | Quote only what they posted publicly in this thread |
| Confounded variants | Two axes changed, result unreadable | Variants carry exactly one axis |
| Unstamped drafts | Can't tell which prompt wrote the message that worked | Prompt version required on every draft row |
data to capture
Record it so a model can learn from it later.
Follows the guide's eight data-spine rules: log the decision, version what decided, freeze the inputs, keep the negatives, log the odds, treat every human touch as a label, keep one chain of ids, keep the raw.
record
- template id, version, variant and prompt version on every draft
- the draft text and the final sent text
- decision, edit distance, edit locus and seconds to decide
- slot values used, with their sources
label
shipped unedited, edited or discarded; the reply each sent message got
trains
a draft reward model from (draft, posted text) preference pairs, and opener choice per trigger
test
variants on one axis at a time · randomized per draft (prompt version and slot)