Pular para o conteúdo
,

O checklist AEO para auditar uma página que ranqueia no Google e nunca aparece em respostas de IA

Use o checklist AEO com 12 itens para auditar páginas que ranqueiam no Google, mas não aparecem em respostas de IA.

Avatar de DK
DKTrabalha com Linux e Unix a mais de 23 anos e possui as certificações LPI 3, RHCE, AIX e VIO.

23 set, 2026
15 min de leitura

Se você tem 30 segundos (TL;DR)

  • AEO é o trabalho de fazer uma página ser citada em respostas de IA, além de ranquear. O checklist AEO tem 12 itens verificáveis. O script faz checagens automáticas em 9 deles, várias parciais. Os outros 3 dependem de leitura.
  • Ranking e citação são dois filtros separados. Passar no primeiro não garante o segundo.
  • Mover a definição para as primeiras 50 palavras rende mais que qualquer ajuste de palavra-chave.
  • No estudo GEO, encher o texto com palavra-chave baixou a visibilidade. Números com fonte e citações diretas aumentaram a visibilidade.
  • Antes do texto, confira a parte técnica: a página precisa estar indexada, exibir snippet e permitir o rastreamento no robots.txt. A medição sugerida aqui cobre só a Busca do Google.

O que o AEO otimiza

AEO (Answer Engine Optimization) significa otimização para engines de resposta. O Google chama esse trabalho de AEO ou GEO. Para o Google, isso continua sendo SEO.

Pense no AEO como arrumar a vitrine de uma padaria. O ranking põe a padaria na rua por onde o cliente passa. A citação acontece quando o cliente olha a vitrine e escolhe um pão já pronto. O sistema de IA age como esse cliente com pressa: ele lê o conteúdo exposto e não entra na cozinha para procurar.

A página que ranqueia já está na rua certa. O checklist AEO cuida do que fica exposto na vitrine.

O caminho da pergunta até a citação

checklist-aeo-diagram01

O guia do Google para busca com IA generativa descreve dois mecanismos. O primeiro é a geração aumentada por recuperação (RAG). Os sistemas de ranking buscam páginas no índice. Depois o sistema revisa a informação específica de cada página e gera a resposta com links.

O segundo é o fan-out. O modelo dispara consultas relacionadas em paralelo para buscar mais resultados. O exemplo do guia parte de uma consulta ampla e gera as subconsultas do desenho.

O SEO clássico cuida do filtro 1. Se a página foi recuperada para compor a resposta, a ausência de citação pode estar no segundo filtro. Ranquear na consulta original não comprova essa recuperação. O checklist AEO mira esse segundo filtro.

Teste o filtro 1 nas subconsultas

O fan-out busca subconsultas diferentes da consulta em que a página ranqueia. Nessas subconsultas, a página pode cair no filtro 1 e nem chegar ao filtro 2. Reescrever a definição, como pede o checklist AEO, não resolve quando a página cai no primeiro filtro.

checklist-aeo-diagram02

Rode esse teste no Google Search Console antes de aplicar o checklist AEO. Uma variação sem impressões também pode ser uma consulta sem volume no período.

As variações escritas por você são uma estimativa. O modelo pode gerar outras subconsultas, e o teste não mostra quais. Ele descarta o caso em que a página nem aparece para as variações óbvias, antes de você gastar tempo com o checklist AEO.

O efeito do texto por posição no ranking

Método do estudo GEO Fonte na posição 1 do Google Fonte na posição 5 do Google
Cite Sources -30,3% +115,1%
Quotation Addition -22,9% +99,7%
Statistics Addition -20,6% +97,9%

A tabela vem do estudo GEO, de Aggarwal e coautores. Os autores montaram uma engine generativa com as 5 primeiras páginas do Google para cada consulta. O ranking seleciona as cinco fontes; entre as fontes já selecionadas, o experimento avalia o efeito das alterações de texto. Um modelo gerava a resposta e citava essas fontes.

Nesse experimento, todas as fontes foram otimizadas simultaneamente. Os valores mostram a variação média de visibilidade por posição original no Google. Com Cite Sources, a fonte na posição 5 ganhou 115,1%. Quando a fonte na posição 1 aplicou o método junto com as outras, perdeu 30,3%.

A tabela indica que o texto altera a parcela de uma página que já chegou ao modelo, ou seja, age no filtro 2. O sinal desse efeito mudou com a posição da fonte.

O que o estudo GEO mediu

Método O que muda no texto Engine do estudo Perplexity
Sem otimização nada 19,3 24,1
Keyword Stuffing mais palavras da consulta 17,7 21,9
Cite Sources cita fontes confiáveis 24,6 26,8
Statistics Addition troca discussão por número 25,2 26,2
Quotation Addition adiciona citação direta 27,2 29,1

Os dados vêm das tabelas 1 e 7 do estudo GEO. A métrica é a contagem de palavras ajustada pela posição. Ela mede quanto da resposta vem de cada fonte e dá mais peso às frases do começo da resposta. No Perplexity, os autores rodaram 200 consultas com arquivos enviados, com respostas limitadas a esses arquivos.

O Keyword Stuffing ficou abaixo da linha de base nas duas engines. No Perplexity, caiu de 24,1 para 21,9. O guia do Google trata de outro ponto. Ele diz que variações de cauda longa não são necessárias, porque os sistemas de IA entendem sinônimos. O guia não afirma que excesso de palavra-chave reduz a visibilidade.

Gastar tempo com densidade de palavra-chave numa página que já ranqueia é desperdício. Por isso o checklist AEO não tem item de densidade.

O estudo mede a posição da frase na resposta gerada, e não a posição da definição na sua página. A regra das 50 palavras do checklist AEO é uma aposta prática minha e não tem medição publicada.

O checklist AEO com 12 itens

# Item Critério de aprovação Como verificar Base
1 Definição no topo o termo central aparece definido nas primeiras 50 palavras do corpo script aposta prática, sem medição
2 H1 descritivo o título resume o conteúdo, sem exagero nem choque leitura Google, conteúdo útil (não mede citação)
3 H2 em forma de pergunta todo H2 termina em “?” script aposta prática, sem medição
4 Resposta logo após o H2 a primeira frase depois do H2 responde a pergunta dele leitura ou prompt aposta prática, sem medição
5 Parágrafo-resposta curto o primeiro parágrafo depois de cada H2 tem até 60 palavras script aposta prática, sem medição
6 Dado citável pelo menos 1 parágrafo com número e link para fonte externa script GEO, Statistics e Cite Sources
7 Citação direta pelo menos 1 citação atribuída a uma fonte com nome leitura GEO, Quotation Addition
8 Autoria assinatura visível com link para a página do autor script e leitura Google, conteúdo útil (não mede citação)
9 Data visível data em destaque, com rótulo “Publicado” ou “Atualizado” script e leitura Google, datas de byline (não mede citação)
10 Data coerente a data no bloco de dados estruturados (JSON-LD) coincide com a data no atributo HTML (datetime); confira o texto visível script e leitura Google, datas de byline (não mede citação)
11 Snippet liberado meta robots sem noindex/nosnippet e definição fora de data-nosnippet script Google, requisito de elegibilidade
12 Robôs liberados o robots.txt permite Googlebot e OAI-SearchBot script Google e OpenAI, requisito de acesso

A coluna “Base” do checklist AEO separa o que tem fonte do que é aposta minha. Os itens 1, 3, 4 e 5 são a aposta. Os itens 2, 8, 9 e 10 vêm de guias do Google sobre conteúdo útil e datas de byline. Nenhum desses guias mede citação em resposta de IA.

O item 11 e a liberação do Googlebot no item 12 são requisitos documentados para a página entrar no índice com snippet no Google. A permissão ao OAI-SearchBot trata do acesso para a busca do ChatGPT. Eles tratam do acesso e da elegibilidade, e não da citação. Só os itens 6 e 7 têm evidência ligada ao filtro 2. Essa evidência vem de um único estudo com gpt-3.5-turbo, sem réplica verificada.

O Google afirma que não é preciso picotar o conteúdo nem reescrever para IA. Concordo em parte. Definição no topo, item 1 do checklist AEO, atende primeiro ao leitor humano, e o mesmo guia pede páginas organizadas e fáceis de seguir.

Rode a auditoria automática

Arquivo auditoria_aeo.py:

import re
import sys
import urllib.robotparser
from urllib.parse import urljoin, urlparse

import requests
from bs4 import BeautifulSoup

MAX_WORDS_TO_DEFINITION = 50
MAX_ANSWER_WORDS = 60
BOTS = ("Googlebot", "OAI-SearchBot")
# Wikipedia, and many other sites, answer 403 to the default agent of requests
# and of urllib. Both requests here send this header.
HEADERS = {"User-Agent": "Mozilla/5.0"}
# Portuguese definition verbs, escaped to keep the file ASCII.
DEFINITION_VERB = re.compile(r"\b(\u00e9|s\u00e3o|significa|define|consiste)\b", re.IGNORECASE)
DATE_LABEL = re.compile(r"\b(publicado|atualizado)\b", re.IGNORECASE)
LD_DATE = re.compile(r'"(datePublished|dateModified)"\s*:\s*"(\d{4}-\d{2}-\d{2})')
AUTHOR_LINK = 'a[rel~="author"][href], .author a[href], .byline a[href], [itemprop="author"] a[href]'

def count_words(text):
    return len(re.findall(r"\w+", text))

def normalize(text):
    return " ".join(text.split())

def find_definition(paragraphs, term):
    total = 0
    for sentence in re.split(r"(?<=[.!?])\s+", " ".join(paragraphs)):
        total += count_words(sentence)
        if term.lower() in sentence.lower() and DEFINITION_VERB.search(sentence):
            return total, normalize(sentence)
    return None, None

def report(item, passed, detail):
    print(f"[{'OK' if passed else 'FALHA'}] {item:>2} {detail}")

def has_external_link(paragraph, host):
    return any(urlparse(a.get("href", "")).netloc not in ("", host) for a in paragraph.find_all("a"))

def audit(url, term):
    soup = BeautifulSoup(requests.get(url, timeout=15, headers=HEADERS).text, "html.parser")
    body = soup.find("article") or soup.body
    paragraphs = body.find_all("p")
    headings = body.find_all("h2")
    host = urlparse(url).netloc

    position, definition = find_definition([p.get_text(" ", strip=True) for p in paragraphs], term)
    report(1, position is not None and position <= MAX_WORDS_TO_DEFINITION,
           f"definicao termina na palavra {position}")

    questions = [h for h in headings if h.get_text(strip=True).endswith("?")]
    report(3, bool(headings) and len(questions) == len(headings),
           f"{len(questions)} de {len(headings)} H2 em forma de pergunta")

    long_answers = [h.get_text(strip=True) for h in headings
                    if (p := h.find_next("p")) and count_words(p.get_text()) > MAX_ANSWER_WORDS]
    report(5, not long_answers, f"respostas longas: {long_answers}")

    cited = [p for p in paragraphs if re.search(r"\d", p.get_text()) and has_external_link(p, host)]
    report(6, bool(cited), f"{len(cited)} paragrafos com numero e fonte externa")

    author_link = soup.select_one(AUTHOR_LINK)
    report(8, author_link is not None,
           f"link de autoria: {author_link['href']}" if author_link else "sem link de autoria")

    time_tag = soup.find("time", datetime=True)
    visible = time_tag["datetime"][:10] if time_tag else None
    labeled = time_tag is not None and bool(DATE_LABEL.search(time_tag.parent.get_text(" ", strip=True)))
    report(9, labeled, f"data no atributo datetime: {visible}, rotulo Publicado/Atualizado: {labeled}")

    ld_dates = dict(m.groups() for s in soup.find_all("script", type="application/ld+json")
                    for m in LD_DATE.finditer(s.string or ""))
    report(10, visible in ld_dates.values(), f"JSON-LD: {ld_dates} vs datetime: {visible}")

    meta = " ".join(m.get("content", "") for m in soup.find_all("meta", attrs={"name": "robots"})).lower()
    blocks = [normalize(el.get_text(" ", strip=True)) for el in soup.select("[data-nosnippet]")]
    hidden = definition is not None and any(b and (definition in b or b in definition) for b in blocks)
    blocked = "noindex" in meta or "nosnippet" in meta or hidden
    detail = "sem definicao para conferir" if definition is None else f"definicao em data-nosnippet: {hidden}"
    report(11, not blocked, f"meta robots: '{meta}', {detail}")

    # robots.read() uses urllib, which sends no header and receives 403. A
    # RobotFileParser on a 403 answers False to every bot, so the item would
    # report a block that does not exist.
    robots = urllib.robotparser.RobotFileParser()
    robots.parse(requests.get(urljoin(url, "/robots.txt"), timeout=15, headers=HEADERS).text.splitlines())
    for bot in BOTS:
        report(12, robots.can_fetch(bot, url), f"{bot} liberado no robots.txt")

if __name__ == "__main__":
    audit(sys.argv[1], sys.argv[2])

Para rodar:

$ pip install requests beautifulsoup4
$ python auditoria_aeo.py https://example.com/sua-pagina "termo central"

No item 1 do checklist AEO, o script procura a primeira frase com o termo e um verbo de definição nos parágrafos. A contagem considera só os parágrafos. Uma definição sem esses verbos gera falso negativo, então confira por leitura se o item 1 falhar.

No item 8, o script encontra o link na assinatura sem validar para onde ele aponta. Clique nele para checar se leva à página correta. No item 9, ele localiza o rótulo perto da data, mas não verifica como esse elemento está destacado visualmente.

No item 10, o script compara o atributo datetime com o JSON-LD, mas não lê a data exibida para o leitor. Confira essa data por leitura:

O que verificar Por quê? Onde está?
A data exibida ao usuário Ela não é lida automaticamente pelo script No JSON-LD vs atributo datetime

No item 11, a checagem é parcial: ele lê a meta tag robots no HTML, mas ignora cabeçalhos HTTP e diretivas específicas para Googlebot.

No item 12, o script baixa o robots.txt com o mesmo cabeçalho do resto. Se o servidor recusar esse pedido, o resultado do item perde valor. Abra o robots.txt no navegador para conferir o arquivo diretamente.

Use um prompt nos itens de leitura

Os itens 2, 4 e 7 do checklist AEO dependem de julgamento. Vamos passar esses itens para um modelo e revisar a resposta dele.

Leia o texto abaixo. Responda em três blocos numerados, sem comentário extra.

1. Copie a primeira frase que define "{termo}". Informe quantas palavras vêm antes dela.
2. Para cada H2, diga "sim" ou "não": a primeira frase depois dele responde a pergunta do H2?
3. Liste cada citação direta e o nome da fonte atribuída. Se não houver, escreva "nenhuma".

Depois, avalie o H1 em uma linha: ele resume o conteúdo sem exagero?

Texto:
{texto}

Trate a saída do modelo como rascunho de revisão do checklist AEO. O modelo pode errar a contagem de palavras, então o script continua valendo para o item 1.

Corrija na ordem dos filtros

checklist-aeo-diagram03

A ordem do checklist AEO segue os filtros do primeiro desenho. O Google só usa como link de apoio uma página indexada e elegível para exibir snippet. O guia de 2026 acrescenta um requisito: o site precisa estar incluído nos recursos de IA generativa da Busca, no Search Console.

Para limitar o que aparece da página, o Google usa nosnippet, data-nosnippet, max-snippet e noindex. Um data-nosnippet esquecido na introdução impede o uso do trecho nas exibições que esse controle cobre. O item 11 do checklist AEO pega esse caso.

A documentação de robôs da OpenAI separa busca de treino. Um site que bloqueia o OAI-SearchBot não aparece nas respostas de busca do ChatGPT, embora ainda possa aparecer como link de navegação. O GPTBot controla só o uso em treino, e as duas regras são independentes. Depois de mudar o robots.txt, a busca do ChatGPT pode levar cerca de 24 horas para se ajustar.

Publique data e autoria legíveis


<article>
  <p class="byline">
    Por <a rel="author" href="/autor/nome-do-autor">Nome do Autor</a>.
    <time datetime="2026-09-22">Atualizado em 22 de setembro de 2026</time>
  </p>
  <script type="application/ld+json">
  {
    "@context": "https://schema.org",
    "@type": "BlogPosting",
    "headline": "O checklist AEO para auditar uma página",
    "datePublished": "2026-09-22T08:00:00-03:00",
    "dateModified": "2026-09-22T08:00:00-03:00",
    "author": {"@type": "Person", "name": "Nome do Autor", "url": "https://example.com/autor/nome-do-autor"}
  }
  </script>
</article>

As regras de data do Google, base dos itens 9 e 10 do checklist AEO, pedem uma data visível, em destaque e rotulada. A data visível e a do JSON-LD precisam coincidir. Não use data futura nem a data do evento descrito na página. Se o Google escolher a data errada, reduza as outras datas do documento.

O guia de conteúdo útil recomenda assinatura visível que leve à página com informações do autor. Revise também por leitura se a atualização corresponde a uma mudança substancial no conteúdo.

O que o Google sugere ignorar

O guia de 2026 lista o que não ajuda na Busca do Google:

Arquivos llms.txt e marcações especiais: sem efeito, pois a Busca os ignora;

Dados estruturados: não são requisito para recursos de IA;

Menções inautênticas: buscar tais citações não é tão útil quanto pode parecer.

A frase do Google vale para a Busca, e não para o llms.txt em geral. Agentes usam o arquivo, e já escrevi sobre quais páginas colocar no llms.txt se um LLM só puder ler 5. A própria OpenAI publica um arquivo desse tipo.

A dúvida está nas engines de busca. O Google diz que ignora o llms.txt, e não encontrei evidência de que outra engine use o arquivo para recuperar ou citar páginas. O checklist AEO mira os dois filtros da busca, então ele não traz item de llms.txt. Mantenha o arquivo para os agentes e não espere ganho de citação na busca por causa dele.

Meça com uma página de controle

            antes da correção        depois da correção
página A    relatório de IA          relatório de IA     <-- corrigida
página B    relatório de IA          relatório de IA     <-- controle, sem mudança

Para medir o resultado do checklist AEO, use o relatório de desempenho de IA generativa do Search Console antes e depois da intervenção. Esse relatório cobre só a Busca do Google. Não tenho um método equivalente para medir citações no ChatGPT ou no Perplexity.

Comparar antes e depois sem controle mistura o efeito da edição com mudanças de engine ou de demanda. Escolha duas páginas parecidas, altere uma e mantenha a outra intacta no mesmo intervalo. O controle reduz esse ruído, mas duas páginas não provam causalidade estrita.

Comece pela página de maior tráfego

1. rode auditoria_aeo.py na pagina de maior trafego do site
2. item 12 ou 11 com FALHA? corrija esses dois antes de mexer no texto
3. escolha uma pagina parecida como controle e nao mexa nela
4. anote o relatorio de IA do Search Console das duas paginas
5. corrija o item 1 na pagina auditada
6. rode o script de novo e compare as duas paginas no mesmo intervalo

Os itens 12 e 11 vêm primeiro porque decidem se a página chega ao modelo. Sem acesso do robô e sem snippet, nenhuma edição de texto passa do filtro 1.

Com os dois liberados, eu arrumaria o item 1 do checklist AEO: a definição do termo central nas primeiras 50 palavras do corpo. Pegue o termo que a página explica e escreva o que ele é, com verbo de definição, antes de qualquer contexto. A seção “O que o AEO otimiza” faz isso na primeira frase: “AEO significa otimização para engines de resposta.”

O item 1 é aposta minha, sem medição publicada. A página de controle mostra se eu errei.


Tabelas 1 e 7 estudo GEO

geo_table-1

geo_table-7

Fontes

Avatar de DK

Comentários

Deixe um comentário

Seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Ir para