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.
npx gooseworks install --claude # Then in your agent: /gooseworks <prompt> --skill 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.
Ask the user these questions:
Save config:
skills/kol-engager-icp/configs/{client-name}.jsonConfig 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"
}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 limitStep 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 postsmax_enrichment_profilesStep 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.
| 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 |
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 --probeThis scrapes posts from the first KOL, selects the best post, scrapes engagers from it, and prints a sample. No enrichment, no CSV.
Present results:
Common adjustments:
tech_vendor_keywordsicp_keywords or target_titlestopic_keywords to be less restrictivemax_enrichment_profiles or switch to test modeCSV 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 |
APIFY_API_TOKEN in .envharvestapi/linkedin-profile-posts (KOL post scraping)harvestapi/linkedin-company-posts (engager scraping from posts)harvestapi/linkedin-profile-scraper (profile enrichment)Trigger phrases:
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--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)Diagnose Meta Ads campaign performance using Meta's actual system mechanics — Breakdown Effect, Learning Phase, Auction Overlap, Pacing, and Creative Fatigue — and produce structured, testable recommendations that avoid judging segments by average CPA instead of marginal efficiency.
Pre-flight policy check for Meta ads. Takes ad copy plus advertiser context, resolves and fetches the relevant Meta transparency-center policy pages at runtime, and returns a Pass / Fix Required / Block verdict with cited findings and rewrites.
For paid lead-gen and participant-recruitment ads, replaces vanity CPA with true CAC per qualified lead by joining ad-platform data with downstream funnel events, surfaces tracking gaps, and classifies every creative into Scale / Keep / Investigate / Cut.