Skip to content
Content
Skill

/sent-mail-outcome-tracker

Read the user's recent cold-outreach sent mail, look up which messages got replies, classify reply sentiment, and produce an outcome report that surfaces what the responders had in common. Use when the user says "did my cold emails get replies," "what's my reply rate,"

From plugin
winning-writing
1431 skills
Install
$ npx -y skills add kalyvask/winning-writing --skill sent-mail-outcome-tracker --agent claude-code

How it fires

How this skill gets triggered: by you, by Claude, or both.

  • Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
  • You can call itInvoke it directly when you want it.
  • Slash command/sent-mail-outcome-tracker

Context preview

The summary Claude sees to decide when to auto-load this skill.

Read the user's recent cold-outreach sent mail, look up which messages got replies, classify reply sentiment, and produce an outcome report that surfaces what the responders had in common. Use when the user says "did my cold emails get replies," "what's my reply rate,"

SKILL.md

sent-mail-outcome-tracker.SKILL.md
name: sent-mail-outcome-tracker
description: Read the user's recent cold-outreach sent mail, look up which messages got replies, classify reply sentiment, and produce an outcome report that surfaces what the responders had in common. Use when the user says "did my cold emails get replies," "what's my reply rate," "sent-mail outcomes," "track outcomes," or "/sent-mail-outcome-tracker." Requires a connected Gmail MCP. Read-only. Never contacts recipients.

Sent-mail outcome tracker

The rest of the toolkit asks "is this email well-written?" This skill asks the only question that actually matters: "did the email get a reply, and what did the messages that replied have in common?"

Composes with `voice-update --source sent-mail` (which audits voice files against sent mail). This skill produces outcome data; voice-update proposes voice updates if patterns emerge.

Why this exists

Two gaps the existing toolkit does not close:

1. **The critic measures rule recall, not response rate.** The eval harness asserts the inline critic catches em-dashes and vague asks. None of that proves the resulting emails get replies. Reply rate is the only metric the recipient cares about, and it is the only one that compounds. 2. **You learn from outcomes, not from the draft.** A draft that passes every rule and gets ignored teaches you something the rules cannot. A draft that breaks a rule and gets a same-day intro teaches you something the rules will never catch. Both signals live in the sent folder and the inbox, not in the rule library.

Auto-tracking every email is out of scope. The user invokes this on demand, the skill reads, the skill reports. The user judges what to change.

Inputs

Optional arguments:

  • **Time window**: default `last 30 days`. Accept "last week," "last 3 months," "since [date]."
  • **Count cap**: default `25 messages`. Cap at 50 to keep token cost bounded.
  • **Mode filter**: default `cold outreach only`. The skill applies heuristics to exclude:
  • Replies (any message with `In-Reply-To` header or whose thread already has an inbound message from the same recipient before the sent date)
  • Automated mail (auto-replies, calendar invites, no-reply addresses)
  • One-liners under 30 words
  • Messages to recipients already in the user's recent inbound mail (these are warm threads, not cold outreach)
  • **Ask-type tag**: optional. "Only meeting requests / intro requests / job inquiries / advice asks." Different ask types have different baseline reply rates and should not be averaged together.

If the user just says "/sent-mail-outcome-tracker" with no args, use defaults and ask whether to narrow the filter before fetching.

Process

1. **Confirm scope before fetching.** "I'll pull your last 25 cold-outreach messages from the past 30 days, excluding replies, automated mail, and threads where the recipient had already written to you. Sound right?" Adjust if they want different scope.

2. **Fetch via the Gmail MCP.** Query `from:me` in the sent folder for the window, fetch the full thread for each candidate, apply the cold-outreach filters above. For each kept message:

  • Sent date and time
  • Subject
  • Body (skip quoted threads)
  • Recipient role inferred from the email domain and any signature in prior threads (anonymize by role; never quote the name into the report)

3. **For each sent message, look up the reply state from the same thread.**

  • **No reply** if the thread has only the user's outbound message after the sent date, or replies are auto-generated.
  • **Replied** if the recipient sent a message after the user's sent message.
  • For replied messages, capture: days to reply (rounded), reply word count, and a one-sentence sentiment classification.

4. **Classify each reply by outcome category, not by tone.** The categories are user-meaningful, not sentiment-mining.

  • **Meeting accepted**: recipient proposed or agreed to a call/coffee/Zoom.
  • **Intro provided**: recipient forwarded to someone else or named a person to contact.
  • **Substantive engagement**: recipient answered the substantive question or offered information, without proposing a meeting.
  • **Polite decline**: recipient declined but acknowledged the email.
  • **Deferral**: recipient said "let me get back to you" or "later this quarter" with no concrete action.
  • **No reply**: no inbound message in the thread within the window.

5. **Read the current rule library.** Open `points/cold-email-rules.md`, `points/named-failure-modes.md`, `context/voice-and-style.md`, and `context/about-me.md`. Patterns in the outcome data only matter against the current rules.

6. **Compute the headline stats.** Always include:

  • N cold outreach messages in the window
  • M replied, R reply rate as %
  • Outcome distribution by category (count and %)
  • Median and 75th-percentile days to reply, on the replied subset only
  • Reply rate by ask type if the user filtered by ask-type, otherwise show the breakdown
  • **Sample-size caveat:** if N < 10 print "Sample is small, treat the patterns below as suggestive, not conclusive." If N < 5, refuse to compute pattern stats at all and tell the user to wait for more data.

7. **Surface the patterns that correlate with replies.** Compare the replied set against the non-replied set on:

  • **Subject line length** (median word count, replied vs not)
  • **Subject line type** (specific claim, question, name-drop, role-only): count how many of each in each set
  • **Body word count** (median, replied vs not)
  • **Opening move** (time/place reference, question, observation, ask-first): count and reply rate per type
  • **Named connection in body** (yes/no, reply rate per side)
  • **Specific ask** (precise time, place, deliverable) vs vague ask ("would love to chat"): reply rate per side
  • **Days-of-week sent** (reply rate per weekday)
  • **Time-of-day sent** (rounded to morning / midday / afternoon / evening, reply rate per bucket)

F

Read more
Ships withwinning-writing

31 Claude skills for cold outreach, op-eds, pitches, press inquiries, bios, exec memos, performance reviews, spoken-delivery talks, fact-checking, and reply-rate tracking.

Get the whole plugin
Stats
15
Stars
5
Forks
Active
Maintenance
JavaScript
Language
MIT
License
9d ago
Last commit
4mo ago
Created

Repo: kalyvask/winning-writing

Other skills on winning-writing.