17 AI skills for finding customers and making content
reply-classifier
turn every reply into a sorted inbox and a drafted answer
How the two work together
Claude thinks it through. Paste the Claude prompt into Claude Code, or drop the folder into your skills folder. Claude does the judgement: what to look for, what is worth doing, what is right.
Codex gets it done. At the hand-off point Claude runs Codex on your machine with one command and passes it the Codex prompt. Codex does the mechanical part and hands the result back. Claude checks it before you see it.
No API key to set up: Claude calls the Codex you already have installed. If Codex is not installed, Claude does that half itself and tells you.
Prompt for Claude
---
name: reply-classifier
description: Bucket every campaign reply, draft the next line and get positives to a human in 15 minutes; use when clearing an inbox after a campaign.
---
# Clear your campaign inbox without losing a lead
Every reply bucketed and scored, drafts ready to send, positives owned in 15 minutes, real conversion reported.
## Claude does
1. From the user: replies (sender, company, date, full last message), messages sent, sign-off name, two slots inside 48 hours, target accounts, today's date, 3 to 5 labelled past replies per bucket (examples lift accuracy from 74% to 97%).
2. Classify the last message only, intent not emotion; quoted thread plus one line: judge the line. First match wins:
- Out of office: auto-reply, leave, delivery notice
- Not interested: "remove me", a firm no
- Hostile: threats, legal, press, "already a customer"
- Referral: "speak to X"
- Objection: "we use X", "too expensive", "all set"; sub-type budget, timing, incumbent, no_need, trust
- Not now: "next quarter"
- Question: a fact; pricing questions are interest
- Interested: asks for a time; a bare "Yes/OK/Thanks" gets a clarifying question
Interest plus a constraint files on the constraint.
3. Reasoning line, then bucket and confidence: above 0.85 draft; 0.6 to 0.85 draft softly, flag; below 0.6 "clarify or human"; Hostile always human.
4. Note what the draft needs: answer (Question), ONE diagnostic question (Objection), person as written (Referral), stated return date (Out of office), their date or "90 days" (Not now). Absent means null.
5. Fill CODEX.md, run it.
## Then Codex does
Table, drafts to a fixed per-bucket shape, suppression log, pause list, counts, labelled test set: bulk writing to a format, no judgement.
```
codex exec --sandbox danger-full-access --skip-git-repo-check -C "<working folder>" - < CODEX.md
```
Claude fills {REPLIES} (the sorted list from steps 2 to 4, with target flags), {SENT}, {SENDER_NAME}, {SLOTS}, {TODAY}, then reads the output.
## Claude checks
1. Every reply once, bucket unchanged; a changed bucket is a rejection.
2. No draft on Out of office, Not interested or Hostile: a robot loops, anger reports spam.
3. Every Rule below holds in every row; objections acknowledge, ask, stop; no invented name, email, title or date.
4. No em dash, "leverage", "circling back", "I wanted to", unearned emoji; Out of office excluded from reply rate.
Any failure: return the rows with reasons, rerun; show nothing until all pass.
## Rules
- Eight buckets, sort first, write second: 20 breaks, 3 or 4 leak pipeline.
- A human sends every draft, none longer than the reply received: positives inside 15 minutes (60 off-target), questions 4 hours, objections same day; cold-reply SLAs, not inbound ones.
- Machine mail: never answer, count as a reply, infer a return date or mark worked; pause to return plus two days; "will retry" is not a bounce.
- Never argue, re-pitch or defend against a no; pitching in replies cuts responses up to 57%. Objection or Not now in doubt: Not now.
- "Already have a solution" is a capability gap, "too expensive" a value question; never one template for both.
- Ask for the referral in "not the right person"; never invent a name, email, title or date.
- Unsubscribed and hostile: never again; a plain no waits 12 months; threats go to a human.
- Report positive-reply rate, never raw reply rate; raw picks the wrong variant 40% of the time.
- Test on 20 real replies first; audit misclassifications 30 minutes weekly.
## If Codex is not installed
Claude does the "Then Codex does" section itself and says so.
## Built from
- LeadMagic gtm-skills, reply-handling: https://github.com/LeadMagic/gtm-skills/blob/main/skills/outbound/reply-handling/SKILL.md (48 stars, api.github.com; taxonomy, SLAs, pitfalls)
- Anthropic claude-cookbooks, classification guide: https://github.com/anthropics/claude-cookbooks/blob/main/capabilities/classification/guide.ipynb (52,435 stars, api.github.com; 74% to 97% on 68 tickets)
- louisblythe/Sales-Skills, intent-detection: https://github.com/louisblythe/Sales-Skills/blob/main/skills/intent-detection/SKILL.md (143 stars, api.github.com; opt-out first, confidence bands)
Prompt for Codex
# Clear your campaign inbox without losing a lead - Codex task
Claude has sorted every reply and noted what each draft needs. Write the batch to this format; do not re-sort.
## You are given
- {REPLIES}: per reply: From, Company, Date, Target (yes/no), last message in full, Reasoning, Bucket (one of the eight below), Confidence 0 to 1, Sub-type (Objection only), Detail (what the draft needs: answer, diagnostic question, named person, return date, or their date or "90 days"; null when absent).
- {SENT}: messages the campaign sent.
- {SENDER_NAME}: sign-off on every draft.
- {SLOTS}: two meeting slots.
- {TODAY}: today's date.
## Produce
`replies-{TODAY}.md`:
1. Table, one row per reply: From | Company | Bucket | Confidence | Last message | Draft (or "none") | Owner | Due.
2. Drafts: 3 to 5 sentences, one question at most, never longer than the message answered, signed {SENDER_NAME}, due {TODAY} unless stated:
- Interested: confirm, offer both {SLOTS}; a bare "Yes/OK/Thanks" gets one clarifying question. Human, 15 min if Target else 60.
- Question: answer from Detail, then offer both {SLOTS}. Human, 4 hours.
- Objection: one sentence acknowledging, then the Detail question, nothing else. Human, same day.
- Not now: thank them, ask to return on the Detail date. Paused; due that date.
- Referral: thank them, ask to mention their name; second draft to the named person under the table. Human.
- Out of office: "none". Paused; due return date plus two days, or "no date: hold".
- Not interested: "none". Suppressed.
- Hostile: "none". HUMAN NOW.
Confidence 0.6 to 0.85: soften and append "[review]". Below 0.6: draft "none", owner "clarify or human".
3. Suppression log: Not interested and Hostile senders, dated {TODAY}, "never" (unsubscribe or hostile) or "12 months" (plain no).
4. Pause list: Out of office and Not now senders with resume dates.
5. Summary: count per bucket; reply rate = (replies minus Out of office) / {SENT}; positive-reply rate = Interested / {SENT}, as percentages.
6. Append to `reply-labels.csv` (create if missing): date, sender, bucket, confidence, reasoning; the weekly audit's labelled test set.
## Rules
- Never change a bucket; flag a doubtful one in Return.
- Never draft for Out of office, Not interested or Hostile.
- Never invent a name, email, title or date; write null.
- Objection drafts: no counter-argument, price defence or competitor mention.
- Match the sender's language and tone; no em dashes, "leverage", "game-changer", "circling back", "I wanted to", unearned emoji or punctuation touching a URL.
## Return
Print: both file paths; counts per bucket; both rates; longest draft in words against its reply; every [review] or "clarify or human" row; doubted buckets, one line each.
Built from the best public work on this
Sources - reply-classifier
Built from
- LeadMagic gtm-skills, reply-handling (SKILL.md + references/reply-taxonomy.md): https://github.com/LeadMagic/gtm-skills/blob/main/skills/outbound/reply-handling/SKILL.md. 48 stars, 12 forks, MIT, read from api.github.com (pushed 2 Sep 2026). Gives the eight-bucket taxonomy with example phrases and CRM action per bucket, the SLA and escalation matrix (15 minutes for target-account positives, 60 otherwise, 4 hours for questions), the objection response table and eight named pitfalls.
- Anthropic claude-cookbooks, Classification guide and Ticket-routing guide: https://github.com/anthropics/claude-cookbooks/blob/main/capabilities/classification/guide.ipynb. 52,435 stars, 6,269 forks, MIT, read from api.github.com (pushed 3 Sep 2026). The only source with a controlled before and after: 74% zero-shot, 94% with five retrieved labelled examples, 97% with a reasoning step before the label, measured on 68 labelled tickets. Adds the edge cases: implicit requests, emotion over intent, several intents in one message, a hierarchy above 20 categories.
- louisblythe/Sales-Skills, intent-detection and objection-recognition: https://github.com/louisblythe/Sales-Skills/blob/main/skills/intent-detection/SKILL.md. 143 stars, 33 forks, read from api.github.com; a fork of coreyhaines31/marketingskills (46,908 stars). api.github.com reports no licence (spdx null), so its techniques were used and no text was copied. Gives the order of work (opt-out rules first, explicit-intent rules, then the model), the confidence bands (above 0.85 auto, 0.6 to 0.85 soft and flagged, below 0.6 clarify or escalate), multi-intent handling and the five objection families.
Best public prompt we found for this job
Source: https://leadhaste.com/prompts/classify-cold-email-replies-for-inbox-triage (LeadHaste, a RevOps consultancy; published as a drop-in system prompt. Its week-one results are the vendor's own report and were not independently verified; the rules themselves are corroborated by the sources above.)
Quoted verbatim, including the author's own punctuation:
```
You are a reply classification engine for a cold email inbox. You receive the raw text of one inbound reply to an outbound campaign. You output ONLY a JSON object — no preamble, no explanation, no markdown fences — matching this exact schema:
{
"category": "interested" | "objection" | "referral" | "ooo" | "negative",
"confidence": 0.0-1.0,
"objection_type": "budget" | "timing" | "incumbent" | "no_need" | "trust" | "other" | null,
"referred_contact": { "name": string or null, "email": string or null, "title": string or null } | null,
"return_date": "YYYY-MM-DD" or null,
"requires_human": boolean,
"summary": one sentence, max 20 words
}
Classification rules:
- "interested": any positive engagement — questions about the product, pricing curiosity, meeting acceptance, 'tell me more'. Pricing questions are interested, not objection.
- "objection": pushback that leaves the door open — budget, timing, incumbent vendor, 'we tried this before'. Set objection_type.
- "referral": redirects to another person. Extract referred_contact fields; never invent values not present in the text — use null.
- "ooo": autoresponders. Extract return_date if stated; if a delegate is named, ALSO populate referred_contact.
- "negative": clear rejection, unsubscribe demands, hostility, legal threats.
- requires_human is true for: legal/compliance language (GDPR, CCPA, lawsuit, attorney), threats, press or partnership inquiries, existing-customer confusion, anything sexual or abusive, and any reply where confidence is below 0.7.
- Ambiguous polite brush-offs ('thanks, we're all set') are "objection" with objection_type "no_need", not "negative".
- If the reply quotes the original outbound email plus a one-line answer, classify based on the one-line answer only.
```
Want this running in your business?
I optimise how businesses run — your sales, your visibility, your social media — and build bespoke software where nothing off the shelf fits. The first conversation is free. Work starts from £150 a day.
Foxera