Skip to content
FixAEO
Methodology ยท transparent ยท updated 2026

How FixAEO scores work

What we measure, how each 0-100 score is computed, what we don't do, and how brands can opt out. No hand-waving.

The scan flow

When you submit a URL, three independent stages run in parallel:

  1. Heuristic checks fetch the homepage HTML + /robots.txt + /llms.txt + /sitemap.xml. We grade 10 signals โ€” title tag, meta description, Open Graph tags, JSON-LD structured data, answer-style content, and crawlability files.
  2. LLM-derived brand profile. One cheap LLM call (typically gpt-4o-mini or Claude Haiku) returns a JSON object with industry, products, primary geography, and a seed list of 3-5 known competitors.
  3. AEO fan-out.A second LLM call generates 5 industry-specific questions that don't name your brand (e.g., "Which digital banks offer multi-currency accounts in Europe?"). Each question is sent in parallel to every AI engine we're wired to. We parse the responses for brand mentions + competitor mentions.

AI Presence (0-100)

Per engine: brand_mentioned_prompts / total_non_error_prompts ร— 100.

Overall AI Presence = arithmetic mean of per-engine scores. Engines that errored on every prompt for that scan don't contribute to the mean.

Example: a brand mentioned by ChatGPT in 4 of 5 prompts (80), by Claude in 5 of 5 (100), and by Gemini in 2 of 5 (40) โ†’ AI Presence = mean(80, 100, 40) = 73.

Key Prompts (0-100)

prompts_where_any_engine_mentioned_brand / total_prompts ร— 100.

Different from AI Presence: this measures whether your brand surfaces in industry queries at all, not how reliably each engine recalls you. A 100 here with a 60 AI Presence means every prompt got at least one mention, but some engines miss you consistently.

Competitor Landscape (0-100)

brand_mentions / (brand_mentions + competitor_mentions) ร— 100 across every (prompt ร— engine) cell.

A low score means competitors get named more often than your brand when the AI answers the same query. A high score means your brand dominates the answer. Competitor names come from the seed list (step 2 above) โ€” we don't guess capitalized words as competitors.

Web Presence

Per platform: Wikipedia (binary 0/100 via MediaWiki opensearch API), Reddit(log-scaled hit count via Reddit's public JSON search), X + YouTube (HTML probe of the canonical @brand URL, score 0 or 50 depending on whether the handle resolves).

X / YouTube scoring is coarse because their public APIs are paid. We're honest about this in-product: those tiles show 50 (presence detected) or 0 (no signal), not finer-grained reach numbers.

Strategy Review sub-scores

  • Answerability = Key Prompts score (alias).
  • Web Presence = mean of Reddit / X / YouTube / Wikipedia scores.
  • Structured Data = JSON-LD heuristic check score (pass=100, warn=50, fail=0).
  • AI Crawler Accessibility = mean of robots.txt, llms.txt, and sitemap.xml check scores.

Overall Strategy = mean of all four.

How leaderboards + brand pages are built

The public leaderboard and per-brand pages aggregate scans:

  • One row per brand, de-duplicated case-insensitively ("Stripe" and "stripe" collapse).
  • Latest scan wins. If a brand has been scanned 3 times, we show the most recent score.
  • Pages are baked into static HTML at frontend deploy time โ€” rankings refresh when we redeploy (typically weekly).
  • Brands we pre-seed via the curated list (30 well-known companies) are re-scanned automatically every 7 days via a cron job. Brands that arrived organically (real user scans) stay until their last scan ages past freshness.

What we explicitly DON'T do

  • We don't use brand logos. First-letter avatars only โ€” avoids any visual confusion with the brand's identity.
  • We don't claim brands endorse our reports or our product.
  • We don't inflate scores or sell ranking placements. Position is purely score-driven.
  • We don't use superlatives ("best", "worst") about specific brands โ€” we report measurements, not verdicts.
  • We don't scan sites that block our bot. FixAEOBot/1.0 respects robots.txt โ€” add a Disallow: /rule for that user-agent and we'll stop on the next refresh.

Opting out

If you represent a brand and want its data removed from our public surfaces (leaderboard + per-brand page):

  1. Email [email protected] from a brand-affiliated address.
  2. Mention the brand name + the URL(s) you want removed.
  3. We remove within 7 days, no proof of representation required. We'd rather honor a request than fight about it.

Alternatively: add Disallow: / for User-agent: FixAEOBot in your robots.txt and we'll skip you automatically on the next seed run.

Try it yourself

Run a free audit on your own URL and see exactly how these scores are computed on real data.

Run a free AEO audit