Systems Lab

Agent skill

speed-to-lead

Route every PlusVibe reply through a Clay webhook table that classifies it and writes a reply, save that reply as a DRAFT in PlusVibe (never auto-send), and ping the assigned rep in Slack at +0 and +5 minutes during 9-17 New York business hours.

activeNeeds a keyActs undeclared674 words

Filed under Prospecting and list building.

From sccsadmin11/outbound-gtm-sc · 11 skill entries · 0 · pushed 2026-10-22

What it does when it runs

Route every PlusVibe reply through a Clay webhook table that classifies it and writes a reply, save that reply as a DRAFT in PlusVibe (never auto-send), and ping the assigned rep in Slack at +0 and +5 minutes during 9-17 New York business hours.

Automated analysis of the skill and the 11 files 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
  • CLAY_WEBHOOK_AUTH_TOKEN
  • PLUSVIBE_API_KEY
  • PLUSVIBE_WEBHOOK_SECRET
  • RELAY_SHARED_SECRET
  • SLACK_BOT_TOKEN
Hosts it reaches
  • api.slack.com
  • app.plusvibe.ai
  • relay.yourdomain.example
  • slack.com
Tool permissions it declares
No allowed-tools in the frontmatter. It does act, so it runs under whatever permissions your session already grants.
Actions present in the files
shell

Ask about speed-to-lead

Opens your assistant with this page's recorded context. Check the linked sources before relying on it.

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/sccsadmin11/outbound-gtm-sc.git /tmp/outbound-gtm-sc
git -C /tmp/outbound-gtm-sc sparse-checkout set "10-speed-to-lead"
mkdir -p ~/.claude/skills/speed-to-lead
cp -R "/tmp/outbound-gtm-sc/10-speed-to-lead/." ~/.claude/skills/speed-to-lead/

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.

Before you install: this skill will not complete its job on a bare agent. It needs CLAY_WEBHOOK_AUTH_TOKEN, PLUSVIBE_API_KEY, PLUSVIBE_WEBHOOK_SECRET, RELAY_SHARED_SECRET, SLACK_BOT_TOKEN, which you have to obtain separately.

Reproduced in full from sccsadmin11/outbound-gtm-sc/blob/fc996416957ff6232cc00c3b5c94d601b68e1d61/10-speed-to-lead/SKILL.md, which is licensed MIT (repository). 674 words, 11 headings.

10 Speed to lead

Purpose

Replies go cold fast. This skill gets a classified reply, a ready draft and a Slack ping in front of the right rep within minutes, while a human still sends every email.

PlusVibe reply webhook -> relay /plusvibe (HMAC check)
  -> Clay webhook table: classify -> draft reply -> HTTP POST back
  -> relay /clay-callback -> PlusVibe save-as-draft (never send)
  -> Slack ping to the rep at +0 and +5 min (Mon-Fri 9-17 America/New_York)

How we run it: we run this on Hermes by Nous Research. Any always-on box that can take HTTPS traffic works (a small VPS, Fly, Railway, a Cloudflare Tunnel to a home server).

Reply classes

ClassDraft savedSlack pings
interestedyes2
meeting_requestyes2
questionyes2
referralyes2
not_nowyes1
not_interestedno0
ooono0
unsubscribeno1 (so someone confirms the lead is blocklisted)

Change this in config/routing.json. An unknown label from Clay is treated as question, so a human always sees it.

Ping timing

  • Reply classified during Mon-Fri 09:00-17:00 America/New_York: ping at +0, second ping at +5 min unless the rep clicked Mark handled.
  • Outside those hours: queued for 09:00 and 09:05 the next business day. A ping that would land after 17:00 moves to 09:00 the next business day. US holidays are not skipped.

Inputs

  • campaign_state.json from skill 09 (optional, limits the webhook to that campaign).
  • config/reps.json (copy config/reps.example.json): who gets pinged, matched by the inbox that got the reply, then by campaign, then the default.

Outputs

  • Drafts in PlusVibe Unibox. Slack DMs to reps.
  • relay_state.json: replies, classes and the ping queue. It survives restarts.

Env vars

VarWhere to get it
PLUSVIBE_API_KEY, PLUSVIBE_WORKSPACE_IDhttps://app.plusvibe.ai/v2/settings/api-access
PLUSVIBE_WEBHOOK_SECRETMake one up (python -c "import secrets;print(secrets.token_hex(32))"). Used to sign webhooks
RELAY_SHARED_SECRETMake one up. Clay sends it back as X-Relay-Secret; it also signs the Mark handled links
RELAY_PUBLIC_URLThe public HTTPS URL of your relay, e.g. https://relay.yourdomain.example
CLAY_WEBHOOK_URLClay table -> Webhook source -> copy URL
CLAY_WEBHOOK_AUTH_TOKENOptional, from the Clay webhook settings
SLACK_BOT_TOKENhttps://api.slack.com/apps -> your app -> OAuth & Permissions -> Bot token (xoxb-...), scope chat:write
SLACK_FALLBACK_CHANNELOptional channel ID used when a rep has no Slack ID

Steps (agent run instructions)

  1. Set up Clay with clay/clay_setup.md (webhook table, two AI columns with the prompts in clay/prompts/, one HTTP API column).
  2. Copy config/reps.example.json to config/reps.json and fill in the Slack member IDs.
  3. Start the relay in dry-run mode and replay the sample reply:
    python 10-speed-to-lead/scripts/relay.py --dry-run --port 8080
    SIG=$(python -c "import hmac,hashlib,os;print(hmac.new(os.environ['PLUSVIBE_WEBHOOK_SECRET'].encode(),open('10-speed-to-lead/examples/sample_plusvibe_reply.json','rb').read(),hashlib.sha256).hexdigest())")
    curl -X POST localhost:8080/plusvibe -H "Signature: $SIG" --data-binary @10-speed-to-lead/examples/sample_plusvibe_reply.json
    curl -X POST localhost:8080/clay-callback -H "X-Relay-Secret: $RELAY_SHARED_SECRET" --data-binary @10-speed-to-lead/examples/sample_clay_callback.json
    
  4. Deploy it behind HTTPS at RELAY_PUBLIC_URL, without --dry-run. Check GET /health.
  5. Register the PlusVibe webhook (dry run first):
    python 10-speed-to-lead/scripts/register_webhook.py --campaign-state campaign_state.json --dry-run
    python 10-speed-to-lead/scripts/register_webhook.py --campaign-state campaign_state.json
    
  6. Reply to one of your own campaign emails from a test address and watch for the draft and the ping.

Safety

  • The relay only calls POST /unibox/emails/save-as-draft. It has no code path to PlusVibe's send/reply endpoint.
  • Webhooks without a valid Signature (HMAC-SHA256 of the raw body with PLUSVIBE_WEBHOOK_SECRET) get a 401.
  • Request logs show paths only, never query strings or secrets.

Open TODOs

  • parent_message_id for the draft uses the webhook's last_email_id. PlusVibe documents that as the reply-to id; confirm it is the same Unibox email id.
  • Clay webhook auth header name (x-clay-webhook-auth).

Handoff

Relay URL + webhook registered -> 11-qa checks GET /health and that a PlusVibe webhook points at it.

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 speed-to-lead 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.

Build my GTM engine

Tell us what you want to improve. Fedor reviews the workflow and replies by email when there is a useful fit.

Fedor reviews every request personally. If there is a useful fit, he will reply by email.