Audit de consentement : ce qui se lance avant que quiconque clique sur « Accepter » ?
La leçon derrière cette compétence (Dr. Erin Toussaint Jacques, reel Instagram, octobre 2026) : les applications « vibe-codées » sont un moyen facile de se faire poursuivre, car personne ne vérifie si le pixel de tracking se déclenche avant que le visiteur n'accepte. Un pixel est un petit bout de code provenant de Meta, Google et autres qui suit ce que les gens font sur votre site. En vertu de la loi californienne sur les écoutes clandestines (CIPA), un tracking qui commence avant le consentement peut être considéré comme une interception illégale, avec des dommages-intérêts légaux allant jusqu'à 5 000 $ par violation, et les procès pour pixels se comptent désormais par milliers. Avoir une bannière et attendre l'autorisation sont deux choses différentes. De nombreux sites poursuivis avaient une bannière ; le tracking se chargeait dès l'ouverture de la page.
Cet audit répond donc à une question avec des preuves : lors d'une visite vierge, avant tout clic, qu'est-ce qui se charge et qu'est-ce qui est envoyé, et à qui ?
Il s'agit d'un audit technique, pas d'un conseil juridique. Ne dites jamais à personne qu'il est « conforme ». Dites ce qui a été trouvé, ce qui a été corrigé, ce qui n'a pas été vérifié, et qu'un avocat devrait examiner la situation si le site diffuse des publicités ou vend dans l'UE ou en Californie.
Par défaut : lecture seule
Ne modifiez rien dans cette compétence : pas d'édition, de publication, de modification de base de données ou d'authentification, de nouveaux services, ou d'acceptation de conditions. Les correctifs sont du ressort de consent-gate, une fois que le propriétaire est d'accord.
Étape 1 : Inventorier le code
Si le code est local (ou un clone GitHub d'un projet Lovable), lancez le scanner :
python3 ~/.claude/skills/consent-audit/scripts/scan_trackers.py /chemin/vers/app
Il liste chaque traceur, pixel, analytique, replay, embed et signature de script tiers qu'il trouve, par fichier et ligne, signale les lignes qui semblent envoyer des emails ou des IDs utilisateur, et indique si une vérification de consentement apparaît à proximité. Une mention « vérification de consentement à proximité » est une piste, pas une preuve. Lisez le code autour de chaque résultat pour confirmer :
- Où cela commence.
index.html<head>,main.tsx,App.tsx,_app/layout, ou un fournisseur signifie que cela s'exécute sur chaque page, pour chaque visiteur. - Ce qui le verrouille. La balise script, l'
import, ou leinit()ne s'exécute-t-il qu'après un opt-in affirmé et stocké ? Une bannière qui se cache alors quegtag('config')a déjà été exécuté n'est pas un verrou. - Ce qu'il envoie.
identify(email),setUser({ email }), correspondance avancée Meta (em,ph), URLs complètes avec chaînes de requête?ou fragments#(codes cadeaux, jetons de réinitialisation, texte de recherche), et champs de formulaire. - Transfert côté serveur. Conversions API,
/api/track, fonctions edge envoyant à Meta/Google/Segment. Elles doivent respecter le même choix.
S'il n'y a pas de code local (un projet Lovable accessible uniquement dans le navigateur), utilisez l'invite d'audit uniquement dans references/prompts.md dans le chat de ce projet, puis vérifiez son rapport avec l'Étape 2.
Étape 2 : Vérifier le site en direct (la partie qu'une bannière ne peut pas dissimuler)
Le code peut mentir par omission (tag managers, modules complémentaires de l'hébergeur, extraits CMS). Vérifiez toujours l'URL publiée dans un onglet de navigateur vierge, sans cookies :
- Ouvrez le site dans un nouveau contexte privé (dans le navigateur intégré de Claude : un nouvel onglet après avoir effacé le stockage, ou un site jamais visité ici). Ne cliquez sur rien.
- Lisez les requêtes réseau (
read_network_requests). Toute requête vers un domaine de publicité, d'analytique ou de replay avant un clic est un résultat : listez le domaine, le chemin de l'URL, et si elle transporte des identifiants (fbp,_ga,cid,uid,em,ttp). - Lisez les cookies et le stockage via
javascript_tool:document.cookie,Object.keys(localStorage). Notez tout_ga,_fbp,_gcl_au,_ttp,_hj*,ph_*,ajs_*,_clckou_uetsid. - Cliquez sur Refuser (ou fermez la bannière s'il n'y a pas de refus). Naviguez vers deux autres pages. Tout nouveau déclenchement est un résultat.
- Cliquez sur Accepter dans un nouveau contexte vierge. Confirmez que les traceurs se chargent maintenant, pour que le verrou ne soit pas simplement cassé.
- Connectez-vous avec un compte de test s'il en existe un (jamais un vrai client). Vérifiez si l'email ou l'ID utilisateur part dans une requête de traceur.
Étape 3 : Vérifier les paramètres de l'hébergeur et de la plateforme
Les traceurs injectés par l'hôte n'apparaissent pas dans le code de l'application :
- Lovable : Projet → Paramètres → Analytiques des visiteurs. C'est activé par défaut ; désactivez-le (ou verrouillez-le) sur chaque projet, y compris les nouveaux.
- Vercel (Web Analytics / Speed Insights), Netlify (Analytics), Cloudflare (Web Analytics, Zaraz), Framer/Webflow/Wix/Squarespace (paramètres du site → code personnalisé / analytiques / pixels), EzyCourse / Systeme / Kajabi (champs de code de suivi, champ Facebook Pixel).
- Tag managers : ouvrez le conteneur GTM et listez chaque tag et son déclencheur. « Toutes les pages » sans condition de consentement signifie qu'il se déclenche avant le consentement.
Étape 4 : Trier et rapporter
Classifiez chaque élément :
| Classe | Exemples | Règle |
|---|---|---|
| Nécessaire | session de connexion, CSRF, panier, Stripe sur la page de paiement, vérifications anti-fraude/bot, préférences d'interface utilisateur sauvegardées | Peut s'exécuter sans consentement. Aucune bannière nécessaire pour ceux-ci seuls. |
| Embed fonctionnel | Mapbox sur la page de carte, lecteurs YouTube/Vimeo, Calendly, widgets de chat | Se charge uniquement là où il est utilisé. Privilégier le clic-pour-charger ou les modes de confidentialité (youtube-nocookie). |
| Optionnel | pixels publicitaires, GA/GTM, PostHog, Hotjar, Clarity, HeyCatch, session replay, reciblage | Ne doit pas se charger, chercher ou s'initialiser tant que le visiteur n'a pas opté pour cette catégorie. |
Format du rapport (soyez court et fondé sur des preuves) :
AUDIT DE CONSENTEMENT : <app> (<url>), <date>
Avant tout clic : <N> traceurs optionnels se sont déclenchés -> SUCCÈS / ÉCHEC
| Fournisseur | Où cela commence (fichier:ligne ou paramètre hôte) | Se déclenche avant consentement ? | Envoie des données d'identité/URL ? | Classe | Correctif minimal |
Services nécessaires (OK sans consentement) : ...
Mention de confidentialité : présente/absente, liée depuis le pied de page ? liste des fournisseurs précise ?
Choix de retrait : y a-t-il un lien persistant « Choix de confidentialité » ?
Global Privacy Control respecté ? oui/non/non testé
Modifications non publiées dont la publication libérerait également : ...
Non vérifié : ...
Ceci n'est pas un conseil juridique. Faites examiner par un avocat si vous diffusez des publicités, servez des visiteurs de Californie/de l'UE, ou placez des pixels sur des pages vidéo.
Proposez ensuite consent-gate pour appliquer les correctifs. Si un traceur ne rapporte pas, recommandez de le supprimer plutôt que de le verrouiller : aucun traceur n'est la conformité la moins chère (dans les audits réels, supprimer un outil d'analyse inutilisé était souvent le seul correctif).
Points de vigilance issus d'audits réels
- L'analytique démarrée depuis le fichier d'entrée de l'application (
src/main.tsx) sur chaque page pour chaque visiteur, sans vérification de consentement, et le code de connexion envoyait les emails et IDs utilisateur des clients connectés à l'outil d'analyse à chaque connexion. L'outil ne pouvait pas supprimer les chaînes de requête, il a donc été entièrement supprimé. - Les analytiques de visiteurs de Lovable sont activées par défaut et sont injectées par l'hôte. Elles ne figurent pas dans le code.
- Publier libère tout ce qui n'est pas publié. Avant de publier un correctif de confidentialité, listez les anciennes modifications non publiées qu'il va également diffuser (aides à la connexion, mises à jour de dépendances, correctifs de paiement) et obtenez l'accord du propriétaire.
- Désactiver les analytiques n'est pas la même chose que désactiver la capture de données. La propre base de données de l'application (travaux des étudiants, progression, messages) est propriétaire et distincte. Dites-le explicitement, car les propriétaires s'inquiètent.
- Pages vidéo + pixel Meta ajoutent un autre risque fédéral (Video Privacy Protection Act). Les sites de cours avec vidéos de leçons doivent traiter tout pixel sur ces pages comme une priorité élevée.