SEO JavaScript: por que o ChatGPT pode não ver o seu site

Equipe NotHuman

Escrito com AI revisado por humanos.

Tempo de leitura: 14 minutos

SEO JavaScript é garantir que o conteúdo montado por JavaScript chegue ao Google e aos rastreadores de IA que indexam e citam páginas. O Google executa o código antes de indexar, mas os rastreadores de IA testados pela Vercel e pela MERJ em 2024 leram só o HTML inicial. Por isso, este guia mostra o processo, os testes e as correções.

Em resumo

  • O Google renderiza o JavaScript antes de indexar. Num estudo da Vercel com a MERJ no nextjs.org, por exemplo, a espera mediana foi de 10 segundos.
  • OpenAI, Anthropic e Perplexity não documentam se os seus rastreadores de IA executam JavaScript. Além disso, nenhum dos testados no estudo de 2024 executou.
  • O teste mais rápido é baixar a página com o user agent de cada robô e, em seguida, procurar o texto e os links.
  • Links com href, uma URL por rota, meta tags e dados estruturados no HTML do servidor são correções que cabem no código atual.

O Google renderiza páginas com JavaScript?

Sim. O guia Princípios básicos de SEO em JavaScript, do Google, descreve três fases: rastreamento, renderização e indexação. Toda página com status 200 entra numa fila de renderização, salvo se uma meta tag robots ou um cabeçalho pedir para não indexar. Em seguida, um Chromium sem interface executa o código, e o Google indexa o HTML que sai dessa execução.

O Googlebot lê o robots.txt, baixa a página, coleta os links do href e a põe na fila, onde ela espera segundos ou mais. Assim que a renderização termina, a página passa por nova coleta de links e vai para o índice.

No site medido, em geral, a fila foi curta. A Vercel e a MERJ mediram o tempo de mais de 37 mil renderizações do Googlebot no nextjs.org, em abril de 2024. A mediana entre rastreamento e renderização foi de 10 segundos, mas o percentil 99 chegou a cerca de 18 horas. A Vercel vende hospedagem para sites em Next.js, e a MERJ é uma consultoria de SEO.

Ainda assim, o guia de SEO em JavaScript do Google diz que renderizar no servidor ou pré-renderizar continua sendo boa ideia. Afinal, nem todos os robôs executam JavaScript.

SEO JavaScript e rastreadores de IA: editor de código com JavaScript aberto na tela

O que atrapalha o SEO JavaScript no Google?

Mesmo com a renderização, alguns problemas deixam conteúdo fora do HTML renderizado ou do índice. Os mais comuns vão de recursos bloqueados ou pesados a erros de script, status HTTP errado e rotas com #.

  • Recursos bloqueados no robots.txt. De acordo com o guia de SEO em JavaScript do Google, o buscador não renderiza JavaScript de arquivos bloqueados, e a página pode ficar incompleta.
  • Arquivos grandes demais. Segundo um post do Google de março de 2026, o Googlebot baixa até 2 MB de cada URL. Além disso, cada script e cada CSS têm limite próprio, e o Google ignora o que passa disso.
  • Recursos lentos. O Google não publica prazo fixo para renderizar. No entanto, a ajuda do teste de pesquisa aprimorada aponta o recurso que não carrega “em um período razoável de tempo”.
  • Erros e recursos sem suporte. Um erro de script pode interromper a página, por isso o guia de solução de problemas de JavaScript recomenda registrar os erros. O renderizador, além disso, apaga cookies e armazenamento local entre páginas e não usa WebSockets.
  • Conteúdo que depende de interação. O Google não interage com a página, segundo a página sobre carregamento lento. O que só carrega após clique ou rolagem do usuário pode ficar de fora.
  • Status diferente de 200 e noindex. O Google pode não renderizar páginas de erro. Da mesma forma, com noindex no HTML inicial, ele pode pular a renderização, e remover a tag por script pode não funcionar.
  • Soft 404 em SPA. Quando a aplicação de página única trata erros no navegador, a rota inexistente geralmente responde 200 e pode acabar indexada.
  • Fragmentos com #. O guia de SEO em JavaScript do Google desaconselha rotas como /#/produtos, porque o Googlebot não resolve essas URLs de forma confiável.

Os rastreadores de IA executam JavaScript?

Não há resposta oficial, porque as páginas sobre os robôs da OpenAI, da Anthropic e do Perplexity não falam em JavaScript. Além disso, a medição pública mais citada, da Vercel com a MERJ em dezembro de 2024, não viu os rastreadores de IA testados executarem o código. Por outro lado, um relato de setembro de 2026 sugere mudança nos robôs da OpenAI, ainda sem confirmação.

Conferimos a documentação da OpenAI, a página da Anthropic e a documentação do Perplexity. Elas descrevem a função de cada robô, mas não tratam de renderização.

No estudo publicado em 17 de dezembro de 2024, a Vercel e a MERJ usaram dados dos meses anteriores do nextjs.org, da rede da Vercel e de dois sites de vagas. Nenhum dos grandes rastreadores de IA testados renderizou JavaScript. Os do ChatGPT e do Claude baixavam scripts, em 11,50% e 23,84% dos pedidos, mas não os executavam. Aliás, a Vercel, que vende hospedagem para Next.js, tem interesse comercial no tema.

O estudo traz duas ressalvas. Em primeiro lugar, dados que já vêm no HTML, como um JSON embutido, ainda podem ser lidos. Em segundo lugar, o Gemini usa a infraestrutura do Googlebot e renderiza JavaScript. Da mesma forma, os AI Overviews e o Modo IA citam páginas do índice da Busca, montado com o HTML renderizado.

“As marcas precisam garantir que a informação crítica seja renderizada no servidor.” (tradução nossa)

Ryan Siddle, diretor-geral da MERJ (2024)
RobôExecuta JavaScript?Base
GooglebotSim, numa fila de renderizaçãoDocumentação do Google
Gemini (via Googlebot)Sim, segundo o estudoVercel e MERJ, 2024
OAI-SearchBot e GPTBotNão em 2024; relato de mudança em 2026Vercel e MERJ; relato sem confirmação
ChatGPT-UserNão, no testeVercel e MERJ, 2024
ClaudeBotNão, no testeVercel e MERJ, 2024
PerplexityBotNão, no testeVercel e MERJ, 2024
Claude-SearchBot, Claude-User e Perplexity-UserNão testados em 2024Lista do estudo da Vercel

O relato de setembro de 2026

Em 30 de setembro, o dono de um marketplace japonês em Next.js publicou na DEV Community a análise dos próprios logs, com os IPs conferidos nas listas da OpenAI. Segundo ele, desde 25 de setembro o OAI-SearchBot e o GPTBot disparam, nos sites dele, pré-carregamentos de links que só surgem com a página renderizada. No entanto, ele não achou anúncio da OpenAI e acha que a mudança vale só para alguns sites.

Além disso, no Internet Archive, o texto sobre os robôs na página da OpenAI é o mesmo desde a cópia de 17 de setembro. Por isso, trate o relato como um sinal a acompanhar nos logs. Para o SEO JavaScript, a regra prática continua a mesma: o que os robôs precisam ler deve estar no HTML inicial. A base técnica é o primeiro passo do SEO para a era da IA.

A função de cada robô está na tabela de robôs do guia sobre o que é GEO. Nas respostas com busca do ChatGPT, por exemplo, quem conta é o OAI-SearchBot, conforme o guia de como aparecer no ChatGPT.

Que conteúdos somem das páginas sem JavaScript (texto, links, preços)?

Some tudo o que o navegador monta depois de carregar a página. Para os rastreadores de IA que leem só o HTML inicial, ficam de fora o texto buscado por API e os links sem href. Da mesma forma, somem preços, avaliações, meta tags e dados estruturados inseridos por script.

ConteúdoComo costuma ser montadoO que o robô perde
Texto principalChamada de API depois do carregamentoA página inteira
Links internosBotão ou onclick sem hrefAs páginas linkadas
Preço e estoqueScript que consulta o catálogoOs dados da oferta
AvaliaçõesWidget de terceirosNota e comentários
Title, description e canonicalDefinidos por scriptResumo e URL preferida
Dados estruturadosJSON-LD injetado por script ou pelo GTMProduto, empresa, autor
ImagensTroca de data-src por srcO endereço da imagem
Listas longasRolagem infinitaItens além da primeira tela

Segundo a documentação de links do Google, o Google em geral só rastreia elementos <a> com atributo href. Por isso, um menu feito de botões pode esconder páginas internas até do Googlebot.

Em lojas, aliás, o Google avisa que a marcação de produto gerada por JavaScript pode deixar o rastreamento do Shopping menos frequente e menos confiável.

Como testar o SEO JavaScript do seu site?

Compare três versões da página: o HTML que o servidor entrega a cada robô, o DOM depois do JavaScript e o que o Google indexou. O checklist abaixo traz cinco testes, cada um com o sintoma, como verificar e a correção.

1. curl com o user agent de cada robô

Sintoma: a página aparece no Google, mas o ChatGPT e o Perplexity não a citam.

Como verificar: baixe o HTML com o user agent oficial de cada robô e, em seguida, procure uma frase do texto e os links. A Anthropic publica só o nome do robô, mas ele serve para o teste. O Googlebot serve de comparação: se só ele recebe o texto, o servidor muda a resposta conforme o user agent.

URL="https://www.exemplo.com.br/produto/tenis-azul"
FRASE="Tênis de corrida azul"

# No user agent do Googlebot, W.X.Y.Z é como o Google indica a versão do Chrome
for UA in \
  "Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/W.X.Y.Z Mobile Safari/537.36 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" \
  "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36; compatible; OAI-SearchBot/1.4; +https://openai.com/searchbot" \
  "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko); compatible; GPTBot/1.4; +https://openai.com/gptbot" \
  "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko); compatible; ChatGPT-User/1.0; +https://openai.com/bot" \
  "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; PerplexityBot/1.0; +https://perplexity.ai/perplexitybot)" \
  "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; Perplexity-User/1.0; +https://perplexity.ai/perplexity-user)" \
  "ClaudeBot" "Claude-SearchBot" "Claude-User"
do
  ROBO=$(echo "$UA" | grep -oE "Googlebot|OAI-SearchBot|GPTBot|ChatGPT-User|PerplexityBot|Perplexity-User|Claude[A-Za-z-]*" | head -1)
  STATUS=$(curl -sL -A "$UA" -o pagina.html -w "%{http_code}" "$URL")
  echo "$ROBO | status $STATUS | frase: $(grep -oF "$FRASE" pagina.html | wc -l) | links: $(grep -oi '<a [^>]*href=' pagina.html | wc -l)"
done

O teste não reproduz o IP do robô, por isso um firewall que confere user agent e IP, como o Perplexity recomenda, pode responder diferente. Os rastreadores de IA do Perplexity e do Claude estão no guia de como aparecer no Gemini, no Perplexity e no Claude.

Correção: se a frase ou os links não aparecem, o conteúdo depende de JavaScript e precisa ir para o HTML do servidor. Status 403 ou 503 pede revisão do firewall e da CDN antes do código.

2. Código-fonte contra DOM renderizado

Sintoma: o navegador mostra o texto, mas o código-fonte traz pouco além de um <div id="root"> e scripts.

Como verificar: compare o código-fonte (Ctrl+U) com o painel Elements das ferramentas do desenvolvedor. Na linha de comando, o Chrome sem interface, com a opção --dump-dom, imprime o DOM depois de executar o JavaScript.

URL="https://www.exemplo.com.br/produto/tenis-azul"
FRASE="Tênis de corrida azul"

curl -sL "$URL" > fonte.html
# No Windows e no macOS, troque google-chrome pelo caminho do Chrome instalado
google-chrome --headless --disable-gpu --dump-dom "$URL" > renderizado.html

for f in fonte.html renderizado.html; do
  echo "$f | frase: $(grep -oF "$FRASE" "$f" | wc -l) | links: $(grep -oi '<a [^>]*href=' "$f" | wc -l)"
done

Correção: o que só aparece no arquivo renderizado é invisível para robôs que não executam JavaScript. Portanto, leve primeiro texto, preço, links e meta tags para o HTML do servidor.

3. Inspeção de URL no Search Console

Sintoma: a página não aparece no Google, ou aparece com título, descrição ou canonical errados.

Como verificar: na ferramenta de inspeção de URL, rode o teste em tempo real e então abra “Ver a página testada”. Ali estão a captura de tela, o código da página, os recursos carregados e a saída do console JavaScript.

Correção: libere recursos bloqueados no robots.txt, corrija os erros do console e leve ao servidor o que falta na captura. Por fim, teste de novo e peça a indexação.

4. Teste de pesquisa aprimorada

Sintoma: os dados estruturados não geram resultados avançados, ou a página é de um domínio sem acesso ao Search Console.

Como verificar: cole a URL no teste de pesquisa aprimorada. Ele acessa a página como smartphone, por padrão, avisa sobre recursos que não carregaram e mostra o código renderizado.

Correção: se o JSON-LD aparece no teste, mas não no HTML do curl, só quem executa JavaScript o vê. Então, gere o bloco no servidor.

5. Logs do servidor

Sintoma: você não sabe se os rastreadores de IA visitam o site, com que status ou se renderizam algo.

Como verificar: filtre o log pelos nomes dos robôs, conte os status e veja se o robô pede algo além do HTML.

# Formato combinado do Apache e do Nginx: status no 9º campo, caminho no 7º

# Status HTTP por robô
for R in OAI-SearchBot GPTBot ChatGPT-User ClaudeBot Claude-SearchBot Claude-User PerplexityBot Perplexity-User; do
  echo "== $R"
  grep "$R" access.log | awk '{print $9}' | sort | uniq -c | sort -rn
done

# O que o OAI-SearchBot pede além do HTML
grep "OAI-SearchBot" access.log | awk '{print $7}' \
  | grep -E '\.(css|js|png|jpe?g|webp)|/api/|_rsc=' \
  | sort | uniq -c | sort -rn | head -20

Pedido de arquivo .js não prova execução, porque no estudo da Vercel os rastreadores de IA baixavam scripts sem executá-los. Sinais mais fortes são as chamadas de API que o script faz e, em Next.js, URLs com _rsc=. Em sites feitos em Next.js, veja também o que o framework entrega a cada robô no guia de SEO no Next.js. Já que qualquer um pode imitar um user agent, confira o IP nas listas de cada empresa.

Para o Google, use o relatório de estatísticas de rastreamento do Search Console. Isso porque o guia de solução de problemas de JavaScript avisa que o analytics do navegador pode não mostrar essa atividade por completo.

Correção: 403 ou 429 para um robô que você quer liberar indica firewall ou limite de taxa. Muitos 404, por sua vez, pedem redirecionamentos e sitemap atualizado. No estudo da Vercel, por exemplo, 34,82% dos pedidos do ChatGPT e 34,16% dos do Claude caíram em páginas 404, contra 8,22% do Googlebot.

Como corrigir o SEO JavaScript sem refazer o site?

Em geral, as correções cabem no código atual, sem trocar o framework. A regra é uma só: o que os robôs precisam ler, citar ou seguir deve estar no HTML que o servidor entrega. Isso vale de links e meta tags a imagens, paginação e status HTTP.

Links com href. Mantenha o roteador, mas renderize um <a> com a URL real. Um evento de clique pode continuar no link.

<!-- Evite: o Google pode não extrair a URL -->
<span onclick="irPara('/tenis')">Tênis</span>
<a onclick="irPara('/tenis')">Tênis</a>

<!-- Rastreável -->
<a href="/tenis">Tênis</a>

Uma URL por rota, com a History API. Troque /#/produtos por /produtos e use pushState no roteador. Além disso, o servidor deve responder cada rota com o HTML dela.

Meta tags no HTML do servidor. Title, description, canonical e robots devem vir na resposta do servidor. O guia de SEO em JavaScript do Google aceita title e description definidos por script, mas pede que o script mantenha o canonical do HTML.

<head>
  <title>Tênis de corrida azul | Loja Exemplo</title>
  <meta name="description" content="Tênis leve para treinos de 5 a 21 km.">
  <link rel="canonical" href="https://www.exemplo.com.br/produto/tenis-azul">
</head>

Dados estruturados no HTML inicial. O Google lê JSON-LD injetado por JavaScript ao renderizar, mas um robô que lê só o HTML, não. Por isso, gere o bloco no servidor.

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "Product",
  "name": "Tênis de corrida azul",
  "offers": {
    "@type": "Offer",
    "price": "399.90",
    "priceCurrency": "BRL",
    "availability": "https://schema.org/InStock"
  }
}
</script>

Lazy load com fallback no HTML. O carregamento nativo do navegador mantém o src no HTML inicial: sem JavaScript, a imagem continua lá. Por outro lado, bibliotecas que trocam data-src por src deixam sem a imagem o robô que não executa JavaScript.

<!-- O robô vê o endereço da imagem -->
<img src="/img/tenis-azul.webp" alt="Tênis de corrida azul" loading="lazy" width="800" height="600">

<!-- Sem JavaScript, não há imagem -->
<img data-src="/img/tenis-azul.webp" class="lazyload" alt="Tênis de corrida azul">

Paginação em vez de rolagem infinita. Dê a cada bloco da lista uma URL fixa, como ?page=2, com links em sequência, e atualize a URL com a History API durante a rolagem. Assim o robô acha todos os itens.

<!-- Na página /tenis?page=2 -->
<nav aria-label="Paginação">
  <a href="/tenis?page=1">Anterior</a>
  <a href="/tenis?page=3">Próxima</a>
</nav>

Status HTTP certos. Rota inexistente deve responder 404 no servidor. Se a SPA não permitir, o Google aceita redirecionar por script para uma URL com 404 ou pôr noindex na página de erro. Para robôs que não executam JavaScript, porém, só o status do servidor conta.

// Rota de produto numa SPA (adaptado do exemplo do Google)
fetch(`/api/produtos/${id}`)
  .then((resposta) => resposta.json())
  .then((produto) => {
    if (!produto.existe) {
      window.location.href = '/nao-encontrado'; // o servidor responde 404 nesta URL
    }
  });

Quando as correções de SEO JavaScript não bastam?

Se o conteúdo principal inteiro depende do navegador, essas correções não bastam. Aí a saída é mudar o modo de renderização, com renderização no servidor, geração estática ou pré-renderização. Para escolher entre esses modos, veja o comparativo entre renderização no servidor e no navegador. O mesmo vale para sites criados no Lovable e em outras ferramentas que geram páginas pelo navegador. Em sites feitos com React, o guia de SEO em React mostra as opções de SSR, pré-renderização e Next.js.

Perguntas frequentes

Quanto tempo o Google demora para renderizar uma página com JavaScript?

O Google não publica um prazo fixo para renderizar páginas com JavaScript, nem no guia de SEO em JavaScript. Na medição da Vercel com a MERJ no nextjs.org, a espera mediana entre rastreamento e renderização foi de 10 segundos, mas o percentil 99 chegou a cerca de 18 horas. Recursos lentos, aliás, podem ficar de fora da página renderizada.

O Google lê dados estruturados inseridos pelo Google Tag Manager?

O Google lê o JSON-LD injetado por JavaScript, inclusive pelo GTM, quando renderiza a página. No entanto, um robô que lê só o HTML inicial não vê esse bloco. Em lojas, o Google também avisa que a marcação de produto gerada por JavaScript pode deixar o rastreamento do Shopping menos frequente e menos confiável.

Se os rastreadores de IA baixam arquivos .js, eles executam o JavaScript?

Não necessariamente. No estudo da Vercel, por exemplo, os robôs do ChatGPT e do Claude baixavam scripts em 11,50% e 23,84% dos pedidos, sem executá-los. Nos logs, portanto, os sinais mais fortes de execução são as chamadas de API que o script faz e, em sites Next.js, URLs com _rsc=.

Quer saber como sua marca aparece hoje nas respostas de IA?

A NotHuman está abrindo vagas para agências e marcas acompanharem como aparecem nas respostas de IA. Entre na lista de espera e avisamos quando houver uma vaga para você.

Fontes principais

  • Google Search Central, Princípios básicos de SEO em JavaScript (2026).
  • Vercel e MERJ, estudo sobre como o Google renderiza JavaScript (2024).
  • Vercel e MERJ, The rise of the AI crawler, sobre rastreadores de IA e JavaScript (2024).
  • OpenAI, Overview of OpenAI Crawlers (2026).
  • Anthropic, robôs da Anthropic e como controlá-los (2026).
  • Perplexity, Perplexity Crawlers (2026).

Índice

Continue lendo

Receba os novos artigos da NotHuman

Um e-mail quando publicarmos um artigo novo sobre GEO, SEO e IA. Você pode sair da lista quando quiser.