Pain language engagers
Find warm leads by searching LinkedIn for pain-language posts — the frustrations, complaints, and operational struggles your ICP talks about publicly.
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/pain-language-engagers#main ~/.claude/skills/pain-language-engagersFor one project only, change the path to .claude/skills/pain-language-engagers.
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 text189 lines
Pain-Language Engagers
Find warm leads by scraping LinkedIn for pain-language posts and their engagers. People who write about, react to, or comment on posts expressing operational frustrations are signaling they live with a problem your product solves. This skill turns those signals into a qualified lead list.
Core principle: Search for pain-language, not solution-language. Solution keywords ("AI automation", "workflow optimization") attract builders and VCs. Pain keywords ("can't find drivers", "check calls are killing us") attract operators living with the problem.
Phase 0: Intake
Before generating keywords or running anything, ask the user these questions. Present them as a numbered list and tell the user to answer what's relevant and skip what's not.
Product & Pain Context
- What does your product/service do in one sentence?
- What specific problem does it solve? Who feels this pain most acutely?
- What does your ICP's day-to-day look like WITHOUT your product? (The frustrations, workarounds, manual processes)
- What phrases would someone use when complaining about this problem on LinkedIn? (e.g., "check calls are killing us", "can't find drivers", "spending hours on manual data entry")
ICP Definition
- What industries/verticals are your target buyers in?
- What job titles or roles are your ideal buyers? (e.g., "VP Operations", "Broker owner", "Head of Logistics")
- What titles should be EXCLUDED? (e.g., "Software Engineer", "AI researcher")
- Any specific competitors whose employees should be filtered out?
- Geographic focus? (e.g., "United States only", "global")
LinkedIn Signal Sources
- Any LinkedIn company pages where your ICP is likely to engage? (Industry publications, communities, competitor pages)
- Any specific LinkedIn posts or content creators your ICP follows?
Phase 1: Generate Pain-Language Keywords
Based on the intake answers, generate ~15-25 pain-language keywords in LinkedIn boolean search syntax. Organize into categories:
- Staffing/Resource Pain — hiring difficulties, turnover, burnout
- Operational Friction — manual processes, missed SLAs, communication breakdowns
- Margin/Growth Pain — cost pressure, scaling challenges
- Process Complaints — specific workflow frustrations
Key principle: Every keyword should be something a frustrated operator would actually type or say, not marketing language or solution framing.
Also generate:
- ICP keyword list — industry terms for ICP classification (from answer #5)
- Tech vendor exclusion list — competitor names + generic tech titles (from answers #7, #8)
- Pain-pattern regexes — for filtering company page posts (derived from the keywords)
- Broad topic patterns — industry terms for known industry page filtering
- Hardcoded company pages — from answer #10, plus any the agent suggests based on the industry
Present the full keyword list to the user for approval/refinement before running. This is the most critical step — bad keywords = bad leads.
Once approved, save the complete config as JSON:
# Save config
skills/pain-language-engagers/configs/{client-name}.json
Config JSON structure:
{
"client_name": "example-client",
"pain_keywords": ["\"can't find X\"", "\"hiring Y\" problems"],
"pain_patterns": ["can.t find X", "hiring Y", "manual.*process"],
"icp_keywords": ["industry-term-1", "industry-term-2"],
"tech_vendor_keywords": ["software engineer", "competitor-name"],
"hardcoded_companies": ["https://www.linkedin.com/company/example/"],
"industry_pages": ["https://www.linkedin.com/company/example/"],
"broad_topic_patterns": ["industry", "sector", "niche-term"],
"country_filter": "United States",
"days_back": 60,
"max_posts_per_keyword": 50,
"max_posts_per_company": 100
}
Phase 2: Run LinkedIn Scraping Pipeline
Execute the pipeline script with the saved config:
python3 skills/pain-language-engagers/scripts/pain_language_engagers.py \
--config skills/pain-language-engagers/configs/{client-name}.json \
[--test] [--companies "url1,url2"]
Flags:
--config(required) — path to the client config JSON--test— limit to 3 keywords, 5 posts per company (for validation)--skip-discovery— skip keyword search, only scrape hardcoded/extra companies--companies "url1,url2"— add extra company URLs to scrape
What the script does:
- Keyword search —
apimaestro/linkedin-posts-search-scraper-no-cookiesfor each pain keyword - Post author extraction — People who wrote pain posts = direct leads (free, no API call)
- Company page discovery — Extract company pages from keyword results
- Company page engager scraping —
harvestapi/linkedin-company-postsfor each company page, pain-filtered - Profile enrichment —
harvestapi/linkedin-profile-scraperfor all profiles (gets headline + location) - ICP classification — Using the client-specific ICP/vendor keyword lists from config
- Dedup + CSV export
Cost estimate:
- Keyword search:
$0.10 per keyword ($2 for 20 keywords) - Company page scraping:
$0.002 per post per company ($0.20 per company) - Profile enrichment: ~$0.003 per profile
- Full run with 20 keywords + 10 companies: ~$5-10
Always run with --test first to validate the config produces relevant results before a full run.
Phase 3: Review & Refine
After the script completes, present results to the user:
- ICP breakdown — counts by tier (Likely / Possible / Unknown / Tech Vendor)
- Top 15 Likely ICP leads — name, role, company, engagement type
- Sample of filtered-out leads — so user can catch false negatives
- Keyword performance — which keywords produced the most leads, which were duds
If the user wants adjustments:
- Update the config JSON (add/remove keywords, adjust ICP lists)
- Re-run the script
- Repeat until the user is satisfied
Common adjustments:
- Too many Tech Vendor results — add more vendor names to
tech_vendor_keywords - Missing obvious ICP leads — add more industry terms to
icp_keywords - Irrelevant posts — refine
pain_patternsto be more specific - Not enough results — add more keywords or reduce
days_backconstraint
Phase 4: Output
CSV exported to the current working directory as {client-name}-{date}.csv with columns:
| Column | Description |
|---|---|
| Name | Full name |
| LinkedIn Profile URL | Profile link |
| Role | Parsed from headline |
| Company Name | Parsed from headline |
| Location | From profile enrichment |
| Source Page | Which company page(s) they engaged on |
| Post URL(s) | Links to the post(s) they engaged with |
| Engagement Type | Post Author, Comment, or Reaction |
| Comment Text | Their comment (if applicable — personalization gold) |
| ICP Tier | Likely ICP, Possible ICP, Unknown, or Tech Vendor |
| Niche Keyword | Which pain keyword matched |
Tools Required
- Apify API token — set as
APIFY_API_TOKENin.env - Apify actors used:
apimaestro/linkedin-posts-search-scraper-no-cookies(keyword search)harvestapi/linkedin-company-posts(company page scraping)harvestapi/linkedin-profile-scraper(profile enrichment)
Example Usage
Trigger phrases:
- "Find people complaining about [problem] on LinkedIn"
- "LinkedIn pain-based prospecting for [product]"
- "Find leads who are discussing [pain point]"
- "Scrape LinkedIn for [industry] pain posts"
- "Run the pain-language engagers pipeline for [client]"
With existing config:
python3 skills/pain-language-engagers/scripts/pain_language_engagers.py \
--config skills/pain-language-engagers/configs/happy-robot.json
Test mode:
python3 skills/pain-language-engagers/scripts/pain_language_engagers.py \
--config skills/pain-language-engagers/configs/happy-robot.json --test
| 1 | |
| 2 | name pain-language-engagers |
| 3 | description > |
| 4 | Find warm leads by searching LinkedIn for pain-language posts — the frustrations, complaints, |
| 5 | and operational struggles your ICP talks about publicly. Asks clarifying questions to understand |
| 6 | your product, ICP, and their pain points, then generates pain-language search keywords, |
| 7 | scrapes LinkedIn for posts and engagers, enriches profiles, and ICP-filters the results. |
| 8 | Use when someone wants to "find leads who are complaining about X" or "find people |
| 9 | discussing problems we solve" or "LinkedIn pain-based prospecting." |
| 10 | tags [lead-generation] |
| 11 | |
| 12 | |
| 13 | # Pain-Language Engagers |
| 14 | |
| 15 | Find warm leads by scraping LinkedIn for pain-language posts and their engagers. People who write about, react to, or comment on posts expressing operational frustrations are signaling they live with a problem your product solves. This skill turns those signals into a qualified lead list. |
| 16 | |
| 17 | **Core principle:** Search for **pain-language**, not solution-language. Solution keywords ("AI automation", "workflow optimization") attract builders and VCs. Pain keywords ("can't find drivers", "check calls are killing us") attract operators living with the problem. |
| 18 | |
| 19 | ## Phase 0: Intake |
| 20 | |
| 21 | Before generating keywords or running anything, ask the user these questions. Present them as a numbered list and tell the user to answer what's relevant and skip what's not. |
| 22 | |
| 23 | ### Product & Pain Context |
| 24 | |
| 25 | What does your product/service do in one sentence? |
| 26 | What specific problem does it solve? Who feels this pain most acutely? |
| 27 | What does your ICP's day-to-day look like WITHOUT your product? (The frustrations, workarounds, manual processes) |
| 28 | What phrases would someone use when **complaining** about this problem on LinkedIn? (e.g., "check calls are killing us", "can't find drivers", "spending hours on manual data entry") |
| 29 | |
| 30 | ### ICP Definition |
| 31 | |
| 32 | What industries/verticals are your target buyers in? |
| 33 | What job titles or roles are your ideal buyers? (e.g., "VP Operations", "Broker owner", "Head of Logistics") |
| 34 | What titles should be EXCLUDED? (e.g., "Software Engineer", "AI researcher") |
| 35 | Any specific competitors whose employees should be filtered out? |
| 36 | Geographic focus? (e.g., "United States only", "global") |
| 37 | |
| 38 | ### LinkedIn Signal Sources |
| 39 | |
| 40 | Any LinkedIn company pages where your ICP is likely to engage? (Industry publications, communities, competitor pages) |
| 41 | Any specific LinkedIn posts or content creators your ICP follows? |
| 42 | |
| 43 | ## Phase 1: Generate Pain-Language Keywords |
| 44 | |
| 45 | Based on the intake answers, generate ~15-25 pain-language keywords in LinkedIn boolean search syntax. Organize into categories: |
| 46 | |
| 47 | **Staffing/Resource Pain** — hiring difficulties, turnover, burnout |
| 48 | **Operational Friction** — manual processes, missed SLAs, communication breakdowns |
| 49 | **Margin/Growth Pain** — cost pressure, scaling challenges |
| 50 | **Process Complaints** — specific workflow frustrations |
| 51 | |
| 52 | **Key principle:** Every keyword should be something a frustrated operator would actually type or say, not marketing language or solution framing. |
| 53 | |
| 54 | Also generate: |
| 55 | **ICP keyword list** — industry terms for ICP classification (from answer #5) |
| 56 | **Tech vendor exclusion list** — competitor names + generic tech titles (from answers #7, #8) |
| 57 | **Pain-pattern regexes** — for filtering company page posts (derived from the keywords) |
| 58 | **Broad topic patterns** — industry terms for known industry page filtering |
| 59 | **Hardcoded company pages** — from answer #10, plus any the agent suggests based on the industry |
| 60 | |
| 61 | **Present the full keyword list to the user for approval/refinement before running.** This is the most critical step — bad keywords = bad leads. |
| 62 | |
| 63 | Once approved, save the complete config as JSON: |
| 64 | |
| 65 | |
| 66 | # Save config |
| 67 | skills/pain-language-engagers/configs/{client-name}.json |
| 68 | |
| 69 | |
| 70 | Config JSON structure: |
| 71 | |
| 72 | |
| 73 | { |
| 74 | "client_name": "example-client", |
| 75 | "pain_keywords": ["\"can't find X\"", "\"hiring Y\" problems"], |
| 76 | "pain_patterns": ["can.t find X", "hiring Y", "manual.*process"], |
| 77 | "icp_keywords": ["industry-term-1", "industry-term-2"], |
| 78 | "tech_vendor_keywords": ["software engineer", "competitor-name"], |
| 79 | "hardcoded_companies": ["https://www.linkedin.com/company/example/"], |
| 80 | "industry_pages": ["https://www.linkedin.com/company/example/"], |
| 81 | "broad_topic_patterns": ["industry", "sector", "niche-term"], |
| 82 | "country_filter": "United States", |
| 83 | "days_back": 60, |
| 84 | "max_posts_per_keyword": 50, |
| 85 | "max_posts_per_company": 100 |
| 86 | } |
| 87 | |
| 88 | |
| 89 | ## Phase 2: Run LinkedIn Scraping Pipeline |
| 90 | |
| 91 | Execute the pipeline script with the saved config: |
| 92 | |
| 93 | |
| 94 | python3 skills/pain-language-engagers/scripts/pain_language_engagers.py \ |
| 95 | --config skills/pain-language-engagers/configs/{client-name}.json \ |
| 96 | [--test] [--companies "url1,url2"] |
| 97 | |
| 98 | |
| 99 | **Flags:** |
| 100 | `--config` (required) — path to the client config JSON |
| 101 | `--test` — limit to 3 keywords, 5 posts per company (for validation) |
| 102 | `--skip-discovery` — skip keyword search, only scrape hardcoded/extra companies |
| 103 | `--companies "url1,url2"` — add extra company URLs to scrape |
| 104 | |
| 105 | **What the script does:** |
| 106 | |
| 107 | **Keyword search** — `apimaestro/linkedin-posts-search-scraper-no-cookies` for each pain keyword |
| 108 | **Post author extraction** — People who wrote pain posts = direct leads (free, no API call) |
| 109 | **Company page discovery** — Extract company pages from keyword results |
| 110 | **Company page engager scraping** — `harvestapi/linkedin-company-posts` for each company page, pain-filtered |
| 111 | **Profile enrichment** — `harvestapi/linkedin-profile-scraper` for all profiles (gets headline + location) |
| 112 | **ICP classification** — Using the client-specific ICP/vendor keyword lists from config |
| 113 | **Dedup + CSV export** |
| 114 | |
| 115 | **Cost estimate:** |
| 116 | Keyword search: ~$0.10 per keyword (~$2 for 20 keywords) |
| 117 | Company page scraping: ~$0.002 per post per company (~$0.20 per company) |
| 118 | Profile enrichment: ~$0.003 per profile |
| 119 | Full run with 20 keywords + 10 companies: ~$5-10 |
| 120 | |
| 121 | **Always run with `--test` first** to validate the config produces relevant results before a full run. |
| 122 | |
| 123 | ## Phase 3: Review & Refine |
| 124 | |
| 125 | After the script completes, present results to the user: |
| 126 | |
| 127 | **ICP breakdown** — counts by tier (Likely / Possible / Unknown / Tech Vendor) |
| 128 | **Top 15 Likely ICP leads** — name, role, company, engagement type |
| 129 | **Sample of filtered-out leads** — so user can catch false negatives |
| 130 | **Keyword performance** — which keywords produced the most leads, which were duds |
| 131 | |
| 132 | If the user wants adjustments: |
| 133 | Update the config JSON (add/remove keywords, adjust ICP lists) |
| 134 | Re-run the script |
| 135 | Repeat until the user is satisfied |
| 136 | |
| 137 | Common adjustments: |
| 138 | **Too many Tech Vendor results** — add more vendor names to `tech_vendor_keywords` |
| 139 | **Missing obvious ICP leads** — add more industry terms to `icp_keywords` |
| 140 | **Irrelevant posts** — refine `pain_patterns` to be more specific |
| 141 | **Not enough results** — add more keywords or reduce `days_back` constraint |
| 142 | |
| 143 | ## Phase 4: Output |
| 144 | |
| 145 | CSV exported to the current working directory as `{client-name}-{date}.csv` with columns: |
| 146 | |
| 147 | | Column | Description | |
| 148 | |--------|-------------| |
| 149 | | Name | Full name | |
| 150 | | LinkedIn Profile URL | Profile link | |
| 151 | | Role | Parsed from headline | |
| 152 | | Company Name | Parsed from headline | |
| 153 | | Location | From profile enrichment | |
| 154 | | Source Page | Which company page(s) they engaged on | |
| 155 | | Post URL(s) | Links to the post(s) they engaged with | |
| 156 | | Engagement Type | Post Author, Comment, or Reaction | |
| 157 | | Comment Text | Their comment (if applicable — personalization gold) | |
| 158 | | ICP Tier | Likely ICP, Possible ICP, Unknown, or Tech Vendor | |
| 159 | | Niche Keyword | Which pain keyword matched | |
| 160 | |
| 161 | ## Tools Required |
| 162 | |
| 163 | **Apify API token** — set as `APIFY_API_TOKEN` in `.env` |
| 164 | **Apify actors used:** |
| 165 | `apimaestro/linkedin-posts-search-scraper-no-cookies` (keyword search) |
| 166 | `harvestapi/linkedin-company-posts` (company page scraping) |
| 167 | `harvestapi/linkedin-profile-scraper` (profile enrichment) |
| 168 | |
| 169 | ## Example Usage |
| 170 | |
| 171 | **Trigger phrases:** |
| 172 | "Find people complaining about [problem] on LinkedIn" |
| 173 | "LinkedIn pain-based prospecting for [product]" |
| 174 | "Find leads who are discussing [pain point]" |
| 175 | "Scrape LinkedIn for [industry] pain posts" |
| 176 | "Run the pain-language engagers pipeline for [client]" |
| 177 | |
| 178 | **With existing config:** |
| 179 | |
| 180 | python3 skills/pain-language-engagers/scripts/pain_language_engagers.py \ |
| 181 | --config skills/pain-language-engagers/configs/happy-robot.json |
| 182 | |
| 183 | |
| 184 | **Test mode:** |
| 185 | |
| 186 | python3 skills/pain-language-engagers/scripts/pain_language_engagers.py \ |
| 187 | --config skills/pain-language-engagers/configs/happy-robot.json --test |
| 188 | |
| 189 |