Systems Lab

Agent skill

competitor-post-engagers

Find leads by scraping engagers from a competitor's top LinkedIn posts.

dormantNeeds a keyActs undeclared951 words

Filed under LinkedIn and social and Positioning and messaging.

From edupegoretti/fluidz-skills · 116 skills · 0 · pushed 2026-03-11

What it does when it runs

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".

Read from the skill and the 2 files bundled beside it. A skill’s own description is written to be selected by an agent, so it describes the job and not the dependencies.

Keys and connectors you must supply
  • APIFY_API_TOKEN
  • APOLLO_API_KEY
Hosts it reaches
  • api.apify.com
  • www.linkedin.com
Tool permissions it declares
No allowed-tools in the frontmatter. It does act, so it runs under whatever permissions your session already grants.
Actions present in the files
shellwrites files

Ask about competitor-post-engagers

Opens your assistant with this page's verified links already in the prompt.

Is this safe to install?ClaudeChatGPT
Adapt it to my stackClaudeChatGPT
What else do I need for it to workClaudeChatGPT
Rather ask a human? Talk to Cheetah
git clone --depth 1 --filter=blob:none --sparse https://github.com/edupegoretti/fluidz-skills.git /tmp/fluidz-skills
git -C /tmp/fluidz-skills sparse-checkout set "skills/capabilities/competitor-post-engagers"
mkdir -p ~/.claude/skills/competitor-post-engagers
cp -R "/tmp/fluidz-skills/skills/capabilities/competitor-post-engagers/." ~/.claude/skills/competitor-post-engagers/

Picked up without a restart. A project skill of the same name is shadowed by your personal one. For one repository only, swap ~/.claude/skills for .claude/skills. Claude Code docs ↗

The folder is the same in every client that implements the format — 46 of them — so if yours is not above, only the destination changes.

Before you install: this skill will not complete its job on a bare agent. It needs APIFY_API_TOKEN, APOLLO_API_KEY, which you have to obtain separately.

Reproduced in full from edupegoretti/fluidz-skills/blob/a2cf697e2e8ec2ea517d85496e2d5c7f5dc44cd3/skills/capabilities/competitor-post-engagers/SKILL.md, which is licensed MIT (repository). 951 words, 11 headings.

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

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

Save config in the client's campaign folder:

clients/<client-name>/campaigns/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-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 the client's folder instead (e.g., "output_dir": "clients/<client-name>/leads").

Phase 1: Run the Pipeline

python3 skills/competitor-post-engagers/scripts/competitor_post_engagers.py \
  --config clients/<client-name>/campaigns/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

ParameterTestStandard
Posts scraped per company2050
Max reactions50500
Max comments50200
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:

ColumnDescription
NameFull name
LinkedIn URLProfile link
RoleParsed from headline
CompanyParsed from headline
Company IndustryFrom Apollo enrichment
Company SizeEstimated employee count from Apollo
Company DescriptionShort company description from Apollo
Company LocationCity, State, Country from Apollo
Source PageWhich competitor's page
Post URLLink to the specific post
Post PreviewFirst 120 chars of post content
Engagement TypeComment or Reaction
Comment TextTheir comment (personalization gold)
ICP TierLikely ICP / Possible ICP / Unknown / Tech Vendor
Pre-Filter ScorePriority 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:

python3 skills/competitor-post-engagers/scripts/competitor_post_engagers.py \
  --config clients/<client>/campaigns/competitor-post-engagers/config.json --test --yes

Full run:

python3 skills/competitor-post-engagers/scripts/competitor_post_engagers.py \
  --config clients/<client>/campaigns/competitor-post-engagers/config.json --yes

Files bundled with it

These load only when the skill asks for them, so they cost nothing until it runs.

Other skills for the same job

Different authors, same problem. Matched on the words in the skill name, across every library in the catalogue except this one.

Need help setting it up?

This page tells you what competitor-post-engagers does and what it needs. Cheetah builds the agent setup it runs inside: data, CRM, sequencing and the guardrails.

Book a call →

The directory stays free. There is nothing gated behind this.