cold-email-sequence-generator-skill
About cold-email-sequence-generator-skill
A Claude skill that turns qualified contact lists and value propositions into reviewable, multi-touch cold email Gmail drafts. It emphasizes lead and claim checks, brand review, and drafting without sending.
Key features
- 01Qualifies contacts before drafting
- 02Builds sequences with varied touch counts
- 03Verifies product and competitor claims
- 04Checks copy against brand style
- 05Creates Gmail drafts with A/B subjects
- 06Supports configurable sequence variants
Use cases
- 01Prepare outbound sequences for new prospects
- 02Create re-engagement or event-based outreach
- 03Stage drafts for human review before sending
MCP support
Uses Epiphan Brand MCP for writing style and copy checks, Epiphan Knowledge search for claim verification, and Gmail tools to create drafts. It does not send messages.
Install
Copy the command and run it in a terminal.
npx skills add https:/ / github.com/ scientiacapital/ skills --skill cold-email-sequence-generator-skillAfter installing, type/cold-email-sequence-generator-skillin Claude Code to confirm it loaded.
Bundled filesconfig.json
Details
From the project README<quick_start> Tools in call order:
- Inputs — contact list (HubSpot list id, CSV, or named contacts), vertical, sequence type, value prop, proof points. Missing list → ask; missing vertical → infer from domain, flag.
- Variant — read
config.json; ifvariants.enabled, runbash scripts/variant-assigner.sh cold-email-sequence-generator-skill $(date +%s)and apply the assignedprompt_suffix. - Gate Q —
qualify_leadper contact. Excluded contacts drop;STALE AE LEADrows are listed for Tim, not drafted; ATL tier from the verdict sets ordering. - Gate S —
search_product_catalogthen Epiphan Knowledgesearchfor every product, spec, or competitor claim the sequence will carry. Unverified →[spec unverified]in the draft. - Gate B —
get_writing_styleonce, thencheck_my_copyon every subject line and body. - Gate D —
mcp__claude_ai_Gmail__create_draftper contact per touch, from[email protected], subject prefixed[Seq N/M]. Neversend_message. - Deliver — a summary table (contact / tier / touches drafted / gate flags) plus the sidecar and
run-log line below. Sending is
batch-send-drafts-skill's job. </quick_start>
<house_rules> Customer-facing skill. Before output, run the gates in order (details: ~/.claude/skills/epiphan-house-rules-skill/reference/gates.md): S: search_product_catalog (Epiphan AI) or Epiphan Knowledge search before any product claim. B: check_my_copy on every customer-facing string. Q: qualify_lead right after the candidate pull, before tiering/enrichment/drafts. D: outbound text becomes a Gmail draft, never a send. Identifiers (owner IDs, portal, emails, seats) come from reference/identifiers.md in that skill — do not restate them here. On any gate failure follow reference/self-healing.md (retry, degrade with a flag, alert Tim, halt) and append a line to ~/.claude/skill-runs/.jsonl. </house_rules>
<variant_support> This skill supports A/B variants via config.json.
- Read this skill's
config.json— check ifvariants.enabledis true - If enabled, run:
bash scripts/variant-assigner.sh cold-email-sequence-generator-skill $(date +%s) - Apply the
prompt_suffixfrom the assigned variant's definition to modify the workflow - Record the variant name in the outcome sidecar (see final stage below)
Current experiment: cold-email-subject-style-001
control: Standard 7-email frameworkconcise: 5-email framework, 50-word max per email </variant_support>
<success_criteria>
-
qualify_leadran on every contact before any draft; excluded and stale-AE rows are reported, not drafted - Sequence type selected (Classic 7, Fast-Track 5, Long-Play 12-14, Event-Based, Re-Engagement)
- Every product or competitor claim traces to an Epiphan Knowledge
searchresult or carries[spec unverified] - Every subject line and body passed
check_my_copy; corrections applied before drafting - One Gmail draft per contact per touch exists, from
[email protected], with[Seq N/M]subject prefix - Each email has A/B subject lines, one CTA, send-day offset; final touch is a breakup
- Outcome sidecar and run-log line written with gate flags </success_criteria>
Stage 1: Inputs and candidate pull
Accept any of: a HubSpot list (hubspot_list_members), a HubSpot search (hubspot_search_contacts),
a CSV, or named contacts. Capture per contact: email, first name, title, org, vertical, HubSpot id.
Capture per sequence: type, value prop, proof points Tim wants used, personalization hooks.
Stage 2: Gate Q — qualify_lead
Call qualify_lead per contact. Apply the verdict as returned: exclude customers, channel partners,
product-only engagers, suppressed, and AE-owned-active; surface STALE AE LEAD rows in the summary
for Tim's decision. Keep the ATL/GRAY/BTL tier for ordering (ATL first). If qualify_lead is
unavailable after one retry: halt, write the state, tell Tim — do not draft to an ungated list.
Stage 3: Sequence design
| Type | Touches | Span | Use for |
|---|---|---|---|
| Classic | 7 | 2 weeks | Net-new cold list |
| Fast-Track | 5 | 1 week | Warm or event-adjacent list |
| Long-Play Nurture | 12-14 | 4-6 weeks | Budget-cycle or RFP-timed accounts |
| Event/Trigger | 3-5 | event-specific | Extron SMP EOL, new building, failed recording, conference |
| Re-Engagement | 5 | 2 weeks | Dead-deal or >90-day-stale contacts |
Email roles (Classic 7):
| # | Role | Goal | Length | CTA |
|---|---|---|---|---|
| 1 | Introduction | Problem reframe, no product name | 50-100 words | Soft question |
| 2 | Value Proof | Verified proof point | 75-125 words | Specific time |
| 3 | Different Angle | Alternative pain | 50-75 words | Yes/no question |
| 4 | Social Proof | Peer validation (verified) | 60-90 words | Simple reply |
| 5 | Resource Share | Give before asking | 40-60 words | "Useful?" |
| 6 | Direct Ask | Straight meeting request | 30-50 words | Day/time |
| 7 | Breakup | Permission to close | 25-40 words | "Should I close your file?" |
Timing: Day 0, 2, 4, 6, 8, 10, 14. Tue-Thu mornings (recipient timezone) outperform; avoid Monday
inbox pile-up and Friday afternoons. Record the day offset in each draft's subject-line note so
batch-send-drafts-skill can order them.
Stage 4: Gate S — spec and claim verification
Before writing a single body: search_product_catalog for every product named (confirms the SKU is
current; EOL products get an acknowledgement, never a spec), then Epiphan Knowledge search for the
exact spec, capability, or competitor fact. Proof points and case references must come from the
knowledge result or from Tim's supplied inputs; never invent a customer, number, or quote. Unverified
claim → write [spec unverified] inline and set outcome partial naming Stage 4.
Stage 5: Gate B — brand voice, then write
get_writing_style once per session. Write each touch from the templates below, then run
check_my_copy on every subject line variant and every body; apply corrections before Stage 6.
If Brand MCP is down after one retry: draft anyway, prefix each body [brand check skipped], outcome
partial naming Stage 5.
Stage 6: Gate D — Gmail drafts
mcp__claude_ai_Gmail__create_draft per contact per touch, from [email protected]:
- Subject:
[Seq N/M] <winning A/B subject>— the alternate subject goes in the first body line asA/B alt: …so Tim can swap it in review. - Body: the touch as approved by
check_my_copy, signature per identifiers.md. - Never call
send_messageorreply. Gmail write failure → retry once, then report the touch as undrafted in the summary (outcomepartial, Stage 6).
Stage 7: Summary
SEQUENCE STAGED — <type>, <M> touches, <date>
Contact Tier Drafts Flags
J. Smith (u.edu) ATL 7/7 —
R. Lee (city.gov) GRAY 7/7 [spec unverified] x1
K. Ng (hosp.org) — 0 STALE AE LEAD (Ron Epstein, 112d) — Tim decides
Excluded by qualify_lead: 4 (2 customer, 1 partner, 1 AE-active)
Next: batch-send-drafts-skill to review and send.
Email Templates
Brackets are filled from Stage 1 inputs and Stage 4 verified facts only.
Email #1: The Introduction
Subject Lines (A/B Test):
- A (Curiosity):
Quick question about [org]'s [specific challenge] - B (Value):
[Verified outcome] for [org type] - C (Personal):
[Name], saw your post about [specific topic]
Hi [First Name],
I noticed [specific observation about their org/role] and thought you might be facing [specific challenge].
Teams like [verified peer org type] have [verified outcome] without [common objection].
Worth a quick 15-minute conversation to see if the same applies at [org]?
[Signature]
P.S. - [Personalized one-liner from research]
Email #2: The Value Proof
Subject: "How [peer org type] achieved [verified result]"
[First Name],
Following up — wanted to share how this worked for a [peer org type].
They were [situation]. In [timeframe], they:
- [Verified result #1]
- [Verified result #2]
They got started without [common objection].
Would [Day] at [Time] work for 15 minutes?
[Signature]
Email #3: The Different Angle
Subject: "Different thought about [org]"
Hi [First Name],
I realize [original pain point] might not be top of mind right now.
But what about [alternative pain point]?
Most [their role]s tell me [common complaint], which is why [mini value prop, no spec unless verified].
If this hits closer to home, happy to share how [quick win].
[Signature]
P.S. - If neither is relevant, just let me know and I'll stop.
Email #4: The Social Proof
Subject: "[Mutual connection] suggested I reach out" OR "How [peer] handles [challenge]"
[First Name],
I was speaking with [title] at a [peer org type] about [challenge].
Here's what they said after [solution]:
"[Quote supplied by Tim or from knowledge base — never invented]"
Open to a quick call to hear what's working in [vertical]?
[Signature]
Email #5: The Resource Share
Subject: "Thought you might find this useful"
[First Name],
No ask here — just sharing something helpful:
[Resource description]: [Link]
We put this together after hearing [their role]s struggle with [pain point]. Useful even if you never buy anything from us.
Hope it helps.
[Signature]
Email #6: The Direct Ask
Subject: "Let's cut to the chase"
[First Name],
Let me be direct: I think we could help [org] [achieve outcome] based on [observation].
I'd like to show you:
1. [Specific thing #1]
2. [Specific thing #2]
3. [How peers in your role use it]
15 minutes. No pressure. How's [day/time]?
[Signature]
Email #7: The Breakup
Subject: "Should I close your file?"
[First Name],
I'll assume [topic] isn't a priority right now — totally fine.
I'll close your file unless I hear otherwise. If you want to revisit, [time-sensitive reason, e.g. budget cycle], so a quick chat now might save you a step later.
No worries either way — appreciate your time.
[Signature]
P.S. - If someone else at [org] should hear about this, happy to redirect.
Breakup variations: Permission ("Not relevant / not a priority / bad timing — which? If #3, when should I check back?") · Referral ("Clearly I'm not reaching the right person — who owns [topic]?"). Avoid FOMO lines that name a competitor's customer unless Gate S verified it.
Vertical Quick-Starts
- Higher Ed (ICP 90): finals-week reliability → peer-campus proof → distribution pain → resource (CMS integration doc) → direct ask → breakup
- Courts (ICP 85): gap in the record → county proof → unattended 8-hour sessions → resource → direct ask → breakup
- Government (ICP 80): council capture without AV headcount → city proof → posting lag → resource → direct ask → breakup
- Healthcare (ICP 75): OR capture without clinical IT load → med-ed proof → learner access → resource → direct ask → breakup
- Corporate AV / Worship / K-12: same arc; swap the reframe for the vertical's top pain from Tim's inputs
A/B Testing and Benchmarks
Test in order: subject line (question vs statement, personalized vs generic), body length (50 vs 100 words), CTA style, send time. Method: 50/50 split on the first 100 contacts, 48-hour read, winner to the rest. Benchmarks (Email 1 open 35-55%, sequence reply 8-25%, meeting booked 1-6%) are planning ranges, not claims to put in copy.
Pre-Launch Checklist
- Gate Q report reviewed (excluded + stale-AE rows acknowledged by Tim)
- No
[spec unverified]or[brand check skipped]flags left in drafts Tim intends to send - Personalization variables all filled; no literal brackets remain
- Links tested; no attachments
- Daily send limit agreed with Tim before
batch-send-drafts-skillruns
<self_healing>
Failure = no drafts produced; partial = a stage degraded (name it: Q halt, S unverified, B skipped,
D write failed). Ladder: retry once → degrade (draft with inline flag, keep core) → alert Tim
(summary line, Slack DM if unattended) → halt when qualify_lead is unavailable for the list.
Full contract: ~/.claude/skills/epiphan-house-rules-skill/reference/self-healing.md.
</self_healing>
<outcome_sidecar>
At the end of every run write ~/.claude/skill-analytics/last-outcome-cold-email-sequence-generator-skill.json
and append one line to ~/.claude/skill-runs/cold-email-sequence-generator-skill.jsonl:
{"ts":"<UTC ISO8601>","skill":"cold-email-sequence-generator-skill","version":"<frontmatter version>",
"variant":"<assigned variant or default>","status":"success|partial|error","runtime_ms":0,
"metrics":{"contacts_in":0,"contacts_qualified":0,"contacts_excluded":0,"stale_ae":0,
"emails_generated":0,"drafts_created":0,"spec_unverified":0,"brand_skipped":0},
"error":null,"session_id":"<date>"}
status partial/error must name the failing stage in error. The SessionStart sweep ingests it.
</outcome_sidecar>