Blogue

Lições de SEO ao Corrigir o Nosso Próprio Site

Passámos alguns dias a ler o nosso próprio site da forma como um motor de pesquisa o faz, e encontrámos seis coisas que valia a pena corrigir. Cada página declarava dois blocos de FAQ, o Google usava como miniatura um brilho decorativo do fundo, um conjunto de páginas de modelos estava a aparecer em pesquisas às quais não respondia, e uma secção nova do site estava bloqueada pela nossa própria borda em staging. Nada disto foi dramático. Tudo isto nos estava a custar visibilidade em silêncio.

O site num parágrafo

O mythex.ai é uma single-page app que pré-renderizamos durante a compilação: um script percorre cada rota, escreve um ficheiro HTML estático para ela e injeta o título, a descrição e os dados estruturados da página (o bloco JSON-LD que diz aos motores de pesquisa o que é uma página; vê o que são dados estruturados). A maior parte do que se segue vive nesse passo de pré-renderização, porque é esse o HTML que um rastreador realmente lê.

1. Cada página reclamava ser a página de FAQ

Sintoma. O nosso modelo HTML trazia um bloco FAQPage para todo o site nos dados estruturados, com o URL a apontar para /faq. A pré-renderização acrescentava depois o FAQPage de cada página por cima. Por isso, cada página do site enviava dois — e a nossa política de privacidade dizia ao Google que era a página de FAQ.

Porque importa. O Google espera no máximo um FAQPage por página. Um segundo que aponte para outro sítio é o tipo de coisa que faz com que a marcação de uma página seja desvalorizada, e não apenas ignorada.

Correção. O bloco global foi eliminado. A marcação de FAQ de cada página vem agora de um único sítio, incluindo a própria /faq, que a constrói a partir da lista completa de perguntas. As páginas sem FAQ passam a não declarar nenhuma, que é a resposta honesta. E a pré-renderização falha a compilação se alguma página voltar a ter mais de um FAQPage. Uma regra que só existe na memória de alguém acaba por ser quebrada; uma regra que a compilação impõe não é.

2. O Google usava a imagem errada para nós

Sintoma. Nos resultados de pesquisa, a miniatura do Mythex era o brilho suave que pulsa por trás do herói da página inicial — uma imagem decorativa de fundo — em vez do nosso cartão de partilha.

Porque aconteceu. Nunca dissemos ao Google qual imagem representava cada página, por isso ele escolheu uma que encontrou.

Correção. Dois lados do mesmo problema:

  • Diz qual é a imagem da página. A página inicial tem agora um nó WebPage com um primaryImageOfPage a apontar para o cartão de partilha, e os dados estruturados de cada página pré-renderizada trazem a sua própria imagem (a imagem de partilha da página, ou a predefinida).
  • Esconde a decoração. As imagens de fundo estão agora proibidas no robots.txt e são servidas com um cabeçalho noindex, noimageindex, para ficarem fora da pesquisa de imagens e das miniaturas.

3. Os motores de pesquisa só conheciam o nosso logótipo

A marcação Organization tinha um nome, um logótipo e algumas ligações a redes sociais — marca, e mais nada. Os motores de pesquisa constroem o painel de conhecimento de uma empresa a partir de factos do tipo registo comercial, por isso acrescentámos os que constam da nossa licença de atividade: nome legal, data de fundação, fundador e morada registada. Deixámos de propósito de fora o número de telefone.

4. As páginas de modelos respondiam a outra pergunta

Sintoma. A Search Console mostrava três páginas de modelos a receber impressões e nenhum clique. Uma aparecia para "portfólio de estratega de conteúdos" e variantes, outra para "melhor design de site para restaurante italiano", e outra para um grupo à volta de "agile board" — metade dessas pesquisas incluía a palavra "grátis". As posições iam de meados dos vinte até aos cinquenta.

Porquê. Cada página respondia a uma pergunta diferente da que tinha sido feita. Quem queria ver como é um bom design para restaurante italiano caía numa página que lhe vendia um construtor.

Correção. Cada uma das três tem agora uma secção escrita para a pesquisa e não para o produto, um título e uma descrição com as palavras que as pessoas escrevem, e FAQ que vale a marcação que já emitiam.

O mesmo commit corrigiu um problema mais discreto. O bloco de "modelos relacionados" usava os primeiros quatro modelos de uma categoria, por isso todos os modelos de portfólio apontavam para os mesmos quatro portfólios, e o resto da categoria não tinha quaisquer ligações internas. Substituímo-lo por um anel ordenado por subcategoria: cada página de modelo tem agora exatamente quatro ligações de entrada e quatro de saída. O HTML pré-renderizado também imprime essas ligações agora — antes, só existiam depois de o JavaScript correr, o que um rastreador pode nunca fazer.

5. Avisar o Bing das páginas novas no momento em que são publicadas

O Google ignora o IndexNow, um protocolo para avisar os motores de pesquisa quando um URL muda. O Bing, o Yandex e o Seznam usam-no — e o índice do Bing é o que a pesquisa do ChatGPT consulta. Um construtor de apps com IA que os assistentes de IA não conseguem encontrar é um tipo de falha muito particular.

A abordagem óbvia, submeter o sitemap inteiro a cada publicação, é a forma como uma chave acaba limitada, e a maior parte das publicações não muda nada que um motor de pesquisa se importe. Por isso, um script compara o sitemap que o site está a servir neste momento com o que acabou de ser compilado e submete apenas a diferença.

Dois detalhes fizeram-no funcionar:

  • Tira o instantâneo antes de publicar. A referência tem de ser capturada antes de a nova compilação entrar em produção. Depois, o sitemap "em produção" já é o novo e todas as diferenças vêm vazias.
  • Só páginas novas, por agora. O nosso sitemap não tem datas lastmod, por isso o script anuncia páginas novas mas não reescritas. Carimbar cada URL com a data da compilação marcaria o site inteiro como alterado a cada publicação — exatamente o spam que estávamos a evitar.

Corre apenas nas publicações de produção e nunca faz falhar a compilação: quando corre, o site já está em linha, e um aviso a um motor de pesquisa não vale um deploy a vermelho.

6. A nossa própria borda dizia "não encontrado"

Quando lançámos as páginas /ai (mais sobre elas em uma página de destino para cada tipo de negócio), o staging mostrava "Not found" em todas elas, enquanto o alojamento estático as servia bem.

O serviço à frente dos nossos domínios de marketing só encaminha uma lista de caminhos permitidos; tudo o resto recebe um 404 seco. /ai era novo e não estava nessa lista. Acrescentámos /ai e /ai/*, com um teste que confirma que passam. Um bug pequeno, mas exatamente do tipo que torna uma secção nova invisível para os rastreadores sem que ninguém dê por isso.

O que tirámos disto

  • Lê o HTML que um rastreador lê. A maior parte disto era invisível num browser e óbvio no ficheiro pré-renderizado.
  • Transforma regras de SEO em verificações de compilação. "Um FAQPage por página" é agora imposto, não lembrado.
  • Diz aos motores de pesquisa o que queres dizer. Se não disseres qual imagem ou quais factos te representam, eles vão adivinhar.
  • A Search Console diz-te que pergunta as pessoas fizeram. Impressões sem cliques costumam significar que a página respondeu a outra pergunta.
  • Submete diferenças, não tudo. Avisar apenas do que mudou mantém-te dentro dos limites de pedidos.

Se estiveres a fazer o mesmo para um site que construíste, os nossos guias sobre SEO para sites construídos com IA e como configurar o Google Search Console cobrem o essencial.

Mythex · Pricing · Crie qualquer coisa com IA · Modelos de sites e apps · Mythex comparado · Glossário de criação de apps com IA · Ferramentas grátis para criar apps com IA · English

English አማርኛ العربية Български বাংলা Bosanski Català Čeština Dansk Deutsch Ελληνικά Español Español (España) Eesti فارسی Suomi Français Français (Canada) ગુજરાતી हिन्दी Hrvatski Magyar Հայերեն Bahasa Indonesia Íslenska Italiano 日本語 ქართული Қазақ тілі ಕನ್ನಡ 한국어 Lietuvių Latviešu Македонски മലയാളം Монгол मराठी Bahasa Melayu မြန်မာ Norsk bokmål Nederlands ਪੰਜਾਬੀ Polski Português (Brasil) Română Русский Slovenčina Slovenščina Soomaali Shqip Srpski Svenska Kiswahili தமிழ் తెలుగు ไทย Tagalog Türkçe Українська اردو Tiếng Việt 简体中文 繁體中文(香港) 繁體中文(台灣)