From gtm-skills
Designs a cold-outreach email sequence as a fixed template set with placeholders and variant-routing rules. Useful when committing to human-approved copy at design time rather than using per-row LLM generation.
How this skill is triggered — by the user, by Claude, or both
Slash command
/gtm-skills:email-prompt-buildingThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Design a cold-outreach sequence and commit it to a **fixed template set**: the actual approved copy for every touch, with `{{input_field}}` placeholders and variant-routing rules. This skill does the thinking — explore angles, form pain hypotheses, decide the sequence arc, pick proof points — and bakes the result into final copy.
Design a cold-outreach sequence and commit it to a fixed template set: the actual approved copy for every touch, with {{input_field}} placeholders and variant-routing rules. This skill does the thinking — explore angles, form pain hypotheses, decide the sequence arc, pick proof points — and bakes the result into final copy.
The template is rendered later by email-generation via plain deterministic substitution. There is no runtime LLM writing emails per row.
This skill is design-time. It commits to copy; it does not defer decisions to a runtime model.
Older versions of this skill emitted an LLM instruction prompt and let a per-row model write each email. That is retired. Per-row variance is now expressed two ways only: (1) {{input_fields}} filled upstream, (2) discrete variant templates selected by a routing key. Everything else is identical across the batch.
DESIGN TIME (this skill)
┌─────────────────────────────────────┐
context file ─────────▶│ explore angles, pick hypotheses, │
research / hypotheses ▶│ decide sequence arc, choose proof │──▶ template set (sequence.md)
enrichment field list ▶│ → commit to FINAL COPY │ • real copy per touch
└─────────────────────────────────────┘ • {{input_field}} placeholders
• variant-routing rules
• Input Fields contract
FILL TIME (normalization + enrichment skills)
contacts ─▶ populate every declared input field
RENDER TIME (email-generation skill)
template + filled CSV ─▶ deterministic render ─▶ emails CSV
All inputs live in the GTM project this skill is invoked on (paths are project-relative; the exact layout is the project's, not this skill's).
| Input | What to extract |
|---|---|
| Company context file | Voice, sender, value prop, proof library, key numbers, banned words |
| Campaign research | Verified data points, statistics, tool comparisons |
| Hypothesis set | Numbered hypotheses with mechanisms and evidence |
| Enrichment field list | Which {{input_fields}} will be available, and from which enrichment/normalization step |
| Campaign brief | Target vertical, role types, sequence length |
A template set — one sequence file per campaign — containing:
{{input_field}} placeholders inline. Not rules for writing it — the actual words.Touch 3: segment == "enterprise" → variant A, else → variant B){{field}}, its source, and its fallbackSee references/example-sequence.md for the worked output shape.
Every {{placeholder}} in the template MUST be declared in a table — this is the handshake with the fill + render steps. A render fails loudly if a declared field is missing; an undeclared placeholder is a bug. Describe each source by its role (a normalization step, a classification enrichment column), not by a file path in any specific project.
| Field | Source (by role) | Fallback if missing |
|---|---|---|
{{first_name}} | name-normalization step | skip the contact |
{{company_name}} | name-normalization step | skip the contact |
{{industry}} | industry-classification enrichment column | drop the clause that uses it (provide a no-{{industry}} variant) |
{{segment}} (routing key) | segment-classification enrichment column | route to the default variant |
If a field needs genuine per-row writing (e.g. a bespoke one-line opener), it is still an input field — produced by an LLM enrichment column upstream, not by this skill and not at render time.
Read the project's company context file, campaign research, and hypothesis set.
Also confirm the enrichment field list — which {{input_fields}} will actually be available, and from which enrichment/normalization step. Only use fields you can guarantee will be filled.
Check persona spread. If the contact list spans multiple personas (executives + ICs + ops), build a separate template set per role cluster. One template trying to serve all roles produces mush.
This is the real work. There is no runtime model to "figure it out per row" — this skill must commit.
{{input_field}} placeholders only where per-row substitution is genuinely needed. Everything else is fixed copy.When a touch should differ by segment/persona, write each variant as separate, complete copy — never one template with "if enterprise, say X" conditionals. Declare the routing key and the condition per variant. Keep variants few (2-3); each is a full email.
Declare every {{field}} per the table above — source and fallback. A field with no reliable source is not allowed in the template; either add an enrichment step that produces it, or cut the clause.
# Sequence — {campaign}
[overview: touches, cadence, variables]
## Touch 1 — {angle}
[FINAL copy with {{placeholders}}]
**Subject options:** [first touch only]
## Touch 2 — {angle}
[FINAL copy] **Subject:** empty (threads as Re:)
## Touch 3 — conditional on {{routing_key}}
### Variant A — {condition}
[FINAL copy]
### Variant B — {condition}
[FINAL copy]
## Input Fields contract
[the declared-fields table]
## Notes
[angle rationale, voice rules, what was excluded]
{{placeholder}} is declared in the Input Fields contract with a source + fallback{{field}} whose source can't be guaranteed-- not –/—, English onlySave the template set as the campaign's sequence file, in whatever location the GTM project uses for campaign assets (one sequence file per campaign).
Touches take the problem from different angles, escalating from soft to direct:
{{customer_segment}})Cadence default: 2 days after Touch 1, 3 days between later touches. Override per campaign.
npx claudepluginhub extruct-ai/gtm-skills --plugin gtm-skillsBuilds high-response cold outreach campaigns with personalized sequences, response handling, and compliance. For B2B sales and SDR workflows.
Generates personalized cold outreach messages and email sequences for LinkedIn DMs and follow-ups to book calls and get replies.
Writes B2B cold emails and follow-up sequences that earn replies. Use for outbound prospecting, SDR outreach, personalized openings, subject lines, CTAs, and multi-touch sequences.