kol-engager-icp
$
npx mdskill add gooseworks-ai/goose-skills/kol-engager-icpScrapes high-engagement KOL posts to identify ICP-fit LinkedIn leads.
- Extracts reactor and commenter profiles from selected influencer content.
- Filters candidates by job title, industry, and geographic location.
- Prioritizes posts with highest engagement within the last thirty days.
- Delivers enriched lead profiles ready for outreach campaigns.
SKILL.md
.github/skills/kol-engager-icpView on GitHub ↗
---
name: kol-engager-icp
description: >
Find ICP-fit leads from KOL audiences on LinkedIn. Given a list of KOLs,
scrapes their most relevant high-engagement post from the last 30 days,
extracts engagers (reactors + commenters), pre-filters by position,
enriches top profiles, and ICP-classifies. Cost-controlled: 1 post per KOL.
Use when someone wants to "find leads from KOL audiences" or "scrape
engagers from influencer posts" or after running kol-discovery.
tags: [lead-generation]
---
# 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
1. What does your product/service do?
2. Topic keywords for post relevance filtering (3-5 terms the KOL posts should be about)
3. Target industries/verticals
4. Target job titles/roles (e.g., "VP Operations", "Head of Logistics")
5. Titles to EXCLUDE (e.g., "Software Engineer", "Data Scientist")
6. Competitors to filter out
7. Geographic focus (e.g., "United States")
### KOL Input
8. KOL list — LinkedIn profile URLs (from kol-discovery output or manual list)
Save config:
```bash
skills/kol-engager-icp/configs/{client-name}.json
```
Config JSON structure:
```json
{
"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
```bash
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:
- `+3` Commenter (higher intent)
- `+2` Position matches ICP keywords
- `+2` Position matches target titles
- `-5` Position matches exclude titles or vendor keywords
- `+1` Engaged 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:
```bash
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_keywords` or `target_titles`
- **Low engagement posts selected** — adjust `topic_keywords` to be less restrictive
- **Too expensive** — lower `max_enrichment_profiles` or 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_TOKEN` in `.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:**
```bash
# 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:**
```bash
python3 skills/kol-engager-icp/scripts/kol_engager_icp.py \
--config skills/kol-engager-icp/configs/example.json --test
```