Una publicación de r/microsaas advirtió sobre la construcción de mercados saturados. El problema: la mayoría de los marcos de validación se centran en encontrar la demanda, no en comprobar el exceso de oferta. Este tutorial crea un proceso de validación negativa que busca soluciones existentes y cuantifica la saturación del mercado antes de comprometerse.
Requisitos previos
- Clave API de Scavio
- Python 3.8+
Guia paso a paso
Paso 1: Definir señales de saturación
Lo que indica que un mercado está demasiado concurrido.
saturation_signals = {
'ad_heavy': 0, # Number of ads on SERP
'established_players': 0, # Funded companies in results
'review_sites': 0, # G2/Capterra listicles
'alternative_pages': 0, # 'X alternatives' pages
'reddit_complaints': 0, # Complaints about existing tools
}Paso 2: Búsqueda de soluciones existentes
Múltiples consultas para medir la densidad del mercado.
import requests, os
H = {'x-api-key': os.environ['SCAVIO_API_KEY']}
def check_saturation(product_idea):
queries = [
f'best {product_idea} software',
f'{product_idea} tools comparison',
f'{product_idea} alternatives',
f'{product_idea} pricing',
]
all_results = []
for q in queries:
data = requests.post('https://api.scavio.dev/api/v1/search',
headers=H, json={'platform': 'google', 'query': q}).json()
all_results.extend(data.get('organic_results', []))
return all_resultsPaso 3: Nivel de saturación de puntuación
Cuente las señales de los resultados de búsqueda.
def score_saturation(results, idea):
score = {'ads': 0, 'listicles': 0, 'funded': 0, 'alternatives_pages': 0}
funded_indicators = ['series a', 'series b', 'raised', 'backed by', 'yc']
for r in results:
snippet = (r.get('snippet', '') + r.get('title', '')).lower()
if 'alternative' in snippet: score['alternatives_pages'] += 1
if any(f in snippet for f in funded_indicators): score['funded'] += 1
if any(s in snippet for s in ['g2.com', 'capterra', 'top 10', 'best 10']): score['listicles'] += 1
total = sum(score.values())
return {'score': total, 'breakdown': score,
'verdict': 'Saturated' if total > 15 else 'Competitive' if total > 8 else 'Open'}Paso 4: Consulte Reddit para conocer necesidades no satisfechas
Incluso los mercados saturados pueden tener nichos desatendidos.
def find_unmet_needs(idea):
data = requests.post('https://api.scavio.dev/api/v1/search',
headers=H,
json={'platform': 'reddit', 'query': f'{idea} frustrating OR missing OR wish'}).json()
complaints = data.get('results', [])
print(f'Found {len(complaints)} complaint threads')
for c in complaints[:5]:
print(f" - {c.get('title', '')}")
return complaintsEjemplo en Python
import os, requests
H = {'x-api-key': os.environ['SCAVIO_API_KEY']}
def validate_not_to_build(idea):
for q in [f'best {idea}', f'{idea} alternatives', f'{idea} comparison']:
data = requests.post('https://api.scavio.dev/api/v1/search', headers=H,
json={'platform': 'google', 'query': q}).json()
alts = sum(1 for r in data.get('organic_results', []) if 'alternative' in r.get('title', '').lower())
print(f'{q}: {len(data.get("organic_results", []))} results, {alts} alternatives pages')
validate_not_to_build('project management tool')Ejemplo en JavaScript
const res = await fetch('https://api.scavio.dev/api/v1/search', {
method: 'POST',
headers: {'x-api-key': process.env.SCAVIO_API_KEY, 'Content-Type': 'application/json'},
body: JSON.stringify({platform: 'google', query: `best ${idea} software`})
});
const data = await res.json();
const saturation = data.organic_results?.filter(r => r.title.toLowerCase().includes('alternative')).length;Salida esperada
Saturation report: ad density, funded competitor count, alternatives page count, listicle coverage, and verdict (Saturated/Competitive/Open). 4 Google + 1 Reddit query = $0.025.