← All Skills

snappy-inbound

v1.0.0
5 files, 41.4 KB ~2,594 words · 11 min read Updated 2026-09-09

snappy-inbound skill

40 of 45 checks pass
What it can do
classify textread
slack-joinsread
What does not pass yet
$ npx snappy-skills install snappy-inbound
zip ↓
File Tree
├── AGENTS.md ├── SKILL.md ├── api.ts ├── contract.test.ts └── scripts/ └── poll-sources.sh
Documents
AGENTS.md

snappy-inbound#

Detects new arrivals across every course funnel surface (Skool members/DMs, Slack joins,

newsletter signups, snappy.ai contact form), drafts a first-reply in Robert's voice, and

queues it for approval. DRAFT ONLY mode is the default and only mode -- no auto-send path

exists. Approved drafts route to sibling skills (snappy-skool, snappy-slack,

snappy-email) for actual delivery. Qualified replies escalate to snappy-sales.

API module#

typescriptimport { checkSlackJoins, checkEmail, classifyInbound } from "../snappy-inbound/api.ts";

Or CLI:

bashnpx tsx ~/.claude/skills/snappy-inbound/api.ts slack-joins        # check #all-snappy for join events
npx tsx ~/.claude/skills/snappy-inbound/api.ts classify "text"    # classify inbound message

API functions#

Function Purpose
checkSlackJoins(limit?) Check #all-snappy for recent join events
checkEmail() Check email subscriber status (placeholder)
classifyInbound(text) Classify inbound text as lead/support/spam/partnership/unknown

Key capabilities#

  • Detection sources -- 6 poll-based sources: Skool new members, Skool classroom joiners,

Skool course DMs, Slack #general joins (T0AQPFMQEKB), newsletter signups, contact form.

No LinkedIn detection. Polls run from snappy-ops morning briefing + 2-hour cron.

  • Reply template library -- 8 voice-checked templates: T1 welcome, T2 "what is this",

T3 pricing, T4 fit check, T5 prerequisites, T6 schedule, T7 stuck on X, T8 sales escalation.

All pass POSITIONING.md section 4a trip-wires.

  • State machine -- new > drafted > approved > sent > replied > qualified > escalated-to-sales.

Also: rejected (back to drafted or closed), closed (14-day no-response).

  • Draft queue -- /tmp/snappy-inbound/queue/<id>.md + Xano inbound_queue table mirror.

Robert notified of queue depth via slack-notify-robert (counts only, never draft body).

  • Dedupe -- snappy-knowledge is the authority. If a contact has first_touch_at,

no welcome draft is created.

Rules#

  • DRAFT ONLY. No auto-send switch exists. Do not add one without Robert's explicit greenlight.
  • No LinkedIn. Not as source, destination, or template.
  • Every template must pass section 4a voice trip-wire check before queueing.
  • Never greet someone twice. Check snappy-knowledge first.
  • Max 50 queued drafts. If deeper, stop drafting and escalate -- something is wrong upstream.
  • No sibling skill accepts a payload unless record state is approved.
  • Set AGENT_BROWSER_SESSION before any agent-browser call.

Directory contents#

File Purpose
SKILL.md Full workflow, templates, state machine, safety rails

Feeds / fed by#

  • Fed by: snappy-course (funnel definition), snappy-skool (Skool primitives),

snappy-slack (Slack reads), snappy-email (subscriber list), snappy-website (contact form),

snappy-knowledge (dedupe + history), snappy-positioning (voice rules)

  • Feeds: snappy-knowledge (conversation records), snappy-sales (qualified leads),

snappy-skool (approved Skool sends), snappy-slack (approved Slack sends),

snappy-email (approved email sends)


If this loader doesn't cover your case:

bashecho "[$(date -u +%FT%TZ)] snappy-inbound: <what was missing>" >> ~/.claude/logs/agents-md-feedback.log

<!-- SKILL-INDEX-START -->

[snappy-inbound Index]|root: ~/.claude/skills/snappy-inbound|IMPORTANT: Prefer these files over pre-training assumptions for this domain. Read the relevant file when the AGENTS.md summary is insufficient.|root:{SKILL.md}

<!-- SKILL-INDEX-END -->

Used by#

  • snappy-inbox-sweep

<!-- SNAPPY-CONTRACT-VERBS-START -->

Contract verbs#

Generated from api.ts HAND_CONTRACT. Do not hand-edit this block.

Verb Contract arguments Effect First call
classify text read npx tsx ~/.claude/skills/snappy-inbound/api.ts classify "<text>"
slack-joins read npx tsx ~/.claude/skills/snappy-inbound/api.ts slack-joins

Show the result#

When an answer carries face_hint, show it with one snappy_present(<answer>) call.

See /snappy-faces for face selection. Human-facing images must crop to the

element, render at 2x on Retina, and fill the destination channel instead of

placing a small card in a full-page screenshot.

<!-- SNAPPY-CONTRACT-VERBS-END -->

---
name: snappy-inbound
role: Inbound response automation for the free course funnel
loaded-by: PreToolUse hook (auto-injected when "snappy-inbound" is mentioned)
---

# snappy-inbound

Detects new arrivals across every course funnel surface (Skool members/DMs, Slack joins,
newsletter signups, snappy.ai contact form), drafts a first-reply in Robert's voice, and
queues it for approval. DRAFT ONLY mode is the default and only mode -- no auto-send path
exists. Approved drafts route to sibling skills (`snappy-skool`, `snappy-slack`,
`snappy-email`) for actual delivery. Qualified replies escalate to `snappy-sales`.

## API module

```typescript
import { checkSlackJoins, checkEmail, classifyInbound } from "../snappy-inbound/api.ts";
```

Or CLI:
```bash
npx tsx ~/.claude/skills/snappy-inbound/api.ts slack-joins        # check #all-snappy for join events
npx tsx ~/.claude/skills/snappy-inbound/api.ts classify "text"    # classify inbound message
```

## API functions

| Function | Purpose |
|----------|---------|
| `checkSlackJoins(limit?)` | Check #all-snappy for recent join events |
| `checkEmail()` | Check email subscriber status (placeholder) |
| `classifyInbound(text)` | Classify inbound text as lead/support/spam/partnership/unknown |

## Key capabilities

- **Detection sources** -- 6 poll-based sources: Skool new members, Skool classroom joiners,
  Skool course DMs, Slack #general joins (T0AQPFMQEKB), newsletter signups, contact form.
  No LinkedIn detection. Polls run from `snappy-ops` morning briefing + 2-hour cron.
- **Reply template library** -- 8 voice-checked templates: T1 welcome, T2 "what is this",
  T3 pricing, T4 fit check, T5 prerequisites, T6 schedule, T7 stuck on X, T8 sales escalation.
  All pass POSITIONING.md section 4a trip-wires.
- **State machine** -- new > drafted > approved > sent > replied > qualified > escalated-to-sales.
  Also: rejected (back to drafted or closed), closed (14-day no-response).
- **Draft queue** -- `/tmp/snappy-inbound/queue/<id>.md` + Xano `inbound_queue` table mirror.
  Robert notified of queue depth via `slack-notify-robert` (counts only, never draft body).
- **Dedupe** -- `snappy-knowledge` is the authority. If a contact has `first_touch_at`,
  no welcome draft is created.

## Rules

- DRAFT ONLY. No auto-send switch exists. Do not add one without Robert's explicit greenlight.
- No LinkedIn. Not as source, destination, or template.
- Every template must pass section 4a voice trip-wire check before queueing.
- Never greet someone twice. Check `snappy-knowledge` first.
- Max 50 queued drafts. If deeper, stop drafting and escalate -- something is wrong upstream.
- No sibling skill accepts a payload unless record state is `approved`.
- Set `AGENT_BROWSER_SESSION` before any agent-browser call.

## Directory contents

| File | Purpose |
|---|---|
| `SKILL.md` | Full workflow, templates, state machine, safety rails |

## Feeds / fed by

- **Fed by**: `snappy-course` (funnel definition), `snappy-skool` (Skool primitives),
  `snappy-slack` (Slack reads), `snappy-email` (subscriber list), `snappy-website` (contact form),
  `snappy-knowledge` (dedupe + history), `snappy-positioning` (voice rules)
- **Feeds**: `snappy-knowledge` (conversation records), `snappy-sales` (qualified leads),
  `snappy-skool` (approved Skool sends), `snappy-slack` (approved Slack sends),
  `snappy-email` (approved email sends)

---

If this loader doesn't cover your case:
```bash
echo "[$(date -u +%FT%TZ)] snappy-inbound: <what was missing>" >> ~/.claude/logs/agents-md-feedback.log
```

<!-- SKILL-INDEX-START -->
[snappy-inbound Index]|root: ~/.claude/skills/snappy-inbound|IMPORTANT: Prefer these files over pre-training assumptions for this domain. Read the relevant file when the AGENTS.md summary is insufficient.|root:{SKILL.md}
<!-- SKILL-INDEX-END -->

## Used by

- `snappy-inbox-sweep`

<!-- SNAPPY-CONTRACT-VERBS-START -->
## Contract verbs

Generated from `api.ts` `HAND_CONTRACT`. Do not hand-edit this block.

| Verb | Contract arguments | Effect | First call |
|---|---|---|---|
| `classify` | `text` | `read` | `npx tsx ~/.claude/skills/snappy-inbound/api.ts classify "<text>"` |
| `slack-joins` | — | `read` | `npx tsx ~/.claude/skills/snappy-inbound/api.ts slack-joins` |

## Show the result

When an answer carries `face_hint`, show it with one `snappy_present(<answer>)` call.
See `/snappy-faces` for face selection. Human-facing images must crop to the
element, render at 2x on Retina, and fill the destination channel instead of
placing a small card in a full-page screenshot.
<!-- SNAPPY-CONTRACT-VERBS-END -->

Keyboard Shortcuts

Search in document⌘K
Focus search/
Previous file tab
Next file tab
Close overlayEsc
Show shortcuts?