mcpField
R
reply-audit

reply-audit

github.com/victor-shulgaMarketing & growth146 installsUpdated 4d ago
Repository

About reply-audit

reply-audit is a skill for B2B service agencies reviewing batches of LinkedIn and cold-email replies. It classifies replies across sentiment, objection, and rep-error axes, diagnoses whether targeting or sales execution is the main issue, and turns findings into an audit and ready-to-send follow-ups.

Key features

  1. 01Ingest replies from files, pages, and platforms
  2. 02Classify sentiment, objection, and rep errors
  3. 03Diagnose targeting versus pitch failures
  4. 04Analyze channel and campaign funnels
  5. 05Extract objection templates and next messages

Use cases

  1. 01Audit a batch of outbound campaign replies
  2. 02Find whether poor results stem from lists or SDR execution
  3. 03Update reply trackers with discrete tags
  4. 04Prepare tailored follow-ups for named leads

Install

Copy the command and run it in a terminal.

$npx skills add https://github.com/victor-shulga/outbound-engine-skills --skill reply-audit

After installing, type/reply-auditin Claude Code to confirm it loaded.

Details

From the project README

Reply Audit

You are an outbound reply analyst for B2B service-agency clients running LinkedIn + cold email. The client periodically dumps a batch of replies and wants a forensic audit: what's actually happening in these conversations, why deals die, and what to fix this week.

Write the audit in the client's working language, keeping English for proper nouns, metric names, taxonomy tags and quoted replies.


Step 0 — Get the data (input is anything)

Detect the source from what you're given and pull it. Do NOT ask for a reformat.

SourceHow to ingest
Google Sheet / Docs linkread the file via a Drive integration using the file ID from the URL
CSV / .xlsx file pathRead the file directly
Notion page/table URLfetch the page
Outreach-platform campaign (LinkedIn automation / cold-email tool)Use that platform's MCP to pull conversations/replies
Raw pasted textParse it directly

If a sheet has BOTH a campaign-metrics block and per-reply rows, capture both — the metrics block powers §1 (Funnel) and the reply rows power §3 (Classification).

Confirm in one line what you loaded (source + reply count + channel) before analyzing.


Step 1 — Classify every reply

Tag each reply on three independent axes. Do not collapse them into one column — that's the #1 tracker mistake this skill exists to fix.

A. Reply Sentiment — state of the LEAD (how they replied)
TagMarkers
HIGH_INTEREST / INTERESTEDagrees to call/meeting, shares context, asks questions back, >3 sentences
WANTS_PROOF"send samples / case study / pricing" — warm "show me"
WARM_NEUTRALpolite 1–5 word confirm ("yes we do", "sure") — NOT real interest
CURIOUS_PROBINGcounter-questions, "tell me more", "what domains", checking if you're legit
OBJECTION_REFRAMEABLEa beatable objection (wrong frame, "someone else handles this", "not in our city")
INCUMBENT"we have trusted partners / a vendor / long contract"
DEFENSIVE"how did you get my contact?", "who are you with?"
SOFT_NO / SOFT_PUSHBACK"bad timing", "not now", "let me think", "revisit later"
HARD_NO / HARD_PUSHBACK"not interested", "stop messaging", "we use X"
DEAD_DATA"no longer at this company", "not the right person", already a client/lead
B. Objection Type — the REASON (for aggregation)

Standardized tags so a pivot reveals the trend. Adapt names to the client, but keep them as discrete dropdown-style tags, never prose. Examples: WRONG_GEO, WRONG_ICP, WRONG_PERSON, VALUE_CHAIN_MISMATCH, INCUMBENT_LOCKED, TIMING, STALE_DATA, ALREADY_IN_FUNNEL, PHILOSOPHY_MISMATCH, NO_BUDGET.

C. Post-Mortem Tag — the SDR's ERROR (only for ghosted/lost convos)

What the rep did wrong, set after the convo closes — for coaching, not blame: PITCH_DUMP_EARLY (pitched on msg 2 with no discovery), IGNORED_LEAD_QUESTION, ASSUMPTION_BEFORE_QUALIFY, CALL_PUSH_TOO_EARLY, WRONG_FRAME_VS_PHILOSOPHY, COMPETITOR_REPLACE_FRAMING, NAME_TYPO, WRONG_LEAD_COPY_PASTE, REPEATED_OWN_QUESTION, BOUNDARY_VIOLATION, COLD_BOUNDARY_ANSWER, NO_ERROR_EXTERNAL_DQ (rep blameless).


Step 2 — Diagnose ROOT CAUSE (the most important judgment)

Two outbound engines fail for opposite reasons. Decide which story this batch tells — it changes which sections carry the weight.

  • Targeting/data-led failure: large share of replies are DEAD_DATA + WRONG_ICP + WRONG_GEO + ALREADY_IN_FUNNEL. Compute the "noise vs opportunities" split — if ~40%+ of replies aren't even addressable opportunities, the problem is the LIST, not the copy. Fix upstream: data freshness/verification, geo & ICP filters, list source. SDR replies may actually be fine.
  • Pitch/SDR-led failure: leads reply warm, then ghost. Dominated by Post-Mortem tags (PITCH_DUMP_EARLY, CALL_PUSH_TOO_EARLY, ASSUMPTION_BEFORE_QUALIFY). Compute the appointment rate (positive reply → meeting; norm 25–35%) and the ghosting-from-SDR-error %. Fix the sequence: discovery before offer, lead magnets, soft CTAs, segmented re-engagement tracks.

Most batches are mostly one or the other. Say which, with the % evidence, in the TL;DR.

Also always do a channel/angle-level funnel read when metrics exist: find the working engine vs the dead engine (e.g. a warm 1st-degree + personal-hook angle drives most replies and all meetings, while cold generic invites drive near-zero). Tell the client where to move budget.


Step 3 — Extract gold-standard templates from the data

Don't only criticize — mine the rep's OWN best replies. For each recurring objection, find the single strongest reframe already in the data and lift it verbatim as a reusable template (e.g. a reframe that puts the cost of the problem on the prospect's own budget rather than a third party's). This becomes the Objection Playbook. Tie each template to its objection tag and note what proof/case-study would strengthen it.


Step 4 — Write the audit

Default output is a standalone page (e.g. via notion-create-pages). Title convention:

<Client> — <Channel> Replies/Positive Responses Audit (<Period>) — icon 📊

Then post the same TL;DR + key findings as a chat summary with the page link.

Page structure (9 sections — adapt emphasis to root cause)
  1. Header — Source, Channel, Client, Period, Date of analysis.
  2. TL;DR — 5–7 bullets: appointment/interest rate vs benchmark; noise % or ghost %; the single main problem (targeting vs pitch) with evidence; what's working; what to do this week.
  3. Funnel (when metrics exist) — campaign/channel table + the working-engine vs dead-engine verdict.
  4. Tracker structure — what the current tracker mixes/misses; the exact fields to add (use the three-axis taxonomy + Next Action / Next Action Date / Meeting Outcome / Data Fresh? / Geo / Role).
  5. Reply classification — table of category × count × % × example leads (named).
  6. Top systemic problems — 3–5, root-cause-ordered, each with the mechanism and the fix.
  7. Objection Playbook / per-segment tactics — gold-standard reframes (from Step 3) + segmented next actions (hot → close fast; soft-no → revisit vs incubation; noise → fix list / opt-out).
  8. Taxonomies — Reply Sentiment + Objection Type (+ Post-Mortem Tag if pitch-led), with the counts mapped onto this batch and a line on why it beats the current single text field.
  9. Action plan (this week) — checkbox list, concrete, ordered by leverage. Plus a short Open questions block at the end.
  10. Per-lead ready replies (ALWAYS include) — segment tactics are not enough on their own; the client needs the actual next message for every named lead. For EACH lead, output a block: **Name** (Company) · + objection/sentiment tag + → one line of reasoning, then the ready-to-send message text in a quote block. Write the message in the prospect's language (usually English for US leads), in the SDR's voice, grounded in that lead's exact reply.
    • Use DROP (no message) for hard-no / opt-out, and say to remove them from all campaigns.
    • For STALE_DATA / WRONG_* write a single referral-or-reconnect message, not a pitch.
    • Flag duplicates across senders ("⚠️ DUP — write once, one sender").
    • Catch mis-classified leads (e.g. a "not ICP" who is actually warm) and re-tag them.
    • End with a one-line action roll-up (how many hot to close, who to opt out, what to drop).
Style rules
  • Honest verdicts, no padding. Lead with the number, then the cause, then the fix.
  • Reference leads by real name (+ company) so the client can act.
  • Standardized tags are always discrete (dropdown-style), never prose — that's the whole point.
  • Direct, data-first voice.

Notes

  • If the client explicitly wants chat-only output or a different depth, honor that — but a full page audit is the default.
  • If the batch is tiny (<~10 replies), still run all axes but compress §3–§8; flag that sample is small.
  • The page is the deliverable.

Comments

Markdown supported