marketing

Cookie banner + consent log GDPR

Banner cookie/consent management GDPR-compliant con categorizzazione (necessari/funzionali/analytics/marketing), blocco preventivo script terzi fino al consenso, integrazione Google Consent Mode v2 + IAB TCF v2.2, prove di consenso archiviate (consent log con hash IP+timestamp+versione testo+scelte granulari) e UI riapertura preferenze.

Cosa fa questo modulo

Modulo «Cookie banner + consent log GDPR»: scheda inventario del layer di consenso cookie/tracking compliance GDPR (Reg. UE 2016/679) + ePrivacy Directive + Linee guida Garante Privacy IT (provv. 10/06/2021) + EDPB Guidelines 03/2022 + Cookie Pledge EU 2024, con architettura «consenso preventivo» (opt-in esplicito prima di caricare qualsiasi script tracking non-necessario), categorizzazione granulare, log immodificabile delle scelte utente per onere della prova al titolare del trattamento, riapertura preferenze always-available, integrazione Google Consent Mode v2 (per AdSense/Ads/GA4 con `ad_storage`/`ad_user_data`/`ad_personalization`/`analytics_storage`/`functionality_storage`/`personalization_storage`/`security_storage`) e IAB TCF v2.2 (per ecosistema adtech publishers — TCString + CMP iframe API + vendor list). Modello dati: tabella `cookie_consents` (id, user_id nullable FK se logged-in, session_id, ip_hash sha256(`ip+app_key_salt`) per pseudonimizzazione GDPR, user_agent_hash, country_code da geoip per regional rules, consent_id uuid univoco rilasciato al browser via cookie `_cc_id` lifetime 12 mesi, policy_version string es. `2026-05-19` per tracciabilità testo informativa al momento del consenso, banner_version string es. `v3.2` per A/B test layout, choices JSON `{"necessary":true,"functional":false,"analytics":true,"marketing":false}` granular per categoria, vendors JSON opt. per consenso per-vendor IAB TCF (`{"google":true,"facebook":false,"hotjar":true,...}`), method enum `accept_all`/`reject_all`/`save_preferences`/`continue_browsing` (per giurisdizioni che ammettono scrolling=consent, sconsigliato post-Garante 2021) / `cookie_wall_paid_subscription` (paywall alternativa rifiuto), source enum `first_visit`/`reopened_preferences`/`policy_update_revalidation`, given_at timestamp, withdrawn_at nullable, ttl_expires_at = given_at + 6 mesi default (Garante linee guida: massimo 6 mesi prima di ri-chiedere se utente non ha modificato attivamente preferenze; altre giurisdizioni 12-24 mesi), raw_request_meta JSON (URL pagina di rilascio, referrer, locale). Indici (user_id+given_at desc), (session_id+given_at desc), (consent_id), (policy_version+given_at) per audit periodici. Tabella `cookie_consent_versions` (id, version string, effective_from date, policy_text_path o markdown, banner_layout_html_snapshot, categories_definition JSON con descrizione+esempi+lifetime+terze parti per ogni categoria, vendors_list JSON snapshot lista vendor abilitati al momento, created_by user) — immutable append-only per onere della prova: se l'utente nel 2024 ha dato consenso e nel 2026 il Garante chiede prova, si recupera versione `2024-XX-XX` esatta del testo che ha letto. Tabella `cookie_categories_catalog` (slug `necessary`/`functional`/`analytics`/`marketing`/`profiling`/`social`, nome localizzato JSON `{it:"Necessari", en:"Strictly necessary"}`, descrizione localizzata, esempio_cookie_list JSON `[{name:"_ga", domain:".dominio.it", lifetime:"2 anni", third_party:true, provider:"Google Analytics"}]`, blockable bool — `necessary=false` non bloccabile, sort_order). Tabella `cookie_scripts_registry` (slug `google-analytics-4`/`google-ads`/`meta-pixel`/`hotjar`/`linkedin-insight`/`tiktok-pixel`/`hubspot`/`intercom`/`youtube-embed`/`vimeo-embed`/`google-maps`/`mapbox`/`stripe-fraud-detection`, categoria FK, script_src URL, init_code template blade con placeholder ID account, requires_consent bool, blocking_strategy enum `delete_cookies_on_revoke`/`reload_page`/`soft_remove`, gdpr_dpia_required bool, vendor_url privacy policy terzi). Banner UI: layout responsive desktop/mobile/tablet, posizione configurabile (`bottom_bar`/`bottom_left_card`/`bottom_right_card`/`center_modal`/`top_bar`) — Garante richiede **non oscurante** ma **immediatamente percepibile** (bottom_bar full-width default), 4 bottoni primari **paritari per dimensione/colore/peso visivo** (Garante 2021 vieta dark pattern «accetta tutti» più evidente di «rifiuta tutti» o «personalizza»): `Accetta tutti` / `Rifiuta tutti` / `Personalizza` / `X chiudi senza scelta` (la X equivale a rifiuto per linee guida EDPB 03/2022); chiusura tramite continuazione navigazione/scroll è **non valida** post-Garante 2021 (rimuovere). Modal personalizza: lista categorie con toggle on/off + accordion descrizione + dettaglio cookie elencati con provider+lifetime+finalità, bottoni in fondo `Salva preferenze` + `Accetta tutti` + `Rifiuta tutti`. Trigger riapertura: link footer «Preferenze cookie» permanente + floating icon opt. (badge piccolo bottom-left/right per riapertura rapida) + sezione informativa privacy policy con bottone embedded. Logica blocco preventivo script: rendering pagina senza alcun script tracking se consenso assente (script tag con `type="text/plain"` o data-attribute `data-category="analytics"` invece di `type="text/javascript"`, attivati dinamicamente via JS solo dopo `consent.granted("analytics")`); pattern alternativo: tag manager wrapper (Tag Manager GTM con built-in Consent Mode trigger condition + custom trigger per ogni categoria + nessun tag fired senza permesso); pattern terzo: lazy-load iframe embed (YouTube/Maps placeholder con bottone «Carica contenuto con consenso» click-to-load). Google Consent Mode v2 integration (richiesto da Google da marzo 2024 per EEA traffic): emissione `gtag('consent', 'default', {ad_storage:'denied', ad_user_data:'denied', ad_personalization:'denied', analytics_storage:'denied', wait_for_update:500})` come primo script in head pre-banner; al consenso `gtag('consent', 'update', {...})` con mapping categorie→Google params (analytics → analytics_storage, marketing → ad_storage+ad_user_data+ad_personalization), supporto modalità «basic» (no event senza consenso) e «advanced» (cookieless ping anonymous per conversioni modeled — opzionale e a discrezione cliente, default basic per safety). IAB TCF v2.2 integration (per publisher con monetizzazione adtech tipo prebid/header bidding): CMP self-hosted ID registrato presso IAB Europe o stamp white-label CMP terzi (OneTrust/Iubenda/CookieFirst/Didomi); generazione TCString conforme + `__tcfapi` window function + iframe `__tcfapi` cross-domain per vendor; vendor list pull settimanale da `https://vendor-list.consensu.org/v3/vendor-list.json` + UI mostra elenco vendor IAB per consenso granulare opt-in (es. 800+ vendor adtech). Geolocalizzazione opzionale (`cookie_consent.geo_strategy`): comportamento differente per Paese — UE/UK: opt-in esplicito obbligatorio, banner full + Rifiuta paritario; California (CCPA/CPRA): «Do Not Sell My Personal Information» link footer + opt-out (non opt-in) — banner soft o non required salvo trattamento «sale» dati; USA altri stati: variabile; resto mondo: opt-out o nessun banner (configurabile). Detect via GeoIP (MaxMind GeoLite2 locale o IP-API.com con cache 30gg per IP/24 anonymized). Auto-discovery script in pagina: comando `php artisan cookie:scan` crawla N pagine sample + ispeziona DOM/network requests + rileva script terzi non registrati + report admin «attenzione: rilevato `https://connect.facebook.net/en_US/fbevents.js` non presente in `cookie_scripts_registry`, classifica come marketing o disattiva». Audit log immutabile: append-only su tabella consent + opzionale spedizione hash a servizio timestamping notarile (TSA RFC 3161) o blockchain (es. OpenTimestamps su Bitcoin) per inalterabilità non-ripudiabile in contenziosi Garante. Esportazione log per richiesta accesso interessato (GDPR art. 15) + cancellazione (art. 17): comando `php artisan cookie:export-consent {user_id|consent_id}` produce JSON+PDF firmato. Reportistica admin (dashboard `/admin/cookie-consent`): KPI funnel banner (impressions, accept_all %, reject_all %, customize %, save_preferences %, X-closed %), distribuzione consenso per categoria (% utenti che accettano analytics, marketing, etc.), distribuzione per source/country/device, drift su policy_version (impatto cambio testo su accept rate), consent expiry queue (chi sta per scadere → ri-chiedere), withdraw rate (% revoche). Comandi artisan: `cookie:scan` (audit script in pagina), `cookie:export-consent` (per art. 15/17), `cookie:expire-old` (cron daily che marca scaduti i consent oltre 6 mesi), `cookie:revalidate-on-policy-update` (quando admin pubblica nuova version, invalidate i consensi precedenti e ri-chiede al prossimo visit), `cookie:archive-anonymize` (anonimizza ip_hash dopo 24 mesi per retention compliance). Integrazione lifecycle Laravel: middleware `CookieConsentBoot` che inietta in ogni response HTML `<script>window.__cookieConsentState = {...}</script>` + carica banner JS asincrono se consenso scaduto/assente; helper `cookie_consent()->granted('analytics')` blade `@cookieConsent('analytics') @endCookieConsent` per wrap condizionale script; service `CookieConsentService` con metodi `record($choices, $meta)`, `revoke($consent_id, $categories)`, `current()`, `requireRevalidation($policy_version)`. API REST: `POST /api/cookie-consent` (salva scelta, ritorna consent_id), `GET /api/cookie-consent/{id}` (recupera per utente per pannello preferenze), `PATCH /api/cookie-consent/{id}` (aggiorna preferenze granular), `DELETE /api/cookie-consent/{id}` (revoca totale → cancella cookies non-necessari client-side via instruction set). Casi d'uso workspace: **Footility** (footility.com banner sobrio con GA4 marketing + LinkedIn Insight, Garante-compliant, log consensi B2B per lead form), **Klabhouse** (klabhouse.com banner forte UX scuola con GA4 + Meta Pixel per ads + YouTube embed click-to-load per video corso anteprima, consent log multilingua IT/EN per studenti EU), **Holiday Self Drive** (multi-locale IT/EN con TCF v2.2 opt-in per ads adtech booking + Hotjar conversion funnel, geolocation Paese ospite per UE rules vs extra-UE rules), **gestionali B2B Casarile/Altramusica/LB advisory** (vetrine con minimo tracking necessario + LinkedIn Insight + GA4, banner discreto B2B), **the-body-code/realpilates** (banner con Meta Pixel/TikTok per ads corsi + GA4 + embed video Vimeo, consent log per audience custom), **mscarichi** (banner per GA4 + Meta Pixel + Google Maps embed click-to-load per area servita), **prontointervento** (banner minimale 24/7 emergenza, solo GA4 + click-to-call telephony tracking + Google Maps cliccabile, geo-trigger città area). Compliance specifica: pre-tick checkbox vietato (EDPB), Accept All paritario con Reject All (Garante), salvataggio scelta prima di ogni script (no script firing pre-consenso), informativa cookies linkata da banner sempre raggiungibile (privacy policy + cookie policy separati), retention massimo 6 mesi prima di ri-chiedere (Garante), supporto «X chiude = rifiuta» (EDPB 03/2022), no cookie wall salvo alternativa effettiva paywall o servizio non-equivalente (Garante 2021), no dark pattern (font/colore identici tra accetta/rifiuta), consent log immodificabile e disponibile per ispezione (art. 7 c.1 GDPR onere della prova), preferenze always-revocabili 1-click (art. 7 c.3), banner localizzato in lingua utente. Estensioni roadmap: AI auto-classifier nuovo script rilevato (LLM legge URL+nome→suggerisce categoria), integrazione DPIA register modulo (#GDPR-DPIA — link script→DPIA-id), consenso parental gating <16 anni opt., dashboard KPI compliance audit «sei pronto a un controllo Garante?» (% pagine con tag pre-consenso, presenza pulsante riapertura, freshness policy_version, retention rispettata), integration con Privacy Center utente (logged-in user vede log proprio consensi + revoca/scarica/modifica), white-label CMP IAB-certified per rivendita ad altre piattaforme, A/B test layout banner con multivariate (4 button order, colore primario, micro-copy «rifiuta tutti» vs «solo necessari») + significance statistica accept rate vs rejection rate vs UX bounce, IAB TCF v2.2 vendor list autoupdate cron, ePrivacy Regulation prep (quando entrerà in vigore sostituisce parzialmente direttiva attuale). Differenze e relazioni: **#8196 google-analytics-4** è tracking analytics (qui invece consenso necessario PRIMA che GA4 si attivi — strettamente upstream/dipendenza obbligatoria), **#8183 meta-pixel-capi** stesso (Pixel non firing senza consenso marketing), **#8104 form-contatti-lead** + **#8313 form-contatti-antispam** form data raccolta — banner cookie ≠ informativa form (sono due informative separate GDPR), **#8311 seo-meta-dinamici-open-graph** + qualsiasi modulo con embed YouTube/Maps → richiede click-to-load fallback per consenso `marketing`/`functional`, **#8053 cms-lite** pagine privacy policy + cookie policy gestite da CMS (testo legale linkato dal banner), **#8326 area-cliente-riservata** privacy center utente integrato per visualizzare/revocare consensi propri, **#8330 audit-log-azioni-utente** può loggare anche eventi consenso (revoca, accettazione) ma consent_log separato per ragioni di prova non-ripudiabile, **#8261 chatbot-rag** chatbot deve rispettare consenso `functional` prima di salvare conversazione/cookie sessione. Casi limite/edge: utente loggato con consent_id session diverso da consent_id user — merge al login (preserva scelta più restrittiva), revoca su pagina X deve cancellare cookies client-side immediatamente + log evento revoke + ricaricare pagina opt. (default no reload, soft remove script handle), TTL scaduto durante navigazione → mostra banner riapertura ma preserva navigazione (no blocco contenuto), policy_version cambia → invalida consensi vecchi e richiede nuovo (ma preserva storico log per audit), Safari ITP/Firefox ETP limita cookie 7gg → consent_id su localStorage fallback + sync DB per logged-in users, browser DoNotTrack opt. respect (configurabile). Costo nuovo modulo (greenfield modulo compliance enterprise): 0.5g migrazioni `cookie_consents` + `cookie_consent_versions` + `cookie_categories_catalog` + `cookie_scripts_registry` + indexes performance + retention archival, 1g banner UI responsive Vue/Alpine con 5 layout (bottom_bar/bottom_card/center_modal/top_bar/floating_widget) + accessibility WCAG 2.1 AA (focus trap modal, ARIA labels, keyboard nav, screen reader), 1g modal personalizza categorie con accordion + lista cookie + toggle + persistenza preferenze granular, 1g logica blocco script preventivo (data-attribute system + manual tag manager wrapper + click-to-load YouTube/Maps placeholder), 0.5g Google Consent Mode v2 integration (default denied + update on grant + mapping categorie→Google params), 1g IAB TCF v2.2 CMP integration (TCString + __tcfapi + iframe cross-domain + vendor list pull) — opt. se cliente ha adtech, 0.5g geolocation rules engine + region-aware behavior + GeoIP lookup, 0.5g consent log immutable + opzionale timestamping notarile + audit query API, 0.5g auto-discovery script comando + classificatore + report admin, 1g admin UI dashboard categorie + scripts registry + versioning policy + dashboard KPI funnel banner + report consenso per categoria/country, 0.5g comandi artisan (scan/export-consent/expire-old/revalidate/archive-anonymize) + scheduling cron, 0.5g multi-locale banner + policy version multi-lingua + JSON localizzazione testo categorie/bottoni, 0.5g middleware integration + helper blade + service API + endpoint REST consenso, 0.5g testing E2E (banner rendering per layout, consenso accept_all/reject_all/customize, script blocco effettivo pre-consenso, Google Consent Mode emission corretta, log audit append-only, TTL scadenza, revoca cancellazione cookies client). Costo riuso nuovo cliente (modulo pronto): 0.25g configurazione categorie + descrizioni localizzate per cliente, 0.25g registry script attivi (GA4 ID, Meta Pixel ID, ecc.), 0.25g policy text customizzato (cookie policy markdown), 0.25g brand customization banner (colori, font, logo, posizione, layout), 0.25g test compliance + Garante checklist, 0.25g integrazione Google Tag Manager se cliente usa (no codice diretto). Dipendenze: Laravel 10/11, Vue 3 o Alpine.js per banner reattivo, opz. Google Tag Manager se cliente usa, opz. CMP IAB-certified third-party (OneTrust/Iubenda) se cliente preferisce SaaS, opz. MaxMind GeoLite2 o IP-API.com per geolocation, opz. OpenTimestamps client + Bitcoin per immutable timestamping, opz. integrazione Privacy Center utente (#8326 area-cliente-riservata), accessibility audit tool (axe-core), policy text legale fornito da cliente o boilerplate (NON consulenza legale — modulo fornisce infrastruttura, testo legale è responsabilità cliente/avvocato).

Esempi d'uso

  • compliance

Disponibile nei pacchetti