# Comparison pages and AI citation > A protocol for writing, at scale and with a real gate, the pages that answer what your audience searches and asks ChatGPT, Gemini and Perplexity: "A or B", "does A work", "alternatives to A", symptom to service, and comparisons with named competitors. The goal is to be the source an answer engine can quote without risk. Published: 2026-10-21 ## What works and what does not Answer engines quote pages that state a checkable fact, say where it came from and the date, and answer one question each. They do not reward volume. The same technique applied by swapping a city name into one template produces doorway pages, which search engines demote. - **Works:** one real question per page, a direct answer, a table with sources, an honest section on where the other side is better, the same data in the visible page and in the schema. - **Does not work:** one template with the place changed, claims about a competitor you did not read on their own site, superlatives about your own brand, pages for places you do not serve. - **Expect citation more than clicks.** Comparison and question pages are written for answer engines and for people who already know a brand name; they rarely bring much search traffic on their own. Measure both before you promise either. > **Warning:** This guide is a method, not legal advice. Brazilian references are listed so you can read the original texts before publishing. ## 1. Find the terms Keep five separate lists. Each one has an owner and a rule. **Where terms come from** | List | Source | Rule | | --- | --- | --- | | Queries without a page | Search Console export (query by page), 90 days; `gsc_oportunidades.py` does the cross | Impressions at or above a floor and no page covering most of the words. A page already ranking near position 8 is reinforced, not duplicated. | | Site search with no result | Your own search box log | Count at least 2 before it becomes a page. | | Questions people ask AI | The AI visibility tracker prompts and what customers say they typed in the chat | Phrase the page title the way the question is asked. | | Sources the engines cite | Cited domains and URLs per prompt and engine; the AI Overview collected over 7 or more days | What appears in 80% or more of the answers becomes a required section. | | Queries with a competitor name | Search Console plus the competitor list in the site registry | Separate list. Only feeds the named templates, only with an opened public source, and the page starts hidden (noindex) until a person reviews it. | Cut every term the site already answers. If a page exists, improve it. Two pages for one query compete with each other. ## 2. Choose the template Every template needs a verifiable fact, schema generated from the same data as the page, and internal links to pages that exist. **Templates** | Template | Example | Verifiable data | Notes | | --- | --- | --- | --- | | A or B (concept) | Tendinitis or tendinosis? | Guideline or systematic review with a DOI you opened | No brand names; both sides neutral. | | Does A work? | Does tape work? | Same; say "not enough evidence" with the source when it is true | Always send alarm signs to a professional. | | You or Competitor A | Brand Example or Competitor A | The competitor's own public pages, opened, with the date checked | Two tables: where you lead and where the competitor ties or wins. "Does not list" never becomes "does not have". | | Alternatives to A | Alternatives to Competitor A | A list with a declared criterion | Your brand is not first by default. | | Best A in a place | A in District One | Address, hours and coverage you really have | Only where you serve. No ranked list that puts you first. | | Symptom to service | Pain behind the thigh: causes | Signs, causes, when to see a doctor | Condition rules of your profession apply. | | Question to answer | How long is a visit? | A fact about your own business, dated | FAQ schema. | Common frame: direct answer in up to 80 words, table of 6 to 10 criteria, 4 to 6 sections titled as questions, "when each one makes sense", 5 to 10 FAQ items, sources, 3 to 6 internal links, author box with a real name and credential, review date. ## 3. The quality gate Machine first, then a person reads a sample. These rules block publication until fixed: - **Nothing invented about a competitor.** Every statement points to a source that someone opened, with the date. "Does not list" means the page you read does not mention it. - **A fact has a source.** DOI checked against the registry, URL opened. A dead link is an error. - **No promise of results.** No "guaranteed", "100%", "cure", no before and after, no testimonials where your profession forbids them. - **Professional board rules** loaded into the gate (medical, psychology, physiotherapy and legal boards each have their own advertising rules). - **Comparative advertising.** Objective, provable comparison; no general claim of superiority; no confusion between brands; no disparagement. - **No self-ranking.** Declared criterion, your brand not first by default, say where the competitor wins, no "the best" about yourself. - **No invented places.** A place page needs real service there. - **No doorway.** Sibling pages must differ: Jaccard similarity below 0.5, and one different question per page. - **No first-person experience you cannot back** ("in my clinic I see…") unless the professional approved it. Brazilian references to read before publishing comparisons: CONAR Code, article 32 (comparative advertising: objective, provable, not disparaging, self-regulation without force of law); Consumer Defense Code, articles 36 and 37 (misleading and abusive advertising); Industrial Property Law 9,279/1996, article 195, items I and II (false statements about a competitor to gain advantage as unfair competition). Check the official text; this is not legal advice. Run it with the command below. Exit code 1 means at least one error; warnings (long direct answer, a source that blocked the robot, a check older than 90 days) do not block. ## 4. Scale in waves with a canary - **Plan file.** One row per page: slug, question, sides, template, linked service, whether you serve the place. Cut what the site already answers before any agent starts. - **Wave 0 (canary).** 3 to 6 pages of different templates, written by agents from a written brief (one file per page, never edit the page registry, drafts in a temp folder, research by web only, a report listing what was left out for lack of a source). A person reviews all of them. Named-competitor pages start hidden. - **Next waves.** 5 to 30 pages, one wave at a time; the next starts after the last was reviewed and merged. The registry and the sitemap belong to the orchestrator, not to the agent. - **Cadence.** A new site publishes at most 4 new pages a week; record a 28-day measurement window per page and do not edit a page inside its window. - **Tripwire.** After each wave check position by page type in Search Console and the similarity between siblings. A drop, or similarity over the limit, freezes the next wave and opens a consolidation: redirect the weak pages to the strong one with 301, do not mass noindex. - **Publish.** Notify IndexNow, keep a real `lastmod` in the sitemap, generate `llms.txt` from the content. ## 5. Measure, and claim only what you measured - **Citation by AI:** an AI visibility tracker per site, neutral prompts separate from brand prompts, competitors registered with their domains. Read the 28-day trend only when the comparison is marked comparable; incomplete or missing baselines do not allow "went up" or "went down". - **By URL:** which page type the engines cite. Without it no template gets credit. - **Search Console:** impressions, clicks and position by page type and by wave, 28 days after the wave. The AI features report in the Search Console interface is not available through the API. - **Conversion:** ask people who say AI sent them what they typed in the chat. - **Wording:** a sentence like "most cited" needs the round, the date, the number of prompts, the engines and the competitor list. Otherwise write "not measured". A single round can swing a lot between weekly rounds with the same prompts. Read at least four rounds before you publish a result. ## The command and a draft `hub/paginas_comparacao.py` is Python standard library only. It reads the Search Console CSV, classifies each query into a template, separates create from reinforce, drops places you do not serve, writes draft skeletons with fields to fill (it writes no facts) and runs the gate. ```bash # 1. terms: Search Console export (query, clicks, impressions, position, page) -> prioritized list python3 -m hub.paginas_comparacao termos --gsc queries.csv \ --concorrentes "Competitor A,Competitor B" --lugares "District One,District Two" --atendemos "District One" \ --paginas pages.txt --saida terms.json # 2. drafts: one skeleton per term with action "criar"; no fact is written for you python3 -m hub.paginas_comparacao rascunhos terms.json --pasta drafts/ --marca "Brand Example" --idioma en # 3. gate: exit code 1 on any error; run before the pull request python3 -m hub.paginas_comparacao portao drafts/*.md --idioma en ``` A passing draft looks like this (front matter, then sections; the gate checks both): ```markdown --- molde: vs termo: brand-example or competitor a marca: Brand Example concorrente: Competitor A lugar: atendimento: n/a conselho: none verificado_em: 2026-10-15 --- # Brand Example or Competitor A: which one fits you? ## Direct answer One or two self-contained paragraphs, up to 80 words. ## Criterion Criterion: what each public site lists on 2026-10-15, alphabetical order. ## Facts - One verifiable fact. [source: https://competitor-a.test/plans] ## Table | Criterion | Brand | Other side | Source | | --- | --- | --- | --- | | Opening hours | until 8 pm | until 7 pm | https://competitor-a.test/hours | ## Where the competitor wins - At least one item, with source. ``` Source code and tests: [`hub/paginas_comparacao.py`](https://github.com/BRK13/krohnos/blob/main/hub/paginas_comparacao.py), [`tests/test_paginas_comparacao.py`](https://github.com/BRK13/krohnos/blob/main/tests/test_paginas_comparacao.py).