Goose-skills kol-engager-icp
git clone https://github.com/gooseworks-ai/goose-skills
T=$(mktemp -d) && git clone --depth=1 https://github.com/gooseworks-ai/goose-skills "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/capabilities/kol-engager-icp" ~/.claude/skills/gooseworks-ai-goose-skills-kol-engager-icp && rm -rf "$T"
skills/capabilities/kol-engager-icp/SKILL.mdKOL Engager ICP
Find ICP-fit leads by scraping engagers from KOL posts on LinkedIn. This is the second half of the KOL pipeline — given KOLs (from kol-discovery or manually), it finds their best post, scrapes who engaged, and filters for your ICP.
Core principle: 1 post per KOL. Pick the most relevant, highest-engagement post from the last 30 days. This controls costs while maximizing lead quality.
Phase 0: Intake
Ask the user these questions:
ICP Criteria
- What does your product/service do?
- Topic keywords for post relevance filtering (3-5 terms the KOL posts should be about)
- Target industries/verticals
- Target job titles/roles (e.g., "VP Operations", "Head of Logistics")
- Titles to EXCLUDE (e.g., "Software Engineer", "Data Scientist")
- Competitors to filter out
- Geographic focus (e.g., "United States")
KOL Input
- KOL list — LinkedIn profile URLs (from kol-discovery output or manual list)
Save config:
skills/kol-engager-icp/configs/{client-name}.json
Config JSON structure:
{ "client_name": "example", "topic_keywords": ["freight automation", "dispatch operations"], "topic_patterns": ["freight.*automat", "dispatch.*oper"], "icp_keywords": ["freight", "logistics", "3pl"], "target_titles": ["vp operations", "head of logistics", "coo"], "exclude_titles": ["software engineer", "data scientist"], "tech_vendor_keywords": ["competitor-name", "saas founder"], "country_filter": "United States", "kol_urls": ["https://www.linkedin.com/in/kol-1/"], "days_back": 30, "max_posts_per_kol": 20, "max_kols": 10, "max_enrichment_profiles": 200, "mode": "standard" }
Phase 1: Run the Pipeline
python3 skills/kol-engager-icp/scripts/kol_engager_icp.py \ --config skills/kol-engager-icp/configs/{client-name}.json \ [--test] [--probe] [--yes] [--kols "url1,url2"]
Flags:
(required) — path to client config JSON--config
— limit to 3 KOLs, 50 enrichment profiles--test
— test engager scraping with one post URL and exit--probe
— skip cost confirmation prompts--yes
— override KOL URLs from config (comma-separated)--kols
— override Apify run limit--max-runs
Pipeline Steps
Step 1: Scrape KOL posts — For each KOL, fetch recent posts (last 30 days, max 20 posts to scan) using
harvestapi/linkedin-profile-posts.
Step 2: Select best post per KOL — Filter posts by
topic_keywords/topic_patterns relevance, then pick the ONE with highest engagement (reactions + comments). Result: 1 post URL per KOL.
Step 3: Scrape engagers — Use
harvestapi/linkedin-company-posts with scrapeReactions: true, scrapeComments: true to get reactors and commenters from each selected post.
Step 4: Pre-filter before enrichment — Score engagers by position:
Commenter (higher intent)+3
Position matches ICP keywords+2
Position matches target titles+2
Position matches exclude titles or vendor keywords-5
Engaged on multiple posts+1- Keep only score > 0, cap at
max_enrichment_profiles
Step 5: Enrich —
harvestapi/linkedin-profile-scraper in batches of 25. Apply country filter after.
Step 6: ICP classify & export — Classify as Likely ICP / Possible ICP / Unknown / Tech Vendor. Export CSV.
Hard Caps
| Parameter | Test | Standard | Full |
|---|---|---|---|
| KOLs processed | 3 | 10 | 20 |
| Posts selected per KOL | 1 | 1 | 1 |
| Max reactions scraped | all | all | all |
| Max profiles enriched | 50 | 200 | 500 |
| Est. total cost | ~$0.50 | ~$1.50-2 | ~$5-8 |
Probe Mode
Run
--probe first to verify engager scraping works:
python3 skills/kol-engager-icp/scripts/kol_engager_icp.py \ --config skills/kol-engager-icp/configs/{client-name}.json --probe
This scrapes posts from the first KOL, selects the best post, scrapes engagers from it, and prints a sample. No enrichment, no CSV.
Phase 2: Review & Refine
Present results:
- Per-KOL breakdown — which KOL's post generated the most leads
- Pre-filter stats — how many engagers passed the position filter
- ICP breakdown — counts by tier
- Top 15 leads — name, role, company, KOL source, engagement type
Common adjustments:
- Too many tech vendors — add terms to
tech_vendor_keywords - Missing ICP leads — broaden
oricp_keywordstarget_titles - Low engagement posts selected — adjust
to be less restrictivetopic_keywords - Too expensive — lower
or switch to test modemax_enrichment_profiles
Phase 3: Output
CSV exported to
skills/kol-engager-icp/output/{client-name}-kol-engagers-{date}.csv:
| Column | Description |
|---|---|
| Name | Full name |
| LinkedIn Profile URL | Profile link |
| Role | Parsed from headline |
| Company Name | Parsed from headline |
| Location | From enrichment |
| KOL Source | Which KOL's post they engaged with |
| Post URL | Link to the specific post |
| Engagement Type | Comment or Reaction |
| Comment Text | Their comment (personalization gold) |
| ICP Tier | Likely ICP / Possible ICP / Unknown / Tech Vendor |
| Pre-Filter Score | Priority score from Step 4 |
Tools Required
- Apify API token — set as
inAPIFY_API_TOKEN.env - Apify actors used:
(KOL post scraping)harvestapi/linkedin-profile-posts
(engager scraping from posts)harvestapi/linkedin-company-posts
(profile enrichment)harvestapi/linkedin-profile-scraper
Example Usage
Trigger phrases:
- "Find leads from KOL audiences in [industry]"
- "Scrape engagers from these KOL posts"
- "Run kol-engager-icp for [client]"
- "Who is engaging with [KOL name]'s content?"
After kol-discovery:
# Use KOL URLs from discovery output python3 skills/kol-engager-icp/scripts/kol_engager_icp.py \ --config skills/kol-engager-icp/configs/example.json \ --kols "https://linkedin.com/in/kol1,https://linkedin.com/in/kol2"
Test mode:
python3 skills/kol-engager-icp/scripts/kol_engager_icp.py \ --config skills/kol-engager-icp/configs/example.json --test