Eventos rastreados
Uma visualização de página informa qual página foi aberta. Ela não informa se o leitor copiou o trecho, perguntou ao assistente, rolou a página além da introdução ou saiu para a página de cadastro. Esta página contém a lista completa de tudo o que é registrado, campo a campo, para que você possa verificar, antes de criar uma meta ou um funil, se aquilo que deseja medir já está sendo medido.
O que você obtém#
Trinta e seis eventos docs.* nomeados, em sete categorias, registrados em todos os
sites de documentação sem configuração e sem um gerenciador de tags. Cada um deles é uma linha
que você pode filtrar em Feeds, associar a uma meta,
classificar na visão geral das análises ou consultar por visitante
via MCP.
O registro deles não consome nada do saldo do seu projeto, e nada na lista muda de acordo com o seu plano.
O catálogo#
Cada evento inclui o nome completo do seu projeto (owner/repo). A coluna Também inclui mostra o que ele adiciona além disso. Os eventos marcados como beacon são entregues por navigator.sendBeacon no momento em que o leitor sai; os demais usam o transporte comum de registro, que agrupa os eventos por dois segundos.
Assistente de IA#
| Evento | Dispara quando | Também inclui |
|---|---|---|
docs.ai_open |
O leitor abre o painel do assistente | conversation_id |
docs.ai_query |
Uma pergunta é enviada | question, answer, conversation_id, turn |
docs.ai_like / docs.ai_dislike |
Uma avaliação é dada a uma resposta | path, conversation_id, question |
docs.ai_copy |
Uma resposta é copiada | conversation_id |
docs.ai_navigate |
Um link citado pela resposta é clicado | query, path, conversation_id, source (badge ou sources) — beacon |
docs.ai_outbound |
Um link na resposta leva o leitor para fora do seu site | href, host, conversation_id, question — beacon |
docs.ai_conversation |
Uma vez por conversa, quando sua primeira resposta bem-sucedida recebe um título | topic, intent, competitor, question, answer_completeness, gap_type |
docs.ask_ai_outline |
"Perguntar à IA" é pressionado no índice da página | — |
docs.ai_navigate e docs.ai_outbound são deliberadamente dois eventos, não um.
O primeiro diz que o leitor confiou na resposta o suficiente para abrir a página que ela citou;
o segundo diz que o assistente o encaminhou para seu aplicativo, seu repositório ou para algum
outro lugar — uma questão comercial, não de compreensão.
Pesquisa#
| Evento | Ocorre quando | Também transporta |
|---|---|---|
docs.search_open |
A caixa de pesquisa na página é aberta | — |
docs.search_navigate |
Um resultado da pesquisa é clicado | query, path |
docs.search_no_result |
Uma consulta não retorna resultados | query |
Leitura e engajamento#
| Evento | Disparado quando | Também carrega |
|---|---|---|
docs.pageview |
Uma página é servida | path, lang, trafficType, referrer, userAgent, source e o país/região/cidade/coordenadas resolvidos pela borda |
docs.read_time |
O leitor sai de uma página | path, seconds — beacon |
docs.heading_view |
Um título entra na área visível | path, heading (como #anchor) — beacon |
docs.scroll_to_top |
O controle de voltar ao topo é usado | — |
docs.widget_toggle |
Um widget de conteúdo é aberto ou fechado | widget, enabled |
docs.theme_toggle |
O modo claro/escuro é alternado | theme |
docs.language_switch |
O seletor de idioma é usado | from, to |
docs.pageview é o único evento que o navegador não envia. Ele é gravado
no servidor, portanto existe para leitores com JavaScript desativado — e é também
por isso que uma visita composta apenas por visualizações de página é tratada como
um rastreador. Em páginas servidas pelo cache, a visualização de página é enviada
como beacon pelo navegador, e o endpoint de ingestão preenche o mesmo IP e a mesma
geografia, portanto os dois caminhos produzem a mesma linha.
seconds é emitido sem processamento e limitado a 300 segundos antes que qualquer relatório faça a soma.
Esse limite, e o motivo de sua existência, são explicados em tempo de leitura.
Ações de conteúdo#
| Evento | Disparado quando | Também inclui |
|---|---|---|
docs.copy_code |
Um bloco de código é copiado | — |
docs.copy_page |
A página inteira é copiada | — |
docs.copy_markdown |
A página é copiada como Markdown | — |
docs.copy_dropdown |
O menu de cópia é usado | action |
docs.edit_on_github |
"Editar no GitHub" é clicado | path |
Navegação#
| Evento | Dispara quando | Também inclui |
|---|---|---|
docs.sidebar_nav |
Uma entrada da barra lateral é clicada | path |
docs.heading_nav |
Uma entrada no índice da página é clicada | heading, path |
docs.page_nav |
Anterior/próximo é usado | direction (prev ou next), path |
docs.internal_link |
Um link na página para outra das suas páginas é clicado | href |
docs.heading_nav e docs.heading_view compartilham intencionalmente o formato #anchor para
que uma seção agregue os mesmos dados, independentemente de os leitores terem saltado até ela ou
rolado até ela.
Saídas e fontes#
| Evento | Dispara quando | Também inclui |
|---|---|---|
docs.outbound_link |
Um link sai da sua documentação | href, host, path — beacon |
docs.header_link |
Um link no cabeçalho do seu site é clicado | label, href |
docs.utm |
Uma visita chega com tags de campanha | os parâmetros utm_* conforme fornecidos |
docs.page_exit |
O leitor sai do site ou recarrega a página | path — beacon |
docs.claim_banner_seen |
O banner de publicação/reivindicação é exibido | claim_token |
docs.claim_click |
O banner de publicação/reivindicação é clicado | claim_token — beacon |
docs.page_exit é disparado apenas em uma saída ou recarregamento real. A navegação no site
não produz um, e é isso que faz com que o último docs.page_exit de uma visita seja a página da qual o leitor realmente saiu.
Feedback#
| Evento | É acionado quando | Também inclui |
|---|---|---|
docs.page_feedback_up |
Uma página recebe um voto positivo | path, país |
docs.page_feedback_down |
Uma página recebe um voto negativo | path, país |
A direção está no nome do evento, não em um campo vote: o esquema do armazenamento de eventos é um conjunto fixo de nomes de campos, e um campo não reconhecido é rejeitado imediatamente, em vez de ser descartado. Os votos são registrados por meio de uma rota do servidor para que um webhook possa ser acionado por eles; se essa solicitação falhar, o navegador registra o mesmo evento diretamente, para que a contagem seja preservada.
Automático ou dependente de um recurso#
Não há nenhuma opção de rastreamento em nenhum lugar do Docsbook, nem um sinalizador enabled em nenhum
evento. Todos os eventos acima são emitidos sempre que aquilo que os produz existe,
o que divide a lista em duas partes:
| Sempre | Somente quando o recurso estiver em uso |
|---|---|
| Visualizações de página, tempo de leitura, visualizações de títulos, saídas, cópias, links internos e externos, navegação pela barra lateral e anterior/próxima, pesquisa, tema, rolagem para o topo | Cada evento docs.ai_* (precisa do assistente voltado ao leitor, que é um recurso pago — consulte preços), docs.language_switch (precisa de um segundo idioma), docs.edit_on_github (precisa de um repositório vinculado), docs.utm (precisa de links que você mesmo marcou), docs.widget_toggle (precisa de um widget na página), o par de feedback (precisa do widget de votação), os dois eventos docs.claim_* (somente em um site não reivindicado) |
Um evento "vazio" nos seus relatórios, portanto, tem duas interpretações possíveis, e elas são diferentes: ninguém fez isso ou nada pode fazê-lo ainda.
Como é entregue#
Os eventos comuns passam por um transporte que agrupa os eventos por dois segundos e os envia
por fetch. Isso é suficiente para um clique que mantém a página aberta, mas
perde tudo no caso de um clique que não mantém a página aberta — por isso, os eventos associados à
saída seguem um segundo caminho:
- Os componentes registram um coletor de saída. Em
pagehide, todos os coletores são esvaziados em um único beacon, limitado a 100 eventos, enviado para um endpoint da mesma origem. - No iOS,
visibilitychange → hiddenaciona o mesmo envio, porquepagehidenão é confiável nesse sistema. - Os coletores retornam apenas o que ainda não enviaram, portanto um envio no iOS seguido por uma saída real não contabiliza duas vezes, e uma página restaurada do cache de voltar/avançar pode enviar novamente.
As visualizações de títulos são coletadas com um IntersectionObserver no limite 0 e
com uma -15% margem inferior, e cada título deixa de ser observado assim que é visto: um título
é contabilizado uma vez por visualização de página e somente depois que ultrapassa a parte inferior da janela de visualização,
em vez do instante em que aparece parcialmente.
Por que esta é a maneira correta#
| Regra | Por que funciona no navegador que a executa | Fonte |
|---|---|---|
Eventos no momento da saída são enviados por beacon, nunca por um fetch com debounce |
As solicitações beacon são "garantidamente iniciadas antes que a página seja descarregada e podem ser executadas até a conclusão sem exigir solicitações bloqueantes" | API Beacon do W3C |
| Não bloqueie a saída para enviar o evento | As alternativas contra as quais a especificação Beacon foi escrita — "emitir solicitações bloqueantes por meio de XMLHttpRequest síncrono, inserir loops ocupados sem efeito" — "impedem o agente do usuário de executar operações críticas em termos de tempo … e prejudicam a experiência do usuário" | API Beacon do W3C |
Escute em pagehide e, adicionalmente, na mudança de visibilidade |
unload "ainda não é confiável, portanto evite usá-lo, a menos que seja absolutamente necessário"; pagehide "é disparado em todos os casos em que o evento unload é disparado" e também ao entrar no cache de voltar/avançar |
web.dev: bfcache |
Detecte as visualizações dos títulos com IntersectionObserver, não com um manipulador de rolagem |
O cálculo de posição por consulta ao DOM "é conhecido por causar recálculo de estilo e layout (dispendiosos)", e os sites que "abusam dos manipuladores de rolagem" causam "travamentos durante a rolagem"; a entrega assíncrona "elimina a necessidade de consultas dispendiosas ao DOM e aos estilos, além de sondagem contínua" | Intersection Observer do W3C |
Conte um título quando ele tiver ultrapassado a dobra, usando rootMargin |
rootMargin aplica "deslocamentos … aumentando ou reduzindo efetivamente a caixa usada para calcular as interseções" — a maneira honesta de dizer "foi realmente alcançado", não "houve sobreposição tecnicamente" |
Intersection Observer do W3C |
| Uma página que continua contando enquanto está oculta mede a coisa errada | A API de Visibilidade de Página existe porque "os desenvolvedores web têm criado páginas como se elas estivessem sempre visíveis" | Visibilidade de Página Nível 2 do W3C |
Como ler os eventos de um visitante#
Duas ferramentas MCP reconstroem o percurso de um visitante anônimo de ponta a ponta, e ambas são operações de leitura: get_top_visitors lista os visitantes mais ativos durante um período,
get_visitor_activity retorna os eventos de um visitante em ordem.
get_top_visitors(period: "7d", limit: 25)
→ [{ visitor_id: "a1b2…", pageview_count: 14, first_seen, last_seen, country }, …]
get_visitor_activity(visitor_id: "a1b2…", period: "7d")
→ { first_seen, last_seen, country, language, pageview_count,
events: [
{ event: "docs.pageview", at, path: "guides/quick-start" },
{ event: "docs.page_feedback_down", at, path: "guides/quick-start" },
{ event: "docs.search_no_result", at, query: "rotate api key" },
… ] }visitor_id é um hash com salt do IP do leitor, limitado ao seu projeto; IPs brutos nunca são retornados. Consulte
como funciona a medição.
Limites e questões em aberto#
- Nenhum webhook pode ser disparado em um evento
docs.*. Esses eventos ficam no armazém de eventos, e nada os despacha. Eles podem ser filtrados nos Feeds e salvos em uma lista, e aparecem comonot_sentnela porque é isso que são. Os alertas sobre o comportamento dos leitores passam pelos eventos de webhook derivados — queda de tráfego, pesquisa popular, pesquisa sem resultados — e não por este catálogo. Consulte webhooks. - Os eventos são contabilizados por evento, não por visita. Um leitor copiando cinco snippets gera cinco linhas
docs.copy_code. Tudo o que precisa ser contabilizado por visita — rejeição, conversão, uma meta — é derivado pela reconstrução da visita, não pela soma desta lista. - Um leitor com JavaScript desativado contribui apenas com
docs.pageview. Todos os outros eventos acima precisam de um script em execução, que é exatamente aquilo em que o filtro de rastreador comportamental se baseia. - Os campos
questioneanswercontêm tudo o que o leitor digitou. As leituras brutas de eventos passam por um processo de mascaramento que oculta qualquer campo cuja chave ou valor pareça um token, uma chave, um JWT ou um cabeçalho de autorização, mas um leitor que digita algo pessoal no seu assistente está digitando isso no seu armazenamento de eventos. A retenção é de 30 dias. - Questão em aberto: o catálogo é autoritativo, mas não é exaustivo em relação ao fluxo. O que pode ser verificado é que estes 36 nomes são os que todas as interfaces — o painel, os Feeds, a validação de metas, o MCP — leem de uma única lista compartilhada, portanto uma meta só pode ser declarada para um nome presente nela. O que não pode ser verificado: alguns nomes
docs.*adicionais são emitidos pelo fluxo de teaser de site não reivindicado e não estão nessa lista, o que significa que chegam ao armazenamento e ficam invisíveis na interface. Considere os 36 como o conjunto completo de eventos sobre os quais você pode agir, não como um inventário completo de todas as strings no fluxo.
Relacionado#
- Como funciona a medição — identidade do visitante, filtragem de bots, retenção e privacidade para tudo nesta página
- Visão geral da análise — os cartões e números alimentados por esses eventos
- Metas e funis — declarar um resultado em um desses nomes de evento
- Tempo de leitura —
docs.read_timecomo um relatório - Webhooks — os eventos que podem notificá-lo