Consentimiento de cookies para Next.js

El banner se carga con next/script y strategy="beforeInteractive" —la estrategia que Next.js documenta para gestores de consentimiento—, así que se ejecuta antes que tu analítica. Las etiquetas que cargas con next/script o @next/third-parties quedan retenidas hasta que el visitante acepta, y las de Google reciben las señales de Consent Mode v2.

Configúralo con tu agente de IA

Conecta el servidor MCP de Croombit a tu editor o agente de código y pega esto. Crea el sitio, las categorías de cookies y el banner, y edita tu código.

Con Croombit: crea un sitio para este proyecto con las categorías de cookies Analítica (ANALYTICS) y Publicidad (MARKETING), desactivadas por defecto, publícalas y publica el banner. Crea una clave publicable de TEST para localhost:3000. Es un proyecto Next.js con App Router: carga cmp.js en el layout raíz con next/script y strategy="beforeInteractive", leyendo la clave de NEXT_PUBLIC_CROOMBIT_KEY en .env.local, y añade un enlace "Configurar cookies" al pie.

El agente trabaja en TEST. Pasar a LIVE son dos pasos en la consola: verificar tu dominio y cambiar a una clave LIVE; consulta pasar a LIVE.

O a mano

1. Carga el banner en el layout raíz

Pon la clave en .env.local como NEXT_PUBLIC_CROOMBIT_KEY (pk_test_… en desarrollo, pk_live_… en producción). beforeInteractive solo funciona en el layout raíz.

// app/layout.tsx
import Script from 'next/script';

export default function RootLayout({ children }: { children: React.ReactNode }) {
  return (
    <html lang="en">
      <body>
        {/* beforeInteractive: loaded before any other script, as consent managers need */}
        <Script
          src="https://croombit.com/cmp.js"
          strategy="beforeInteractive"
          data-tc-api-key={process.env.NEXT_PUBLIC_CROOMBIT_KEY}
        />
        {children}
      </body>
    </html>
  );
}

2. Tu analítica no necesita cambios

Los scripts que carga next/script se insertan por JavaScript, y cmp.js los intercepta: los proveedores conocidos quedan aparcados hasta que el visitante concede su categoría.

// Any tag loaded through next/script or @next/third-parties is inserted
// by JavaScript, so cmp.js holds known hosts (gtag.js, GTM, Meta Pixel…)
// until the visitor grants the matching category.
import { GoogleAnalytics } from '@next/third-parties/google';

<GoogleAnalytics gaId="G-XXXX" />

Para una etiqueta que la lista de bloqueo no conozca, renderízala con type="text/plain" y data-tc-consent="analytics" (o marketing).

3. Un enlace «Configurar cookies»

'use client';
// Any element with data-tc-open-preferences reopens the panel,
// pre-set to the visitor's current choices.
export function CookieSettingsLink() {
  return <a href="#" data-tc-open-preferences>Configurar cookies</a>;
}

4. Registra los consentimientos que pide tu app

Los opt-in de newsletter, la aceptación de términos y similares se registran desde tu servidor —un Route Handler o una Server Action— con una clave secreta. Cada uno va a la bóveda de solo-anexado con un recibo firmado. Consulta Registrar y consultar consentimiento.

import { CroombitClient } from '@croombit/sdk';

// Server side, with a secret key — e.g. in your signup handler.
const tc = new CroombitClient({
  baseUrl: 'https://api.croombit.com',
  apiKey: process.env.CROOMBIT_SECRET_KEY!,
});
await tc.recordConsent(
  { subject: 'email:' + user.email, purpose: 'newsletter', state: 'GRANTED', channel: 'signup_form' },
  { idempotencyKey: crypto.randomUUID() },
);

Preguntas

¿Funciona con el Pages Router?

Sí. Pon el mismo <Script strategy="beforeInteractive"> en pages/_document.tsx, dentro de <Head>.

¿La navegación en cliente vuelve a mostrar el banner?

No. La decisión se guarda una vez y vale para todas las rutas; el banner solo vuelve si publicas una versión que exige volver a consentir.

¿Puedo mantener mi propio diseño de banner?

Sí: el diseñador del banner cubre disposición, colores y textos. Para una interfaz totalmente propia, usa el SDK de JavaScript en lugar de cmp.js; consulta la guía del banner de cookies.