skills/outbound-sales/SKILL.md
B2B outbound sales drafting — pick the right accounts using buying-intent signals, find the right decision-maker, verify their email, and draft both a cold email AND a LinkedIn DM keyed to the signal that fired. Use this skill whenever the user wants to do outbound prospecting, run a cold-outreach campaign, find leads and message them, prospect companies that show signs of buying intent, identify hot accounts to message this week, find Director of X at companies hiring SDRs (or any signal → persona → message combination), draft outreach copy that references a specific reason to reach out now, or repurpose detected signals into a prospect list with messaging — even if they don't say "outbound" or name the underlying tools. Drafts only — the skill returns copy-paste-ready email + LinkedIn DM content in a structured handoff format, intentionally agnostic of the sending tool (Apollo / Outreach / Salesloft / Lemlist / Smartlead / your own — none of them need to know about gtm-tools).
npx skillsauth add arnaudjnn/gtm-skills outbound-salesInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Outbound that lands is best message → right person → right time. This skill turns that into a deterministic pipeline:
references/signal-to-angle.md).The skill ties those three together: detect → qualify person → verify contact → draft outbound, multi-channel (email + LinkedIn DM). It does not send — companies use their own outreach platform (Apollo, Outreach, Salesloft, Lemlist, Smartlead, Instantly, Reply, internal CRM, etc.) and this skill stays agnostic by returning drafts in a structured format that pastes into any of them.
Trigger phrases — invoke for any of:
Don't invoke for: pure copy work on a single existing draft (use linkedin-copywriter for that), Reddit (use reddit-community-manager), or internal-comms (not outbound).
Before invoking any tool, confirm:
https://api.gtm-tools.sh/api/v0. Auth: Authorization: Bearer $GTM_TOOLS_API_KEY. (The bare gtm-tools.sh is the docs site — POSTing returns 405.)list_linkedin_company_employees, get_linkedin_profile, etc.). Call list_connected_linkedin_accounts. If empty: curl -fsSL https://api.gtm-tools.sh/extension/install.sh | bash, then Connect.get_token_balance before fanning out across >10 accounts.domains
↓ detect_signal (cost: 0 dispatcher + 5/detector that fires)
qualified accounts (signals firing)
↓ map signal → message angle + title filter (references/signal-to-angle.md)
ranked accounts with angle
↓ get_linkedin_company_url (cost: 2)
LinkedIn company URLs
↓ list_linkedin_company_employees with title_filters (cost: 30)
decision-makers
↓ get_email (cost: 5 per candidate)
verified contacts
↓ Draft cold email + LinkedIn DM keyed to signal angle
copy-paste-ready output (handoff to user's outreach platform)
Skipping steps is fine — if the user already has a domain + a target persona, jump straight to step 4 (list_linkedin_company_employees). If they already have a name + domain, jump to step 5 (get_email). The full pipeline is for fresh prospecting from a target-account list.
Run detect_signal (free dispatcher) on each domain. Only spend tokens on people-lookup for accounts where at least one signal fires. This is the single biggest token-savings lever.
curl -s -X POST "https://api.gtm-tools.sh/api/v0/detect_signal" \
-H "Authorization: Bearer $GTM_TOOLS_API_KEY" -H "Content-Type: application/json" \
-d '{"domain":"gymshark.com","techs":["zendesk.com","intercom.com"]}' | jq .
The response includes which signals fired. Sort accounts by how many signals fired and which ones — see references/signal-to-angle.md for the priority table.
If no signals fire, deprioritize the account. The skill should output SKIP — no signals on <domain> rather than fall back to generic outreach. Generic outreach is what makes B2B inboxes hostile; signal-keyed outreach is what gets replies.
Look up the firing signal in references/signal-to-angle.md. Each entry gives you:
list_linkedin_company_employeesExample mappings (full list in the reference file):
| Signal | Hook | Title filter |
|---|---|---|
| signal_hiring_sales_rep_repost | "Saw the SDR role got re-listed — usually means the last one didn't stick" | "(VP OR Director OR Head) AND Sales NOT intern" |
| signal_trustpilot_negative_support_reviews | "Noticed 6 negative Trustpilot reviews about support response time in the last 30 days" | "(VP OR Director OR Head) AND (CX OR Support OR \"Customer Experience\") NOT intern" |
| signal_socials_spike | "Saw the +18% follower spike on Instagram last week" | "(VP OR Director OR Head) AND (Marketing OR Brand OR Growth)" |
| signal_hiring_support | "Saw the 3 CX roles posted in the last 14 days" | "(VP OR Director OR Head) AND (CX OR Support OR Operations)" |
When multiple signals fire, prefer the one with the most specific hook over the broad one (Trustpilot review counts > "they're hiring").
# Company URL
curl -s -X POST "https://api.gtm-tools.sh/api/v0/get_linkedin_company_url" \
-H "Authorization: Bearer $GTM_TOOLS_API_KEY" -H "Content-Type: application/json" \
-d '{"domain":"gymshark.com"}' | jq .
# Decision-makers (30 tokens; the expensive step — title filter is mandatory)
curl -s -X POST "https://api.gtm-tools.sh/api/v0/list_linkedin_company_employees" \
-H "Authorization: Bearer $GTM_TOOLS_API_KEY" -H "Content-Type: application/json" \
-d '{
"domain":"gymshark.com",
"title_filters":"(VP OR Director OR Head) AND (CX OR Support) NOT intern",
"limit":5,
"page":1
}' | jq .
Use the 5-token search variant search_linkedin_company_employees for cheaper discovery if you just need name+title+linkedin_url and don't need the full About / profile id. The full list_ variant is worth the 30 tokens only when you'll use the structured data downstream (e.g. for AI-driven personalization).
For each candidate, call get_email. Skip candidates where the response sets is_catch_all: true unless the user explicitly approves catch-all targets.
curl -s -X POST "https://api.gtm-tools.sh/api/v0/get_email" \
-H "Authorization: Bearer $GTM_TOOLS_API_KEY" -H "Content-Type: application/json" \
-d '{"name":"Camille Tichard","domain":"gymshark.com","input_parameters":{"signal":"trustpilot_negative_support","lead_id":"abc123"}}' | jq .
input_parameters is echoed back in the response — use lead_id to correlate to the user's CRM row, and signal to carry the firing-signal forward into the draft.
Both channels, keyed to the signal angle.
Cold email format that converts in B2B (validated by the templates in references/email-templates.md):
Subject: <signal-specific, 5-8 words, no salesy adjectives>
<First name>,
<Signal observation — one sentence, specific number / date / fact>.
<One-line implication / pain hypothesis> — <one-line social proof or
data point that makes it concrete>.
<Soft CTA — one specific yes-no question, not "do you have 30 mins">.
<Sign-off>
Hard rules:
Shorter than email — LinkedIn's read context is mobile, scroll-fast:
Hey <First name>,
<Signal observation — one sentence>.
<Two-sentence reason it matters + concrete reference>.
<One-line ask — even softer than the email CTA. "Worth a quick chat?" or "Want me to send the X piece?">.
Hard rules:
See references/dm-templates.md for 5 reusable templates keyed to signal type.
For high-value accounts, pull the recipient's recent activity to layer in one specific reference:
curl -s -X POST "https://api.gtm-tools.sh/api/v0/list_user_posts" \
-H "Authorization: Bearer $GTM_TOOLS_API_KEY" -H "Content-Type: application/json" \
-d '{"username":"camilletichard","limit":5}' | jq .
If their recent post discusses a related topic, replace the second sentence of the email/DM with a callback to it. ("Saw your Aug 5 post on AI-driven ticket triage — the signal-side of that is exactly what we're seeing across CX leaders this quarter.")
The skill does not send. It returns a structured handoff per lead, ready to paste into any outreach platform.
Default output format (one JSON object per lead, in a code block):
{
"lead_id": "abc123",
"domain": "gymshark.com",
"first_name": "Camille",
"last_name": "Tichard",
"title": "VP of Customer Experience",
"linkedin_url": "https://linkedin.com/in/camilletichard",
"email": "[email protected]",
"is_catch_all": false,
"signals_fired": ["signal_trustpilot_negative_support_reviews", "signal_hiring_support"],
"primary_signal": "signal_trustpilot_negative_support_reviews",
"angle": "Negative Trustpilot reviews about support response time — 6 in the last 30 days",
"email_subject": "6 Trustpilot reviews about support",
"email_body": "Camille,\n\nSaw 6 negative Trustpilot reviews about Gymshark's support response time in the last 30 days — the common thread was 48+ hour first-reply.\n\nUsually means ticket volume jumped before headcount did. The teams we work with at your scale cut first-reply to under 6h without doubling the CX headcount.\n\nWorth a 15-min compare on what changed for them?\n\n— <signature>",
"linkedin_dm": "Hey Camille,\n\nSaw the spike in negative Trustpilot reviews about Gymshark's support response time over the past month.\n\nUsually means ticket volume outpaced headcount. The teams I work with at your scale cut first-reply to <6h without adding bodies.\n\nWorth a quick chat?",
"ready_to_send": true
}
If the user asks for a markdown table instead (easier to skim across 20+ leads):
| Lead | Signal | Email subject | Email body | LinkedIn DM |
|---|---|---|---|---|
| Camille Tichard, VP CX, gymshark.com — [email protected] | Trustpilot negative support reviews | 6 Trustpilot reviews about support | ... | ... |
Ask the user up-front which format they prefer if it's not obvious from context.
Do not call send_linkedin_message, send_linkedin_invitation, or any email-send tool. This skill stops at the handoff. The user pushes to their outreach platform manually or via a separate skill.
is_catch_all: true without explicit user approval)User: "Find 3 hot accounts in the CX space and draft outreach."
Agent:
detect_signal with techs:["zendesk.com","intercom.com"].signal_trustpilot_negative_support_reviews OR signal_hiring_support fired.references/signal-to-angle.md to get the title filter + hook.get_linkedin_company_url then list_linkedin_company_employees with the title filter, limit=3.get_email.list_user_posts for personalization if budget allows.references/signal-to-angle.mdreferences/email-templates.mdreferences/dm-templates.mdhttps://api.gtm-tools.sh/api/v0 — auth via Authorization: Bearer $GTM_TOOLS_API_KEYtools
Manage Reddit community engagement for a B2B company via Bash — hunt the best threads for the business (industry questions, competitor complaints, category buying-research), qualify the posters before replying, then bring real value in a comment that mentions your company *sparingly* and discloses affiliation *always*. Never cheesy, never pitch-first; the value-to-pitch ratio is roughly 9:1. Use this skill whenever the user mentions Reddit, mentions a subreddit (r/anything), shares a reddit.com or redd.it URL, asks to find / monitor / reply to / engage with Reddit threads, asks to post on Reddit, asks to DM a Reddit user, asks where their competitors are getting complained about, asks to find threads about <industry/category>, mentions Reddit outreach / marketing / community management / monitoring, asks "should I reply to this Reddit post", or asks to check a Reddit user's credibility — even if they don't explicitly say "skill" or name the underlying tools. Every comment that touches the business OR even adjacent to your product MUST open with a disclosure line ("<First> from <Company> here…") — non-negotiable.
data-ai
Look up LinkedIn profiles and find company LinkedIn URLs from domains.
content-media
Research LinkedIn post content, engagement, and company employee activity.
tools
Send and read LinkedIn messages via connected accounts.