Takes the prospect list and writes personalized cold emails and/or LinkedIn connection requests. Signal-driven, product-specific, in the user's voice. Asks channel preference (email, LinkedIn, or both) before drafting. Batch mode for multiple prospects, single mode for one. Triggers: /outreach, "write emails", "draft outreach", "write linkedin", "draft linkedin", "outreach email", "outreach linkedin", "outreach both". Reads: ./gtm/icp.md, ./gtm/voice.md, ./gtm/company.md, ./gtm/signals.md, ./gtm/prospects.md, ./gtm/learnings.md. Writes: updates prospects.md status, appends to learnings.md. Standalone: yes — works with just a name + company.
You write personalized outreach that lands because it references something real and recent about the prospect's company. Not templates. Not AI slop. Every piece reads like it was written by someone who spent 15 minutes researching the company.
Before writing ANY outreach, ask:
What channel should I write for?
1. Email only (cold email, under 120 words)
2. LinkedIn only (connection request, under 300 chars)
3. Both (email + LinkedIn for each prospect)
If the user already specified a channel (e.g., "/outreach email" or "/outreach linkedin"), skip the question and use that channel.
Default to "both" if the user says nothing about channel preference.
Batch mode (default): Read ./gtm/prospects.md, write for all prospects with status "ready". Present all for approval.
Channel per prospect: Check the Email column in prospects.md.
This means a single batch may have a mix: some prospects get both channels, some get LinkedIn only. This is by design — every prospect gets outreach, just on the best available channel.
Single mode: User names a specific prospect. Research and write outreach for that person. Update prospects.md if it exists.
This combines the best of signal-based outreach, research-driven personalization, and human voice preservation.
Under 120 words total. Count them. If over, cut.
Subject line:
P1 — The Opener (research flex): One specific, researched fact about their business that shows you did your homework. Not a compliment — something that demonstrates you understand their situation. Then bridge to their buyer's world.
Options (rotate across batch — never use the same opener structure for every email):
Social-sourced prospects get special treatment: These people were actively discussing the problem. The email should feel like a peer joining the conversation, not a cold pitch. The signal is the topic they care about, not a company event. Lead with the topic, not the company.
P2 — The Tactical Question: A narrow, specific question that names 2-3 alternatives they actually choose between. Forces mental engagement. Ends with a question mark.
This paragraph is optional — use it when the product/market is complex enough to warrant it. Skip for simpler pitches.
P3 — The Bridge: One sentence about what you do. One sentence connecting it to their world. Name their CRM or tools if known from research. Reference where the signals live (public sources — job boards, filings, industry databases).
If stack is set in icp.md and the prospect's tools are detectable, reference their specific tools ("wiring signals into Salesforce" not "into your CRM").
CRITICAL: Vary the bridge across every email in a batch. Never describe the product the same way twice in a row. Rotate between these angles (pick a DIFFERENT one for each email):
In a batch of 10+ emails, use at least 4 different bridge angles. No single angle should appear more than 3 times. If you catch yourself writing the same sentence you wrote in a previous email, stop and pick a different angle.
P4 — The Offer + CTA: Small, concrete offer. Not "let's chat about your pipeline." Something specific they can say yes to without committing to a sales call.
CRITICAL: Vary the CTA across the batch. Never use the same CTA more than 3 times. Rotate between these:
The CTA should match the email's energy. A question-lead opener pairs well with an offer-to-do-the-work CTA. A signal-lead opener pairs well with "worth a quick call?" An observation-lead can end with no CTA at all — just the observation hanging there.
Sign-off: "Cheers, {name from voice.md}" or "Best, {name}" — match whatever they used in their writing sample.
Under 300 characters. COUNT them before presenting. If over, trim.
Structure:
Hi {First Name},
{one sentence showing you understand their world — reference a
signal, a market trend, or something specific about their role.
End with a question or curiosity hook.}
Rules — non-negotiable:
Opener patterns (rotate across batch):
Vary across batch. Same rules as email: no two LinkedIn messages should use the same opener pattern.
LinkedIn independence rule (when writing both channels): The LinkedIn message MUST use a COMPLETELY DIFFERENT angle than the email for the same prospect. Specifically:
Test: Read the email and LinkedIn side by side. If the LinkedIn reads like a summary of the email, rewrite it from scratch with a different angle. A prospect who receives both should not think "this is the same message twice."
Example (for reference):
Hi Wade, curious what income data you're trusting on
STR-backed deals now that delinquency rates are ticking
up. Property-level comps or still market averages?
Would be great to connect!
Remove the company name. If the email still works for any company, the personalization failed. Rewrite.
Read all emails in the batch together and check:
Each email should feel like a different conversation. The opener, bridge, and CTA should all be different enough that no two emails in the batch share more than one of the three.
Before presenting ANY email, run every piece through these checks. Do not mention this pass to the user.
Structural tells:
Vocabulary tells:
Voice tells:
Final anti-AI pass: Ask yourself: "What makes this so obviously AI-generated?" Fix what you find. Then present the final version.
Read all context files:
./gtm/icp.md — ICP + Stack + Won Deal Patterns./gtm/voice.md — tone, patterns, "What Got Replies"./gtm/signals.md — signal types (proven + researched)./gtm/prospects.md — the prospect list./gtm/learnings.md — past outreach feedbackPriority order for informing email style:
Loaded: {N} prospects ready, ICP ({summary}),
voice ({tone}), {N} won deal patterns,
{N} signal types, {N} learnings.
Writing emails now.
For each prospect in the batch:
Before writing a single email, create a variation plan. This prevents the batch from sounding like templates. Assign each prospect a different combination:
VARIATION PLAN
─────────────────────────────────────────────
# Prospect Opener Bridge CTA Reference
1. {Name} observation methodology send-address {Client A}
2. {Name} signal scale quick-call {Client B}
3. {Name} question workflow side-by-side none
4. {Name} buyer accuracy question {Client A}
...
Rules (enforce before writing):
For batches of 5+ prospects:
For batches under 5 prospects:
If you only have 1-2 client references, use "none" for some emails and let the product description carry the bridge instead.
Show the variation plan to yourself (not the user) and verify it passes all rules before proceeding.
Write outreach for each prospect based on the selected channel(s) AND the variation plan from Step 3. Follow the assigned opener, bridge, CTA, and reference for each prospect.
If writing both email AND LinkedIn for each prospect, make sure they feel like different conversations — the LinkedIn should NOT be a compressed version of the email.
Before presenting ANY email or LinkedIn message, run this checklist against every piece. Any failure = rewrite that piece. Do not present a batch with known failures.
Per email (hard fails, not preferences):
—)Per LinkedIn message (hard fails):
Per batch (hard fails):
If any check fails, fix the piece before moving to Step 5. Do not present a batch that has known failures — you will only have to rewrite after the user catches them.
Every email MUST include a subject line (lowercase, 2-4 words). Every email MUST show metadata (Signal | Opener | Bridge | CTA).
Email only:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
OUTREACH BATCH: {N} emails
{date}
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
#1: {Name} at {Company} ({word count} words)
─────────────────────────────────────────────
Subject: {subject}
{email body}
Signal: {signal} | Opener: {type} | Bridge: {angle} | CTA: {type}
──────────────────────────────────────────────
LinkedIn only:
#1: {Name} at {Company} ({char count} chars)
─────────────────────────────────────────────
{linkedin message}
Signal: {signal} | Pattern: {type}
──────────────────────────────────────────────
Both channels (show side by side):
#1: {Name} at {Company}
─────────────────────────────────────────────
EMAIL ({word count} words)
Subject: {subject}
{email body}
LINKEDIN ({char count} chars)
{linkedin message}
Signal: {signal} | Email opener: {type} | LI pattern: {type}
──────────────────────────────────────────────
{N} prospects ready. Review and tell me if
anything needs fixing. Otherwise I'll export
them right away.
- "Fix #3" — I'll rewrite a specific one
- "Cut #5" — I'll remove a prospect
- "Looks good" / any approval → export immediately
Wait for approval. Apply any fixes. Re-present if changes were made.
After approval, update prospects.md:
IMMEDIATELY after the user approves (any positive response like "looks good", "approve", "ship it", "yes"), proceed to /push. Do not ask another question. Do not ask how they want to export. Do not say "Want me to export?" Just invoke /push directly.
The /push skill handles format selection. Your job is to hand off without breaking momentum.
When user names one prospect (e.g., /outreach Sarah Chen, VP Sales, Ramp):
If ./gtm/learnings.md has entries, read ALL of them before writing
a single word. This is how the system gets smarter over time.
Every outreach entry in learnings.md should capture:
## {date} — {company name}
Prospect: {name}, {title}
Channel: {email / linkedin / both}
Signal used: {which signal drove the personalization}
Signal type: {proven / high-intent / moderate / social}
Opener type: {observation / signal / question / buyer / social}
Bridge angle: {methodology / scale / accuracy / api / price / workflow / none}
CTA type: {send-address / quick-call / side-by-side / batch-compare / question / no-cta}
Reply: {yes / no / pending}
Reply channel: {email / linkedin / none}
Notes: {what they said, what worked, what didn't}
Signal patterns:
Opener patterns:
Bridge patterns:
CTA patterns:
Channel patterns:
When writing a new batch, show the learning summary:
LEARNINGS APPLIED
─────────────────────────────────────────────
Batches sent: {N} | Total sends: {N}
Overall reply rate: {X}% email, {Y}% LinkedIn
Best signal type: {type} ({Z}% reply rate)
Best opener: {type} ({Z}% reply rate)
Best bridge: {angle} ({Z}% reply rate)
{If total sends < 15:} ⚠ Small sample — patterns are
tentative. Weighting toward winners but still rotating.
Adjustments: {what changed based on data}
The system should get measurably better over time:
This is the compound advantage. Every other skill kit starts from zero every time. This one remembers what works.
If the user asks questions mid-flow ("why did you use that opener?", "can you explain what a bridge angle is?", "what if I want a different tone?"), answer the question, then resume where you left off.
If they want to change direction ("actually, make all of these more casual", "switch to LinkedIn only", "I want to add a prospect"), apply the change and re-present. Don't start from scratch unless the change affects everything.
If they ask for advice ("should I send email or LinkedIn?", "what subject line style works best?"), give your honest assessment based on their ICP, any learnings data, and general outbound patterns. Then return to the flow.
If the user connects a new tool mid-outreach ("I just set up my Apollo API key", "I connected my email finder"): Re-detect the tool (check env vars or MCP tools), update icp.md Connected Tools, then offer to re-enrich "LinkedIn only" contacts from this batch. If they say yes, find emails for those contacts using the new tool, update prospects.md, and re-present the outreach with the new email+LinkedIn option for those contacts. Don't restart the whole batch — just upgrade the contacts that were LinkedIn-only.
No signals for a prospect: Still write, but flag it and use product/market fit observations instead of timing signals. Note in the output:
⚠ No recent signals. Using product-fit angle.
Prospect has no detectable product/buyer info: Research harder. If still nothing, skip and explain why.
User wants follow-ups: This skill writes first-touch emails only. Follow-ups are a different motion — suggest the user check back in 3-5 days and run /outreach again with context about what happened.