consentimiento de cookies para Next.js

Consentimiento de cookies para Next.js,
con un comando

Ejecuta npx cookiecrumbs init en tu repositorio Next.js. Vincula el sitio, escribe cookiecrumbs.config.ts e inserta la etiqueta con strategy="beforeInteractive", para que los valores por defecto del consentimiento lleguen antes de la hidratación y de cualquier gestor de etiquetas.

Lo que cambia en el head de una página Next.js cuando el runtime va primero: nada no esencial se ejecuta hasta que se concede su categoría.

la norma

Lo que la ley exige a un sitio Next.js

Una app Next.js no tiene capa de consentimiento. next/script carga GA4 o el píxel de Meta en cuanto la página se hidrata, y cada visitante de la UE es rastreado antes de haber dicho nada.

La norma es la misma en toda la UE y en el Reino Unido: nada más allá de lo estrictamente necesario puede almacenarse en el dispositivo de un visitante ni leerse de él antes de que haya dado su consentimiento. Es el artículo 5(3) de la Directiva ePrivacy, y ese consentimiento debe cumplir la definición del RGPD: libre, específico, informado e inequívoco, con un rechazo tan fácil como la aceptación. El Reino Unido mantiene la misma norma en PECR, con exenciones limitadas para estadísticas de bajo riesgo desde el 5 de febrero de 2026. California y las demás leyes estatales de EE. UU. funcionan al revés: sin opt-in, pero con un enlace de opt-out y soporte para la señal Global Privacy Control.

De ahí se derivan tres cosas para un sitio web. Los scripts de analítica, publicidad y redes sociales tienen que esperar una decisión. La decisión tiene que registrarse de forma que puedas demostrarla después, porque el artículo 7(1) pone la carga de la prueba sobre ti. Y retirar el consentimiento tiene que ser tan fácil como darlo, lo que exige un control que vuelva a abrir el banner en cada página. Un banner que muestra dos botones y carga Google Analytics de todos modos suspende la primera prueba, y ese es justo el fallo que las autoridades están sancionando, desde las decisiones de la CNIL contra Google y SHEIN hasta las inspecciones de las autoridades neerlandesa y belga.

cómo funciona

Cómo funciona el consentimiento en una app Next.js

Next.js te da exactamente un buen lugar para un runtime de consentimiento: una etiqueta next/script con strategy="beforeInteractive". Los scripts con esa estrategia se inyectan en el HTML inicial y se ejecutan antes de cualquier hidratación, el único momento suficientemente temprano. afterInteractive (el valor por defecto) se ejecuta tras la hidratación, cuando un gestor de etiquetas añadido con la misma estrategia puede haberse disparado ya. lazyOnload es aún peor.

En el App Router la etiqueta va en app/layout.tsx, que envuelve cada ruta. En el Pages Router va en pages/_document.tsx. La CLI detecta cuál usas e imprime el snippet correcto; @cookiecrumbs/next envuelve la etiqueta como componente y añade helpers de servidor, de modo que un Server Component o un route handler puede leer la cookie de consentimiento y decidir qué renderizar antes de que se ejecute el cliente.

A partir de ahí, bloquear es cuestión de categoría. Una etiqueta de terceros pasa a ser type="text/plain" con data-cc-category; un subárbol de React que carga un rastreador va dentro de ConsentGate. El runtime libera ambos cuando se concede la categoría, en el orden del documento, así que un contenedor de GTM que espera a analítica se ejecuta exactamente como lo habría hecho, solo que más tarde. Todo lo que el escaneo encontró en tu dominio de producción se compila en un mapa de bloqueo al publicar, de modo que los scripts sin etiquetar cuyo host es conocido también se neutralizan in situ.

configuración

Configúralo en Next.js

Cinco pasos. La CLI hace la mayoría, y cada uno es también un clic en el panel.

  1. Init desde el repositorio

    Detecta Next.js, vincula o crea el sitio en tu espacio de trabajo, escribe la configuración y los archivos de texto e imprime el snippet para tu router.

    npx cookiecrumbs login
    npx cookiecrumbs init
  2. Pon la etiqueta primero

    App Router: en app/layout.tsx. Pages Router: en pages/_document.tsx. beforeInteractive la mantiene por delante de la hidratación y de cualquier gestor de etiquetas.

    // app/layout.tsx
    import Script from 'next/script';
    
    <Script src="https://app.cookiecrumbs.eu/runtime/cc.js"
      strategy="beforeInteractive"
      data-cc-site="pk_live_…" data-cc-env="production" />
  3. Bloquea lo que necesita consentimiento

    Dale a las etiquetas sujetas a consentimiento type="text/plain" y una categoría, o envuelve los componentes en ConsentGate de @cookiecrumbs/next. El runtime los libera cuando se concede la categoría.

    import { ConsentGate } from '@cookiecrumbs/next';
    
    <ConsentGate category="analytics" fallback={null}>
      <Analytics />
    </ConsentGate>
  4. Escanear, clasificar, publicar

    El primer escaneo encuentra lo que la app carga de verdad. Clasifica cada proveedor una vez, configura tus enlaces legales, publica y el registro de consentimiento empieza a grabar.

    npx cookiecrumbs scan --wait
    npx cookiecrumbs push --env production
  5. Protege el despliegue

    En CI, haz fallar la build cuando aparezca un nuevo rastreador sin clasificar. La salida SARIF llega al análisis de código.

    npx cookiecrumbs scan --wait --fail-on-unknown --fail-on-preconsent --sarif results.sarif

ojo

Errores que vemos en apps Next.js

Cada uno aparece en el primer escaneo como un rastreador que se disparó antes del consentimiento.

  • Cargar el runtime con afterInteractivePara entonces la página ya se ha hidratado y un gestor de etiquetas con la misma estrategia puede haberse ejecutado. Solo beforeInteractive es suficientemente temprano.
  • Un componente de banner que solo se ocultaPoner una cookie y ocultar la caja no hace nada con los scripts que ya se ejecutaron. El bloqueo tiene que ocurrir en la etiqueta script, no en la UI.
  • Vercel Analytics y Speed Insights como «necesarias»Son analítica. Clasifícalas como analítica y bloquéalas; el nivel gratuito también cuenta.
  • Middleware que pone cookies de marketingUn test A/B o una cookie de referente puesta en el middleware se ejecuta antes de que exista consentimiento. Mantenlas estrictamente necesarias o ponlas detrás del consentimiento.
  • Olvidar el despliegue de vista previaLas URL de vista previa usan la clave de preview y su propio entorno, así que las pruebas nunca tocan a visitantes reales.

antes de publicar

La lista de comprobación

Ocho líneas. El panel marca las dos últimas con datos reales.

  • La etiqueta es el primer script del headCualquier cosa por encima puede poner una cookie que el runtime no puede retirar.
  • Cada script de analítica, anuncios y redes sociales espera a su categoríaO bien type="text/plain" con una categoría, o bien el host está en el mapa de bloqueo del escaneo.
  • «Rechazar todo» está en la primera capaMismo tamaño y mismo peso que «Aceptar todo». Sin «X» que cuente como consentimiento ni casillas premarcadas.
  • Los valores por defecto de Consent Mode están en «denied» antes de que cargue GoogleComprueba las siete señales en Tag Assistant con el consentimiento denegado.
  • Los enlaces al aviso legal y a la política de privacidad están configuradosLa publicación se rechaza hasta que estén los dos; el pie del banner enlaza a ellos.
  • Hay un control para retirar el consentimiento en cada páginaEl control permanente o un enlace «Gestionar cookies» en tu pie de página.
  • El primer escaneo completo se ejecutó y cada proveedor está clasificadoEl veredicto en Inicio dice, con fecha, qué se disparó antes del consentimiento.
  • La comprobación de instalación se ha superadoCarga tu página como un visitante y confirma que el banner se ejecutó antes que cualquier rastreador.

lo que obtienes

Lo que incluye el plan gratuito

Dos dominios, 100 subpáginas escaneadas al mes por dominio, todas las normativas, la CLI, los SDK y el servidor MCP.

Un escáner que lee la página renderizada

Cada página, en cada estado de consentimiento, en un navegador real. Cookies, píxeles, iframes y claves de almacenamiento, con la página y el script que los pusieron. Se vuelve a escanear según un calendario.

La declaración de cookies se escribe sola a partir del resultado.

Un banner que bloquea primero

Las etiquetas permanecen inactivas hasta que se concede su categoría. «Rechazar todo» es tan visible como «Aceptar todo». Siete diseños, 25 idiomas, Consent Mode v2 y la norma correcta por región.

21 kB, un solo archivo, sin peticiones propias a terceros.

Una prueba que puedes entregar

Cada decisión se guarda con marca de tiempo, versión del banner y un hash de los textos mostrados, encadenada al registro anterior. Las exportaciones van firmadas. Alojado en Fráncfort.

Artículo 7(1), en el plan gratuito.

comprobación gratuita

Comprueba qué carga tu sitio ahora mismo

El HTML de la página de inicio, contrastado con la base de datos de rastreadores. Sin cuenta, sin guardar nada. El escaneo completo del panel hace lo mismo con cada página, en un navegador real.

preguntas

Respuestas claras

¿Funciona con el App Router y el Pages Router?
Sí. La etiqueta va en app/layout.tsx con next/script y strategy="beforeInteractive" para el App Router, o en pages/_document.tsx para el Pages Router. La CLI imprime el snippet correcto para tu proyecto.
¿El banner empeora mis Core Web Vitals?
El runtime pesa 21 kB comprimido, un solo archivo, cargado en asíncrono, y los diseños de barra y cinta reservan su espacio antes del pintado, así que no añade desplazamiento de diseño. En Vercel se sirve desde nuestro propio dominio con largas vidas de caché.
¿Puedo mantener la configuración en git?
Sí. cookiecrumbs.config.ts contiene diseño, textos, categorías, idiomas y reglas por región. cookiecrumbs push la despliega y cookiecrumbs pull trae los cambios del panel de vuelta al repositorio, así que un cambio en el banner es una pull request.
¿Puede un Server Component leer el consentimiento?
Sí. @cookiecrumbs/next expone la cookie de consentimiento a los helpers de servidor, así que puedes renderizar un marcador en lugar de un embed antes de que el cliente llegue a ejecutarse.
¿Y Google Tag Manager en Next.js?
Mantenlo. El runtime fija los valores por defecto de Consent Mode v2 antes de que cargue GTM y los actualiza con el consentimiento; la plantilla de GTM añade los activadores. O dale una categoría a la etiqueta de GTM y deja que espere del todo.
¿El plan gratuito cubre un proyecto personal en Next.js?
Dos dominios, 100 subpáginas escaneadas al mes por dominio, todas las normativas, el SDK, la CLI y el servidor MCP. Los registros de consentimiento se conservan 12 meses en Free y 60 meses en todos los planes de pago.

siguiente paso

Publica el banner con el siguiente despliegue

Añade el sitio, ejecuta npx cookiecrumbs init en tu repositorio Next.js y el registro de consentimiento empieza a grabar en la UE.