Competitor post engagers
Find leads by scraping engagers from a competitor's top LinkedIn posts.
How to use it
- Hit Copy SKILL.md — or use the Claude Code line below to get every file.
- 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/competitor-post-engagers#main ~/.claude/skills/competitor-post-engagersFor one project only, change the path to .claude/skills/competitor-post-engagers. This skill also uses competitor-post-engagers-config.json — copying SKILL.md alone won't be enough. See the folder on GitHub.
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 text169 lines
Competitor Post Engagers
Find ICP-fit leads by scraping engagers from a competitor's top-performing LinkedIn posts. Given one or more company page URLs, this skill finds their highest-engagement recent posts, extracts everyone who reacted or commented, and classifies by ICP fit.
Core principle: Scrape all posts in one call per company, then locally rank and select the top N. This minimizes Apify costs while maximizing lead quality.
Phase 0: Intake
Ask the user these questions:
Target Companies
- LinkedIn company page URL(s) to scrape (e.g.,
https://www.linkedin.com/company/11x-ai/) - Time window — how many days back to look (default: 30)
- Top N posts per company to extract engagers from (default: 1)
ICP Criteria
- ICP keywords — job title/role terms that indicate a good lead (e.g., "sales", "SDR", "revenue")
- Exclude keywords — roles to filter out (e.g., "software engineer", "designer")
- Geographic focus (optional, e.g., "United States")
Save config in the current working directory (or user-specified path):
competitor-post-engagers-config.json
Config JSON structure:
{
"name": "<run-name>",
"company_urls": ["https://www.linkedin.com/company/<competitor>/"],
"days_back": 30,
"max_posts": 50,
"max_reactions": 500,
"max_comments": 200,
"top_n_posts": 1,
"icp_keywords": ["sales", "revenue", "growth", "SDR", "BDR", "outbound"],
"exclude_keywords": ["software engineer", "developer", "designer"],
"enrich_companies": true,
"competitor_company_names": ["<competitor-name>"],
"industry_keywords": ["freight", "logistics", "trucking", "transportation", "3pl", "supply chain", "carrier", "brokerage", "shipping", "warehousing"],
"output_dir": "output"
}
enrich_companies— Enable Apollo company enrichment (default: true). Set to false or use--skip-company-enrichto skip.competitor_company_names— Company names to exclude from enrichment (the competitor itself).industry_keywords— Industry terms that indicate ICP fit. Matched against Apollo's industry field.
The output_dir is relative to the script directory by default. Override it with an absolute path to write output to a specific location.
Phase 1: Run the Pipeline
python3 skills/competitor-post-engagers/scripts/competitor_post_engagers.py \
--config competitor-post-engagers-config.json \
[--test] [--yes] [--skip-company-enrich] [--top-n 3] [--max-runs 30]
Flags:
--config(required) — path to config JSON--test— small limits (20 posts, 50 profiles, 1 top post)--yes— skip cost confirmation prompts--skip-company-enrich— skip Apollo company enrichment step (saves credits)--top-n— override top_n_posts from config--max-runs— override Apify run limit
Pipeline Steps
Step 1: Scrape company posts + engagers — For each company URL, one Apify call using harvestapi/linkedin-company-posts with scrapeReactions: true, scrapeComments: true. Returns posts, reactions, and comments in a single dataset.
Step 2: Rank & select top posts — Filter posts by time window (days_back), rank by total engagement (reactions + comments), select top N per company. Then extract engagers (reactors + commenters) only from those selected posts. Deduplication by name. Score engagers by position:
+3Commenter (higher intent)+2Position matches ICP keywords-5Position matches exclude keywords
Step 3: Company enrichment (Apollo) — Extract unique company names from engagers, call apollo.enrich_organization(name=...) for each. Returns industry, employee count, description, and location. ~1 Apollo credit per unique company. Merge data back to all engagers from that company. Skip with --skip-company-enrich or "enrich_companies": false.
Step 4: ICP classify & export — Classify as Likely ICP / Possible ICP / Unknown / Tech Vendor. Uses both headline keyword matching AND company industry data (from Step 3) — if the engager's company industry matches industry_keywords, they're classified as "Likely ICP" regardless of role. Export CSV.
Cost Estimates
| Parameter | Test | Standard |
|---|---|---|
| Posts scraped per company | 20 | 50 |
| Max reactions | 50 | 500 |
| Max comments | 50 | 200 |
| Est. Apify cost (1 company) | ~$0.10 | ~$0.50-1 |
| Est. Apollo credits (company enrich) | ~10-20 | ~30-80 unique companies |
| Est. Apollo cost | ~$0.05-0.10 | ~$0.15-0.40 |
Phase 2: Review & Refine
Present results:
- Post selection — which posts were chosen and why (engagement counts, preview)
- Per-company breakdown — how many leads from each competitor
- ICP breakdown — counts by tier
- Top 15 leads — name, role, company, engagement type
Common adjustments:
- Too many irrelevant leads — tighten
icp_keywordsor addexclude_keywords - Missing ICP leads — broaden
icp_keywords - Wrong posts selected — increase
top_n_postsor adjustdays_back - Too expensive — use
--testmode or lowermax_reactions/max_comments
Phase 3: Output
CSV exported to {output_dir}/{name}-engagers-{date}.csv:
| Column | Description |
|---|---|
| Name | Full name |
| LinkedIn URL | Profile link |
| Role | Parsed from headline |
| Company | Parsed from headline |
| Company Industry | From Apollo enrichment |
| Company Size | Estimated employee count from Apollo |
| Company Description | Short company description from Apollo |
| Company Location | City, State, Country from Apollo |
| Source Page | Which competitor's page |
| Post URL | Link to the specific post |
| Post Preview | First 120 chars of post content |
| 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 pre-filter |
Tools Required
- Apify API token — set as
APIFY_API_TOKENin.env - Apollo API key — set as
APOLLO_API_KEYin.env(for company enrichment) - Apify actors used:
harvestapi/linkedin-company-posts(post + engager scraping)
- Apollo endpoints used:
organizations/enrich(company industry/size lookup, 1 credit per company)
Example Usage
Trigger phrases:
- "Find leads engaging with [competitor]'s LinkedIn posts"
- "Scrape engagers from [company]'s top posts"
- "Who is interacting with [competitor]'s content?"
- "Run competitor-post-engagers for [company]"
Test mode:
python3 skills/competitor-post-engagers/scripts/competitor_post_engagers.py \
--config competitor-post-engagers-config.json --test --yes
Full run:
python3 skills/competitor-post-engagers/scripts/competitor_post_engagers.py \
--config competitor-post-engagers-config.json --yes
| 1 | |
| 2 | name competitor-post-engagers |
| 3 | description > |
| 4 | Find leads by scraping engagers from a competitor's top LinkedIn posts. |
| 5 | Given one or more company page URLs, scrapes recent posts, ranks by |
| 6 | engagement, selects the top N, extracts all reactors and commenters, |
| 7 | ICP-classifies, and exports CSV. Use when someone wants to "find leads |
| 8 | engaging with competitor content" or "scrape people who interact with |
| 9 | [company]'s LinkedIn posts". |
| 10 | tags [lead-generation] |
| 11 | |
| 12 | |
| 13 | # Competitor Post Engagers |
| 14 | |
| 15 | Find ICP-fit leads by scraping engagers from a competitor's top-performing LinkedIn posts. Given one or more company page URLs, this skill finds their highest-engagement recent posts, extracts everyone who reacted or commented, and classifies by ICP fit. |
| 16 | |
| 17 | **Core principle:** Scrape all posts in one call per company, then locally rank and select the top N. This minimizes Apify costs while maximizing lead quality. |
| 18 | |
| 19 | ## Phase 0: Intake |
| 20 | |
| 21 | Ask the user these questions: |
| 22 | |
| 23 | ### Target Companies |
| 24 | |
| 25 | LinkedIn company page URL(s) to scrape (e.g., `https://www.linkedin.com/company/11x-ai/`) |
| 26 | Time window — how many days back to look (default: 30) |
| 27 | Top N posts per company to extract engagers from (default: 1) |
| 28 | |
| 29 | ### ICP Criteria |
| 30 | |
| 31 | ICP keywords — job title/role terms that indicate a good lead (e.g., "sales", "SDR", "revenue") |
| 32 | Exclude keywords — roles to filter out (e.g., "software engineer", "designer") |
| 33 | Geographic focus (optional, e.g., "United States") |
| 34 | |
| 35 | Save config in the current working directory (or user-specified path): |
| 36 | |
| 37 | competitor-post-engagers-config.json |
| 38 | |
| 39 | |
| 40 | Config JSON structure: |
| 41 | |
| 42 | { |
| 43 | "name": "<run-name>", |
| 44 | "company_urls": ["https://www.linkedin.com/company/<competitor>/"], |
| 45 | "days_back": 30, |
| 46 | "max_posts": 50, |
| 47 | "max_reactions": 500, |
| 48 | "max_comments": 200, |
| 49 | "top_n_posts": 1, |
| 50 | "icp_keywords": ["sales", "revenue", "growth", "SDR", "BDR", "outbound"], |
| 51 | "exclude_keywords": ["software engineer", "developer", "designer"], |
| 52 | "enrich_companies": true, |
| 53 | "competitor_company_names": ["<competitor-name>"], |
| 54 | "industry_keywords": ["freight", "logistics", "trucking", "transportation", "3pl", "supply chain", "carrier", "brokerage", "shipping", "warehousing"], |
| 55 | "output_dir": "output" |
| 56 | } |
| 57 | |
| 58 | |
| 59 | `enrich_companies` — Enable Apollo company enrichment (default: true). Set to false or use `--skip-company-enrich` to skip. |
| 60 | `competitor_company_names` — Company names to exclude from enrichment (the competitor itself). |
| 61 | `industry_keywords` — Industry terms that indicate ICP fit. Matched against Apollo's industry field. |
| 62 | |
| 63 | The `output_dir` is relative to the script directory by default. Override it with an absolute path to write output to a specific location. |
| 64 | |
| 65 | ## Phase 1: Run the Pipeline |
| 66 | |
| 67 | |
| 68 | python3 skills/competitor-post-engagers/scripts/competitor_post_engagers.py \ |
| 69 | --config competitor-post-engagers-config.json \ |
| 70 | [--test] [--yes] [--skip-company-enrich] [--top-n 3] [--max-runs 30] |
| 71 | |
| 72 | |
| 73 | **Flags:** |
| 74 | `--config` (required) — path to config JSON |
| 75 | `--test` — small limits (20 posts, 50 profiles, 1 top post) |
| 76 | `--yes` — skip cost confirmation prompts |
| 77 | `--skip-company-enrich` — skip Apollo company enrichment step (saves credits) |
| 78 | `--top-n` — override top_n_posts from config |
| 79 | `--max-runs` — override Apify run limit |
| 80 | |
| 81 | ### Pipeline Steps |
| 82 | |
| 83 | **Step 1: Scrape company posts + engagers** — For each company URL, one Apify call using `harvestapi/linkedin-company-posts` with `scrapeReactions: true, scrapeComments: true`. Returns posts, reactions, and comments in a single dataset. |
| 84 | |
| 85 | **Step 2: Rank & select top posts** — Filter posts by time window (`days_back`), rank by total engagement (reactions + comments), select top N per company. Then extract engagers (reactors + commenters) only from those selected posts. Deduplication by name. Score engagers by position: |
| 86 | `+3` Commenter (higher intent) |
| 87 | `+2` Position matches ICP keywords |
| 88 | `-5` Position matches exclude keywords |
| 89 | |
| 90 | **Step 3: Company enrichment (Apollo)** — Extract unique company names from engagers, call `apollo.enrich_organization(name=...)` for each. Returns industry, employee count, description, and location. ~1 Apollo credit per unique company. Merge data back to all engagers from that company. Skip with `--skip-company-enrich` or `"enrich_companies": false`. |
| 91 | |
| 92 | **Step 4: ICP classify & export** — Classify as Likely ICP / Possible ICP / Unknown / Tech Vendor. Uses both headline keyword matching AND company industry data (from Step 3) — if the engager's company industry matches `industry_keywords`, they're classified as "Likely ICP" regardless of role. Export CSV. |
| 93 | |
| 94 | ### Cost Estimates |
| 95 | |
| 96 | | Parameter | Test | Standard | |
| 97 | |-----------|------|----------| |
| 98 | | Posts scraped per company | 20 | 50 | |
| 99 | | Max reactions | 50 | 500 | |
| 100 | | Max comments | 50 | 200 | |
| 101 | | Est. Apify cost (1 company) | ~$0.10 | ~$0.50-1 | |
| 102 | | Est. Apollo credits (company enrich) | ~10-20 | ~30-80 unique companies | |
| 103 | | Est. Apollo cost | ~$0.05-0.10 | ~$0.15-0.40 | |
| 104 | |
| 105 | ## Phase 2: Review & Refine |
| 106 | |
| 107 | Present results: |
| 108 | **Post selection** — which posts were chosen and why (engagement counts, preview) |
| 109 | **Per-company breakdown** — how many leads from each competitor |
| 110 | **ICP breakdown** — counts by tier |
| 111 | **Top 15 leads** — name, role, company, engagement type |
| 112 | |
| 113 | Common adjustments: |
| 114 | **Too many irrelevant leads** — tighten `icp_keywords` or add `exclude_keywords` |
| 115 | **Missing ICP leads** — broaden `icp_keywords` |
| 116 | **Wrong posts selected** — increase `top_n_posts` or adjust `days_back` |
| 117 | **Too expensive** — use `--test` mode or lower `max_reactions`/`max_comments` |
| 118 | |
| 119 | ## Phase 3: Output |
| 120 | |
| 121 | CSV exported to `{output_dir}/{name}-engagers-{date}.csv`: |
| 122 | |
| 123 | | Column | Description | |
| 124 | |--------|-------------| |
| 125 | | Name | Full name | |
| 126 | | LinkedIn URL | Profile link | |
| 127 | | Role | Parsed from headline | |
| 128 | | Company | Parsed from headline | |
| 129 | | Company Industry | From Apollo enrichment | |
| 130 | | Company Size | Estimated employee count from Apollo | |
| 131 | | Company Description | Short company description from Apollo | |
| 132 | | Company Location | City, State, Country from Apollo | |
| 133 | | Source Page | Which competitor's page | |
| 134 | | Post URL | Link to the specific post | |
| 135 | | Post Preview | First 120 chars of post content | |
| 136 | | Engagement Type | Comment or Reaction | |
| 137 | | Comment Text | Their comment (personalization gold) | |
| 138 | | ICP Tier | Likely ICP / Possible ICP / Unknown / Tech Vendor | |
| 139 | | Pre-Filter Score | Priority score from pre-filter | |
| 140 | |
| 141 | ## Tools Required |
| 142 | |
| 143 | **Apify API token** — set as `APIFY_API_TOKEN` in `.env` |
| 144 | **Apollo API key** — set as `APOLLO_API_KEY` in `.env` (for company enrichment) |
| 145 | **Apify actors used:** |
| 146 | `harvestapi/linkedin-company-posts` (post + engager scraping) |
| 147 | **Apollo endpoints used:** |
| 148 | `organizations/enrich` (company industry/size lookup, 1 credit per company) |
| 149 | |
| 150 | ## Example Usage |
| 151 | |
| 152 | **Trigger phrases:** |
| 153 | "Find leads engaging with [competitor]'s LinkedIn posts" |
| 154 | "Scrape engagers from [company]'s top posts" |
| 155 | "Who is interacting with [competitor]'s content?" |
| 156 | "Run competitor-post-engagers for [company]" |
| 157 | |
| 158 | **Test mode:** |
| 159 | |
| 160 | python3 skills/competitor-post-engagers/scripts/competitor_post_engagers.py \ |
| 161 | --config competitor-post-engagers-config.json --test --yes |
| 162 | |
| 163 | |
| 164 | **Full run:** |
| 165 | |
| 166 | python3 skills/competitor-post-engagers/scripts/competitor_post_engagers.py \ |
| 167 | --config competitor-post-engagers-config.json --yes |
| 168 | |
| 169 |