Rastreamento de Primeira Parte com Next.js
Configure um proxy de primeira parte em sua aplicação Next.js para contornar bloqueadores de anúncios e proteção de rastreamento do navegador.
Dificuldade: Fácil - Esta é a opção mais simples para projetos Next.js. Apenas adicione algumas linhas no seu arquivo de configuração.
Por Que Funciona (Mesma Origem)
Esta abordagem usa /api/_z/script.js que está na mesma origem do seu site. Firefox ETP e outras proteções de rastreamento bloqueiam apenas requisições entre origens diferentes.
- Navegador vê:
seudominio.com/api/_z/script.js— mesma origem (primeira parte) - Next.js reescreve a requisição para o servidor Zenovay no lado do servidor (o navegador nunca vê isto)
- Toda proteção de rastreamento é contornada porque a requisição é de primeira parte
Antes de Começar
Certifique-se de ter:
- Um projeto Next.js 12+ (App Router ou Pages Router)
- Seu código de rastreamento Zenovay (encontrado em Domains → seu site → General → Tracking script, na aba First-Party)
- Acesso ao seu arquivo
next.config.jsounext.config.ts
Formato do Seu Código de Rastreamento
Seu código de rastreamento é assim: ZV_XXXXXXXXXX
- Começa com
ZV_ - Seguido por 10 caracteres (letras e números)
- SENSÍVEL A MAIÚSCULAS - copie exatamente
Exemplo: ZV_Q8U0GYD70WR

Como Funciona
Reescritas Next.js funcionam como um proxy do lado do servidor. Quando um navegador solicita /api/_z/script.js, Next.js a busca de api.zenovay.com/fp/script.js e a devolve. O navegador vê apenas seu domínio.
Navegador → seudominio.com/api/_z/script.js (Primeira parte)
↓
Reescrita Next.js
↓
api.zenovay.com/fp/script.js (Servidor para servidor)
Etapa 1: Configurar Reescritas
Adicione a configuração de reescrita ao seu arquivo de configuração Next.js.
Qual arquivo de configuração?
next.config.js- Se seu projeto usa JavaScriptnext.config.mjs- Se seu projeto usa módulos ESnext.config.ts- Se seu projeto usa TypeScript (Next.js 15+)
Para next.config.js (JavaScript)
/** @type {import('next').NextConfig} */
const nextConfig = {
// Add this rewrites configuration
async rewrites() {
return [
{
// Proxy all requests to /api/_z/* to Zenovay's first-party endpoint
source: '/api/_z/:path*',
destination: 'https://api.zenovay.com/fp/:path*',
},
]
},
}
module.exports = nextConfigPara next.config.mjs (Módulos ES)
/** @type {import('next').NextConfig} */
const nextConfig = {
async rewrites() {
return [
{
source: '/api/_z/:path*',
destination: 'https://api.zenovay.com/fp/:path*',
},
]
},
}
export default nextConfigPara next.config.ts (TypeScript - Next.js 15+)
import type { NextConfig } from 'next'
const nextConfig: NextConfig = {
async rewrites() {
return [
{
source: '/api/_z/:path*',
destination: 'https://api.zenovay.com/fp/:path*',
},
]
},
}
export default nextConfigSe Você Já Tem Reescritas
Se sua configuração já possui uma função rewrites(), adicione a reescrita Zenovay ao array existente:
const nextConfig = {
async rewrites() {
return [
// Your existing rewrites...
{
source: '/old-page',
destination: '/new-page',
},
// Add Zenovay rewrite
{
source: '/api/_z/:path*',
destination: 'https://api.zenovay.com/fp/:path*',
},
]
},
}
module.exports = nextConfigEtapa 2: Adicionar o Script de Rastreamento
Agora adicione o script de rastreamento à sua aplicação.
App Router (Next.js 13+)
Adicione o script ao seu layout raiz:
import Script from 'next/script'
export default function RootLayout({
children,
}: {
children: React.ReactNode
}) {
return (
<html lang="en">
<head>
<Script
src="/api/_z/script.js"
data-tracking-code="YOUR_TRACKING_CODE"
strategy="afterInteractive"
/>
</head>
<body>{children}</body>
</html>
)
}Pages Router
Adicione o script ao seu _app.tsx personalizado:
import Script from 'next/script'
import type { AppProps } from 'next/app'
export default function App({ Component, pageProps }: AppProps) {
return (
<>
<Script
src="/api/_z/script.js"
data-tracking-code="YOUR_TRACKING_CODE"
strategy="afterInteractive"
/>
<Component {...pageProps} />
</>
)
}Substitua YOUR_TRACKING_CODE pelo seu código de rastreamento real do painel Zenovay (ex: ZV_Q8U0GYD70WR).
Etapa 3: Reiniciar Seu Servidor de Desenvolvimento
Importante! Next.js armazena em cache o arquivo de configuração. Você DEVE reiniciar seu servidor de desenvolvimento após editar next.config.js.
# Stop your current dev server (Ctrl+C)
# Then restart it
npm run devEtapa 4: Implantar Suas Mudanças
# For Vercel (automatic deployment)
git add .
git commit -m "Add Zenovay first-party tracking"
git push
# Or manual Vercel deployment
vercel deploy
# For other platforms
npm run build && npm run startEtapa 5: Verificar Se Está Funcionando
Verificação 1: Desenvolvimento Local
- Abra seu site em
http://localhost:3000 - Pressione F12 para abrir DevTools
- Clique na aba Network
- Atualize a página
- Filtre por
script.js - Você deve ver uma requisição para
/api/_z/script.jscom status 200
Verificação 2: Modo Strict do Firefox (Mais Importante!)
Firefox tem a proteção de rastreamento mais rigorosa. Se funcionar no Firefox, funciona em todos os lugares.
- Abra o navegador Firefox
- Clique no botão de menu (três linhas, canto superior direito) → Configurações
- Clique em Privacidade e Segurança na barra lateral esquerda
- Em "Proteção aprimorada contra rastreamento", selecione Rigorosa
- Visite seu site
- Abra DevTools (F12) → aba Network
- Atualize e verifique se
/api/_z/script.jscarrega com status 200
Verificação 3: Painel Zenovay
- Vá para app.zenovay.com e faça login
- Clique no seu site
- Visite seu site em outra aba
- Em 1-2 minutos, você deve ver a visita aparecer no seu painel
Lista de Verificação Final
Antes de terminar, verifique TODOS estes itens:
-
next.config.jstem a regra de reescrita para/api/_z/:path* - Servidor de desenvolvimento foi reiniciado após mudança de configuração
- Tag de script usa
/api/_z/script.js(não a URL Zenovay direta) - Atributo
data-tracking-codecontém seu código de rastreamento correto - Testado no Firefox com Proteção aprimorada contra rastreamento definida como Rigorosa
- Visitas aparecendo no painel Zenovay
Solução de Problemas
Script Retorna 404
Causa: A reescrita não está configurada corretamente ou o servidor não foi reiniciado.
Solução:
- Reinicie seu servidor de desenvolvimento - Esta é a correção mais comum
- Verifique se o arquivo
next.config.jsfoi salvo - Verifique se o caminho corresponde exatamente:
/api/_z/:path* - Certifique-se de estar usando
sourceedestination(nãofrometo)
Script Carrega Mas Nenhum Dado Aparece
Causa: O código de rastreamento pode estar incorreto.
Solução:
- Encontre seu código de rastreamento em Domains → seu site → General → Tracking script
- Certifique-se de que
data-tracking-codecorresponde exatamente (sensível a maiúsculas) - Verifique o console do navegador (F12 → aba Console) para erros
Reescritas Funcionam Localmente Mas Não em Produção
Causa: Algumas plataformas de hospedagem lidam com reescritas de maneira diferente.
Solução:
- Vercel: Reescritas funcionam automaticamente
- Netlify: Adicione a reescrita ao
netlify.tomltambém - Auto-hospedado: Certifique-se de que seu servidor suporte reescritas Next.js
Geolocalização Incorreta
Causa: O IP real do visitante não está sendo encaminhado.
Solução: Para Vercel, isso funciona automaticamente. Para outras plataformas, você pode precisar de middleware:
import { NextResponse } from 'next/server'
import type { NextRequest } from 'next/server'
export function middleware(request: NextRequest) {
if (request.nextUrl.pathname.startsWith('/api/_z/')) {
const response = NextResponse.rewrite(
new URL(`https://api.zenovay.com/fp/${request.nextUrl.pathname.replace('/api/_z/', '')}${request.nextUrl.search}`)
)
// Forward the real client IP
const clientIP = request.headers.get('x-forwarded-for')?.split(',')[0]
|| request.headers.get('x-real-ip')
|| ''
response.headers.set('X-Zenovay-Real-IP', clientIP)
return response
}
}
export const config = {
matcher: '/api/_z/:path*',
}Exemplo Completo
Aqui está um exemplo completo de next.config.js:
/** @type {import('next').NextConfig} */
const nextConfig = {
// Your existing config options...
reactStrictMode: true,
// Zenovay first-party proxy rewrite
async rewrites() {
return [
{
source: '/api/_z/:path*',
destination: 'https://api.zenovay.com/fp/:path*',
},
]
},
}
module.exports = nextConfigE um app/layout.tsx completo:
import Script from 'next/script'
import './globals.css'
export default function RootLayout({
children,
}: {
children: React.ReactNode
}) {
return (
<html lang="en">
<head>
{/* Zenovay Analytics - First-Party Tracking */}
<Script
src="/api/_z/script.js"
data-tracking-code="ZV_Q8U0GYD70WR" // Replace with your tracking code
strategy="afterInteractive"
/>
</head>
<body>{children}</body>
</html>
)
}Próximos Passos
- Eventos Personalizados - Rastreie ações personalizadas do usuário
- Identificação de Visitantes - Identifique usuários autenticados
- Solução de Problemas - Mais ajuda com problemas comuns