{
 "id": "6.9",
 "title": "AI search visibility",
 "department": "AI and models",
 "department_slug": "ai-and-models",
 "direction": null,
 "branded": false,
 "status": "draft",
 "owner": "Param",
 "last_verified": "Mon Oct 26",
 "holds": "Reading and improving what AI answers say about a brand",
 "urls": {
  "html": "https://handbook.joinsquareup.com/ai-and-models/ai-search-visibility",
  "markdown": "https://handbook.joinsquareup.com/ai-and-models/ai-search-visibility.md",
  "json": "https://handbook.joinsquareup.com/ai-and-models/ai-search-visibility.json"
 },
 "other_directions": [],
 "tldr": {
  "headline": "We ask the AIs about a brand, then propose the page fix",
  "points": [
   {
    "icon": "eye",
    "text": "Eight shopper questions, at least five unbranded, asked from the brand's own market."
   },
   {
    "icon": "chat",
    "text": "ChatGPT, Gemini and Perplexity are asked through treg; Claude sits out while we run on Gemini."
   },
   {
    "icon": "check",
    "text": "Only real answers count; a tool that failed is never scored as not named."
   },
   {
    "icon": "spark",
    "text": "Each gap gets one fix: a comparison, a proof block or an FAQ."
   },
   {
    "icon": "clock",
    "text": "The weekly check costs about 50 cents a brand and retries after 6 hours on failure."
   }
  ],
  "stat": {
   "value": "8",
   "label": "shopper questions per brand"
  },
  "decide": "Ask Claude through the Anthropic key for this one check, about 8 short calls a week?",
  "mood": "building"
 },
 "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"
 ],
 "open_questions": [
  "**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.",
  "**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.",
  "**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."
 ],
 "parts": {
  "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\n\n- **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].\n- **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].\n- 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].\n- The team can add up to 3 questions its customers ask [src: memory brew-proof-plain-make].\n- **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].\n\n### Who is asked\n\n| Tool | How | Price | Source |\n|---|---|---|---|\n| 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] |\n| Gemini | treg `dataforseo.x.ai-optimization-gemini-llm-scraper-live-advanced` | $0.004 | [src: brew/reader/stages/answers.js:102] |\n| Perplexity | treg `dataforseo.x.ai-optimization-perplexity-llm-responses-live`, sonar | $0.004 | [src: brew/reader/stages/answers.js:104] |\n| 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] |\n\n- 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].\n- 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].\n- Avoid `crawl4ai.ai-search.chatgpt.scrape` at 3% success and llm-mentions at $0.10 [src: memory treg-catalog-for-brew].\n\n### When\n\n| Run | Cadence | Cost | Source |\n|---|---|---|---|\n| 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] |\n| 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] |\n\n### What we read from each answer\n\n- 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].\n- 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].\n- Two ledger facts: AI answers that name the brand, and unbranded AI answers that name it [src: brew/reader/stages/answers.js:131-132].\n\n### The standing\n\n- `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].\n- 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].\n- 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].\n\n### Improving it\n\n- **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].\n\n| Question kind | Fix | Source |\n|---|---|---|\n| compare | A comparison section beside the rival the answers named | [src: brew/ai-gap.js:22] |\n| proof | A proof block: what it does, how long, the reviews that say so | [src: brew/ai-gap.js:23] |\n| safe | An ingredients FAQ answering in its first line | [src: brew/ai-gap.js:24] |\n| price | An FAQ with price and pack sizes | [src: brew/ai-gap.js:25] |\n| howto | A two-sentence answer block | [src: brew/ai-gap.js:26] |\n| best, other | An FAQ answering in its first line | [src: brew/ai-gap.js:27-28] |\n\n- **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].\n- **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].\n- 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 |\n|---|---|---|\n| Real answers only, from the brand's market, sourced questions, one check per ring | v1 | Stays |\n| Claude asked again once the provider is Anthropic | v1 | Changes |\n| A draft of the fix itself, the FAQ block or comparison section, ready to paste | v1 | New |\n| Publishing that fix to the brand's store on a yes | v2 | New |\n| Measuring whether a fix moved the brand into the answers, week on week | v3 | New |\n| 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].\n2. 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].\n3. 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].\n4. 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 |\n|---|---|---|---|\n| Named | AI answers that name the brand, over answers | ledger `ai.named.of` [src: brew/reader/stages/answers.js:131] | Live |\n| Unbranded named | Unbranded answers that name the brand, over unbranded answers | ledger `ai.named.unbranded` [src: brew/reader/stages/answers.js:132] | Live |\n| By tool | Named over answers, per tool | `profile.ai.score.byTool` [src: brew/reader/stages/answers.js:130] | Live |\n| 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.\n2. **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.\n3. **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."
 }
}