Cookies conformes en Astro con Consent Mode v2
Cargar Google Analytics en el <head> sin más incumple el RGPD: las cookies no esenciales necesitan consentimiento previo. Pero bloquear GA hasta el “Aceptar” te deja sin ningún dato de quien no acepta. La solución oficial de Google resuelve las dos cosas: Consent Mode v2. Un matiz importante primero: esto no va de ocultar el banner —el banner se ve siempre al cargar—, va del estado del tracking.
GA arranca denegado
Antes de cargar gtag.js, le digo a Google que el consentimiento por defecto es denegado. GA se carga, pero sin escribir cookies: solo manda pings anónimos, que sí son legales sin consentimiento.
<script>
window.dataLayer = window.dataLayer || [];
function gtag() { dataLayer.push(arguments); }
gtag('consent', 'default', {
ad_storage: 'denied',
ad_user_data: 'denied',
ad_personalization: 'denied',
analytics_storage: 'denied',
wait_for_update: 500,
});
</script>
<script async src="https://www.googletagmanager.com/gtag/js?id=G-XXXX"></script>
<script>gtag('js', new Date()); gtag('config', 'G-XXXX');</script>
Del banner a Google: consent update
El banner lo pinta vanilla-cookieconsent (v3, gratis, sin servicio externo). Cuando el usuario decide, reflejo su elección en gtag: si acepta la categoría analítica, paso analytics_storage a granted.
import * as CookieConsent from 'vanilla-cookieconsent';
function updateConsent() {
const analytics = CookieConsent.acceptedCategory('analytics');
gtag('consent', 'update', {
analytics_storage: analytics ? 'granted' : 'denied',
});
}
CookieConsent.run({
categories: { necessary: { readOnly: true }, analytics: {} },
onFirstConsent: updateConsent,
onConsent: updateConsent,
onChange: updateConsent,
// ...traducciones
});
Conclusión
Con Consent Mode v2, GA carga en denied (sin cookies) y solo pasa a granted cuando el usuario acepta. Cumples el RGPD, no te pierdes los datos agregados anónimos, y usas el patrón que Google exige desde 2024 en la UE. En Astro son dos piezas: el default antes de gtag.js y el update desde el banner.