Version 2026.07 · Living document
How Aelo measures AI visibility
Every formula. Every threshold. Every disclosure. Read it before you trust any number Aelo shows. When the methodology changes, we bump the version at the top of this page and log the change below, we never silently retune a metric behind your back.
Principles
01
The receipt is the product
Every derived number in Aelo is one click from the raw scans that produced it, prompt sent, LLM response received, timestamp, platform. Verify any claim yourself.
02
Zero is honest
Low visibility means low visibility. We don't smooth it, we don't cap it, we don't paint it red just to alarm you. A score of 0 is a real answer, it means the AI didn't name your brand once.
03
No LLM-as-judge, no black boxes
We don't ask an LLM to score another LLM's answer. Every metric is a deterministic function of the raw response text (mention-match, position-match, citation-parse). No hidden model, no vibes.
04
Non-determinism, disclosed
LLMs drift run-to-run. A single scan is a sample, not a truth. Every dashboard number aggregates multiple scans to reduce noise; every number can still shift ±10 pts between measurements. We say so out loud.
The formulas
Every metric, computed line-by-line.
Mention rate
Percentage of tracked prompts where the AI named your brand.
mention_rate = (scans_where_brand_named / total_scans) × 100
Deterministic string match against your brand name and known aliases. Case-insensitive, word-boundary respected (so 'Notion' matches but not 'ancnotionally'). Aliases are stored per-workspace and editable.
Average position
When your brand IS named, how early in the AI's list?
avg_position = mean(position_index_of_first_mention) across mentioned scans
Position 1.0 = named first in the answer. We tokenize the response, find the first index containing the brand name, and average across scans where mention_rate = true. Scans where brand was not mentioned are excluded (not counted as ∞).
Health score / 100
Weighted composite: are you visible, and are you visible early?
health = round( mention_rate × 0.7 + position_boost × 0.3 ) where position_boost = 100 × max(0, (10 - avg_position) / 10)
Mention rate carries most of the weight because being named at all matters more than being named first. Position boost caps out at position 1 (100) and decays linearly to 0 by position 10. Health of 0 means never mentioned; 100 means named first in every scan.
Share of Voice
Your mentions as a fraction of all brand mentions in a category.
sov = (your_mentions / (your_mentions + Σ competitor_mentions)) × 100
Requires competitor names configured in your workspace. We count total occurrences of your name + each competitor's name across all scans in the window, then divide. If competitors aren't set, we show ', ', never a fake number.
Verdict tiers (India Index + metric badges)
Strict thresholds, no smoothing.
dominant = mention_rate ≥ 90 AND avg_position ≤ 2 strong = mention_rate ≥ 60 contested = 1 ≤ mention_rate ≤ 59 invisible = mention_rate = 0
Numeric thresholds only. There is no 'trending up' verdict. If the numbers say invisible, the badge says invisible, even if you feel like the trend is positive.
Scan cadence
When and how often we ask the AIs.
Prompt selection
Every workspace tracks a curated prompt list, either configured by the customer (Command tier), or authored by our team from intent research (Concierge tier). Prompts are stored and versioned; when they change, the change is logged.
Cadence
Scheduled scans run once per day per platform per prompt (Command), or every 6 hours (Concierge). Manual scans run on-demand and are indistinguishable in the receipt from scheduled ones.
Regionalization
Prompts can be sent with a region context ('Respond as if answering from India in English'). The region is stored with the scan; when a metric filters by region, only scans from that region contribute.
Rate limits + retries
Manual scans are rate-limited to 20/hour/user. Failed scans retry with backoff up to 3× before being marked failed and excluded from metrics. Failure reasons are visible in the receipt.
What we don't do
The tempting shortcuts we refuse.
We don't use LLMs to score LLMs.
LLM-as-judge introduces a black box you can't audit and a bias you can't measure. Everything downstream inherits both.
We don't average across platforms unless you ask.
Averaging ChatGPT + Gemini + Claude produces a single feel-good number that hides real strategic differences. Per-platform first, aggregate on request.
We don't include failed scans in the denominator.
A network error isn't 'invisible.' A rate limit isn't 'no mention.' Failed scans are logged, tagged, and excluded, with the failure visible in the receipt.
We don't hide our sample size.
If a metric is computed from 3 scans, we say so. If it's computed from 300, we say so. Sample size travels with every number in the drawer.
We don't retune metrics silently.
If a formula changes, the version at the top of this page bumps and a changelog entry appears below. Historical numbers get re-flagged as 'v1' vs 'v2' so year-over-year comparisons stay honest.
Data + retention
Where the receipts live, and for how long.
Storage
Raw scan rows (prompt, response, timestamp, platform, position, sentiment, citations) live in Postgres with per-workspace RLS. Only members of your workspace can read them. Aelo staff access requires an audit-logged support ticket.
Retention
90 days on Command, 24 months on Concierge, unlimited on Command Enterprise. Deleted workspaces have all scans purged within 30 days.
Export
Any workspace can export every scan as CSV or JSON. Nothing about a metric is proprietary to Aelo, take the receipts with you if you leave.
Third-party access
We do not sell, share, or aggregate customer scan data. Ever.
Methodology changelog
2026-07-05
Initial published version (v2026.07). Introduces Sage verdict tiers, honest-data policy, and non-determinism disclosure.
Trust the receipts, not the vibes.
See a live example: the India AI Visibility Index publishes every number with the same rules documented above. Every brand's score links back to the scans that produced it.