Overview
This workflow runs weekly and checks a list of potential product ideas against market saturation signals. For each idea, it queries Google for organic competition and ad density, then checks Reddit for user satisfaction with existing tools. Ideas that score high on saturation metrics are flagged as 'do not build' candidates.
Trigger
Cron schedule (weekly, Monday at 9 AM UTC)
Schedule
Weekly (Monday at 9 AM UTC)
Workflow Steps
Load idea backlog
Read a list of product ideas from a JSON file. Each idea has a name and 2-3 search keywords to evaluate.
Check Google SERP saturation
For each keyword, call Scavio Google search. Count organic results from established brands, count ads, and check for knowledge panels indicating a dominant player.
Check Reddit satisfaction
For each idea, search Reddit for 'best [category] tool' and 'happy with [existing tool]'. High satisfaction with incumbents is a negative signal.
Score each idea
Compute a saturation score: organic_big_brands * 2 + ad_count * 3 + reddit_satisfied_threads * 1. Higher score means more saturated market.
Generate report
Output a ranked list of ideas from least saturated to most saturated. Flag ideas above the threshold as 'do not build' candidates.
Python Implementation
import requests, os, json
SCAVIO_KEY = os.environ["SCAVIO_API_KEY"]
H = {"x-api-key": SCAVIO_KEY}
IDEAS = [
{"name": "AI resume builder", "keywords": ["ai resume builder", "resume builder tool"]},
{"name": "Invoice automation", "keywords": ["invoice automation tool", "automated invoicing"]},
]
def check_saturation(keyword: str) -> dict:
serp = requests.post("https://api.scavio.dev/api/v1/search", headers=H,
json={"platform": "google", "query": keyword}, timeout=10).json()
reddit = requests.post("https://api.scavio.dev/api/v1/search", headers=H,
json={"platform": "reddit", "query": f"{keyword} recommendation"}, timeout=10).json()
return {
"organic_count": len(serp.get("organic", [])),
"ads_count": len(serp.get("ads_results", [])),
"reddit_threads": len(reddit.get("organic", [])),
}
for idea in IDEAS:
scores = [check_saturation(kw) for kw in idea["keywords"]]
avg_ads = sum(s["ads_count"] for s in scores) / len(scores)
avg_organic = sum(s["organic_count"] for s in scores) / len(scores)
saturation = avg_ads * 3 + avg_organic * 2
status = "SATURATED" if saturation > 30 else "OPEN"
print(f"[{status}] {idea['name']}: ads={avg_ads:.0f}, organic={avg_organic:.0f}, score={saturation:.0f}")JavaScript Implementation
const IDEAS = [
{ name: "AI resume builder", keywords: ["ai resume builder", "resume builder tool"] },
{ name: "Invoice automation", keywords: ["invoice automation tool", "automated invoicing"] },
];
async function checkSaturation(keyword) {
const headers = { "x-api-key": process.env.SCAVIO_API_KEY, "Content-Type": "application/json" };
const [serp, reddit] = await Promise.all([
fetch("https://api.scavio.dev/api/v1/search", { method: "POST", headers,
body: JSON.stringify({ platform: "google", query: keyword }) }).then(r => r.json()),
fetch("https://api.scavio.dev/api/v1/search", { method: "POST", headers,
body: JSON.stringify({ platform: "reddit", query: `${keyword} recommendation` }) }).then(r => r.json())
]);
return {
organic: (serp.organic || []).length,
ads: (serp.ads_results || []).length,
reddit: (reddit.organic || []).length,
};
}
for (const idea of IDEAS) {
const scores = await Promise.all(idea.keywords.map(checkSaturation));
const avgAds = scores.reduce((s, x) => s + x.ads, 0) / scores.length;
const avgOrganic = scores.reduce((s, x) => s + x.organic, 0) / scores.length;
const saturation = avgAds * 3 + avgOrganic * 2;
const status = saturation > 30 ? "SATURATED" : "OPEN";
console.log(`[${status}] ${idea.name}: ads=${avgAds.toFixed(0)}, organic=${avgOrganic.toFixed(0)}, score=${saturation.toFixed(0)}`);
}Platforms Used
Web search with knowledge graph, PAA, and AI overviews
Community, posts & threaded comments from any subreddit