consentimiento de cookies para SvelteKit

Consentimiento de cookies para SvelteKit,
un hook de servidor

cookiecrumbsHandle inserta la etiqueta como primer elemento del head de cada respuesta HTML y establece event.locals.consent para tus funciones load.

Lo que cambia en el head de una página SvelteKit 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 SvelteKit

Una app SvelteKit carga sus rastreadores desde +layout.svelte en el cliente. Sin paso de consentimiento, sin registro.

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 SvelteKit

SvelteKit renderiza HTML a través de hooks.server.ts, y ese es el lugar más limpio para un runtime de consentimiento: un handle que transforma cada respuesta HTML y escribe la etiqueta primero en el head, haga lo que haga la página o el layout. Compónlo con tus otros hooks mediante sequence(); pon %cookiecrumbs.head% en app.html si quieres elegir la posición exacta tú mismo.

El mismo hook establece event.locals.consent, así que una función load de +page.server.ts puede decidir en el servidor si incluir un embed o su marcador. En el cliente, los stores de consentimiento mantienen cada componente al día: $consent para las categorías, $regime para la regla aplicable y acciones para abrir, aceptar, rechazar o retirar.

El onMount de SvelteKit es donde suelen arrancar los rastreadores. Envuelve el subárbol en ConsentGate, o comprueba el store antes de inicializar. Todo lo que el escaneo encuentra en el dominio desplegado sin etiquetar lo gestiona el mapa de bloqueo, así que un script olvidado en un layout antiguo también espera.

configuración

Configúralo en SvelteKit

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 SvelteKit, vincula el sitio, escribe la configuración.

    npx cookiecrumbs login
    npx cookiecrumbs init
  2. Añade el hook

    Compónlo con tus otros hooks mediante sequence(). Pon %cookiecrumbs.head% en src/app.html para elegir la posición exacta tú mismo.

    npm i @cookiecrumbs/sveltekit
    
    // src/hooks.server.ts
    import { cookiecrumbsHandle } from '@cookiecrumbs/sveltekit/server';
    
    export const handle = cookiecrumbsHandle({ site: 'pk_live_…', env: 'production' });
  3. Bloquea en el árbol

    Los componentes Svelte ConsentGate, CookieDeclaration y ManageCookiesLink y los stores de consentimiento vienen con el paquete.

    <script>
      import { ConsentGate } from '@cookiecrumbs/sveltekit';
    </script>
    
    <ConsentGate category="marketing">
      <MetaPixel />
    </ConsentGate>
  4. Decide en el servidor cuando puedas

    Una función load puede leer el consentimiento y omitir un embed para los visitantes que dijeron no, antes de que se ejecute cualquier código cliente.

    // +page.server.ts
    export const load = ({ locals }) => ({
      showMap: locals.consent?.isGranted('marketing') ?? false,
    });
  5. Escanear, clasificar, publicar

    Escanea, clasifica una vez por proveedor, publica.

    npx cookiecrumbs scan --wait
    npx cookiecrumbs push --env production

ojo

Errores que vemos en apps SvelteKit

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

  • Añadir la etiqueta en +layout.svelteEso es en el cliente y tras la hidratación. El hook la escribe en la respuesta HTML, primero.
  • Páginas prerenderizadas sin el hookEl prerenderizado pasa por el mismo handle, así que la etiqueta también está en el HTML estático. Si te saltas el hook con un app.html propio, usa el marcador.
  • Form actions que ponen cookies de analíticaLas cookies puestas por el servidor son cookies. Mantenlas necesarias o bloquéalas.
  • Varios adaptadores, una sola claveProducción y preview tienen claves distintas. Usa la clave de preview en staging.
  • Sin vía para retirar el consentimientoManageCookiesLink en el pie ocupa dos líneas.

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

¿Puedo leer el consentimiento en el servidor?
Sí. El hook establece event.locals.consent a partir de la cookie de consentimiento, así que una función load puede decidir qué renderizar antes de que se ejecute el cliente.
¿Funciona con los adaptadores de Vercel, Netlify y Node?
El hook se ejecuta dentro del manejo de peticiones de SvelteKit, así que funciona con cualquier adaptador que sirva respuestas HTML, y con prerenderizado.
¿Qué componentes y stores se incluyen?
ConsentGate, CookieDeclaration y ManageCookiesLink, más stores para el estado del consentimiento, el régimen y las acciones.
¿Y Google Tag Manager?
Mantenlo. El runtime fija primero los valores por defecto de Consent Mode v2 y la plantilla de GTM añade los activadores; o dale una categoría a la etiqueta de GTM.
¿Afecta al rendimiento?
El runtime pesa 21 kB comprimido, es asíncrono, no hace peticiones propias a terceros, y los diseños de barra y cinta reservan espacio antes del pintado.
¿Puedo colocar la etiqueta yo mismo?
Sí. Pon %cookiecrumbs.head% en src/app.html y el hook lo rellena ahí en lugar de al principio del head.

siguiente paso

Publica el banner con el siguiente despliegue

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