| name | competitive-landscape |
| description | Full competitor analysis for VC market maps: scope competitors at 4 levels (direct, indirect, adjacent, substitute), discover companies via Extruct API with a two-pass strategy (fast search first, deep search where needed), enrich with positioning axes and competitive intelligence, and build feature comparison matrices. Triggers on: "find competitors", "scope competitors", "competitive landscape", "competitor analysis", "discover competitors", "competitive enrichment", "competitor search", "build landscape", "competitor discovery".
|
Competitive Landscape
Scope, discover, enrich, and compare competitors across 4 levels. This is the core skill — it takes a market definition and produces enriched Extruct tables and feature comparison matrices.
All Extruct API operations are delegated to the extruct-api skill. Do not construct raw HTTP requests — use the bundled CLI via the extruct-api skill.
Environment
| Variable | Service |
|---|
EXTRUCT_API_TOKEN | Extruct API |
Inputs
| Input | Source | Required |
|---|
| Market context | claude-code-gtm/vc-maps/{map-slug}/market_context.md | yes |
| User knowledge of competitors | User input | recommended |
Workflow
This skill has 5 phases. Each phase pauses for user review before proceeding.
Phase A: Competitor Scoping + Search Query Design
Read market_context.md. Extract: market description, positioning axes, capability areas, seed companies, geographic scope, stage focus.
Read references/scoping-framework.md for the full framework.
For each of the 4 competitor levels, draft the scoping and search queries.
Level 1: Direct Competitors
Definition: Products that solve the same problem for the same users in the same way.
Query design — describe the PRODUCT, not the problem:
- Template: "Companies that offer [specific product type] for [target user] to [specific function]"
- Be specific about the product category and core capability
- Write 2-3 queries from different angles on the same product
Example queries (AI code review market):
- "Companies that offer AI-powered code review tools for engineering teams"
- "Automated pull request review and code analysis platforms"
- "Developer tools for AI-assisted code quality and review automation"
Lookalike seeds: Use seed companies from market context + any the user names.
Discovery criteria (for Pass 2 if needed): Design 3-5 criteria from the capability areas in market context.
Level 2: Indirect Competitors
Definition: Products that solve the same problem but with a fundamentally different approach.
Query design — describe the PROBLEM, not the product:
- Template: "Companies that help [target user] solve [problem] using [different approach]"
- Write one query per distinct alternative approach
- Focus on the workflow and pain point
Example queries (AI code review market):
- "Companies helping engineering teams maintain code quality through static analysis and linting tools"
- "Developer education and training platforms focused on code quality best practices"
- "Peer code review workflow tools and collaboration platforms for developers"
Discovery criteria (for Pass 2 if needed): Focused on problem overlap, NOT product similarity.
Level 3: Adjacent Competitors
Definition: Products that don't compete today but could expand into this market.
Three query sub-strategies:
A. Similar technology, different use case:
- "Companies using [same core tech] for [adjacent use case]"
B. Same customers, different product:
- "Companies selling [different product] to [same buyer persona]"
C. Platform expansion risk:
- "Platforms for [broader category] that include or could add [this capability]"
Write 1 query per sub-strategy (2-3 total).
Lookalike: Run from direct competitors — finds similar-profile companies in adjacent spaces.
Level 4: Substitute Solutions
Definition: Entirely different ways users solve the underlying need.
Two parts:
-
Narrative section — ask user: "What do companies do instead of using a product like this? Think: hiring people, using general-purpose tools (Excel, email), outsourcing, or ignoring the problem."
-
Software-adjacent search — 1-2 queries for general-purpose tools that subsume the need:
- "General-purpose [tool type] that includes [relevant capability] as a feature"
Present scoping to user
Show the complete scoping plan:
Level: Direct Competitors
Definition: [...]
Known companies: [from user + seed list]
Semantic queries:
1. "[query]"
2. "[query]"
3. "[query]"
Lookalike seeds: [domains]
Discovery criteria (for Pass 2): [criteria]
Level: Indirect Competitors
...
Ask once: "Does this scoping look right? Any competitors or approaches I'm missing?"
If user confirms, proceed immediately to Phase B. Do not ask multiple follow-up questions.
Save to claude-code-gtm/vc-maps/{map-slug}/competitor_scoping.md.
Phase B: Pass 1 — Fast Discovery (Semantic + Lookalike)
Execute the search plan from Phase A. All Extruct operations use the extruct-api skill.
Step 0: Check for existing tables
Before running any searches, check if the user already has Extruct tables that cover this market:
- List existing tables via
extruct-api tables list.
- For each table, inspect its name, row count, and columns via
extruct-api tables get.
- If a table already contains companies relevant to a competitor level (e.g., a previously generated "AI code review — direct competitors" table):
- Present it to the user: "I found an existing table '{name}' with N companies. Want to reuse it for {level}?"
- If the user confirms, skip search for that level — use the existing table directly.
- If the table has stale data or missing columns, offer to extend it (add new rows or columns) rather than creating a new one.
- If no relevant tables exist, proceed to Step 1.
This avoids duplicate work and saves Extruct credits when the user has already run a previous mapping session.
Step 1: Run semantic searches
For each level, run each query via extruct-api semantic search:
- Use the queries designed in Phase A
- Apply filters from market context (geography, size, founding year)
limit=100 per query (up to 200 for direct competitors if needed)
Step 2: Run lookalike searches
For levels with seed companies, run extruct-api lookalike search:
- Apply matching filters
limit=100
Step 3: Merge and deduplicate
Per level:
- Combine semantic + lookalike results
- Deduplicate by domain within the level
Across levels:
- If a company appears in multiple levels, assign to the highest-priority level
- Priority: direct > indirect > adjacent > substitute
Step 4: Create or extend tables, upload, and assess coverage
For levels where an existing table was reused from Step 0, upload only the new (deduplicated) domains that aren't already in the table. For levels without an existing table, create a new one:
- Create a company table per level:
{map-slug} — {level} competitors
- Upload domains in batches via
extruct-api rows create
- Do NOT ask permission to create tables — just create them
Then present coverage assessment:
| Level | Semantic | Lookalike | After Dedup | Coverage |
|---|
| Direct | N | N | N | Sufficient/Thin/Gaps |
| Indirect | N | N | N | ... |
| Adjacent | N | N | N | ... |
| Substitute | N | -- | N | ... |
Coverage signals:
- Sufficient: 20+ companies, recognizable names present, query overlap confirms category
- Thin: <10 companies, few recognizable names, low query overlap
- Gaps: Known competitors missing, sub-segments not represented
Auto-proceed logic:
- If all levels are "Sufficient" -> skip deep search, go straight to Phase D (relevance validation)
- If any level is "Thin" or "Gaps" -> recommend Deep Discovery for that level and ask: "Direct competitors coverage is thin. Want me to run Deep Discovery to find more? Or proceed with what we have?"
- Do NOT ask "should I create tables?" — just create them
- Do NOT offer "filter down" as an option — the user can always remove companies from the table later
Phase C: Pass 2 — Deep Discovery (Optional)
Only run for levels where the user requests deeper coverage. Uses the extruct-api skill's deep-search commands.
Step 1: Design Discovery criteria
Based on what was found (and missing) in Pass 1, design criteria sets:
- Use capability areas from market context as evaluation criteria
- Add criteria for segments that were underrepresented
- Max 5 criteria per Discovery task
Step 2: Run Discovery tasks
Create deep-search tasks via extruct-api deep-search create.
Step 3: Poll until complete
Use extruct-api deep-search poll until status == "done" or is_exhausted == true.
Step 4: Fetch and integrate results
Fetch results via extruct-api deep-search results. Deduplicate against existing table for this level. Upload new companies to the level's existing table.
Step 5: Present updated counts
Show what Discovery added:
| Level | Before Discovery | New from Discovery | Total |
|---|
| {level} | N | +N | N |
Note any notable companies Discovery found that semantic search missed.
Phase D: Relevance Validation
Before running expensive enrichment, validate that every company in the tables actually belongs in the target market. Semantic search returns false positives — companies with similar keywords but different markets.
Step 1: Add a relevance check column
Add a single select column to each table via extruct-api columns add:
{
"kind": "agent",
"name": "Market Relevance",
"key": "market_relevance",
"value": {
"agent_type": "research_reasoning",
"prompt": "Does this company operate in the {MARKET_DESCRIPTION} market? Check the company's website and product description. Return ONLY one label.",
"output_format": "select",
"labels": ["Yes — core market", "Partially relevant", "No — different market"]
}
}
Customize {MARKET_DESCRIPTION} from market_context.md (e.g., "AI-powered legal software in Brazil").
Step 2: Run relevance check and wait for completion
Run the relevance column via extruct-api tables run (scoped to relevance column only). Poll until complete. This is a cheap research_reasoning column — fast to run.
Step 3: Remove irrelevant companies
Fetch table data. For each row where market_relevance = "No — different market":
- Delete the row via
extruct-api rows delete
Report:
| Table | Before | Removed | After |
|---|
| Direct | N | -N | N |
| Indirect | N | -N | N |
| Adjacent | N | -N | N |
Companies marked "Partially relevant" stay — they may be indirect or adjacent competitors.
Phase E: Competitive Enrichment
Design and run enrichment columns on the validated tables. All column operations use the extruct-api skill. Read the extruct-api skill's references/column-guide.md for column design rules.
Step 1: Select columns
See references/enrichment-columns-vc.md for pre-built column configs.
Standard 7 intelligence columns (applied to all tables):
- Recent Funding (json) — round, amount, investors. Use Crunchbase, PitchBook, press releases. Search in the startup's language.
- Parent Ownership (json) — independent, PE-backed, subsidiary, public, or acquired
- Key Clients (json) — notable customers from website logos, case studies, press releases
- Review Sentiment (json) — G2, Capterra ratings and themes
- Hiring Signals (text) — strategic hires, department focus
- Recent News (text) — launches, partnerships, acquisitions. Search in the startup's language.
- Target Market (select) — SMB / Mid-Market / Enterprise / All
Optional capability columns — only add if user requests deep analysis on direct competitors.
Present the column plan and proceed to create. Do not ask for confirmation unless the user has previously requested custom columns.
Step 2: Create columns
For each table, create confirmed columns via extruct-api columns add.
Step 3: Trigger enrichment
For each table, run via extruct-api tables run scoped to the new column IDs.
Report total cells queued.
Step 4: Monitor progress
Poll each table via extruct-api tables poll. Report completion percentage.
Step 5: Quality spot-check
After 50%+ completion on the direct competitors table, fetch 5 rows via extruct-api tables data and display a sample:
- Is funding data correct for known companies?
- Are key clients reasonable?
- Is parent ownership accurate?
If quality issues: delete the column via extruct-api columns delete, adjust the prompt, recreate, re-run.
Step 6: Summarize enrichment results
Once enrichment completes, present a summary of key findings:
- Companies with known funding (sorted by total raised)
- Ownership breakdown (independent vs PE-backed vs subsidiary)
- Notable key clients across competitors
- Hiring trends across the market
Outputs
| Output | Path / Location |
|---|
| Scoping document | claude-code-gtm/vc-maps/{map-slug}/competitor_scoping.md |
| Direct competitors table | Extruct table (ID saved in scoping doc) |
| Indirect competitors table | Extruct table (ID saved in scoping doc) |
| Adjacent competitors table | Extruct table (ID saved in scoping doc) |
When NOT to Use
- If the user just wants to define a market — use
market-definition
- If the user wants to run GTM outbound campaigns — use the GTM skills (list-building, list-enrichment, etc.)