aeosaasdiy

SaaS AI Search Visibility Tracking (DIY)

Self-hosted AEO monitor for SaaS founders. SERP plus AI Overviews plus Reddit plus weekly ChatGPT prompt study under $50/mo total.

6 min read

A r/SaaSMarketing thread asked the question every SaaS founder is asking in 2026: how do you track whether your SaaS shows up in AI search results? Most paid tools cost $300+/mo for partial coverage. The DIY version costs $30/mo total and gives multi-surface visibility.

What Counts as "AI Search"

Three surfaces matter. First, Google AI Overviews (the panel above organic results). Second, ChatGPT and Claude when they cite sources in answers. Third, Perplexity and similar answer engines. A founder wants to know if their brand or product name shows up in any of these for category queries.

The Tools That Try to Track This

Several SaaS tools launched in 2025 to 2026 to cover AEO/GEO measurement. They charge $200 to $500 per month, mostly for one or two surfaces. None of them include the off-platform signal (Reddit threads about the brand) that often precedes AI citations.

The DIY Stack

  1. SERP plus AI Overviews citations: Scavio withinclude_ai_overview: true.
  2. Reddit brand mentions: Scavio Reddit endpoint per brand keyword.
  3. Weekly ChatGPT prompt study: a small script that runs the same 30 prompts against ChatGPT and Claude.
  4. DuckDB or SQLite: store the daily snapshots and compute deltas.
  5. Email digest: weekly markdown report with new and lost citations.

The Daily Snapshot

For each brand keyword, run one Scavio SERP call with AI Overviews on. Pull the organic results plus the AI Overview citations. Run one Reddit search per brand keyword. Store everything in DuckDB with one row per (keyword, surface, url, date).

Python
import os, requests, datetime, duckdb

API_KEY = os.environ["SCAVIO_API_KEY"]
H = {"x-api-key": API_KEY}
db = duckdb.connect("aeo.duckdb")
db.execute("CREATE TABLE IF NOT EXISTS aeo(brand TEXT, keyword TEXT, surface TEXT, url TEXT, date DATE)")

def daily_snapshot(brand, keywords):
    today = datetime.date.today()
    for k in keywords:
        serp = requests.post("https://api.scavio.dev/api/v1/google",
            headers=H, json={"query": k, "include_ai_overview": True}).json()
        for r in serp.get("organic_results", [])[:10]:
            db.execute("INSERT INTO aeo VALUES (?, ?, ?, ?, ?)", (brand, k, "serp", r["link"], today))
        for c in (serp.get("ai_overview") or {}).get("citations", []):
            db.execute("INSERT INTO aeo VALUES (?, ?, ?, ?, ?)", (brand, k, "ai_overview", c, today))
    rdt = requests.post("https://api.scavio.dev/api/v1/reddit/search",
        headers=H, json={"query": brand}).json()
    for p in rdt.get("posts", [])[:25]:
        db.execute("INSERT INTO aeo VALUES (?, ?, ?, ?, ?)", (brand, brand, "reddit", p.get("url",""), today))

The Weekly Prompt Study

AI Overviews are one signal. ChatGPT and Claude answers are another. Run a 30-prompt set (your top category queries) against ChatGPT and Claude weekly. Store the answers, then grep for the brand name. Track the answer-mention rate over time.

Python
from anthropic import Anthropic
import openai
client_cc = Anthropic()
client_oai = openai.OpenAI()

def weekly_prompts(brand, prompts):
    results = []
    for p in prompts:
        cc = client_cc.messages.create(model="claude-sonnet-4-6", max_tokens=512,
            messages=[{"role":"user","content":p}]).content[0].text
        oai = client_oai.chat.completions.create(model="gpt-5",
            messages=[{"role":"user","content":p}]).choices[0].message.content
        results.append({"prompt": p, "claude_mentions": brand.lower() in cc.lower(), "gpt_mentions": brand.lower() in oai.lower()})
    return results

The Weekly Digest

DuckDB query per week. New citations (urls present this week, not last week). Lost citations (urls present last week, missing this week). Reddit thread velocity (count this week vs trailing 4-week average). Claude prompt-mention delta. Email it as a markdown table.

What This Lacks

Pretty dashboards. The DIY version is a script plus a digest, not a UI. Founders who want to share the dashboard with non-technical stakeholders should add a Streamlit or Metabase view on top of the DuckDB file. Otherwise the markdown digest is fine.

The Cost Profile

Daily snapshot of 30 keywords plus weekly prompt study uses about 2,000 to 3,000 Scavio credits per month, plus $20 to $40 in LLM spend. Total under $50/mo for the monitoring stack. Compare to the $300+/mo paid tools and the savings compound across multiple SaaS products.

Why This Wins for Founders

Full control. Custom keyword lists. Custom prompt sets. The data lives in your own DuckDB file. No vendor lock-in. Easy to extend with new surfaces (Perplexity Sonar API, You.com, etc.) when they matter.