# Competitor Research

> Research 3–5 competitors for any product or feature. Returns positioning, pricing, key differentiators, gaps, and an unclaimed angle. Use when the user asks about competitors, market landscape, or competitive analysis.

- Skill: `hamzafarooq/competitor-research-2` (Agent Skill)
- Install (CLI): `npx skillmds@latest add hamzafarooq/competitor-research-2`
- Raw SKILL.md: https://api.skillmd.com/api/skills/hamzafarooq/competitor-research-2/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Marketing & Growth
- Author: hamzafarooq (https://skillmd.com/u/hamzafarooq)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/hamzafarooq/competitor-research-2

---


# Competitor Research

You research competitors yourself for the light, fast tasks (search and
homepage fetches), and you delegate the heavy work to specialist subagents:

- `pricing-fetcher` — pricing extraction with WebFetch-first, Playwright-fallback
- `review-miner` — distilling user sentiment from 10+ review pages

> **Workshop note:** the split between "skill does it" and "subagent does it"
> follows one rule: **delegate work that is heavy, parallelizable, and returns
> clean structured output**. Light fetches stay in the skill. Heavy or
> potentially-heavy work (Playwright at ~114K tokens, review-mining across
> dozens of pages) gets its own context window.

---

## Step 1 — Scope

Ask the user **once**:

> "What product or feature are you researching? Who is it for?"

Skip if they already gave both. Cap at **2** clarifying questions max
(geography, segment, direct vs. adjacent). Don't run an interview.

## Step 2 — Identify competitors

Use **`WebSearch`** by default. Look for:

- "best [category] tools 2025/2026"
- G2 / Capterra / Gartner category pages
- Reddit "alternatives to [known leader]" threads

**Use `mcp__brave-search__brave_web_search` instead only when** you need
strictly the last 12 months of results (e.g., a fast-moving category where
2-year-old listicles would be misleading). Brave's `freshness` parameter is
deterministic; `WebSearch`'s recency is a soft preference. For most categories
the soft preference is fine.

Pick **direct** competitors (same buyer, same job-to-be-done). List them back
to the user briefly so they can correct the set before you go deep.

## Step 3 — Per competitor (parallel work)

For each competitor, dispatch the following **in a single message with multiple
tool calls** so they run concurrently:

### 3a. Homepage — you do this yourself (`WebFetch`)

Fetch the homepage and extract:

- Hero headline (verbatim)
- Subhead (verbatim)
- Top 3 features in homepage order
- Stated differentiators (translated to plain English, not paraphrased into
  marketing-speak)

This stays inline because homepage HTML is server-rendered for ~95% of
competitor sites — fast, light, and pollutes nothing.

### 3b. Pricing — delegate to `pricing-fetcher` subagent

Spawn one `pricing-fetcher` per competitor. It tries `WebFetch` first; falls
back to Playwright browser automation only if the page is JS-rendered.

**Why this is delegated:** Playwright sessions cost ~114K tokens each. Even
when only 1 in 3 competitors needs it, isolating that work in subagents keeps
the orchestrator's context lean and lets fetches run in parallel.

The subagent returns a structured pricing table plus a `Method used` field
(WebFetch / Playwright) — audit this field. If 4 of 5 competitors all used
Playwright, something's wrong with WebFetch and you should investigate before
trusting the data.

### 3c. Reviews — delegate to `review-miner` subagent

Spawn one `review-miner` per competitor. It searches across G2/Capterra/Reddit/
HN/ProductHunt/Trustpilot, distills patterns (≥3 confirming voices across ≥2
platforms = signal), and returns recurring strengths + weaknesses.

**Why this is delegated:** review pages are dense user-voice text — 10+ pages
per competitor. Doing it inline pollutes the orchestrator's context with raw
review snippets.

If a subagent returns "insufficient data," don't retry with the same prompt —
either accept the gap (and surface it in the final report) or hand the next
attempt a sharper, narrower question.

## Step 4 — Synthesize per-competitor cards

Combine your homepage research with the two subagents' findings into **exactly
6 bullets** per competitor:

```
### [Competitor Name]
- **Positioning**: one sentence (their words, plain English)
- **Target customer**: who they're built for
- **Pricing**: tiers and price points, or "Not public"
- **Differentiators**: 2–3 things they do well
- **Weaknesses**: 1–2 recurring complaints from reviews/forums
- **Source date**: most recent source pulled (YYYY-MM)
```

Hard rules:
- 6 bullets exactly. If a bullet is empty, write "—" but keep the line.
- Pricing must cite a source URL inline if public.
- No marketing language in your translation.

## Step 5 — Gap Analysis

Add this section verbatim:

```
### Gap Analysis
- **What no competitor does well**: [specific capability gap]
- **Where pricing is underserved**: [a tier or model nobody offers]
- **Unclaimed positioning angle**: [a frame nobody owns]
```

Each gap must be **falsifiable** — grounded in something a reader can verify.
"Better UX" is not a gap. "No competitor offers per-seat pricing under $10/mo
for teams under 5" is.

## Step 6 — Close

End the report with exactly one line:

> **Based on this, which gap are you trying to own?**

No summary. No "let me know if you want more." Just the question.

---

## Tool selection cheat sheet

| Task | Default tool | Reach for MCP when... |
| --- | --- | --- |
| Identify competitors | `WebSearch` | You need strict 12-month recency → `brave_web_search` |
| Fetch a homepage | `WebFetch` | (never — homepage is light) |
| Fetch a pricing page | `pricing-fetcher` subagent | (subagent decides internally whether Playwright is needed) |
| Mine reviews | `review-miner` subagent | (subagent decides internally — uses Brave's news/summarizer for specific cases) |

**Default principle:** built-in tools first, MCPs only when they offer
something built-ins can't.

---

## Anti-patterns (do not do)

- ❌ Doing your own deep web searches once you've identified competitors —
  delegate pricing and review work to the subagents
- ❌ Calling subagents sequentially per competitor instead of in parallel
- ❌ Reaching for `brave_web_search` when `WebSearch` would have been fine
  (this wastes Brave's free-tier budget)
- ❌ Invoking Playwright tools directly from the orchestrator — those calls
  belong in the `pricing-fetcher` subagent so the heavy context is isolated
- ❌ Accepting a `pricing-fetcher` report where 4 of 5 competitors used
  Playwright — investigate WebFetch first
- ❌ Adding a 7th bullet "for completeness"
- ❌ Inventing pricing because the public site is vague
- ❌ Listing every G2 complaint — only recurring patterns
- ❌ Writing a closing paragraph after the sharp question

