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.
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-toolsin 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.
Install it
View source on GitHub ↗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.
The skill
Source on GitHub ↗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
| Class | Draft saved | Slack pings |
|---|---|---|
| interested | yes | 2 |
| meeting_request | yes | 2 |
| question | yes | 2 |
| referral | yes | 2 |
| not_now | yes | 1 |
| not_interested | no | 0 |
| ooo | no | 0 |
| unsubscribe | no | 1 (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.jsonfrom skill 09 (optional, limits the webhook to that campaign).config/reps.json(copyconfig/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
| Var | Where to get it |
|---|---|
PLUSVIBE_API_KEY, PLUSVIBE_WORKSPACE_ID | https://app.plusvibe.ai/v2/settings/api-access |
PLUSVIBE_WEBHOOK_SECRET | Make one up (python -c "import secrets;print(secrets.token_hex(32))"). Used to sign webhooks |
RELAY_SHARED_SECRET | Make one up. Clay sends it back as X-Relay-Secret; it also signs the Mark handled links |
RELAY_PUBLIC_URL | The public HTTPS URL of your relay, e.g. https://relay.yourdomain.example |
CLAY_WEBHOOK_URL | Clay table -> Webhook source -> copy URL |
CLAY_WEBHOOK_AUTH_TOKEN | Optional, from the Clay webhook settings |
SLACK_BOT_TOKEN | https://api.slack.com/apps -> your app -> OAuth & Permissions -> Bot token (xoxb-...), scope chat:write |
SLACK_FALLBACK_CHANNEL | Optional channel ID used when a rep has no Slack ID |
Steps (agent run instructions)
- Set up Clay with
clay/clay_setup.md(webhook table, two AI columns with the prompts inclay/prompts/, one HTTP API column). - Copy
config/reps.example.jsontoconfig/reps.jsonand fill in the Slack member IDs. - 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 - Deploy it behind HTTPS at
RELAY_PUBLIC_URL, without--dry-run. CheckGET /health. - 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 - 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 withPLUSVIBE_WEBHOOK_SECRET) get a 401. - Request logs show paths only, never query strings or secrets.
Open TODOs
parent_message_idfor the draft uses the webhook'slast_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.
- no-lead-left-behind-lead-treatment-audit by zapier · 354
- lead-magnets by coreyhaines31 · 57,918
- lead-dossier by ericosiu · 3,766
- lead-magnet-brainstorm by growthenginenowoslawski · 797
- lead-magnet by OpenClaudia · 724
- lead-scoring by shawnpang · 374
- daily-lead-steward by zapier · 354
- find-lead-account-owner by zapier · 354
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.