How to use it
- Hit Copy the whole skill.
- Claude: ⋯ → Download .md, then Customize → Skills → Add → Upload skill.
ChatGPT: make a Project and paste it into Instructions.
Neither? Paste it at the top of a new chat — it works for that chat. - Describe your job in plain words. The AI follows the skill from there.
npx degit gooseworks-ai/goose-skills/skills/lead-generation/capabilities/kol-engager-icp#main ~/.claude/skills/kol-engager-icpFor one project only, change the path to .claude/skills/kol-engager-icp.
Not working?
- Check which app you pasted it into — the steps above name the right one.
- Some skills need the paid tier of Claude or ChatGPT.
Paste into Claude, ChatGPT or Cursor.
Show the full text180 lines
KOL 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:
--config(required) — path to client config JSON--test— limit to 3 KOLs, 50 enrichment profiles--probe— test engager scraping with one post URL and exit--yes— skip cost confirmation prompts--kols— override KOL URLs from config (comma-separated)--max-runs— override Apify run limit
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:
+3Commenter (higher intent)+2Position matches ICP keywords+2Position matches target titles-5Position matches exclude titles or vendor keywords+1Engaged on multiple posts- 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
icp_keywordsortarget_titles - Low engagement posts selected — adjust
topic_keywordsto be less restrictive - Too expensive — lower
max_enrichment_profilesor switch to test mode
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
APIFY_API_TOKENin.env - Apify actors used:
harvestapi/linkedin-profile-posts(KOL post scraping)harvestapi/linkedin-company-posts(engager scraping from posts)harvestapi/linkedin-profile-scraper(profile enrichment)
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
| 1 | |
| 2 | name kol-engager-icp |
| 3 | description > |
| 4 | Find ICP-fit leads from KOL audiences on LinkedIn. Given a list of KOLs, |
| 5 | scrapes their most relevant high-engagement post from the last 30 days, |
| 6 | extracts engagers (reactors + commenters), pre-filters by position, |
| 7 | enriches top profiles, and ICP-classifies. Cost-controlled: 1 post per KOL. |
| 8 | Use when someone wants to "find leads from KOL audiences" or "scrape |
| 9 | engagers from influencer posts" or after running kol-discovery. |
| 10 | tags [lead-generation] |
| 11 | |
| 12 | |
| 13 | # KOL Engager ICP |
| 14 | |
| 15 | 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. |
| 16 | |
| 17 | **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. |
| 18 | |
| 19 | ## Phase 0: Intake |
| 20 | |
| 21 | Ask the user these questions: |
| 22 | |
| 23 | ### ICP Criteria |
| 24 | |
| 25 | What does your product/service do? |
| 26 | Topic keywords for post relevance filtering (3-5 terms the KOL posts should be about) |
| 27 | Target industries/verticals |
| 28 | Target job titles/roles (e.g., "VP Operations", "Head of Logistics") |
| 29 | Titles to EXCLUDE (e.g., "Software Engineer", "Data Scientist") |
| 30 | Competitors to filter out |
| 31 | Geographic focus (e.g., "United States") |
| 32 | |
| 33 | ### KOL Input |
| 34 | |
| 35 | KOL list — LinkedIn profile URLs (from kol-discovery output or manual list) |
| 36 | |
| 37 | Save config: |
| 38 | |
| 39 | skills/kol-engager-icp/configs/{client-name}.json |
| 40 | |
| 41 | |
| 42 | Config JSON structure: |
| 43 | |
| 44 | { |
| 45 | "client_name": "example", |
| 46 | "topic_keywords": ["freight automation", "dispatch operations"], |
| 47 | "topic_patterns": ["freight.*automat", "dispatch.*oper"], |
| 48 | "icp_keywords": ["freight", "logistics", "3pl"], |
| 49 | "target_titles": ["vp operations", "head of logistics", "coo"], |
| 50 | "exclude_titles": ["software engineer", "data scientist"], |
| 51 | "tech_vendor_keywords": ["competitor-name", "saas founder"], |
| 52 | "country_filter": "United States", |
| 53 | "kol_urls": ["https://www.linkedin.com/in/kol-1/"], |
| 54 | "days_back": 30, |
| 55 | "max_posts_per_kol": 20, |
| 56 | "max_kols": 10, |
| 57 | "max_enrichment_profiles": 200, |
| 58 | "mode": "standard" |
| 59 | } |
| 60 | |
| 61 | |
| 62 | ## Phase 1: Run the Pipeline |
| 63 | |
| 64 | |
| 65 | python3 skills/kol-engager-icp/scripts/kol_engager_icp.py \ |
| 66 | --config skills/kol-engager-icp/configs/{client-name}.json \ |
| 67 | [--test] [--probe] [--yes] [--kols "url1,url2"] |
| 68 | |
| 69 | |
| 70 | **Flags:** |
| 71 | `--config` (required) — path to client config JSON |
| 72 | `--test` — limit to 3 KOLs, 50 enrichment profiles |
| 73 | `--probe` — test engager scraping with one post URL and exit |
| 74 | `--yes` — skip cost confirmation prompts |
| 75 | `--kols` — override KOL URLs from config (comma-separated) |
| 76 | `--max-runs` — override Apify run limit |
| 77 | |
| 78 | ### Pipeline Steps |
| 79 | |
| 80 | **Step 1: Scrape KOL posts** — For each KOL, fetch recent posts (last 30 days, max 20 posts to scan) using `harvestapi/linkedin-profile-posts`. |
| 81 | |
| 82 | **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. |
| 83 | |
| 84 | **Step 3: Scrape engagers** — Use `harvestapi/linkedin-company-posts` with `scrapeReactions: true, scrapeComments: true` to get reactors and commenters from each selected post. |
| 85 | |
| 86 | **Step 4: Pre-filter before enrichment** — Score engagers by position: |
| 87 | `+3` Commenter (higher intent) |
| 88 | `+2` Position matches ICP keywords |
| 89 | `+2` Position matches target titles |
| 90 | `-5` Position matches exclude titles or vendor keywords |
| 91 | `+1` Engaged on multiple posts |
| 92 | Keep only score > 0, cap at `max_enrichment_profiles` |
| 93 | |
| 94 | **Step 5: Enrich** — `harvestapi/linkedin-profile-scraper` in batches of 25. Apply country filter after. |
| 95 | |
| 96 | **Step 6: ICP classify & export** — Classify as Likely ICP / Possible ICP / Unknown / Tech Vendor. Export CSV. |
| 97 | |
| 98 | ### Hard Caps |
| 99 | |
| 100 | | Parameter | Test | Standard | Full | |
| 101 | |-----------|------|----------|------| |
| 102 | | KOLs processed | 3 | 10 | 20 | |
| 103 | | Posts selected per KOL | 1 | 1 | 1 | |
| 104 | | Max reactions scraped | all | all | all | |
| 105 | | **Max profiles enriched** | **50** | **200** | **500** | |
| 106 | | Est. total cost | ~$0.50 | ~$1.50-2 | ~$5-8 | |
| 107 | |
| 108 | ### Probe Mode |
| 109 | |
| 110 | Run `--probe` first to verify engager scraping works: |
| 111 | |
| 112 | |
| 113 | python3 skills/kol-engager-icp/scripts/kol_engager_icp.py \ |
| 114 | --config skills/kol-engager-icp/configs/{client-name}.json --probe |
| 115 | |
| 116 | |
| 117 | This scrapes posts from the first KOL, selects the best post, scrapes engagers from it, and prints a sample. No enrichment, no CSV. |
| 118 | |
| 119 | ## Phase 2: Review & Refine |
| 120 | |
| 121 | Present results: |
| 122 | **Per-KOL breakdown** — which KOL's post generated the most leads |
| 123 | **Pre-filter stats** — how many engagers passed the position filter |
| 124 | **ICP breakdown** — counts by tier |
| 125 | **Top 15 leads** — name, role, company, KOL source, engagement type |
| 126 | |
| 127 | Common adjustments: |
| 128 | **Too many tech vendors** — add terms to `tech_vendor_keywords` |
| 129 | **Missing ICP leads** — broaden `icp_keywords` or `target_titles` |
| 130 | **Low engagement posts selected** — adjust `topic_keywords` to be less restrictive |
| 131 | **Too expensive** — lower `max_enrichment_profiles` or switch to test mode |
| 132 | |
| 133 | ## Phase 3: Output |
| 134 | |
| 135 | CSV exported to `skills/kol-engager-icp/output/{client-name}-kol-engagers-{date}.csv`: |
| 136 | |
| 137 | | Column | Description | |
| 138 | |--------|-------------| |
| 139 | | Name | Full name | |
| 140 | | LinkedIn Profile URL | Profile link | |
| 141 | | Role | Parsed from headline | |
| 142 | | Company Name | Parsed from headline | |
| 143 | | Location | From enrichment | |
| 144 | | KOL Source | Which KOL's post they engaged with | |
| 145 | | Post URL | Link to the specific post | |
| 146 | | Engagement Type | Comment or Reaction | |
| 147 | | Comment Text | Their comment (personalization gold) | |
| 148 | | ICP Tier | Likely ICP / Possible ICP / Unknown / Tech Vendor | |
| 149 | | Pre-Filter Score | Priority score from Step 4 | |
| 150 | |
| 151 | ## Tools Required |
| 152 | |
| 153 | **Apify API token** — set as `APIFY_API_TOKEN` in `.env` |
| 154 | **Apify actors used:** |
| 155 | `harvestapi/linkedin-profile-posts` (KOL post scraping) |
| 156 | `harvestapi/linkedin-company-posts` (engager scraping from posts) |
| 157 | `harvestapi/linkedin-profile-scraper` (profile enrichment) |
| 158 | |
| 159 | ## Example Usage |
| 160 | |
| 161 | **Trigger phrases:** |
| 162 | "Find leads from KOL audiences in [industry]" |
| 163 | "Scrape engagers from these KOL posts" |
| 164 | "Run kol-engager-icp for [client]" |
| 165 | "Who is engaging with [KOL name]'s content?" |
| 166 | |
| 167 | **After kol-discovery:** |
| 168 | |
| 169 | # Use KOL URLs from discovery output |
| 170 | python3 skills/kol-engager-icp/scripts/kol_engager_icp.py \ |
| 171 | --config skills/kol-engager-icp/configs/example.json \ |
| 172 | --kols "https://linkedin.com/in/kol1,https://linkedin.com/in/kol2" |
| 173 | |
| 174 | |
| 175 | **Test mode:** |
| 176 | |
| 177 | python3 skills/kol-engager-icp/scripts/kol_engager_icp.py \ |
| 178 | --config skills/kol-engager-icp/configs/example.json --test |
| 179 | |
| 180 |