positive-reply-scoring について
Claude Code向けのコールドメール評価スキルです。肯定的な返信の割合を算出し、返信を分類して、対応が必要な返信やリスクを示します。
主な機能
- 01返信を結果ラベルで分類
- 02肯定的な返信率を算出
- 03不在通知とバウンスを分母から除外
- 04キャンペーン指標を集計
- 05要対応の返信とリスクを提示
活用シーン
- 01肯定的な反応でキャンペーンを比較
- 02週次でキャンペーン品質を確認
- 03キャンペーンの停止や拡大を判断
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ growthenginenowoslawski/ coldoutboundskills --skill positive-reply-scoringインストール後、Claude Code で/positive-reply-scoringを入力して読み込まれたか確認します。
同梱ファイルscripts/aggregate-scores.tsscripts/fetch-campaign-replies.ts
詳細
ポジティブ返信率のスコアリング
返信率は、人々が注目しているかどうかを示します。ポジティブ返信率は、販売しているものに関心があるかどうかを示します。 このスキルでは、後者を算出します。
このスキルがある理由
キャンペーンの返信率が5%でも、失敗に終わることがあります。返信の90%が「配信停止」と「対象外」なら、ドメインを無駄に消耗させているだけです。
重要な指標は次のとおりです。
positive_reply_rate = positive_replies / total_sent
並べて比較すると:
- キャンペーンA:返信率1%、ポジティブ率70% → ポジティブ返信率0.7%
- キャンペーンB:返信率5%、ポジティブ率10% → ポジティブ返信率0.5%
- キャンペーンAの勝ちです。
分類スキーマ
すべての返信を、以下のいずれか1つの分類に割り当てます。
| ラベル | 意味 | 「ポジティブ」として数える? |
|---|---|---|
positive_interested | 「はい、詳しく教えてください」または面談を予約した | ✅ |
positive_soft | 「詳しい情報を送ってください」/「第3四半期に連絡してください」/情報のリクエスト | ✅ |
positive_referral | 「私ではありませんが、Xに相談してください」 | ✅(紹介は価値が高い) |
neutral_question | 確認の質問。まだ意思表示はない | ❌(任意 — 半分として数える場合もあります) |
negative_notnow | 「今は必要ありませんが、また後日」 | ❌ |
negative_notfit | 「対象外です」/「これは必要ありません」 | ❌ |
negative_hostile | 怒りの返信、苦情、通報 | ❌(リスクの兆候として別途追跡) |
unsubscribe | 明示的な配信停止 | ❌ |
ooo | 不在通知の自動返信 | ❌(分母から除外) |
bounce | 技術的なバウンス | ❌(分母から除外) |
other | 判定できない | ❌ |
ポジティブ返信率 = (positive_interested + positive_soft + positive_referral) / 送信総数
入力
- Smartlead API キー(環境変数:
SMARTLEAD_API_KEY) - スコアリングするキャンペーン ID
- 任意:client_id(サブクライアント設定を使用している場合)
- 任意:期間(デフォルトではキャンペーン全期間)
手順
1. キャンペーンからすべてのリードと返信を取得する
取得スクリプトを実行します。
npx tsx scripts/fetch-campaign-replies.ts --campaign-id=12345 --out=/tmp/replies.json
このスクリプトはページネーションを使用して/campaigns/{id}/leadsをたどり、返信のあるリード(has_reply = true)を特定した後、それぞれについて/campaigns/{id}/leads/{lead_id}/message-historyを取得し、返信ごとに1つのオブジェクトを含む JSON ファイルに書き込みます。
返信ごとの出力スキーマ:
{
"lead_id": "...",
"email": "...",
"lead_first_name": "...",
"company": "...",
"reply_time": "ISO timestamp",
"reply_subject": "...",
"reply_body": "... full text ...",
"sequence_step": 1
}
2. Claude Code の会話内で返信を分類する
JSON が書き込まれたら、Claude(このスキルを実行している Claude)がファイルを読み込み、各返信を分類します。処理を速めるには、Task ツールを使って20~30件ずつ並列処理します(並列処理の方法についてはpersonalization-subagent-patternスキルを参照してください)。
分類プロンプト(バッチごと):
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. 集計して率を算出する
集計スクリプトを実行します。
npx tsx scripts/aggregate-scores.ts --replies=/tmp/classified-replies.json --campaign-id=12345
出力(標準出力および任意の--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. ディスクに保存する
集計結果を次の場所に書き込みます。
~/cold-email-ai-skills/profiles/<business-slug>/scores/<campaign-id>-<YYYY-MM-DD>.json
これにより履歴が作成され、キャンペーンごとのポジティブ返信率の推移を確認できます。
5. 対応事項にフラグを付ける
最後に、以下を提示します。
- 人による返信が必要なポジティブな返信 —
positive_interestedのリード上位10件と、それぞれの返信本文を一覧表示します。ユーザーはこのレポートを見てから30秒以内に返信してください。 - フォローアップが必要な紹介 —
positive_referralのラベルが付いた返信です。紹介された連絡先を新しいアウトリーチリストに追加します。 - 敵対的な返信のフラグ —
negative_hostileの返信です。内容を手動で確認し、本当に怒っている場合は受信トレイの一時停止を検討してください。 - 配信停止 — 配信停止がグローバルな抑制リストに登録されていることを確認します(Smartlead が自動で処理しますが、念のため再確認してください)。
このスキルを使うタイミング
- キャンペーンを少なくとも14日間実施した後(それより短いとサンプル数が少なすぎます)
- 実験で2つのキャンペーンを比較するとき(両方で同じ締め日を使います)
- 実施中のキャンペーンの品質確認として週次で
- キャンペーンを停止するか拡大するかを決める前
よくある注意点
- 返信率だけを信用しないでください。 迷惑メールトラップからの返信や配信停止を含む5%の返信率よりも、実際の購入者からの2%の返信率のほうが価値があります。
- 分母から不在通知とバウンスを除外してください。 これらは実際の返信ではありません。スクリプトが自動的に除外します。
- Smartlead に組み込まれている AI 分類機能もありますが、制御の自由度は低めです。このスキルでは、透明性を確保し、プロンプトを調整して分類できるよう、Claude を直接使用します。
- サンプル数が少ないと、結果は当てになりません。 送信数が約500件未満の場合、ポジティブ返信率のばらつきが大きすぎます。勝ち負けを判断する前に、データが増えるまで待ってください。
- 各リードの最初の返信だけを分類してください。 リードから返信があり、あなたが返信し、さらに相手から返信があった場合、指標となるのは最初の返信だけです。それ以降のメッセージは会話であり、スコアリングの対象ではありません。
次に行うこと
positive_interested の返信を確認したら、30秒以内にすべて返信してください。 次に /experiment-design を実行し、うまくいったことをもとに次の反復を計画します。
200件以上送信してもポジティブ返信率が1%未満の場合: 1%ルールは機能しませんでした。/email-deliverability-audit を実行してください(受信トレイに届いていますか?)(曖昧な CTA、ありきたりな冒頭文、エムダッシュがないか確認してください)。
または、待ってください: このスキルは /cold-email-weekly-rhythm の水曜日のタスクです。今後は毎週実行してください。
関連スキル
/experiment-design— ポジティブ返信率を成功指標として使用します/email-deliverability-audit— 否定的な返信と配信停止が多い場合は、次にこれを実行してください/cold-email-starter-kit→ 返信にフラグを付けた後、ポジティブな返信にどう対応するかは10-reply-handling.mdを参照してください
スクリプト
scripts/fetch-campaign-replies.ts— Smartlead API 経由で返信を取得しますscripts/aggregate-scores.ts— 分類済み JSON から比率を算出します