Inicio Rápido con Next.js
Integra Zenovay Analytics en tu aplicación Next.js. Soporta tanto App Router (Next.js 13+) como Pages Router.
Instalación
No se requiere ningún paquete npm. Zenovay utiliza un script de seguimiento ligero que agregues a tu layout.
Encuentra tu código de seguimiento en la aplicación de Zenovay: abre Dominios, haz clic en tu sitio, luego ve a la página de configuración General. La tarjeta Script de seguimiento muestra tu fragmento y un botón Verificar instalación.

Configuración con App Router (Next.js 13+)
Agregar Script de Seguimiento
Agrega el script de seguimiento de Zenovay a tu layout raíz usando el componente Script de Next.js:
import Script from 'next/script';
export default function RootLayout({
children,
}: {
children: React.ReactNode;
}) {
return (
<html lang="en">
<body>
{children}
<Script
defer
data-tracking-code="YOUR_TRACKING_CODE"
src="https://api.zenovay.com/z.js"
strategy="afterInteractive"
/>
</body>
</html>
);
}¡Eso es! Zenovay ahora rastreará automáticamente las vistas de página en tu aplicación Next.js.
Configuración con Pages Router
Agregar Script a Custom App
Actualiza tu archivo _app.tsx:
import Script from 'next/script';
import type { AppProps } from 'next/app';
export default function App({ Component, pageProps }: AppProps) {
return (
<>
<Component {...pageProps} />
<Script
defer
data-tracking-code="YOUR_TRACKING_CODE"
src="https://api.zenovay.com/z.js"
strategy="afterInteractive"
/>
</>
);
}Rastrear Eventos Personalizados
Usa window.zenovay para rastrear eventos personalizados en tus componentes:
'use client';
export function SignupButton() {
const handleSignup = async () => {
// Your signup logic here
const user = await signup();
// Track the event
if (window.zenovay) {
window.zenovay('track', 'user_signup', {
plan: 'free',
source: 'homepage',
});
}
};
return (
<button onClick={handleSignup}>
Sign Up
</button>
);
}Rastreo del Lado del Servidor
Para rastrear eventos del lado del servidor, envía eventos directamente al punto final de rastreo de Zenovay. Este es un punto final público que no requiere una clave API:
import { NextResponse } from 'next/server';
export async function POST(request: Request) {
const { amount } = await request.json();
// Process payment...
// Track conversion server-side via the public tracking endpoint
await fetch('https://api.zenovay.com/e/YOUR_TRACKING_CODE', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'User-Agent': request.headers.get('user-agent') || '',
'X-Forwarded-For': request.headers.get('x-forwarded-for') || '',
},
body: JSON.stringify({
type: 'event',
payload: {
name: 'purchase_complete',
url: 'https://yoursite.com/checkout',
props: { amount, currency: 'USD' },
},
}),
});
return NextResponse.json({ success: true });
}El punto final de rastreo (/e/:trackingCode) es público y no requiere una clave API. Reenvía el User-Agent y la dirección IP del usuario original para una atribución de visitante precisa.
Identificar Usuarios
Asocia eventos con usuarios autenticados:
'use client';
import { useEffect } from 'react';
import { useUser } from '@/hooks/useUser';
export default function Dashboard() {
const { user } = useUser();
useEffect(() => {
if (user && window.zenovay) {
window.zenovay('identify',user.id, {
email: user.email,
name: user.name,
plan: user.subscription?.plan,
});
}
}, [user]);
return <div>Dashboard</div>;
}Rastrear Clics en Enlaces
Rastrea clics en enlaces externos:
'use client';
export function ExternalLink({ href, children }: { href: string; children: React.ReactNode }) {
const handleClick = () => {
if (window.zenovay) {
window.zenovay('track', 'external_link_click', {
url: href,
text: children?.toString(),
});
}
};
return (
<a
href={href}
onClick={handleClick}
target="_blank"
rel="noopener noreferrer"
>
{children}
</a>
);
}Rastreo de Vistas de Página en SPA
Para rastreo de navegación del lado del cliente en App Router:
'use client';
import { usePathname, useSearchParams } from 'next/navigation';
import { useEffect } from 'react';
export function Analytics() {
const pathname = usePathname();
const searchParams = useSearchParams();
useEffect(() => {
if (window.zenovay) {
window.zenovay('track', 'pageview', {
path: pathname,
title: document.title,
});
}
}, [pathname, searchParams]);
return null;
}
// Add to your root layout:
// <Analytics />Soporte de TypeScript
Agrega declaraciones de tipo para el objeto global zenovay:
declare global {
interface Window {
zenovay: (...args: any[]) => void;
}
}
export {};Pruebas en Desarrollo
En desarrollo, puedes verificar que los eventos se están enviando abriendo la consola del navegador y observando las solicitudes de red a api.zenovay.com. El panel de control de Zenovay también muestra datos de eventos en tiempo real.
// Optional: Create a helper hook for cleaner tracking calls
export function useZenovay() {
const track = (eventName: string, data?: Record<string, any>) => {
if (window.zenovay) {
window.zenovay('track',eventName, data);
}
};
const identify = (userId: string, traits?: Record<string, any>) => {
if (window.zenovay) {
window.zenovay('identify', userId, traits);
}
};
const trackGoal = (goalName: string, data?: Record<string, any>) => {
if (window.zenovay) {
window.zenovay('goal', goalName, data);
}
};
return { track, identify, trackGoal };
}Próximos Pasos
¡Tu aplicación Next.js ya está rastreando analytics con Zenovay! Consulta tu panel de control para ver datos en tiempo real.
Continúa aprendiendo:
- Eventos Personalizados - Rastrear acciones específicas del usuario
- Cumplimiento de Privacidad - Configuración de GDPR y CCPA
- Descripción General del Panel - Entiende tus datos