competitor-mapper

Maps the full competitive landscape — direct, indirect, substitute, and emerging competitors — with positioning gap analysis, review mining, and market_insights-calibrated saturation scoring. Feeds into idea-scoring, cac-modeler, pricing-and-wtp, and tam-sam-som-builder.

<!-- version: 0.2.0 | outputs: memory/ideas/<slug>/competitors.json -->

Skill: competitor-mapper

Purpose

Understand what the user is actually competing against — not just other apps, but also spreadsheets, habits, free alternatives, and human services. The goal is not an exhaustive list but a strategic map: who owns the space, where the gaps are, and whether this idea can occupy a position that incumbents can't easily copy.

Input

  • Idea slug
  • memory/ideas/<slug>/idea.md (app concept, key features, differentiator)
  • memory/market_insights/<niche>-*-<YYYY>-<MM>.md (trend analysis files — use all available platform files for this niche)

Using Market Insights

Trend analysis files are a primary research source for competitor mapping. Extract the following:

Platform fileWhat to extract for competitor mapping
Apps (<niche>-apps-*.md)Category rankings, new entrants, top apps by downloads/revenue, review complaint patterns, pricing models in use
Reddit (<niche>-reddit-*.md)Apps and tools users mention by name (both praised and hated), non-software workarounds users describe, recurring complaints about existing solutions
TikTok (<niche>-tiktok-*.md)Apps featured in viral content (free marketing = distribution advantage), creator-promoted tools, "alternatives to X" content trends
Web Search (<niche>-web-search-*.md)Top-ranking apps for category keywords, "best X apps" list winners, SEO-dominant competitors
monetization_evidence (from any platform)Which competitors are actively monetizing (proves the market supports revenue, identifies pricing benchmarks)
trend_velocityRising-fast markets attract new entrants quickly — flag that emerging threats will increase

If no market_insights files exist, note this as a gap and rely on direct research only.

Competitor Categories

CategoryDefinitionWhy it mattersExamples
DirectSame solution, same audienceHead-to-head competition for the same usersApps solving the exact same problem on the same platform
IndirectDifferent solution, same problemUser might choose this instead, even though it works differentlyA meditation app competing with a journaling app for "stress relief"
SubstituteNon-software solution the user currently employsThe real baseline — what happens if the user never installs any appSpreadsheets, pen-and-paper, hiring a person, doing nothing, a WhatsApp group
EmergingNew entrants, beta products, or announced features from incumbentsFuture competitive pressure — the landscape 6–12 months from nowYC-backed startups, Product Hunt launches, Apple/Google adding native features

Process

Step 1 — Research Checklist by Category

Direct competitors (find 3–8)

Search these sources in order:

  1. App Store / Play Store category browse: Search the primary category and 2–3 keyword variations. Record the top 10 results for each search.
  2. "Best X apps" articles: Search Google for best [category] apps 2026. The top 3 listicle results typically capture the market leaders.
  3. Product Hunt: Search the category. Sort by most upvoted. Focus on launches from the past 18 months (recent entrants).
  4. Market insights (Apps file): If <niche>-apps-*.md exists, extract any competitors named in the narrative.
  5. Market insights (Reddit file): If <niche>-reddit-*.md exists, extract apps users mention by name in discussions.
  6. AlternativeTo.net: Search the closest existing app. Lists adjacent competitors you may have missed.

For each direct competitor, record:

  • Name, platform(s), pricing model and price
  • Estimated user base (from App Store ratings count × 50–100, or from market_insights narrative)
  • App Store rating (stars + review count)
  • Last updated date (stale = opportunity)
  • Top 3 features
  • Top 3 complaints (from review mining — see Step 3)

Indirect competitors (find 2–5)

Ask: "What else might someone use to solve the same underlying problem, even if the approach is completely different?"

Sources:

  • Reddit threads where users describe their current workflow for this problem
  • "How to [solve problem]" search results — the solutions that appear ARE the indirect competition
  • Market insights narratives that describe alternative approaches to the same pain

Substitutes (find 2–4)

Ask: "What is the user doing RIGHT NOW, before they know this app exists?"

Common substitute categories:

  • Manual process: Spreadsheet, notes app, pen-and-paper, calendar reminders
  • Human service: Coach, therapist, accountant, personal trainer
  • Social workaround: Group chat, Facebook group, Discord server
  • Inaction: Doing nothing (this is the strongest competitor for low-urgency problems)

Record the estimated cost and friction of each substitute — this is the switching-cost baseline the app must beat.

Emerging threats (find 1–3)

Sources:

  • Product Hunt launches in the past 6 months
  • YC / startup accelerator demo day lists
  • Apple WWDC / Google I/O feature announcements that could obviate the app
  • If trend_velocity = "rising-fast" in market_insights, note that new entrants are likely

Flag any emerging competitor that has raised funding — they have resources to move fast.

Step 2 — App Store Search Methodology

The App Store is the most important research surface for B2C apps. Use this systematic approach:

  1. Primary keyword search: The most obvious term a user would search (e.g., "habit tracker").
  2. Problem keyword search: The problem statement (e.g., "build better habits").
  3. Audience keyword search: The target user + need (e.g., "ADHD planner").
  4. Adjacent keyword search: Related but broader terms (e.g., "daily routine", "productivity").

For each search, record:

  • Number of results that are clearly relevant (not spam/unrelated)
  • Rating and review count of the top 3 results
  • Whether the top result has > 50K ratings (signals an entrenched incumbent)
  • Date of last update for top 5 results (stale apps = opportunity to displace)

Step 3 — Review Mining for Positioning Gaps

Competitor reviews are the richest source of positioning gaps. Mine them systematically:

1-star reviews (frustration signals)

These reveal what users hate about existing solutions. Look for patterns:

  • Bugs and reliability complaints (opportunity: "the one that actually works")
  • Missing features that users expected (opportunity: build the feature they want)
  • Pricing complaints (opportunity: better value or different model)
  • Privacy/data concerns (opportunity: privacy-first positioning)
  • UX complexity complaints (opportunity: simpler alternative)

3-star reviews (unmet expectation signals)

These are often more valuable than 1-star reviews. 3-star reviewers liked the app enough to keep using it but something important is missing:

  • "Great app BUT..." — the "but" is the positioning gap
  • "Would be perfect IF..." — the "if" is the feature opportunity
  • "Works for X but not for Y" — the "Y" is the underserved segment

5-star reviews (what's defensible)

Read competitor 5-star reviews to understand what they do well. These strengths are hard to compete against directly — don't try. Instead, find the orthogonal angle that the incumbent's strength doesn't cover.

Mining process

For each direct competitor (top 3–5):

  1. Read the 20 most recent 1-star reviews
  2. Read the 20 most recent 3-star reviews
  3. Read 10 recent 5-star reviews
  4. Categorize complaints into themes (max 5 themes per competitor)
  5. Identify the most common complaint shared across 2+ competitors — this is the strongest gap signal

Step 4 — Positioning Gap Analysis

A positioning gap is a real user need that no current competitor serves well. Classify each gap:

Gap typeDescriptionDefensibility
Audience gapNo competitor targets this specific user segmentMedium — easy to copy if proven
Feature gapA commonly requested feature that no competitor has builtLow — incumbents can add it
Experience gapExisting solutions work but the UX is painfulMedium — hard for bloated incumbents to simplify
Price gapAll competitors are expensive; a free or cheap alternative would winLow — race to the bottom
Philosophy gapExisting solutions have a fundamentally different worldview (e.g., "gamified" vs. "minimalist")High — incumbents can't pivot their core identity
Platform gapNo good solution exists on a specific platform (e.g., iOS-only need, Apple Watch, visionOS)Medium — temporary, but first-mover advantage is real
Trust gapUsers don't trust existing solutions (privacy, data ownership, ads)High — trust is hard to build retroactively

Prioritize philosophy gaps and trust gaps — these are the hardest for incumbents to copy and the most defensible for an indie developer.

Step 5 — Market Saturation Scoring

Saturation reflects how crowded the space is and how difficult it will be to get noticed.

FactorLow (1 pt)Medium (2 pts)High (3 pts)
Direct competitor count0–2 relevant apps3–6 relevant apps7+ relevant apps
Incumbent dominanceNo app has > 10K ratings1–2 apps have 10K–100K ratingsAn app has > 100K ratings
Funding in spaceNo funded competitors1–2 funded startupsMultiple funded companies or a FAANG player
App Store keyword saturationPrimary keywords show few relevant resultsModerate results, some quality varianceTop results are all high-quality, well-maintained apps
Content saturationFew "best X apps" articles existSome articles, moderate SEO competitionMany SEO-optimized listicles, hard to rank

Total score (5–15 points):

TotalSaturation level
5–7low — Blue ocean. Few competitors, clear opportunity to establish position.
8–11medium — Competitive but gaps exist. Success requires clear differentiation.
12–15high — Red ocean. Dominated by well-funded or well-established players. Indie success requires a genuinely novel angle or underserved niche.

Output

Write to memory/ideas/<slug>/competitors.json:

{
  "direct_competitors": [
    {
      "name": "",
      "platform": "",
      "estimated_users": "",
      "app_store_rating": 0,
      "review_count": 0,
      "last_updated": "",
      "pricing": "",
      "pricing_model": "",
      "top_features": [],
      "top_complaints": [],
      "complaint_themes": [],
      "distribution_channels_observed": []
    }
  ],
  "indirect_competitors": [
    {
      "name": "",
      "approach": "",
      "why_users_choose_it": ""
    }
  ],
  "substitutes": [
    {
      "description": "",
      "cost": "",
      "friction_level": "low | medium | high",
      "switching_cost_to_app": ""
    }
  ],
  "emerging_threats": [
    {
      "name": "",
      "stage": "beta | launched | announced",
      "funded": false,
      "threat_level": "low | medium | high",
      "notes": ""
    }
  ],
  "review_mining_summary": {
    "most_common_complaint_across_competitors": "",
    "strongest_gap_signal": "",
    "competitors_mined": 0
  },
  "positioning_gaps": [
    {
      "gap_type": "audience | feature | experience | price | philosophy | platform | trust",
      "description": "",
      "defensibility": "low | medium | high",
      "evidence": ""
    }
  ],
  "saturation_score": {
    "direct_competitor_count": 0,
    "incumbent_dominance": 0,
    "funding_in_space": 0,
    "keyword_saturation": 0,
    "content_saturation": 0,
    "total": 0
  },
  "market_saturation": "low | medium | high",
  "differentiation_opportunities": [],
  "market_insights_sources_used": []
}

Notes

  • The most_common_complaint_across_competitors from review mining is one of the highest-signal data points in the entire validation system. If the same complaint appears in 3+ competitor review sets, it's a validated pain point — the market is telling you what to build.
  • distribution_channels_observed for each competitor helps downstream skills (distribution-analysis, cac-modeler) understand which channels actually work in this category.
  • If market_insights show trend_velocity = "rising-fast", note in emerging_threats that the competitor landscape will shift quickly. Rising markets attract builders.
  • Substitutes with friction_level = "low" are the hardest to displace — if doing nothing or using a spreadsheet is easy enough, the app must provide dramatically more value to justify the download.