Email personalization
Skill vivekkhimani/gtm-tools-template/.agents/skills/email-personalization
Draft a 90-word personalized first-touch cold email for a [COMPANY] prospect. Takes one company row (from leads_scored.csv or leads_enriched.csv) plus an optional buying signal, and produces a draft that follows the v1 sequence pattern. Use when drafting Email 1 of the 4-touch sequence (outreach/sequence-v1.md). Also triggers on "draft outreach email", "write cold email", "personalize email for {company}".From its SKILL.md
npx -y skills add vivekkhimani/gtm-tools-template --skill email-personalizationAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 1 stars1 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
SKILL.md
6.8 KB, ~1.6k tokens by cl100k_base, as published. Nobody here has run it
Email personalization
Generate a personalized Email-1 cold outreach draft for a [COMPANY] ICP target, matching the v1 sequence pattern in outreach/sequence-v1.md.
When to use
- Drafting first-touch emails for the top tier (T1/T2) of
pipeline/leads/leads_scored.csv. - Re-drafting after a signal changes (new buying signal, leadership change, compliance event).
- NOT for follow-up emails (2, 3, 4) — those are thread replies with simpler templates already in the sequence doc.
Inputs
| Input | Required | Source |
|---|---|---|
| Company row | Yes | A single row from pipeline/leads/leads_scored.csv or leads_enriched.csv. At minimum: Company Name, Short Description, Keywords, Company Country, # Employees. |
| Recipient name + title | Yes | First name, title, ideally verified via Findymail/Hunter |
| Buying signal | Optional but recommended | One-sentence specific fact: <!-- TODO: 2–3 example signals for YOUR industry, e.g. "took delivery of new capacity in March 2026", "hired a [BUYER_TITLE] in February", "recent compliance finding in [GEO_PRIMARY]" --> |
| Angle | Optional | One of: [ANGLE_A], [ANGLE_B], [ANGLE_C]. Default: pick the one best-matched to the signal. <!-- TODO: name your 2–3 messaging angles --> |
Process
-
Read
positioning/messaging.md,positioning/ICP.md, andoutreach/sequence-v1.md. The skill must conform to the voice and structural conventions already defined there. Do not invent claims that aren't in messaging.md. -
Classify segment for the company (A/B/C per
ICP.md). If unclear, infer from Short Description + Keywords, but prefer to ASK rather than guess on segment. -
Choose angle. Pick the angle that maps to:
- The provided signal. <!-- TODO: map signal types → angles, e.g. a compliance event → [ANGLE_A] -->
- The segment (Segment A favors
[ANGLE_A]; Segment B favors[ANGLE_B]; Segment C favors[ANGLE_C]).
-
Generate signal sentence. This is the most important sentence — first line of the email. It must reference a specific, verifiable fact about the company. Source it from:
- The provided signal input (preferred).
- The Short Description column (less specific but better than nothing).
- A recent news snippet if web search is available.
- DO NOT make up a signal. If you don't have one, return an explicit "needs signal research" output instead of a fabricated email.
-
Draft. Follow the structure in
outreach/sequence-v1.mdEmail 1. Constraints:- 80–95 words in the body.
- First sentence is the signal reference + the pain hook.
- One proof point (citing the canonical traction: "[METRIC_DEPLOYMENTS] / [METRIC_USERS]" — or "replaced [INCUMBENT] at [ANCHOR_CUSTOMER]" if a switch-out proof lands harder for the segment).
- One soft CTA ("worth a 15-min call?").
- Plain text, no HTML, no formatting.
- Lowercase, no exclamation marks, no "Hope this finds you well" or similar dead opens.
-
Subject line. Generate 3 candidate subject lines following the patterns in
outreach/sequence-v1.md. ≤8 words. Lowercase. No question marks at the end unless it's a real question. Reference a specific token (a product/category term, company name, role) — don't go generic. -
Output as YAML so it slots cleanly into Smartlead/Instantly imports:
to: {recipient_email}
recipient_name: {FirstName} {LastName}
recipient_title: {Title}
company: {Company}
segment: {A|B|C}
angle: {[ANGLE_A]|[ANGLE_B]|[ANGLE_C]}
signal_used: "{one-sentence signal}"
subject_options:
- {subject 1}
- {subject 2}
- {subject 3}
body: |
Hi {FirstName},
{body 80–95 words}
— [FOUNDER]
[DOMAIN] · [CALENDLY]
qc_checks:
word_count: {N}
has_signal: true|false
has_one_cta: true|false
no_banned_phrases: true|false # checks "hope this finds you", "circling back", "just checking in", "synergy", "leverage", "solution", "platform"
Banned phrases (never use)
- "Hope this finds you well"
- "Just checking in"
- "Circling back"
- "Touching base"
- "Synergy", "leverage", "solution" (as nouns), "platform" (generic)
- "10x", "best-in-class", "world-class"
- "I noticed you on LinkedIn..." (we are not on LinkedIn for this audience)
- Any subject line that's only "{Company}" with no other context
Voice constraints
- Use specific [INDUSTRY] terms when they fit. <!-- TODO: list the concrete vocabulary your buyer uses — product/category terms, regulation/standard codes, equipment, certifications — so drafts sound native, not like generic SaaS copy. -->
- The reader is a [INDUSTRY] operator, not a SaaS buyer. Match their register.
- Honest claims only — canonical traction is [METRIC_DEPLOYMENTS], [METRIC_USERS], [METRIC_COMPLETION], anchor customer [ANCHOR_CUSTOMER] with the incumbent replaced (name them only if cleared for external use). Don't inflate beyond these. Keep the wedge framing in cold email (the budgeted entry pain) — do NOT cold-open with "[PRODUCT_ONELINER]"; "platform" stays a banned generic noun here.
Failure modes (return explicitly rather than fake it)
- No signal available: return
status: needs-signal-researchwith a list of 3–5 specific signal queries to run. <!-- TODO: example queries for YOUR industry's data sources --> - Segment ambiguous: return
status: needs-segment-decisionwith two interpretations and your recommendation. - Recipient title doesn't match [COMPANY]'s buyer personas: return
status: wrong-personawith a recommended persona to find instead.
Example invocation
Draft an Email-1 for [TARGET_COMPANY] (row in leads_scored.csv) targeting their [BUYER_TITLE]. Signal: <!-- TODO: a specific, verifiable fact, e.g. "they were quoted in [TRADE_PRESS] last month about [a pain in your space]". -->
Expected output: a YAML block as specified above, with the angle matched to the signal, 3 subject candidates, and a body that opens with the signal reference.
Integration
This skill is invoked manually per email during the first weeks (we want human review of every draft). Once you've shipped ~50 drafts and feel confident the voice is right, wrap it in scripts/draft_emails.py to batch-process the top 20 weekly.
Track each draft in outreach/drafts/_template/{company-slug}.yaml (copy _TEMPLATE.yaml per prospect). Drafts are .gitignored if they include recipient emails; the templates without recipient emails are fine to commit for voice tuning.
What ships with it
Read from the repository
Just SKILL.md. No reference files, no scripts.