mcpField
C
cold-email-sequence-generator-skill

cold-email-sequence-generator-skill

github.com/scientiacapitalMarketing & growth2840 installsUpdated 3w ago
Repository

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

  1. 01Qualifies contacts before drafting
  2. 02Builds sequences with varied touch counts
  3. 03Verifies product and competitor claims
  4. 04Checks copy against brand style
  5. 05Creates Gmail drafts with A/B subjects
  6. 06Supports configurable sequence variants

Use cases

  1. 01Prepare outbound sequences for new prospects
  2. 02Create re-engagement or event-based outreach
  3. 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-skill

After installing, type/cold-email-sequence-generator-skillin Claude Code to confirm it loaded.

Bundled filesconfig.json

Details

From the project README
Turn a qualified contact list plus a value proposition into a multi-touch cold email sequence whose output is a set of reviewable Gmail drafts, not chat text. Each email has A/B subject lines, one CTA, timing, and a breakup touch. Product facts come from the Epiphan catalog, voice from the Epiphan Brand MCP, and the recipient list from `qualify_lead`. Keywords: `cold email sequence`, `email campaign`, `outbound sequence`, `nurture`, `re-engagement`, `breakup email`

<quick_start> Tools in call order:

  1. 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.
  2. Variant — read config.json; if variants.enabled, run bash scripts/variant-assigner.sh cold-email-sequence-generator-skill $(date +%s) and apply the assigned prompt_suffix.
  3. Gate Q — qualify_lead per contact. Excluded contacts drop; STALE AE LEAD rows are listed for Tim, not drafted; ATL tier from the verdict sets ordering.
  4. Gate S — search_product_catalog then Epiphan Knowledge search for every product, spec, or competitor claim the sequence will carry. Unverified → [spec unverified] in the draft.
  5. Gate B — get_writing_style once, then check_my_copy on every subject line and body.
  6. Gate D — mcp__claude_ai_Gmail__create_draft per contact per touch, from [email protected], subject prefixed [Seq N/M]. Never send_message.
  7. 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.

  1. Read this skill's config.json — check if variants.enabled is true
  2. If enabled, run: bash scripts/variant-assigner.sh cold-email-sequence-generator-skill $(date +%s)
  3. Apply the prompt_suffix from the assigned variant's definition to modify the workflow
  4. Record the variant name in the outcome sidecar (see final stage below)

Current experiment: cold-email-subject-style-001

  • control: Standard 7-email framework
  • concise: 5-email framework, 50-word max per email </variant_support>

<success_criteria>

  • qualify_lead ran 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 search result 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

TypeTouchesSpanUse for
Classic72 weeksNet-new cold list
Fast-Track51 weekWarm or event-adjacent list
Long-Play Nurture12-144-6 weeksBudget-cycle or RFP-timed accounts
Event/Trigger3-5event-specificExtron SMP EOL, new building, failed recording, conference
Re-Engagement52 weeksDead-deal or >90-day-stale contacts

Email roles (Classic 7):

#RoleGoalLengthCTA
1IntroductionProblem reframe, no product name50-100 wordsSoft question
2Value ProofVerified proof point75-125 wordsSpecific time
3Different AngleAlternative pain50-75 wordsYes/no question
4Social ProofPeer validation (verified)60-90 wordsSimple reply
5Resource ShareGive before asking40-60 words"Useful?"
6Direct AskStraight meeting request30-50 wordsDay/time
7BreakupPermission to close25-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 as A/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_message or reply. Gmail write failure → retry once, then report the touch as undrafted in the summary (outcome partial, 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-skill runs

<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>

Comments

Markdown supported