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.
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.
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.
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.