AEO Open Measurement Spec, v0.1 (September 2026)
A minimal, vendor-neutral way to record AI-answer visibility so that numbers from different tools, teams and weeks can be compared. Published alongside The Definitive 2027 Guide to AEO (StackedGTM). Anyone may adopt it; trackers are asked to label exports against it.
1. Prompt inventory (prompts.csv)
| Field | Required | Values / notes |
|---|---|---|
| prompt_id | yes | stable id; never reused |
| class | yes | discovery, comparison, validation, category education, renewal |
| brand_scope | yes | unbranded, competitor-branded, own-brand |
| base_prompt | yes | exact text |
| variant_type / variant_value | no | segment, role, constraint, year, persona |
| segment | no | free text |
| engine_scope | no | all, or a list |
| added_on / retired_on | yes / no | ISO dates; editing a prompt = retire + add |
| notes | no | source of the prompt (sales call, ticket, fan-out) |
2. Run log (runs.csv)
Required: run_id, prompt_id, engine, tier, locale, collection_method, run_number, timestamp, mentioned, recommended, cited_owned_domain, status. Optional: in_initial_search (0/1/unknown), cited_url, competitor_names, answer_text, fanout_queries, persona_cohort.
- collection_method is
ui(the consumer product) orapi. Never compare the two. - tier is the product tier the run used (free, plus, pro, api-model-name).
- status is
okorfailed; failed runs are collection failures, never lost visibility. - persona_cohort is blank for clean sessions; otherwise the cohort label.
3. Events, kept separate
| Event | Definition |
|---|---|
| in_initial_search | the brand name appeared in the engine's own background queries (only where observable) |
| mentioned | the brand appears in the answer text |
| recommended | the answer selects or endorses the brand, not merely lists it |
| cited_owned_domain | a link in the answer points at a domain the brand owns |
| description_accuracy | the answer's description of the brand matches an approved fact sheet (scored separately) |
| citation_support | the cited page supports the claim it's attached to (supports / partial / contradicts / unrelated) |
4. Comparison rule
Series key = prompt_id + engine + tier + locale + collection_method (+ persona_cohort). Anything that differs on the key is a different series, never a change.
5. Thresholds and reporting
- Per prompt per week: "won" when the event occurred in at least 3 of 5 completed runs. Fewer than 5 completed runs: excluded and listed under coverage.
- Rates are reported by brand_scope and class, never blended. Shortlist inclusion (mentioned, recommended) on unbranded and competitor-branded prompts only. Own-brand prompts report recommendation, citation and accuracy only.
- Every rate carries its cell size (answers) and an interval. About 300 answers per cell for roughly ±5 points.
- A threshold crossing is a review flag with raw counts; it becomes a result when it holds two consecutive weeks.
- Model and engine changes are annotated by date on every chart.
6. Disclosure
Any published visibility number states: engine, tier, locale, collection_method, date range, prompt count, runs per prompt, cell size, and whether persona cohorts were used. Numbers without these are not comparable to anything.
7. What this spec does not do
It does not define how to collect answers, score accuracy, or attribute business outcomes. It defines how to record and compare what was observed.
Changes: propose them as pull requests against the skill repository.