Guia de integração
Analytics no Nuxt
Um plugin que roda só no navegador cria o SDK, conta as navegações do roteador e expõe $analytics para os componentes. Funciona com SSR, SSG e SPA.
Antes de começar
- Nuxt 3 (ou 4).
- A
site_keye o domínio em Allowed origins.
Instalação
1Instale o SDK e configure a chave
O Nuxt preenche
runtimeConfig.publiccom variáveis de ambienteNUXT_PUBLIC_*.npm install @racoelho/analyticsnuxt.config.ts export default defineNuxtConfig({ runtimeConfig: { public: { analisaSiteKey: '', }, }, }).env NUXT_PUBLIC_ANALISA_SITE_KEY=YOUR_SITE_KEY2Crie o plugin
O sufixo
.clientno nome do arquivo faz o Nuxt carregar o plugin só no navegador — o SDK não roda no servidor.plugins/analytics.client.ts import { Analytics } from '@racoelho/analytics' export default defineNuxtPlugin(() => { const config = useRuntimeConfig() // o sufixo .client garante que isto só roda no navegador const analytics = new Analytics({ siteKey: config.public.analisaSiteKey }) useRouter().afterEach((to, from) => { // só quando o caminho muda; a primeira carga já foi contada if (to.path !== from.path) analytics.pageview() }) return { provide: { analytics } } })
Eventos e metas
Em qualquer componente, pegue $analytics do useNuxtApp() e chame track(nome, propriedades).
<script setup lang="ts">
const { $analytics } = useNuxtApp()
function subscribe() {
$analytics.track('newsletter_signup', { place: 'footer' })
}
</script>
<template>
<button @click="subscribe">Assinar a newsletter</button>
</template>Crie uma meta do tipo evento newsletter_signup no painel. Como o plugin é só do cliente, use $analytics em handlers de evento ou em onMounted, nunca durante a renderização no servidor.
Navegação entre páginas
Depois da primeira carga o Nuxt navega sem recarregar, e o SDK não percebe isso sozinho — o afterEach do plugin conta cada nova página. Mudanças só de query string não contam como página nova.
Confira se está funcionando
- Abra o site publicado numa janela comum, sem bloqueador de anúncios.
- Nas ferramentas do navegador, aba Network, filtre por
v1/i: deve aparecer umPOSTcom status200em até 3 segundos (ou quando você sai da página). - No painel, os eventos aparecem em cerca de 30 segundos.
- Navegue por um
<NuxtLink>e confira um novopage_viewnoPOSTseguinte.
Problemas comuns
$analyticséundefinedno componente- O código rodou no servidor, onde o plugin
.clientnão existe. Mova a chamada para um handler de clique ou paraonMounted. - A requisição volta 403 (
origin_not_allowed) - O domínio não está em Allowed origins nas configurações do site. Cadastre a origem exata — com
https://, com e semwww, e endereços de teste comohttp://localhost:3000se quiser medir em desenvolvimento. - Nenhuma requisição aparece na aba Network
- O SDK respeita o Do Not Track por padrão: se o seu navegador envia DNT, nada é enviado. Teste em outro navegador ou perfil. Bloqueadores de anúncio também podem barrar o script.
- As pageviews aparecem em dobro
- O SDK foi inicializado duas vezes (por exemplo, o script colado no tema e também por um plugin). Mantenha uma única instância por página.