competitor-post-engagers

Find leads by scraping engagers from a competitor's top LinkedIn posts. Given one or more company page URLs, scrapes recent posts, ranks by engagement, selects the top N, extracts all reactors and commenters, ICP-classifies, and exports CSV. Use when someone wants to "find leads engaging with competitor content" or "scrape people who interact with [company]'s LinkedIn posts".

380 stars

Best use case

competitor-post-engagers is best used when you need a repeatable AI agent workflow instead of a one-off prompt.

Find leads by scraping engagers from a competitor's top LinkedIn posts. Given one or more company page URLs, scrapes recent posts, ranks by engagement, selects the top N, extracts all reactors and commenters, ICP-classifies, and exports CSV. Use when someone wants to "find leads engaging with competitor content" or "scrape people who interact with [company]'s LinkedIn posts".

Teams using competitor-post-engagers should expect a more consistent output, faster repeated execution, less prompt rewriting.

When to use this skill

  • You want a reusable workflow that can be run more than once with consistent structure.

When not to use this skill

  • You only need a quick one-off answer and do not need a reusable workflow.
  • You cannot install or maintain the underlying files, dependencies, or repository context.

Installation

Claude Code / Cursor / Codex

$curl -o ~/.claude/skills/competitor-post-engagers/SKILL.md --create-dirs "https://raw.githubusercontent.com/gooseworks-ai/goose-skills/main/skills/capabilities/competitor-post-engagers/SKILL.md"

Manual Installation

  1. Download SKILL.md from GitHub
  2. Place it in .claude/skills/competitor-post-engagers/SKILL.md inside your project
  3. Restart your AI agent — it will auto-discover the skill

How competitor-post-engagers Compares

Feature / Agentcompetitor-post-engagersStandard Approach
Platform SupportNot specifiedLimited / Varies
Context Awareness High Baseline
Installation ComplexityUnknownN/A

Frequently Asked Questions

What does this skill do?

Find leads by scraping engagers from a competitor's top LinkedIn posts. Given one or more company page URLs, scrapes recent posts, ranks by engagement, selects the top N, extracts all reactors and commenters, ICP-classifies, and exports CSV. Use when someone wants to "find leads engaging with competitor content" or "scrape people who interact with [company]'s LinkedIn posts".

Where can I find the source code?

You can find the source code on GitHub using the link provided at the top of the page.

SKILL.md Source

# 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

1. LinkedIn company page URL(s) to scrape (e.g., `https://www.linkedin.com/company/11x-ai/`)
2. Time window — how many days back to look (default: 30)
3. Top N posts per company to extract engagers from (default: 1)

### ICP Criteria

4. ICP keywords — job title/role terms that indicate a good lead (e.g., "sales", "SDR", "revenue")
5. Exclude keywords — roles to filter out (e.g., "software engineer", "designer")
6. Geographic focus (optional, e.g., "United States")

Save config in the current working directory (or user-specified path):
```bash
competitor-post-engagers-config.json
```

Config JSON structure:
```json
{
  "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-enrich` to 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

```bash
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:
- `+3` Commenter (higher intent)
- `+2` Position matches ICP keywords
- `-5` Position 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_keywords` or add `exclude_keywords`
- **Missing ICP leads** — broaden `icp_keywords`
- **Wrong posts selected** — increase `top_n_posts` or adjust `days_back`
- **Too expensive** — use `--test` mode or lower `max_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_TOKEN` in `.env`
- **Apollo API key** — set as `APOLLO_API_KEY` in `.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:**
```bash
python3 skills/competitor-post-engagers/scripts/competitor_post_engagers.py \
  --config competitor-post-engagers-config.json --test --yes
```

**Full run:**
```bash
python3 skills/competitor-post-engagers/scripts/competitor_post_engagers.py \
  --config competitor-post-engagers-config.json --yes
```

Related Skills

competitor-monitoring-system

381
from gooseworks-ai/goose-skills

Set up and run ongoing competitive intelligence monitoring for a client. Tracks competitor content, ads, reviews, social, and product moves.

competitor-content-tracker

381
from gooseworks-ai/goose-skills

Monitor competitor content across blogs, LinkedIn, and Twitter/X on a recurring basis. Surfaces new posts, trending topics, and content gaps you can own. Chains blog-scraper, linkedin-profile-post-scraper, and twitter-scraper. Use when you want a weekly digest of what competitors are publishing and which topics are generating engagement.

competitor-ad-teardown

381
from gooseworks-ai/goose-skills

Deep-dive analysis of a competitor's ad strategy. Scrapes their Meta + Google ads, reverse-engineers their funnel (ad → landing page → CTA), identifies positioning bets, and produces a strategic teardown. Goes beyond ad-creative-intelligence by analyzing the full conversion path and strategic intent behind each campaign.

competitor-signals

380
from gooseworks-ai/goose-skills

Extract leads from competitor product activity — Product Hunt commenters/upvoters, HN posts about competitors, case studies, testimonials, tech press, and switching signals. Detects people actively switching from competitors as highest-priority leads.

competitor-intel

380
from gooseworks-ai/goose-skills

Competitor intelligence system. Research competitors across web, Reddit, Twitter/X, LinkedIn, and blogs. Build deep competitor profiles, monitor content and positioning changes, track what gets traction, and identify competitive gaps. Covers data collection, content tracking, and strategy analysis. Pure research skill — uses web search, web fetch, and optionally Apify for social scraping. No scripts required.

competitor-ad-intelligence

380
from gooseworks-ai/goose-skills

Scrape competitor ads from Meta Ad Library and Google Ads Transparency Center, analyze creative patterns (hooks, formats, CTAs), reverse-engineer landing page funnels, and produce a strategic teardown with vulnerability analysis and counter-play recommendations. Use when you need to understand the competitive ad landscape, find new creative directions, or identify weaknesses in a competitor's paid strategy.

reddit-post-finder

380
from gooseworks-ai/goose-skills

Scrape and search Reddit posts using Apify. Use when you need to find Reddit discussions, track competitor mentions, monitor product feedback, discover pain points, or analyze subreddit content. Supports keyword filtering, time-based searches, and subreddit-specific queries.

pain-language-engagers

380
from gooseworks-ai/goose-skills

Find warm leads by searching LinkedIn for pain-language posts — the frustrations, complaints, and operational struggles your ICP talks about publicly. Asks clarifying questions to understand your product, ICP, and their pain points, then generates pain-language search keywords, scrapes LinkedIn for posts and engagers, enriches profiles, and ICP-filters the results. Use when someone wants to "find leads who are complaining about X" or "find people discussing problems we solve" or "LinkedIn pain-based prospecting."

orthogonal-competitor-research

380
from gooseworks-ai/goose-skills

Research competitors - products, pricing, team, funding, and strategy

linkedin-profile-post-scraper

380
from gooseworks-ai/goose-skills

Scrape recent posts from LinkedIn profiles using Apify. Use when you need to monitor what specific people are posting on LinkedIn, track founder/exec activity, or gather LinkedIn content for competitive intelligence.

linkedin-post-research

380
from gooseworks-ai/goose-skills

Search LinkedIn posts by keywords, sorted by engagement or date. Use when researching what people are saying about a topic on LinkedIn, finding high-engagement content, identifying thought leaders, or discovering warm leads through post engagement. Returns author, post text, reactions, comments, shares, post URL, and date. No LinkedIn cookies or login required.

job-posting-intent

380
from gooseworks-ai/goose-skills

Detect buying intent from job postings. When a company posts a job in your problem area, they've allocated budget and are actively thinking about the problem. This skill finds those companies, qualifies them, extracts personalization context, and outputs everything to a Google Sheet. Does NOT do outreach — just delivers qualified leads with reasoning.