validationmicrosaasmarket-research

Negative Validation: What Not to Build (2026)

r/microsaas building a tool to decide what NOT to build. Search signals for kill decisions: competition density, review sentiment, keyword trends. Check before committing code.

5 min read

Most validation advice focuses on finding demand. Equally important: finding reasons not to build. A thread on r/microsaas asked how to decide between three project ideas. The highest-signal answer: search for kill conditions first. High competition density, declining interest, and strong incumbents with network effects are signals to walk away before writing a single line of code.

Three kill signals to check

  • Competition density: if the first page of search results is dominated by well-funded competitors with mature products, your side project will not rank and will not get discovered organically.
  • Declining search interest: if search volume for the core keyword has been dropping for 12+ months, the market is contracting. You are building into a headwind.
  • Network effects: if the incumbent's value increases with each user (marketplace, social network, data flywheel), a better product alone will not win. You need a distribution hack that the incumbent cannot replicate.

Checking competition density via SERP

Pull the top 10 results for your target keyword. Count how many are from companies with dedicated teams, versus personal blogs, forum posts, or thin affiliate pages. A SERP full of HubSpot, Salesforce, and G2 comparison pages is a red flag for a solo founder.

Python
import requests, os
from urllib.parse import urlparse

def check_competition_density(keyword):
    """Analyze SERP competition for a keyword."""
    resp = requests.post(
        "https://api.scavio.dev/api/v1/search",
        headers={"x-api-key": os.environ["SCAVIO_API_KEY"]},
        json={"query": keyword, "num_results": 10}
    ).json()

    domains = [urlparse(r["url"]).netloc for r in resp["results"]]

    # Known high-authority domains that are hard to compete with
    big_players = {
        "hubspot.com", "salesforce.com", "g2.com", "capterra.com",
        "gartner.com", "forbes.com", "techcrunch.com", "zapier.com",
    }

    big_count = sum(1 for d in domains if any(bp in d for bp in big_players))
    return {
        "keyword": keyword,
        "domains": domains,
        "big_player_count": big_count,
        "density_score": big_count / len(domains),
        "verdict": "high competition" if big_count >= 5 else "possible opening"
    }

result = check_competition_density("best crm for small business")
print(f"Competition: {result['big_player_count']}/10 big players")
print(f"Verdict: {result['verdict']}")
print(f"Domains: {result['domains']}")

Checking for declining interest

Search for the keyword with time-bounded freshness filters. If recent results (last 30 days) are thin, mostly recycled content, or dominated by "is X dead?" articles, interest is declining. Compare the quality and volume of recent results to older ones.

Python
def check_declining_interest(keyword):
    """Compare recent vs older search results."""
    recent = requests.post(
        "https://api.scavio.dev/api/v1/search",
        headers={"x-api-key": os.environ["SCAVIO_API_KEY"]},
        json={"query": keyword, "num_results": 10, "freshness": "month"}
    ).json()

    general = requests.post(
        "https://api.scavio.dev/api/v1/search",
        headers={"x-api-key": os.environ["SCAVIO_API_KEY"]},
        json={"query": keyword, "num_results": 10}
    ).json()

    recent_count = len(recent.get("results", []))
    general_count = len(general.get("results", []))

    # Check for "is X dead?" signals
    death_signals = sum(
        1 for r in general["results"]
        if any(w in r["title"].lower() for w in ["dead", "dying", "obsolete", "replaced"])
    )

    return {
        "keyword": keyword,
        "recent_results": recent_count,
        "general_results": general_count,
        "death_signals": death_signals,
        "freshness_ratio": recent_count / max(general_count, 1),
    }

interest = check_declining_interest("wordpress theme marketplace")
print(f"Recent results: {interest['recent_results']}")
print(f"Death signals: {interest['death_signals']}")

Checking for network effects

This one is harder to automate. Search for the incumbent's value proposition. If results mention "largest network," "millions of users," "marketplace with X sellers," or similar, the incumbent has a moat you cannot replicate with a better product. Upwork is hard to compete with not because the software is good but because 12 million freelancers are already there.

The negative validation scorecard

  • Competition density above 50% big players: major red flag
  • Fewer than 3 recent results in 30 days: declining interest
  • 2+ death signal articles in top 10: market is contracting
  • Incumbent has network effects: need distribution hack, not just features

What to do with a kill signal

A kill signal does not always mean "do not build." It means "do not build the obvious version." High competition density for "best CRM" does not kill a CRM for veterinarians. The niche version avoids the SERP competition while serving a specific audience. Negative validation tells you what not to build, which sharpens what you should build.

Cost of this analysis

Four API calls per idea (two for competition, two for interest) at $0.005 each = $0.02 per idea validated. Run it on three ideas: $0.06 total. Six cents and 10 minutes can save you three months of building into a dead market.