Krohnos
Português

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

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
ListSourceRule
Queries without a pageSearch Console export (query by page), 90 days; gsc_oportunidades.py does the crossImpressions 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 resultYour own search box logCount at least 2 before it becomes a page.
Questions people ask AIThe AI visibility tracker prompts and what customers say they typed in the chatPhrase the page title the way the question is asked.
Sources the engines citeCited domains and URLs per prompt and engine; the AI Overview collected over 7 or more daysWhat appears in 80% or more of the answers becomes a required section.
Queries with a competitor nameSearch Console plus the competitor list in the site registrySeparate 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
TemplateExampleVerifiable dataNotes
A or B (concept)Tendinitis or tendinosis?Guideline or systematic review with a DOI you openedNo brand names; both sides neutral.
Does A work?Does tape work?Same; say "not enough evidence" with the source when it is trueAlways send alarm signs to a professional.
You or Competitor ABrand Example or Competitor AThe competitor's own public pages, opened, with the date checkedTwo tables: where you lead and where the competitor ties or wins. "Does not list" never becomes "does not have".
Alternatives to AAlternatives to Competitor AA list with a declared criterionYour brand is not first by default.
Best A in a placeA in District OneAddress, hours and coverage you really haveOnly where you serve. No ranked list that puts you first.
Symptom to servicePain behind the thigh: causesSigns, causes, when to see a doctorCondition rules of your profession apply.
Question to answerHow long is a visit?A fact about your own business, datedFAQ 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, tests/test_paginas_comparacao.py.