Cold Email Automation

Auto research public

by growthenginenowoslawski · MIT license · ★ 736 on GitHub

Auto research public cover

Autonomous cold email campaign launcher. Takes one target company domain, scrapes their website, generates an ICP with Claude, pulls matching leads via Prospeo, enriches emails + company descriptions, personalizes each lead with…

---
name: auto-research-public
description: Autonomous cold email campaign launcher. Takes one target company domain, scrapes their website, generates an ICP with Claude, pulls matching leads via Prospeo, enriches emails + company descriptions, personalizes each lead with parallel Claude Code Task sub-agents (A/B/C variants), and uploads as a live Smartlead campaign. Uses local JSON files for state (no database required). Use for automated daily campaign launches after you have an initial `client-profile.yaml` from /icp-onboarding. Triggers on "auto-research", "launch an automated campaign", "daily campaign", "run the research loop".
---

# Auto Research (Public)

Automated end-to-end campaign launcher. Feed it one target company domain, get back a live Smartlead campaign with per-lead personalization — in about 20 minutes.

This is the beginner-friendly version of the GEX internal `auto-research-v2`. All state lives in local JSON files; no Supabase, no Trigger.dev.

## What you get

- **Input:** one target company domain + your `client-profile.yaml`
- **Output:** a running Smartlead campaign with:
  - 200-1,000 leads (depending on targeting tightness)
  - Per-lead personalization: 9 custom variables (situation, value, CTA × 3 variants)
  - A/B/C subject + body variants tested in parallel

Overview

Automated end-to-end campaign launcher. Feed it one target company domain, get back a live Smartlead campaign with per-lead personalization — in about 20 minutes.

What you get

  • Inputone target company domain + your client-profile.yaml
  • Outputa running Smartlead campaign with:
  • 200-1,000 leads (depending on targeting tightness)
  • Per-lead personalization9 custom variables (situation, value, CTA × 3 variants)
  • A/B/C subject + body variants tested in parallel
  • Campaign assigned to your available inboxes

Example prompts

/auto-research-public --domain=$(cat /tmp/auto/next-target.txt
Manual install (npx, ZIP)
Claude Codenpx skills add growthenginenowoslawski/coldoutboundskills --skill auto-research-public -g -a claude-code
Claude Code (degit)npx degit growthenginenowoslawski/coldoutboundskills/skills/auto-research-public#main ~/.claude/skills/auto-research-public
Claude.ai / desktopZip the folder and upload it under Settings → Capabilities → Skills.
Codex, Cursor, other agentsPoint them at SKILL.md. The other files are plain text.

Connects with Agent Alley MCP · agentalley.io/mcp

Files included

  • SKILL.md11.4 KB
Read SKILL.md here
growthenginenowoslawski/main1 file shown
SKILL.md
Show the full text288 lines

Auto Research (Public)

Automated end-to-end campaign launcher. Feed it one target company domain, get back a live Smartlead campaign with per-lead personalization — in about 20 minutes.

This is the beginner-friendly version of the GEX internal auto-research-v2. All state lives in local JSON files; no Supabase, no Trigger.dev.

What you get

  • Input: one target company domain + your client-profile.yaml
  • Output: a running Smartlead campaign with:
    • 200-1,000 leads (depending on targeting tightness)
    • Per-lead personalization: 9 custom variables (situation, value, CTA × 3 variants)
    • A/B/C subject + body variants tested in parallel
    • Campaign assigned to your available inboxes
    • Schedule: Mon-Fri 8am-5pm your timezone

Prerequisites

Before running:

  • client-profile.yaml exists (run /icp-onboarding if not)
  • SMARTLEAD_API_KEY in env
  • PROSPEO_API_KEY in env
  • MILLIONVERIFIER_API_KEY in env (for email validation)
  • At least 20 Smartlead inboxes tagged "active" (run /smartlead-inbox-manager first)
  • At least 1 campaign template in Smartlead (or the script creates a fresh one)

The orchestration (Claude Code runs this)

Unlike the other skills, this skill orchestrates through the Claude Code conversation itself — Claude does the reasoning (ICP generation, copy writing, personalization), and phase scripts do the heavy API I/O. This is the pattern from the GEX v2 internal.

Phase 1: Scrape the target company
npx tsx scripts/phase-scrape.ts --domain=<target.com> --out=/tmp/auto/scrape.json

Output: JSON with domain + text content from homepage, /about, /product, /pricing, /customers.

Claude reads the output and writes a short analysis to /tmp/auto/company-analysis.md:

  • What the company does
  • Who their likely customers are
  • Social proof signals
  • Potential angles for outreach
Phase 2: Claude generates ICP filters

Reading /tmp/auto/scrape.json + ~/cold-email-ai-skills/profiles/<slug>/client-profile.yaml, Claude writes Prospeo filters to /tmp/auto/filters.json:

{
  "job_titles": ["VP Marketing", "Head of Marketing", ...],
  "seniorities": ["Vice President", "Head", "Director"],
  "industries": ["Software Development", "Financial Services"],
  "company_size_min": 50,
  "company_size_max": 500,
  "countries": ["US"],
  "excluded_industries": ["Religious Institutions", "Government Administration"]
}

Claude MUST use exact Prospeo industry names from ~/cold-email-ai-skills/skills/icp-onboarding/references/prospeo-industries.md.

npx tsx scripts/phase-prospeo.ts --filters-file=/tmp/auto/filters.json --max-leads=1000 --out=/tmp/auto/leads.json

Output: JSON with leads array. Each lead has: first_name, last_name, email (may be empty), linkedin_url, job_title, company_name, company_domain, company_industry, company_headcount, company_description.

Phase 4: Email waterfall + description enrichment
npx tsx scripts/phase-enrich.ts --leads-file=/tmp/auto/leads.json --out=/tmp/auto/enriched.json

The script:

  1. Checks each lead for email; if missing, hits Prospeo's enrich-person endpoint
  2. If company_description is thin (<50 chars), scrapes company_domain homepage
  3. Runs MillionVerifier on every candidate email
  4. Writes enriched leads (only those with valid email) to output

Expect hit rates:

  • Retail/SMB: ~99% email found
  • B2B tech: ~65-80%
  • Healthcare/public sector: ~25-40%
  • MV rejection: ~20-30% of found emails
Phase 5: Copy writing (Claude)

Claude generates 3 copy variants (A, B, C) and writes to /tmp/auto/variants.json:

[
  {
    "variant": "A",
    "subject": "<concrete, specific, <60 chars>",
    "angle": "<pain observation>",
    "body_template": "Hi {{first_name}},\n\n{{situation_line_a}}\n\n{{value_line_a}}\n\n{{cta_line_a}}\n\n%signature%\n\nP.S. If this isn't relevant, just let me know and I won't reach out again."
  },
  {
    "variant": "B",
    "subject": "<different angle>",
    "angle": "<compliment + transition>",
    "body_template": "..."
  },
  {
    "variant": "C",
    "subject": "<third angle>",
    "angle": "<question>",
    "body_template": "..."
  }
]

Rules Claude MUST follow (run /spam-word-checker on output):

  • No em dashes (—). Use commas or periods.
  • No "leverage", "synergy", "solutions", "world-class", "cutting-edge".
  • Body: 50-90 words max.
  • Subject: under 60 chars, specific, no clickbait.
  • End with %signature% on its own line.
Phase 6: Personalization via Task sub-agents

Claude fans out to parallel Task sub-agents (one per variant × batch of 20-30 leads). See /personalization-subagent-pattern for the full pattern.

Per lead, each sub-agent writes to /tmp/auto/personalization-<batch>-variant-<X>.json:

[
  {
    "lead_id": "...",
    "situation_line": "One sentence about the company.",
    "value_line": "One sentence connecting to our offer.",
    "cta_soft": "One soft ask sentence."
  }
]

After all sub-agents finish, Claude merges by lead_id into /tmp/auto/personalized.json. Each lead now has 9 personalization fields.

Phase 7: Upload to Smartlead
npx tsx scripts/phase-upload.ts \
  --leads-file=/tmp/auto/personalized.json \
  --variants-file=/tmp/auto/variants.json \
  --domain=<target.com> \
  --inboxes-tag=active \
  --inbox-count=10 \
  --activate

This script:

  1. Creates a new Smartlead campaign named [AUTO] <date> <target> Auto
  2. Saves the 3-variant sequence with campaign-ID-scoped custom vars ({{situation_line_a_{campaign_id}}})
  3. Selects N inboxes tagged "active" from Smartlead (LRU — least recently used first)
  4. Uploads leads in batches of 100 with custom fields mapped to their personalization
  5. Sets schedule (Mon-Fri 8am-5pm EST) and settings (tracking off, stop on reply)
  6. Activates the campaign

Outputs: { campaignId, inboxCount, leadsUploaded } to stdout.

Phase 8: Save experiment state (local JSON)

Write to ~/cold-email-ai-skills/profiles/<slug>/experiments/<YYYY-MM-DD>-<target>.json:

{
  "date": "2026-04-17",
  "target_domain": "example.com",
  "smartlead_campaign_id": 123456,
  "inboxes_assigned": [...],
  "icp_filters": {...},
  "variants": [...],
  "lead_count_uploaded": 347,
  "launched_at": "2026-04-17T14:23:00Z",
  "status": "launched"
}

This is your experiment log. /experiment-design reads from here to compare runs. /positive-reply-scoring writes results back to this file after 21 days.

Running the full loop

To run all 8 phases in one command (with Claude orchestrating):

/auto-research-public --domain=<target.com>

Claude Code will execute each phase in order, pausing before phase 5 (copy) and phase 7 (upload) so you can review.

Daily / scheduled runs

Once comfortable, wrap it in a cron or use Claude Code's /loop skill to run daily:

/loop 1d /auto-research-public --domain=$(cat /tmp/auto/next-target.txt)

You need a way to pick the next target each day. Options:

  • Maintain a targets.txt list and pop one per day
  • Let Claude pick based on TAM research (see /GEX:Full-TAM-Waterfall for inspiration)
  • Rotate through a list of competitors/lookalikes

State files (local JSON, no database)

Everything the skill needs lives under ~/cold-email-ai-skills/profiles/<slug>/:

profiles/
  <business-slug>/
    client-profile.yaml          # from /icp-onboarding
    lead-magnets.md              # from /lead-magnet-brainstorm
    experiments/
      2026-04-16-targetco.json   # per-campaign experiment log
      2026-04-17-othertarget.json
    scores/
      123456-2026-05-07.json     # from /positive-reply-scoring

Inbox assignment (no Supabase)

The GEX v2 uses a Supabase table auto_research_inbox_assignments to track which inboxes are assigned to which campaigns (to spread load). This public version:

  1. Queries Smartlead for inboxes tagged "active"
  2. Pulls each inbox's daily_sent_count as a proxy for "how recently used"
  3. Sorts ascending, picks the first N (least-sent-today = least recently used)
  4. Records the assignment in the local experiment JSON (not a database)

Works for <1000 inboxes. If you scale beyond that, migrate to a real DB.

Common issues

  • Prospeo INVALID_FILTERS — Usually "industry name not in the 256 list." Check /icp-onboarding references/prospeo-industries.md for exact matches.
  • Low email hit rate — If <30%, your list is targeting hard-to-find people (niche titles, small companies). Widen ICP or accept the cost.
  • Sub-agent personalization repetitive — If you see the same phrasing across leads, rerun that batch with a diversity prompt. See /personalization-subagent-pattern references/failure-modes.md.
  • Smartlead "inbox not allowed" on upload — Inbox is flagged/blocked. The script skips and continues.
  • Campaign stuck at 0 sends — Check campaign schedule, inbox warmup status (via /smartlead-inbox-manager list-health), and that leads actually uploaded.

Cost per run

Typical run (1 target, 1000 leads pulled):

  • Prospeo search: ~40 pages × search = ~$0.20
  • Prospeo enrich-person (email finding for ~500 leads missing email): ~$5
  • MillionVerifier validation: ~$0.50
  • Smartlead send cost: ~$0.001/email sent over time
  • Claude Code Task sub-agents: (uses your Claude Code plan — no extra API spend)

Total: ~$6-10 per campaign to reach 300-500 valid emails.

Scripts

  • scripts/phase-scrape.ts — website scrape
  • scripts/phase-prospeo.ts — Prospeo paginated search
  • scripts/phase-enrich.ts — email waterfall + description enrichment + MillionVerifier
  • scripts/phase-upload.ts — Smartlead campaign creation + upload
  • scripts/_lib.ts — shared API helpers

References

  • references/orchestration-checklist.md — full step-by-step for running the loop manually
  • references/icp-to-prospeo.md — how to translate client-profile.yaml into Prospeo filter JSON
  • references/copy-variant-guide.md — how to write 3 distinct A/B/C variants

What to do next

Wait 21 days for the campaign to accumulate reply data, then run /positive-reply-scoring on the launched campaign.

Meanwhile: continue the weekly rhythm via /cold-email-weekly-rhythm. Every Monday, /email-deliverability-audit on the new campaign to catch infrastructure issues early.

Or wait: this skill IS the automation loop. Next action can be "run again tomorrow with a different target domain" or integrate with /schedule skill to run daily.

  • /icp-onboarding — produces client-profile.yaml (required input)
  • /lead-magnet-brainstorm — produces the offer/CTA this campaign asks about
  • /personalization-subagent-pattern — the fan-out pattern used in phase 6
  • /smartlead-inbox-manager — must run BEFORE so inboxes are tagged/warmed
  • /positive-reply-scoring — run AFTER 21 days to score the campaign
  • /experiment-design — how to plan which target to try next
1---
2name: auto-research-public
3description: Autonomous cold email campaign launcher. Takes one target company domain, scrapes their website, generates an ICP with Claude, pulls matching leads via Prospeo, enriches emails + company descriptions, personalizes each lead with parallel Claude Code Task sub-agents (A/B/C variants), and uploads as a live Smartlead campaign. Uses local JSON files for state (no database required). Use for automated daily campaign launches after you have an initial `client-profile.yaml` from /icp-onboarding. Triggers on "auto-research", "launch an automated campaign", "daily campaign", "run the research loop".
4---
5 
6# Auto Research (Public)
7 
8Automated end-to-end campaign launcher. Feed it one target company domain, get back a live Smartlead campaign with per-lead personalization — in about 20 minutes.
9 
10This is the beginner-friendly version of the GEX internal `auto-research-v2`. All state lives in local JSON files; no Supabase, no Trigger.dev.
11 
12## What you get
13 
14- **Input:** one target company domain + your `client-profile.yaml`
15- **Output:** a running Smartlead campaign with:
16 - 200-1,000 leads (depending on targeting tightness)
17 - Per-lead personalization: 9 custom variables (situation, value, CTA × 3 variants)
18 - A/B/C subject + body variants tested in parallel
19 - Campaign assigned to your available inboxes
20 - Schedule: Mon-Fri 8am-5pm your timezone
21 
22## Prerequisites
23 
24Before running:
25- [ ] `client-profile.yaml` exists (run `/icp-onboarding` if not)
26- [ ] `SMARTLEAD_API_KEY` in env
27- [ ] `PROSPEO_API_KEY` in env
28- [ ] `MILLIONVERIFIER_API_KEY` in env (for email validation)
29- [ ] At least 20 Smartlead inboxes tagged "active" (run `/smartlead-inbox-manager` first)
30- [ ] At least 1 campaign template in Smartlead (or the script creates a fresh one)
31 
32## The orchestration (Claude Code runs this)
33 
34Unlike the other skills, this skill orchestrates through the Claude Code conversation itself — Claude does the reasoning (ICP generation, copy writing, personalization), and phase scripts do the heavy API I/O. This is the pattern from the GEX v2 internal.
35 
36### Phase 1: Scrape the target company
37 
38```bash
39npx tsx scripts/phase-scrape.ts --domain=<target.com> --out=/tmp/auto/scrape.json
40```
41 
42Output: JSON with `domain` + text content from homepage, /about, /product, /pricing, /customers.
43 
44Claude reads the output and writes a short analysis to `/tmp/auto/company-analysis.md`:
45- What the company does
46- Who their likely customers are
47- Social proof signals
48- Potential angles for outreach
49 
50### Phase 2: Claude generates ICP filters
51 
52Reading `/tmp/auto/scrape.json` + `~/cold-email-ai-skills/profiles/<slug>/client-profile.yaml`, Claude writes Prospeo filters to `/tmp/auto/filters.json`:
53 
54```json
55{
56 "job_titles": ["VP Marketing", "Head of Marketing", ...],
57 "seniorities": ["Vice President", "Head", "Director"],
58 "industries": ["Software Development", "Financial Services"],
59 "company_size_min": 50,
60 "company_size_max": 500,
61 "countries": ["US"],
62 "excluded_industries": ["Religious Institutions", "Government Administration"]
63}
64```
65 
66Claude MUST use exact Prospeo industry names from `~/cold-email-ai-skills/skills/icp-onboarding/references/prospeo-industries.md`.
67 
68### Phase 3: Prospeo search
69 
70```bash
71npx tsx scripts/phase-prospeo.ts --filters-file=/tmp/auto/filters.json --max-leads=1000 --out=/tmp/auto/leads.json
72```
73 
74Output: JSON with `leads` array. Each lead has: `first_name`, `last_name`, `email` (may be empty), `linkedin_url`, `job_title`, `company_name`, `company_domain`, `company_industry`, `company_headcount`, `company_description`.
75 
76### Phase 4: Email waterfall + description enrichment
77 
78```bash
79npx tsx scripts/phase-enrich.ts --leads-file=/tmp/auto/leads.json --out=/tmp/auto/enriched.json
80```
81 
82The script:
831. Checks each lead for email; if missing, hits Prospeo's `enrich-person` endpoint
842. If company_description is thin (<50 chars), scrapes company_domain homepage
853. Runs MillionVerifier on every candidate email
864. Writes enriched leads (only those with valid email) to output
87 
88Expect hit rates:
89- Retail/SMB: ~99% email found
90- B2B tech: ~65-80%
91- Healthcare/public sector: ~25-40%
92- MV rejection: ~20-30% of found emails
93 
94### Phase 5: Copy writing (Claude)
95 
96Claude generates 3 copy variants (A, B, C) and writes to `/tmp/auto/variants.json`:
97 
98```json
99[
100 {
101 "variant": "A",
102 "subject": "<concrete, specific, <60 chars>",
103 "angle": "<pain observation>",
104 "body_template": "Hi {{first_name}},\n\n{{situation_line_a}}\n\n{{value_line_a}}\n\n{{cta_line_a}}\n\n%signature%\n\nP.S. If this isn't relevant, just let me know and I won't reach out again."
105 },
106 {
107 "variant": "B",
108 "subject": "<different angle>",
109 "angle": "<compliment + transition>",
110 "body_template": "..."
111 },
112 {
113 "variant": "C",
114 "subject": "<third angle>",
115 "angle": "<question>",
116 "body_template": "..."
117 }
118]
119```
120 
121Rules Claude MUST follow (run `/spam-word-checker` on output):
122- No em dashes (—). Use commas or periods.
123- No "leverage", "synergy", "solutions", "world-class", "cutting-edge".
124- Body: 50-90 words max.
125- Subject: under 60 chars, specific, no clickbait.
126- End with `%signature%` on its own line.
127 
128### Phase 6: Personalization via Task sub-agents
129 
130Claude fans out to parallel Task sub-agents (one per variant × batch of 20-30 leads). See `/personalization-subagent-pattern` for the full pattern.
131 
132Per lead, each sub-agent writes to `/tmp/auto/personalization-<batch>-variant-<X>.json`:
133 
134```json
135[
136 {
137 "lead_id": "...",
138 "situation_line": "One sentence about the company.",
139 "value_line": "One sentence connecting to our offer.",
140 "cta_soft": "One soft ask sentence."
141 }
142]
143```
144 
145After all sub-agents finish, Claude merges by lead_id into `/tmp/auto/personalized.json`. Each lead now has 9 personalization fields.
146 
147### Phase 7: Upload to Smartlead
148 
149```bash
150npx tsx scripts/phase-upload.ts \
151 --leads-file=/tmp/auto/personalized.json \
152 --variants-file=/tmp/auto/variants.json \
153 --domain=<target.com> \
154 --inboxes-tag=active \
155 --inbox-count=10 \
156 --activate
157```
158 
159This script:
1601. Creates a new Smartlead campaign named `[AUTO] <date> <target> Auto`
1612. Saves the 3-variant sequence with campaign-ID-scoped custom vars (`{{situation_line_a_{campaign_id}}}`)
1623. Selects N inboxes tagged "active" from Smartlead (LRU — least recently used first)
1634. Uploads leads in batches of 100 with custom fields mapped to their personalization
1645. Sets schedule (Mon-Fri 8am-5pm EST) and settings (tracking off, stop on reply)
1656. Activates the campaign
166 
167Outputs: `{ campaignId, inboxCount, leadsUploaded }` to stdout.
168 
169### Phase 8: Save experiment state (local JSON)
170 
171Write to `~/cold-email-ai-skills/profiles/<slug>/experiments/<YYYY-MM-DD>-<target>.json`:
172 
173```json
174{
175 "date": "2026-04-17",
176 "target_domain": "example.com",
177 "smartlead_campaign_id": 123456,
178 "inboxes_assigned": [...],
179 "icp_filters": {...},
180 "variants": [...],
181 "lead_count_uploaded": 347,
182 "launched_at": "2026-04-17T14:23:00Z",
183 "status": "launched"
184}
185```
186 
187This is your experiment log. `/experiment-design` reads from here to compare runs. `/positive-reply-scoring` writes results back to this file after 21 days.
188 
189## Running the full loop
190 
191To run all 8 phases in one command (with Claude orchestrating):
192 
193```
194/auto-research-public --domain=<target.com>
195```
196 
197Claude Code will execute each phase in order, pausing before phase 5 (copy) and phase 7 (upload) so you can review.
198 
199## Daily / scheduled runs
200 
201Once comfortable, wrap it in a cron or use Claude Code's `/loop` skill to run daily:
202 
203```
204/loop 1d /auto-research-public --domain=$(cat /tmp/auto/next-target.txt)
205```
206 
207You need a way to pick the next target each day. Options:
208- Maintain a `targets.txt` list and pop one per day
209- Let Claude pick based on TAM research (see `/GEX:Full-TAM-Waterfall` for inspiration)
210- Rotate through a list of competitors/lookalikes
211 
212## State files (local JSON, no database)
213 
214Everything the skill needs lives under `~/cold-email-ai-skills/profiles/<slug>/`:
215 
216```
217profiles/
218 <business-slug>/
219 client-profile.yaml # from /icp-onboarding
220 lead-magnets.md # from /lead-magnet-brainstorm
221 experiments/
222 2026-04-16-targetco.json # per-campaign experiment log
223 2026-04-17-othertarget.json
224 scores/
225 123456-2026-05-07.json # from /positive-reply-scoring
226```
227 
228## Inbox assignment (no Supabase)
229 
230The GEX v2 uses a Supabase table `auto_research_inbox_assignments` to track which inboxes are assigned to which campaigns (to spread load). This public version:
231 
2321. Queries Smartlead for inboxes tagged "active"
2332. Pulls each inbox's `daily_sent_count` as a proxy for "how recently used"
2343. Sorts ascending, picks the first N (least-sent-today = least recently used)
2354. Records the assignment in the local experiment JSON (not a database)
236 
237Works for <1000 inboxes. If you scale beyond that, migrate to a real DB.
238 
239## Common issues
240 
241- **Prospeo INVALID_FILTERS** — Usually "industry name not in the 256 list." Check `/icp-onboarding` references/prospeo-industries.md for exact matches.
242- **Low email hit rate** — If <30%, your list is targeting hard-to-find people (niche titles, small companies). Widen ICP or accept the cost.
243- **Sub-agent personalization repetitive** — If you see the same phrasing across leads, rerun that batch with a diversity prompt. See `/personalization-subagent-pattern` references/failure-modes.md.
244- **Smartlead "inbox not allowed" on upload** — Inbox is flagged/blocked. The script skips and continues.
245- **Campaign stuck at 0 sends** — Check campaign schedule, inbox warmup status (via `/smartlead-inbox-manager list-health`), and that leads actually uploaded.
246 
247## Cost per run
248 
249Typical run (1 target, 1000 leads pulled):
250- Prospeo search: ~40 pages × search = ~$0.20
251- Prospeo enrich-person (email finding for ~500 leads missing email): ~$5
252- MillionVerifier validation: ~$0.50
253- Smartlead send cost: ~$0.001/email sent over time
254- Claude Code Task sub-agents: (uses your Claude Code plan — no extra API spend)
255 
256Total: **~$6-10 per campaign** to reach 300-500 valid emails.
257 
258## Scripts
259 
260- `scripts/phase-scrape.ts` — website scrape
261- `scripts/phase-prospeo.ts` — Prospeo paginated search
262- `scripts/phase-enrich.ts` — email waterfall + description enrichment + MillionVerifier
263- `scripts/phase-upload.ts` — Smartlead campaign creation + upload
264- `scripts/_lib.ts` — shared API helpers
265 
266## References
267 
268- `references/orchestration-checklist.md` — full step-by-step for running the loop manually
269- `references/icp-to-prospeo.md` — how to translate client-profile.yaml into Prospeo filter JSON
270- `references/copy-variant-guide.md` — how to write 3 distinct A/B/C variants
271 
272## What to do next
273 
274**Wait 21 days** for the campaign to accumulate reply data, then run `/positive-reply-scoring` on the launched campaign.
275 
276**Meanwhile:** continue the weekly rhythm via `/cold-email-weekly-rhythm`. Every Monday, `/email-deliverability-audit` on the new campaign to catch infrastructure issues early.
277 
278**Or wait:** this skill IS the automation loop. Next action can be "run again tomorrow with a different target domain" or integrate with `/schedule` skill to run daily.
279 
280## Related skills
281 
282- `/icp-onboarding` — produces client-profile.yaml (required input)
283- `/lead-magnet-brainstorm` — produces the offer/CTA this campaign asks about
284- `/personalization-subagent-pattern` — the fan-out pattern used in phase 6
285- `/smartlead-inbox-manager` — must run BEFORE so inboxes are tagged/warmed
286- `/positive-reply-scoring` — run AFTER 21 days to score the campaign
287- `/experiment-design` — how to plan which target to try next
288 
View all files on GitHub →

Details

License
MIT
Stars on the repo
★ 736
Checked
Source
growthenginenowoslawski/coldoutboundskills ↗
Creator
growthenginenowoslawski · 52 listings
View creator

Similar skills

See all →
SkillAI Sales Team Orchestratorzubair-trabzada/ai-sales-team-claude · by zubair-trabzadaYou are a comprehensive AI sales intelligence and outreach system for Claude Code. You help founders, sales teams, agency owners, and…★ 1.4k GitHub starsSkillABM Campaign Playbookexplorium-ai/gtm-skills · by explorium-aiABM campaign skill for Claude Code: run a full Account-Based Marketing campaign end-to-end — from ICP definition to live LinkedIn Ads. Builds targeted account lists with Vibe Prospecting, enriches and scores companies with real-time B2B data, generates personalized ad creatives with Claude Code and Figma, pushes matched audiences to LinkedIn Ads, and monitors campaigns daily at scale. The complete GTM skill for AI-driven account-based marketing in Claude Code, Codex, Hermes-Agent, and OpenClaw. No agency needed.★ 197 GitHub starsSkillDecision-Maker Shortlistexplorium-ai/gtm-skills · by explorium-aiContact data skill for Claude Code and Codex: build a ranked shortlist of decision-makers and contacts at a target company for outbound prospecting, deal acceleration, or renewal/expansion plays. Returns verified contact data including email, phone, LinkedIn profile, title, seniority, and department. Provide a company name or domain plus optional seniority focus or use case. Use for contact data enrichment, LinkedIn profile lookup, and building outbound contact lists. Works in Claude Code, Codex, Hermes-Agent, and OpenClaw.★ 197 GitHub starsSkillAccount Fit Scorerexplorium-ai/gtm-skills · by explorium-aiLead scoring and buying signals skill for Claude Code and Codex: rank a list of accounts by ICP fit, buying intent, real-time trigger events, and workforce momentum. Returns composite score (0-100), tier (A/B/C), and a 'why now' signal per account. Use for account-based selling, ABM list prioritization, territory planning, signal-based selling, and buyer-intent ranking. Triggers on 'score these accounts', 'rank by ICP fit and intent', 'prioritize this account list', 'which accounts have the strongest buying signals', 'ICP scoring', 'account prioritization'. Works in Claude Code, Codex, Hermes-Agent, OpenClaw, and Claude Cowork.★ 197 GitHub starsSkillApollo Hyper Orchestratorhyperfx-ai/marketing-skills · by hyperfx-aiRun end-to-end B2B cold-email outreach through the Hyper MCP — enrich prospects with Apollo, scrape per-prospect signals from company sites and LinkedIn, draft personalized emails using proven hook frameworks, send via Gmail with safe defaults, and route replies into labeled folders. Use when the user wants to write cold emails, run an outbound sequence, prospect a list, build a follow-up cadence, "reach out to leads," or asks why nobody is replying to their cold emails.★ 90 GitHub starsSkillPersonalized B2B Outreach Agentmarcosmodly/marketing-skill · by marcosmodlyWrites personalized B2B cold emails at a steady daily volume: researches real prospects against your ideal customer profile (ICP), drafts a genuinely 1:1 email for each, and dedupes against a permanent contact log that updates itself from real Gmail replies, bounces, and unsubscribes. Each email is timed to the prospect's local business hours, checked for deliverability and anti-spam compliance, and A/B-tracked by subject line, with the outreach strategy re-confirmed monthly. Queues everything for approval (or creates Gmail drafts if connected) and never sends on its own. Use for cold email, cold outreach, sales prospecting, lead generation, or sales outreach to new contacts. Not for drip or nurture emails to people who already opted in; that is email-sequence.★ 42 GitHub stars

More from growthenginenowoslawski

SkillCompany Decision-Maker Findergrowthenginenowoslawski/coldoutboundskills · by growthenginenowoslawskiUse the Blitz API to find decision-makers at specific companies when you already have a list of company domains. Best for SMB owner-finding, domain-to-people lookup, or supplementing Prospeo results. Outputs a CSV you can feed to the email-waterfall or directly to /cold-email-starter-kit for Smartlead upload. Use when your targeting is company-first (not title-first).★ 736 GitHub starsSkillCold Outreach Strategistgrowthenginenowoslawski/coldoutboundskills · by growthenginenowoslawskiGenerates 15-25+ cold outbound campaign ideas with targeting strategies, AI personalization approaches, and value propositions. Use when planning campaign experiments for a client, given their website or business context.★ 736 GitHub starsSkillClay Signal Playbooksgrowthenginenowoslawski/coldoutboundskills · by growthenginenowoslawskiIndex and shared harness for the 19 signal playbooks. Each playbook turns one buying signal (new in role, raised a round, hiring surge, pricing page, tech on website, ...) into one copy-ready sentence you can drop into a cold email. Every playbook ships three ways to run it: as a Claude skill, as a Clay table built through a browser harness, and as a Clay workflow built from the clay CLI. Use when someone says "personalize this list", "what signal should I use", "build the Clay column for X", or names any of the 19 signals.★ 736 GitHub starsSkillCompetitor Engager Findergrowthenginenowoslawski/coldoutboundskills · by growthenginenowoslawskiFind people actively engaging with competitor LinkedIn posts. Given a website URL, discovers competitors, fetches their company and employee posts, collects all commenters and reactors, and outputs a deduplicated CSV of engaged prospects. Use when someone wants to find leads from competitor engagement, build outreach lists from LinkedIn activity, or analyze who interacts with competitor content.★ 736 GitHub starsSkillEmail Deliverability Crisisgrowthenginenowoslawski/coldoutboundskills · by growthenginenowoslawskiTriage playbook for when cold email deliverability breaks. Decision-tree guidance for "I landed in spam", "bounce rate spiked", "domain blacklisted", "inbox blocked in warmup", "reply rate dropped". Tells you what to check first, what to fix, and how long the fix takes. Pair with /email-deliverability-audit for diagnosis.★ 736 GitHub starsSkillInbox Delivery Benchmarkinggrowthenginenowoslawski/coldoutboundskills · by growthenginenowoslawskiCompare reply rates, bounce rates, and positive reply rates broken down by inbox type (SMTP / Gmail / Outlook) for a Smartlead account. Use when you want to know "which inbox type delivers best" or when debugging unexplained deliverability differences across a mixed fleet. Operates via Smartlead API only (no database required).★ 736 GitHub stars