Consent gate : rien ne s'exécute sans accord préalable
La règle vue dans la vidéo, en une ligne : aucun pixel de tracking, script d'analyse ou tiers ne se charge tant que l'utilisateur n'a pas cliqué sur Accepter dans la bannière de cookies. Une bannière qui apparaît alors que le pixel a déjà été déclenché ne corrige rien. Cette compétence construit la partie d'attente.
Ce n'est pas un conseil juridique. N'écrivez jamais "entièrement conforme" dans le code, les copies ou les rapports. Dites ce que l'application fait maintenant et ce qui a été testé.
Avant de toucher à quoi que ce soit
- Ayez un audit. S'il n'y a pas de rapport
consent-auditpour cette application, exécutez-le d'abord. Vous avez besoin de l'inventaire : quels fournisseurs, où ils commencent, ce qu'ils envoient. - Demandez au propriétaire une décision par tracker : conserver, gater ou supprimer ? Si un tracker n'est pas utilisé pour des décisions ou des publicités, le supprimer est préférable au gating. Un site qui ne stocke que des données nécessaires n'a pas besoin de bannière ; n'en ajoutez pas.
- Sachez ce que la publication va libérer. Les constructeurs hébergés (Lovable, etc.) publient tous les changements non publiés en même temps. Listez-les et obtenez un accord avant de publier.
- Protégez les données first-party. Les trackers gate ne doivent pas toucher à la connexion, aux paiements, ni aux écritures dans la propre base de données de l'application (travail des étudiants, progression, formulaires). Mentionnez-le dans le rapport.
Ce que signifie "gate" (la checklist que la correction doit respecter)
Chargement
- Un chargeur central (
src/lib/consent.ts, voirreferences/consent.ts). Aucun pixel, GTM, gtag, PostHog ou script<script>de replay dansindex.html, le layout racine oumain.tsx. - Les scripts optionnels ne sont pas chargés, pas seulement non initialisés :
import()dynamique ou injection de script a lieu uniquement après l'opt-in. - Aucun événement mis en file d'attente n'est rejoué : les pages vues avant le consentement sont abandonnées, pas envoyées en retard.
- Le forwarding côté serveur (Meta Conversions API,
/api/track, fonctions edge) vérifie le même choix stocké, envoyé avec la requête. - L'analytique injectée par l'hébergeur est désactivée à la source (Lovable → Paramètres → Visitor analytics off ; Vercel/Netlify/Cloudflare analytics off), ou gate avant l'injection. Supprimer un script après son chargement est trop tard, car la première requête a déjà été émise.
- Google Consent Mode (si GA/Ads restent) :
gtag('consent','default',{ad_storage:'denied',analytics_storage:'denied',ad_user_data:'denied',ad_personalization:'denied'})et le script gtag lui-même attend toujours l'opt-in dans la configuration par défaut de cette compétence. Consent Mode "basic", pas "advanced", car advanced envoie des pings sans cookies avant le consentement.
La bannière
- Accepter optionnel et Refuser optionnel sont également proéminents : même taille, même style, même nombre de clics. Plus une option Paramètres.
- Les bascules de catégories (Analytique, Publicité, etc.) commencent décochées.
- Fermer la bannière (X / Échap) signifie refuser.
- Le choix est enregistré avec une version et une date d'expiration (6 à 12 mois). Changer la liste des fournisseurs augmente la version et demande à nouveau.
- Un lien persistant "Choix de confidentialité" dans le pied de page rouvre les paramètres.
- Le retrait stoppe les appels futurs et supprime les cookies et stockage optionnels possédés par l'application (
_ga*,_fbp,_gcl_au,_ttp,ph_*,ajs_*,_hj*,_clck) sans toucher à l'authentification. - Global Privacy Control (
navigator.globalPrivacyControl === true) est traité comme Refuser pour la publicité/vente/partage, et la bannière indique qu'il a été honoré.
Ce qui est envoyé, même après consentement
- Aucun email, numéro de téléphone, nom ou date de naissance dans les payloads des pixels ou des scripts d'analyse (pas d'Advanced Matching Meta, pas d'
identify(email)). Utilisez un ID opaque seulement si vraiment nécessaire. - Les URL sont envoyées sans
?queryet#fragment(codes cadeaux, jetons de réinitialisation, termes de recherche). Si un fournisseur ne peut pas les supprimer, retirez le fournisseur. - Rien provenant des réponses aux quiz, du contenu des discussions, des données de santé/finances/naissance, ou des champs de formulaire.
- Pages vidéo : aucun pixel publicitaire sur les pages qui diffusent des vidéos de cours ou de leçons (risque lié au Video Privacy Protection Act fédéral), sauf avis contraire du conseil.
Avis
- Un avis de confidentialité/cookies sur une route publique, lié depuis le pied de page et la page d'inscription/connexion, listant les fournisseurs et catégories réels. Utilisez uniquement le nom et l'email de contact de l'opérateur réel ; n'inventez jamais d'adresses, de DPO ou de revendications légales.
Comment implémenter
- Code local / Claude Code : copiez
references/consent.tsdans l'application, enregistrez chaque fournisseur optionnel en tant queloader, supprimez les balises codées en dur, construisez la bannière avec les composants propres à l'application, et reliez le lien du pied de page. Gardez la diff petite et dans le style de l'application. - Lovable / Bolt / v0 / Replit (construit par agent) : collez le prompt Fix depuis
~/.claude/skills/consent-audit/references/prompts.md(ou le prompt Remove). Ensuite vérifiez vous-même ; ne vous fiez pas au résumé de l'agent.
Prouvez-le (requis avant de dire que c'est terminé)
Exécutez ces tests sur l'aperçu, puis à nouveau sur l'URL en ligne après publication. Dans le navigateur intégré de Claude, utilisez un onglet frais avec stockage vidé, puis read_network_requests et javascript_tool (document.cookie, localStorage) :
| Test | Passe quand |
|---|---|
| Première visite, sans clic | 0 requêtes vers les domaines publicitaires, analytiques ou de replay ; pas de cookies ou stockage optionnels |
| Refuser, puis 2 navigations | toujours 0 ; bannière disparue ; choix enregistré |
| Accepter uniquement l'analytique | l'analytique se charge ; les pixels publicitaires ne se chargent pas |
| Rechargement | choix mémorisé ; pas de bannière |
| Retrait via le lien du pied de page | les appels futurs s'arrêtent ; les cookies optionnels sont effacés ; toujours connecté |
GPC activé (navigator.globalPrivacyControl forcé true) | la publicité est refusée sans clic |
| Navigation côté client (SPA) | aucun tracker ne s'infiltre lors du changement de route |
| Connexion avec un compte de test | aucun email ou ID utilisateur dans les requêtes des trackers |
| Build + vérification de type | réussi |
Rapport : fichiers modifiés, résultat de chaque test avec preuves (domaines vus ou "aucun"), tests non exécutés et pourquoi, modifications non publiées publiées avec, et "Ce n'est pas un conseil juridique. Faites examiner par un conseiller si vous diffusez des publicités ou servez des visiteurs de Californie/de l'UE."