Help us improve
Share bugs, ideas, or general feedback.
From gtmvp-gtm-agents
Use when you need to identify a defensible set of direct, cross-shoppable competitors for a B2B brand — not a list of mega-corps that show up because they share a keyword. Provides the 4-step chain-of-thought (define profile → must-have overlap criteria → systematic search → cross-shop validation) plus the disqualifier rules that reject HubSpot/Salesforce/Adobe-class false positives when the target is sub-$50M ARR. Cited by the competitor-mapper agent and the /competitor-map slash command.
npx claudepluginhub gtmvp/gtmvp-gtm-agents --plugin gtmvp-gtm-agentsHow this skill is triggered — by the user, by Claude, or both
Slash command
/gtmvp-gtm-agents:competitor-discovery-cotThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
The single most common failure mode of automated competitor discovery is returning a mega-corp list. Customer of a 30-person B2B agency does not cross-shop HubSpot. This skill is the disqualifier-first method that fixes it.
Guides Next.js Cache Components and Partial Prerendering (PPR): 'use cache' directives, cacheLife(), cacheTag(), revalidateTag() for caching, invalidation, static/dynamic optimization. Auto-activates on cacheComponents: true.
Migrates code, prompts, and API calls from Claude Sonnet 4.0/4.5 or Opus 4.1 to Opus 4.5, updating model strings on Anthropic, AWS, GCP, Azure platforms.
Breaks plans, specs, or PRDs into thin vertical-slice issues on the project issue tracker using tracer bullets. Useful for converting high-level work into grabbable implementation tickets.
Share bugs, ideas, or general feedback.
The single most common failure mode of automated competitor discovery is returning a mega-corp list. Customer of a 30-person B2B agency does not cross-shop HubSpot. This skill is the disqualifier-first method that fixes it.
When invoked, run all four steps before producing any output. Skipping steps is the fastest way to fail.
Before you can do this work, gather:
If you don't have these, ask for them or pull them from the brand's site before proceeding. Do not guess.
Pin down the exact shape of the company you're searching against:
Write each of these as a single explicit statement before continuing.
From the profile, declare:
If you cannot name disqualifiers, you have not defined the profile tightly enough. Go back to Step 1.
Work outward in concentric rings:
Hard rule: Ignore companies that are 10x+ larger than the target unless the target is itself enterprise-scale. A $5M ARR boutique agency does not compete with a $5B platform — they share a keyword, not a customer.
For every candidate, ask one question and answer it explicitly:
"Would a real customer actually cross-shop these two companies?"
If the answer requires hedging ("well, theoretically..." or "if they grew 10x..."), the candidate is not a direct competitor.
Secondary checks:
Return JSON. The agent calling this skill must conform to the competitor_mapper_agent output schema (see gtm-output-schemas skill, §6.1):
{
"competitorSet": [
{
"domain": "actual-website.com",
"name": "Company Name",
"segment": "What sub-niche they're in",
"sizeBand": "sub-$10M | $10-50M | $50-250M | $250M+",
"crossShopProbability": 0.85,
"overlapVector": [
{ "audience": "exact-match | adjacent | partial" },
{ "problem": "exact-match | adjacent | partial" },
{ "pricePoint": "same-tier | one-tier-up | one-tier-down" },
{ "channels": ["list of shared go-to-market channels"] }
],
"positioningPhrase": "How they describe themselves on their homepage",
"primaryAdvantage": "What they do better than the target",
"primaryWeakness": "Where the target can attack them"
}
],
"rejectedCandidates": [
{
"domain": "huge-platform.com",
"reason": "mega_corp | wrong_icp | different_problem | different_price"
}
],
"whitespaceGaps": [
{
"gap": "What no competitor in this set is doing well",
"evidence": "Specific evidence from competitor analysis",
"viableFor": ["Which target customer segments this gap matters to"]
}
],
"recommendations": [
{ "type": "positioning | offer | channel", "priority": "high | medium | low", "suggestion": "...", "reason": "..." }
]
}
example.com, no placeholders, no inferred-but-unverified URLs.rejectedCandidates is mandatory. Document at least 2-3 rejections — this is evidence the disqualifier logic ran.whitespaceGaps is the highest-leverage section. It surfaces where the brand can attack. Don't skip it.| Failure | What it looks like | Fix |
|---|---|---|
| Mega-corp drift | Salesforce, HubSpot, Adobe in the list for a sub-$50M brand | Apply Step 2 disqualifier hard |
| Keyword overlap | Two companies share "AI" but solve different problems | Use Step 4 cross-shop test |
| Half-overlap | Found companies doing one of two services in the combination | Re-check Step 1 — the combination is the requirement |
| Theoretical competition | "If they pivoted, they'd compete" | Step 4: real and current only |
| No rejections logged | Empty rejectedCandidates array | You skipped Step 2 — go back |