---
id: "6.9"
title: "AI search visibility"
dept: ai-and-models
status: draft
owner: Param
branded: false
last_verified: 2026-10-26
sources:
  - "brew origin/main b91e364: reader/stages/answers.js:1-180, ai-questions.js:51-108, live-watch.js:1-37, 149-170 and 183-251, ai-standing.js:1-80, ai-gap.js:1-32, feed-service.js:1144, brand-kit.js:1-12 and 101, treg.js:20-27, cards-gen.js:258, plain.js:90"
  - "brew origin/main: sources/moves/15 Getting Arata cited in AI answers.txt"
  - "memory brew-ai-ring-one-check, brew-proof-plain-make, treg-catalog-for-brew, brew-gemini-provider, brew-brand-book"
---

# AI search visibility

## Answer

How Brew reads what ChatGPT, Gemini, Perplexity and Claude say when shoppers ask about a brand's category, who those answers name instead, and the specific page fix it proposes for each gap; it settles that we report only answers we really asked, from the brand's own market, and never guess a score.

## Today

### What is asked

- **The questions:** 8 shopper questions, at least 5 unbranded, because what an AI says before anyone names the brand is the test [src: brew/reader/stages/answers.js:92-94].
- **Where they come from, in order:** a sourced set from Google suggestions, search volume, threads Brew heard and best sellers; else the brand's last questions so weeks compare; else the model writes them; else a template [src: brew/reader/stages/answers.js:77-95] [src: brew/ai-questions.js:51-108] [src: brew/reader/stages/answers.js:147].
- In the sourced set, the model only picks; the reason for each question is built in code from evidence [src: memory brew-proof-plain-make].
- The team can add up to 3 questions its customers ask [src: memory brew-proof-plain-make].
- **Where from:** the brand's market and language, through `askMarket`; a market still to confirm says so on every answer [src: brew/reader/stages/answers.js:70-71] [src: brew/live-watch.js:37].

### Who is asked

| Tool | How | Price | Source |
|---|---|---|---|
| ChatGPT | treg `dataforseo.x.ai-optimization-chat-gpt-llm-scraper-live-advanced`, web search forced | $0.004 | [src: brew/reader/stages/answers.js:100] [src: memory treg-catalog-for-brew] |
| Gemini | treg `dataforseo.x.ai-optimization-gemini-llm-scraper-live-advanced` | $0.004 | [src: brew/reader/stages/answers.js:102] |
| Perplexity | treg `dataforseo.x.ai-optimization-perplexity-llm-responses-live`, sonar | $0.004 | [src: brew/reader/stages/answers.js:104] |
| Claude | Brew's own AI with web search 3, only when the provider is Anthropic | the model's price | [src: brew/reader/stages/answers.js:106-110] |

- Under Gemini today, Claude is not asked, because its answer would be Gemini's labelled Claude [src: brew/live-watch.js:159] [src: memory brew-gemini-provider].
- Answers are cached a week by treg, so the read, the live watcher and the weekly check share one paid answer [src: brew/treg.js:20-27].
- Avoid `crawl4ai.ai-search.chatgpt.scrape` at 3% success and llm-mentions at $0.10 [src: memory treg-catalog-for-brew].

### When

| Run | Cadence | Cost | Source |
|---|---|---|---|
| The read's answers stage | On a brand's first read and re-reads | per question per tool | [src: brew/reader/stages/answers.js:1-4] |
| The weekly AI answers check | Every 7 days, retried after 6 hours on failure | about $0.50 a run | [src: brew/live-watch.js:21-24] |

### What we read from each answer

- Is the brand named, in any of its names, so "PUMA India" counts when an answer says "Puma" [src: brew/reader/stages/answers.js:112-120] [src: brew/reader/stages/answers.js:170].
- Which rivals and other brands are named, and which sites are cited, and whether the brand's own site is cited [src: brew/reader/stages/answers.js:118-121].
- Two ledger facts: AI answers that name the brand, and unbranded AI answers that name it [src: brew/reader/stages/answers.js:131-132].

### The standing

- `ai-standing.js` builds who the brand is up against from who the answers actually name, where the shopper named no brand; the read's rivals stand in only without that pass [src: brew/ai-standing.js:36-44].
- A tool that failed is no answer, never counted as "not named"; a failed check says it couldn't be read and retries [src: brew/ai-standing.js:33] [src: brew/ai-standing.js:64].
- The AI answers ring uses one check only, the newest of the read and the weekly run; no bonus points; only tools that answered are named [src: memory brew-ai-ring-one-check].

### Improving it

- **The gap card:** one fix per gap, by question kind, pointing at the brand's own product page or a new guide page [src: brew/ai-gap.js:1-32] [src: brew/feed-service.js:1144].

| Question kind | Fix | Source |
|---|---|---|
| compare | A comparison section beside the rival the answers named | [src: brew/ai-gap.js:22] |
| proof | A proof block: what it does, how long, the reviews that say so | [src: brew/ai-gap.js:23] |
| safe | An ingredients FAQ answering in its first line | [src: brew/ai-gap.js:24] |
| price | An FAQ with price and pack sizes | [src: brew/ai-gap.js:25] |
| howto | A two-sentence answer block | [src: brew/ai-gap.js:26] |
| best, other | An FAQ answering in its first line | [src: brew/ai-gap.js:27-28] |

- **The Play:** the playbook includes a Play on getting the brand cited in AI answers, written first for Arata [src: brew/sources/moves/15 Getting Arata cited in AI answers.txt].
- **The Brand Book's AI files:** every brand gets `/<slug>/brand.md`, `/<slug>/brand.json` and `/<slug>/llms.txt`, an index an AI agent reads first, plus project notes for Claude and ChatGPT in the kit [src: brew/brand-kit.js:1-12] [src: brew/brand-kit.js:101].
- Cards say what the brand gains, such as "Show your star ratings in Google and AI answers", never the technical step [src: brew/cards-gen.js:258] [src: brew/plain.js:90].

## Tomorrow

| Item | Version | Tag |
|---|---|---|
| Real answers only, from the brand's market, sourced questions, one check per ring | v1 | Stays |
| Claude asked again once the provider is Anthropic | v1 | Changes |
| A draft of the fix itself, the FAQ block or comparison section, ready to paste | v1 | New |
| Publishing that fix to the brand's store on a yes | v2 | New |
| Measuring whether a fix moved the brand into the answers, week on week | v3 | New |
| Google AI overviews and AI mode added as a tool | v2 | New, Proposed |

## How we do it

1. Check a brand's standing on its AI answers sheet, from the card's proof shield, `GET /api/tenants/:t/ai-answers` [src: memory brew-proof-plain-make].
2. Never mix two checks on one card and never add points to a measured ring; `test/ai-ring-one-check.test.js` guards it [src: memory brew-ai-ring-one-check].
3. A new AI tool goes into the `ask` map with its own error branch, and is named only when it answered [src: brew/reader/stages/answers.js:99-110].
4. Keep the questions stable so weeks compare; change them only through the sourced set, which marks old runs as stale [src: brew/live-watch.js:232].

## Numbers

| Metric | Definition | Where measured | Status |
|---|---|---|---|
| Named | AI answers that name the brand, over answers | ledger `ai.named.of` [src: brew/reader/stages/answers.js:131] | Live |
| Unbranded named | Unbranded answers that name the brand, over unbranded answers | ledger `ai.named.unbranded` [src: brew/reader/stages/answers.js:132] | Live |
| By tool | Named over answers, per tool | `profile.ai.score.byTool` [src: brew/reader/stages/answers.js:130] | Live |
| Gap closed | Questions where the brand moved from not named to named within 4 weeks of a fix | weekly runs | Proposed |

## Open

1. **Claude in the check.** Claude sits out while Brew runs on Gemini, so the check shows three tools. Proposal: ask Claude through the Anthropic key for this one check even while the rest runs on Gemini, about 8 short calls a week a brand.
2. **Weekly check across many brands.** About $0.50 a brand a week. Proposal: keep it weekly for design partners and monthly for brands that only had a read.
3. **Google AI overviews.** Not asked today. Proposal: probe one treg endpoint for AI overviews on one brand with your yes, then add it if it answers reliably.
