Systems Lab

Agent skill

reply-analyzer

Classify reply sentiment and determine next action

dormantSelf-containedInstructions only1,535 words

From ekatasingh1107/b2b-gtm-skills · 99 skills · 2 · pushed 2026-04-11

What it does when it runs

Classify reply sentiment and determine next action

Read from the skill and the 1 file bundled beside it. A skill’s own description is written to be selected by an agent, so it describes the job and not the dependencies.

Keys and connectors you must supply
None found.
Hosts it reaches
No third-party host appears in the skill or its bundled files.
Tool permissions it declares
No allowed-tools in the frontmatter. It only issues instructions, so there is nothing to bound.
Actions present in the files
None. Instructions only.

Ask about reply-analyzer

Opens your assistant with this page's verified links already in the prompt.

Is this safe to install?ClaudeChatGPT
Adapt it to my stackClaudeChatGPT
What else do I need for it to workClaudeChatGPT
Rather ask a human? Talk to Cheetah
git clone --depth 1 --filter=blob:none --sparse https://github.com/ekatasingh1107/b2b-gtm-skills.git /tmp/b2b-gtm-skills
git -C /tmp/b2b-gtm-skills sparse-checkout set "skills/capabilities/reply-analyzer"
mkdir -p ~/.claude/skills/reply-analyzer
cp -R "/tmp/b2b-gtm-skills/skills/capabilities/reply-analyzer/." ~/.claude/skills/reply-analyzer/

Picked up without a restart. A project skill of the same name is shadowed by your personal one. For one repository only, swap ~/.claude/skills for .claude/skills. Claude Code docs ↗

The folder is the same in every client that implements the format — 46 of them — so if yours is not above, only the destination changes.

Reproduced in full from ekatasingh1107/b2b-gtm-skills/blob/eae8dd0bb98da1c8e84abd297066a87015dd860f/skills/capabilities/reply-analyzer/SKILL.md, which is licensed MIT (repository). 1,535 words, 15 headings.

Reply Analyzer

Classifies the sentiment and intent of replies to outreach messages. Determines the recommended next action, generates draft responses for positive and neutral cases, and outputs CRM stage updates. Used by the evening-scan playbook after inbox-scanner returns responses.

Prerequisites

  • agency.config.json at repo root with outreach, services, case_studies
  • Reply data from inbox-scanner or manually provided

Phase 0: Intake

  1. Read agency.config.json from the project root.
  2. Extract:
    • services -- list of services offered (for matching interest areas)
    • case_studies -- available case studies (for draft responses)
    • outreach.tone -- voice guidelines for draft responses
    • outreach.banned_phrases -- phrases to avoid in draft responses
    • outreach.sign_off -- signature line for draft responses
  3. Accept parameters:
    • reply_text -- the full text of the reply (required)
    • from_name -- name of the person who replied
    • from_email -- their email address (if available)
    • company -- their company name (if known)
    • channel -- where the reply came from (email, linkedin, instagram)
    • lead_context -- object with cadence day, previous touches, lead score, tier

Phase 1: Sentiment Classification

Analyze the reply text and classify it into exactly one of these categories:

CategorySignalsExamples
POSITIVE_DEMOExplicitly requests a meeting, call, or demo"Let's set up a call", "Can we chat this week?", "Send me a calendar link", "Free Thursday?"
POSITIVE_INTERESTEDQuestions about services, pricing, timeline, availability; general interest"Sounds interesting, tell me more", "What are your rates?", "How long does a CRO audit take?", "Can you send some examples?"
NEUTRAL_QUESTIONAsks for info but no clear buying intent"Who is this?", "How did you find me?", "What does Plasho do?", "Where are you based?"
NEUTRAL_OOOOut of office or auto-reply"I'm out of office until...", "On PTO, back on...", "Auto-reply: I'm currently unavailable"
NEGATIVE_NOT_NOWPolite decline with timing indication; not a permanent no"Not the right time", "Maybe next quarter", "We just signed with someone", "Check back in 3 months"
NEGATIVE_NOT_INTERESTEDClear rejection without timing indicator"Not interested", "We're good, thanks", "Not looking for this", "Please don't contact me"
NEGATIVE_UNSUBSCRIBEWants to be removed from all communication"Unsubscribe", "Remove me from your list", "Stop emailing me", "Do not contact me again", "This is spam"
REFERRALRedirects to another person inside or outside their company"You should talk to [name]", "CC'ing my colleague who handles this", "Try reaching out to our head of ecomm"

Classification rules:

  • If multiple signals are present, choose the strongest positive category. A reply that asks a question AND requests a call is POSITIVE_DEMO, not NEUTRAL_QUESTION.
  • Short replies ("Thanks", "Got it", "OK") without additional context: classify as NEUTRAL_QUESTION with LOW confidence.
  • Replies that are clearly automated (vacation responders, ticket confirmations): classify as NEUTRAL_OOO.
  • Any mention of "unsubscribe", "remove", "stop", or "spam" overrides all other signals and forces NEGATIVE_UNSUBSCRIBE.

Phase 2: Intent Extraction

Beyond the top-level sentiment, extract these structured details from the reply:

Questions asked

List every question the person asked, verbatim or paraphrased:

  • "What are your rates?"
  • "How long does a CRO audit take?"
  • "Do you work with brands outside India?"

Objections raised

Identify any objections or hesitations:

  • Price: "Too expensive", "What's the budget?", "We don't have budget right now"
  • Timing: "Not the right time", "Maybe next quarter", "After our funding round"
  • Existing vendor: "We already work with an agency", "We just signed with someone"
  • Platform: "We're not on Shopify", "We use WooCommerce", "Thinking of migrating to Shopify"
  • Trust: "Never heard of you", "Can you share references?", "How many stores have you done?"
  • Scope: "We only need X, not Y", "This is too comprehensive"

People mentioned

Extract any person references that could be referrals:

  • Name (if mentioned)
  • Title/role (if mentioned)
  • Company (if different from the replier's company)
  • Contact info (if shared)

Timeline indicators

Extract any timing references:

  • Specific dates: "after March", "in Q2", "next month"
  • Relative: "in 2 weeks", "next quarter", "after funding"
  • Vague: "sometime later", "eventually"
  • Urgent: "ASAP", "this week", "immediately"

Interest areas

Map the reply to specific services from agency.config.json:

  • Which service(s) they seem interested in
  • Any specific problems they mentioned (e.g., "our conversion rate is low" maps to CRO)

Phase 3: Recommended Action

Based on the classification, recommend a specific next action and CRM stage update:

ClassificationRecommended ActionCRM Stage UpdatePause Cadence?
POSITIVE_DEMOSend calendar link immediately. Suggest 2-3 time slots. Keep it short.DEMO_BOOKEDYes
POSITIVE_INTERESTEDReply with relevant info addressing their questions. Include the most relevant case study. Ask if they want to jump on a 15-min call.REPLIEDYes
NEUTRAL_QUESTIONAnswer their question directly and concisely. Re-pitch value in 1-2 sentences. Include a soft CTA for a call.REPLIEDYes
NEUTRAL_OOODo nothing now. Note their return date. Reschedule next cadence touch for return date + 1 day.CONTACTED (keep current)Adjust timing only
NEGATIVE_NOT_NOWSend polite acknowledgment. If they gave a timeline, set a reminder for that date. If no timeline, set reminder for 90 days.REPLIEDYes, with reactivation date
NEGATIVE_NOT_INTERESTEDSend a short, gracious close: "Understood, thanks for letting me know. If things change, we're here." Mark lead as done.NOT_INTERESTEDYes, end cadence
NEGATIVE_UNSUBSCRIBESend acknowledgment: "Done, you won't hear from us again." Remove from ALL sequences and lists immediately.DO_NOT_CONTACTYes, permanent
REFERRALThank the original contact. Add the referred person as a new lead with source = "referral from [original contact]". Begin research on the referred person.REPLIED (original) + create new leadYes (original)

Draft response generation

Generate a draft response for POSITIVE_DEMO, POSITIVE_INTERESTED, NEUTRAL_QUESTION, NEGATIVE_NOT_NOW, NEGATIVE_NOT_INTERESTED, and NEGATIVE_UNSUBSCRIBE categories.

Draft response rules:

  • Follow the outreach.tone from config: direct, helpful, zero fluff
  • Never use any phrase from outreach.banned_phrases
  • Keep it under 100 words for email, under 50 words for LinkedIn/Instagram
  • Use the replier's first name
  • For positive replies: reference the most relevant case_studies entry based on their industry/interest
  • For demo requests: include a calendar link placeholder [CAL_LINK]
  • Sign off with outreach.sign_off
  • Match the channel tone: email can be slightly longer, LinkedIn/Instagram should be conversational and brief

Phase 4: Output

Return structured JSON:

{
  "classification": "POSITIVE_INTERESTED",
  "sentiment": "positive",
  "confidence": "HIGH",
  "summary": "Interested in CRO audit services, asked about pricing and timeline",
  "questions_asked": [
    "What are your rates?",
    "How long does a CRO audit take?"
  ],
  "objections": [],
  "referrals": [],
  "timeline_mentioned": null,
  "interest_area": "Conversion Rate Optimization",
  "recommended_action": "Reply with CRO audit pricing and Kibi Sports case study. Suggest 15-min call.",
  "crm_stage_update": "REPLIED",
  "pause_cadence": true,
  "reactivation_date": null,
  "draft_response": "Hey Sarah, glad this caught your eye. For CRO, we typically start with a full audit (takes about a week) -- for reference, our Kibi Sports audit uncovered issues causing 15-25% revenue loss, and the redesign drove measurable uplift in conversions.\n\nHappy to walk through what a quick audit of your store would look like. Got 15 min this week?\n\nEkata | Plasho (plasho.com)",
  "new_leads_to_create": []
}

For REFERRAL classification, the new_leads_to_create array is populated:

{
  "classification": "REFERRAL",
  "sentiment": "neutral",
  "confidence": "MEDIUM",
  "summary": "Redirected to their Head of Ecommerce, Priya Sharma",
  "questions_asked": [],
  "objections": [],
  "referrals": [
    {
      "name": "Priya Sharma",
      "title": "Head of Ecommerce",
      "company": "Brand X",
      "email": null,
      "source": "Referral from Sarah Chen"
    }
  ],
  "timeline_mentioned": null,
  "interest_area": null,
  "recommended_action": "Thank Sarah for the referral. Research Priya Sharma at Brand X. Add as new lead with referral source.",
  "crm_stage_update": "REPLIED",
  "pause_cadence": true,
  "reactivation_date": null,
  "draft_response": "Thanks Sarah, really appreciate the pointer. Will reach out to Priya.\n\nEkata | Plasho (plasho.com)",
  "new_leads_to_create": [
    {
      "name": "Priya Sharma",
      "title": "Head of Ecommerce",
      "company": "Brand X",
      "email": null,
      "source": "Referral from Sarah Chen",
      "priority": "HIGH"
    }
  ]
}

Confidence levels:

  • HIGH: Reply is unambiguous, classification is clear from the text
  • MEDIUM: Reply has mixed signals or is short/ambiguous, classification is best guess
  • LOW: Reply is very short (1-3 words), automated, or context-dependent

Example Usage

Trigger phrases:

  • "Analyze this reply"
  • "Classify this response"
  • "What should I do with this reply?"
  • "Run reply analyzer on these responses"
User: Analyze this reply: "Hey, interesting work on Kibi Sports. We're actually looking at overhauling our Shopify store. What would something like that cost for a mid-size D2C brand? Could do a call next week."
Assistant: [classifies as POSITIVE_DEMO, extracts pricing question + timeline "next week", recommends sending calendar link with 2-3 slots, generates draft response referencing Kibi Sports case study]
User: What do I do with this: "Thanks but we just hired an agency last month."
Assistant: [classifies as NEGATIVE_NOT_NOW, extracts objection "existing vendor", recommends polite acknowledgment with 90-day reminder, generates short gracious reply]

Files bundled with it

These load only when the skill asks for them, so they cost nothing until it runs.

Other skills for the same job

Different authors, same problem. Matched on the words in the skill name, across every library in the catalogue except this one.

Need help setting it up?

This page tells you what reply-analyzer does and what it needs. Cheetah builds the agent setup it runs inside: data, CRM, sequencing and the guardrails.

Book a call →

The directory stays free. There is nothing gated behind this.