본문으로 건너뛰기
cccskills
무료GitHub에 공개

positive-reply-scoring

Pulls replies from a Smartlead campaign, classifies each as positive/neutral/negative/OOO/bounce/unsubscribe using Claude, and reports the positive reply rate — the north-star metric for cold email. Use when the user wants to know if a campaign is actually working (not just getting replies, but getting the RIGHT replies). Triggers on "score my replies", "how's campaign X doing", "positive reply rate", "is this campaign working".

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

실행 점수 미검증

설치 방법 보기

포함된 파일(3)

  • SKILL.md7.7 KB
  • scripts/aggregate-scores.ts4.9 KB
  • scripts/fetch-campaign-replies.ts5.8 KB

SKILL.md(원문)

설치하기 전에 에이전트에게 전달되는 지시 내용을 확인할 수 있습니다.

Positive Reply Scoring

Reply rate tells you if people are paying attention. Positive reply rate tells you if they want what you're selling. This skill computes the second.

Why this exists

A campaign can get 5% reply rate and still be a disaster. If 90% of those replies are "unsubscribe" and "not a fit," you're burning your domains for nothing.

The metric that matters is:

positive_reply_rate = positive_replies / total_sent

Compared side-by-side:

  • Campaign A: 1% reply rate, 70% positive → 0.7% positive reply rate
  • Campaign B: 5% reply rate, 10% positive → 0.5% positive reply rate
  • Campaign A wins.

Classification schema

Every reply is classified into exactly one bucket:

LabelMeaningCount as "positive"?
positive_interested"Yes, tell me more" or booked a meeting✅
positive_soft"Send more info" / "reach out in Q3" / info request✅
positive_referral"Not me, but talk to X"✅ (referral is high-value)
neutral_questionClarifying question, no commitment yet❌ (optional — some score as half)
negative_notnow"Not right now, maybe later"❌
negative_notfit"Not a fit" / "we don't need this"❌
negative_hostileAngry reply, complaint, report❌ (and track separately as risk signal)
unsubscribeExplicit opt-out❌
oooOut-of-office auto-reply❌ (exclude from denominators)
bounceTechnical bounce❌ (exclude from denominators)
otherCan't tell❌

Positive reply rate = (positive_interested + positive_soft + positive_referral) / total_sent

Inputs

  • Smartlead API key (env: SMARTLEAD_API_KEY)
  • Campaign ID to score
  • Optional: client_id (if using a sub-client setup)
  • Optional: date range (defaults to full campaign)

Steps

1. Fetch all leads + replies from the campaign

Run the fetch script:

npx tsx scripts/fetch-campaign-replies.ts --campaign-id=12345 --out=/tmp/replies.json

This walks /campaigns/{id}/leads paginated, identifies leads with replies (has_reply = true), then fetches /campaigns/{id}/leads/{lead_id}/message-history for each, and writes them to a JSON file with one object per reply.

Output schema per reply:

{
  "lead_id": "...",
  "email": "...",
  "lead_first_name": "...",
  "company": "...",
  "reply_time": "ISO timestamp",
  "reply_subject": "...",
  "reply_body": "... full text ...",
  "sequence_step": 1
}

2. Classify replies in the Claude Code conversation

Once the JSON is written, Claude (the one running this skill) reads the file and classifies each reply. For speed, fan out in batches of 20-30 via the Task tool (see personalization-subagent-pattern skill for fan-out mechanics).

Classification prompt (per batch):

Classify each reply as one of:
- positive_interested, positive_soft, positive_referral
- neutral_question
- negative_notnow, negative_notfit, negative_hostile
- unsubscribe, ooo, bounce, other

For each reply, output: { lead_id, label, confidence: 0.0-1.0, one_line_reason }

Rules:
- OOO auto-replies ("I'm out of office") → ooo
- Bounces (delivery failure messages) → bounce
- "Take me off your list", "unsubscribe", "STOP" → unsubscribe
- "Not interested", "not a fit" → negative_notfit
- "Not right now, circle back in Q3" → negative_notnow
- "Try [other person]" → positive_referral
- "Send more info" or "Tell me more" → positive_soft
- "Yes, let's book a call", "what times work" → positive_interested
- Insults, reports, legal threats → negative_hostile

If confidence < 0.7, label as `other`.

3. Aggregate + compute rates

Run the aggregator:

npx tsx scripts/aggregate-scores.ts --replies=/tmp/classified-replies.json --campaign-id=12345

Output (to stdout + optional --out):

Campaign 12345 — Positive Reply Scoring

Total sent:              5,284
Total replies:              212 (4.01%)
  ooo/bounce (excluded):    34
  Net replies:             178

Breakdown:
  positive_interested:    22
  positive_soft:          31
  positive_referral:       8
  neutral_question:       14
  negative_notnow:        28
  negative_notfit:        52
  negative_hostile:        3
  unsubscribe:            20
  other:                   0

Positive reply rate:     1.15% (61 / 5,284)
Positive % of replies:   34.3% (61 / 178)
Negative hostile risk:    0.06% (3 / 5,284)
Unsub rate:              0.38% (20 / 5,284)

Benchmarks (B2B cold email):
  Good positive reply rate: ≥1%
  Great: ≥2%
  Hostile >0.3% or unsub >2% → deliverability risk, pause campaign

4. Save to disk

Write aggregate results to:

~/cold-email-ai-skills/profiles/<business-slug>/scores/<campaign-id>-<YYYY-MM-DD>.json

This builds a history so you can trend positive reply rate over campaigns.

5. Flag action items

At the end, surface:

  • Positive replies that need a human response — list the top 10 positive_interested leads and their reply bodies. The user should reply to these within 30 seconds of seeing this report.
  • Referrals that need follow-up — positive_referral labels. Add the referred contacts to a new outreach list.
  • Hostile flags — any negative_hostile replies. Read them manually; consider pausing the inbox if someone is genuinely angry.
  • Unsubscribes — confirm they're globally suppressed (Smartlead does this automatically, but double-check).

When to use this skill

  • After a campaign has run for at least 14 days (otherwise sample is too small)
  • When comparing two campaigns in an experiment (use the same cutoff date for both)
  • Weekly as a quality check on running campaigns
  • Before deciding to kill or scale a campaign

Common gotchas

  • Don't trust reply rate alone. A 5% reply rate from spam-trap replies and unsubscribes is worse than a 2% reply rate from real buyers.
  • Exclude OOO + bounce from denominators. They're not real replies. The script does this automatically.
  • Smartlead's built-in AI categorization exists but is less controllable. This skill uses Claude directly for transparency and prompt-tunable classification.
  • Small samples lie. Below ~500 sent, the positive reply rate has too much noise. Wait for more volume before declaring winners/losers.
  • Classify only FIRST reply per lead. If a lead replied, you replied, they replied again — only the first reply is the signal. Later messages are the conversation, not the scoring.

What to do next

Respond to every positive_interested reply within 30 seconds of seeing it. Then /experiment-design to plan the next iteration based on what worked.

If positive reply rate is <1% after 200+ sends: the 1% rule failed. Run /email-deliverability-audit (are you reaching the inbox?) (check for vague CTAs, generic first lines, em dashes).

Or wait: this skill is the Wednesday task in /cold-email-weekly-rhythm. Run it weekly going forward.

Related skills

  • /experiment-design — uses positive reply rate as the success metric
  • /email-deliverability-audit — if hostile + unsub are elevated, run this next
  • /cold-email-starter-kit → 10-reply-handling.md for what to do with the positive replies once flagged

Scripts

  • scripts/fetch-campaign-replies.ts — pulls replies via Smartlead API
  • scripts/aggregate-scores.ts — computes rates from classified JSON

리뷰

아직 리뷰가 없습니다. 사용해 본 소감을 남겨 주세요.

댓글

로그인 없이 쓸 수 있습니다. 사용 후기, 질문, 작동하지 않은 환경 등을 편하게 남겨 주세요.

아직 댓글이 없습니다. 첫 댓글을 남겨 보세요.

보내면 바로 공개됩니다. 이메일 주소나 전화번호 같은 개인 정보는 쓰지 마세요. URL은 2개까지입니다.

0 / 1,000자

이 양식은 reCAPTCHA로 보호되며 Google 개인정보처리방침 및 서비스 약관이 적용됩니다.

같은 저장소의 스킬

Autonomous cold email campaign launcher. Takes one target company domain, scrapes their website, generates an ICP with Claude, pulls matching leads via Prospeo, enriches emails + company descriptions, personalizes each lead with parallel Claude Code Task sub-agents (A/B/C variants), and uploads as a live Smartlead campaign. Uses local JSON files for state (no database required). Use for automated daily campaign launches after you have an initial `client-profile.yaml` from /icp-onboarding. Triggers on "auto-research", "launch an automated campaign", "daily campaign", "run the research loop".

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

growthenginenowoslawski/coldoutboundskills7772026년 10월 6일 업데이트

Use the Blitz API to find decision-makers at specific companies when you already have a list of company domains. Best for SMB owner-finding, domain-to-people lookup, or supplementing Prospeo results. Outputs a CSV you can feed to the /list-builder Phase 5 or directly to /cold-email-starter-kit for Smartlead upload. Use when your targeting is company-first (not title-first).

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

growthenginenowoslawski/coldoutboundskills7772026년 10월 6일 업데이트

Creates cold email copy through a stepwise confirmation process. Use when writing email campaigns, given a campaign strategy document, website, or client context. Confirms direction at each step before outputting final copy.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

growthenginenowoslawski/coldoutboundskills7772026년 10월 6일 업데이트

Generates 15-25+ cold outbound campaign ideas with targeting strategies, AI personalization approaches, and value propositions. Use when planning campaign experiments for a client, given their website or business context.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

growthenginenowoslawski/coldoutboundskills7772026년 10월 6일 업데이트

Index and shared harness for the 19 signal playbooks. Each playbook turns one buying signal (new in role, raised a round, hiring surge, pricing page, tech on website, ...) into one copy-ready sentence you can drop into a cold email. Every playbook ships three ways to run it: as a Claude skill, as a Clay table built through a browser harness, and as a Clay workflow built from the clay CLI. Use when someone says "personalize this list", "what signal should I use", "build the Clay column for X", or names any of the 19 signals.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

growthenginenowoslawski/coldoutboundskills7772026년 10월 6일 업데이트

Single "start here" orchestrator for new cold email operators. Asks infrastructure-status questions first, then runs /icp-onboarding → /lead-magnet-brainstorm → /campaign-strategy in sequence, producing a consolidated campaign-plan.md. Ends with an interactive menu of next skills branched on whether the user already has domains/inboxes. Use as the very first invocation on any new repo checkout or when onboarding someone to cold email from zero.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

growthenginenowoslawski/coldoutboundskills7772026년 10월 6일 업데이트

growthenginenowoslawski의 스킬 모두 보기

이 스킬의 문제 신고