Consent Mode v2 dans PrestaShop : implémentation technique

Consent Mode v2 dans PrestaShop : implémentation technique
Sans Consent Mode v2, vos campagnes Google Ads dans l'EEE perdent le remarketing et les conversions modélisées. Signaux de consentement, mode avancé, hook PrestaShop et intégration CMP : le guide développeur pour une implémentation conforme et fonctionnelle.

Depuis mars 2024, sans Consent Mode v2 vos campagnes Google Ads dans l'EEE perdent le remarketing et les conversions modélisées. Signaux de consentement, mode basique vs avancé, intégration CMP et hooks PrestaShop : voici comment l'implémenter proprement, sans casser votre tracking ni votre conformité RGPD.

Consent Mode v2 : de quoi parle-t-on ?

Le Consent Mode est l'API de Google qui ajuste le comportement de ses balises (GA4, Google Ads, GTM) en fonction du choix de consentement de l'utilisateur. La version 2, obligatoire depuis mars 2024 pour tout trafic provenant de l'Espace économique européen, ajoute deux nouveaux signaux dédiés à la publicité.

Sans Consent Mode v2 correctement implémenté, Google cesse d'alimenter vos audiences de remarketing et désactive la modélisation des conversions pour les utilisateurs ayant refusé les cookies. Concrètement : des campagnes aveugles et des rapports incomplets.

Les quatre signaux de consentement

  • analytics_storage : stockage lié à la mesure d'audience (cookies GA4)
  • ad_storage : stockage lié à la publicité (cookies Google Ads)
  • ad_user_data (nouveau en v2) : envoi de données utilisateur à Google à des fins publicitaires
  • ad_personalization (nouveau en v2) : utilisation des données pour le remarketing et la personnalisation

Chaque signal prend la valeur granted ou denied. Tant que l'utilisateur n'a pas choisi, ils doivent tous être positionnés sur denied par défaut.

Mode basique ou mode avancé ?

Le choix d'implémentation conditionne le volume de données récupérées. Il faut le trancher avant d'écrire la moindre ligne de code.

CritèreMode basiqueMode avancé
Chargement des balises GoogleBloqué tant que pas de consentementChargé immédiatement (sans cookies)
Pings sans cookie (refus)AucunEnvoyés (hits anonymes)
Modélisation des conversionsLimitéeOptimale
Conformité RGPDPlus stricteAcceptable si pings anonymisés

Le mode avancé est recommandé dans la majorité des cas e-commerce : il maximise la modélisation tout en restant conforme, car les pings envoyés avant consentement ne contiennent ni cookie ni identifiant. C'est celui que nous implémentons ci-dessous.

Étape 1 : poser l'état de consentement par défaut

La règle absolue : la commande consent default doit s'exécuter avant le chargement de GTM ou de gtag.js. Si une balise Google se charge avant cet appel, le consentement par défaut n'est pas respecté.

Dans PrestaShop, le plus fiable est un module qui injecte ce script en tout début de <head> via le hook displayHeader, en s'assurant qu'il passe avant le snippet GTM.

<script>
window.dataLayer = window.dataLayer || [];
function gtag() { dataLayer.push(arguments); }

// Tout est refusé par défaut, avant le moindre cookie
gtag('consent', 'default', {
    ad_storage: 'denied',
    analytics_storage: 'denied',
    ad_user_data: 'denied',
    ad_personalization: 'denied',
    wait_for_update: 500
});
</script>

Le paramètre wait_for_update indique à Google d'attendre 500 ms le signal de la CMP avant de déclencher quoi que ce soit. Indispensable pour éviter une course entre le chargement de la bannière et celui des balises.

Étape 2 : injecter le script via un hook PrestaShop

On encapsule la logique dans un module dédié. Le hook displayHeader est appelé sur toutes les pages, ce qui garantit la présence du consentement par défaut partout.

<?php

declare(strict_types=1);

use PrestaShop\PrestaShop\Adapter\Configuration;

class ConsentModeV2 extends Module
{
    public function __construct()
    {
        $this->name = 'consentmodev2';
        $this->version = '1.0.0';
        $this->author = 'Itroom';

        parent::__construct();

        $this->displayName = $this->trans('Consent Mode v2', [], 'Modules.Consentmodev2.Admin');
        $this->description = $this->trans('Google Consent Mode v2 default state', [], 'Modules.Consentmodev2.Admin');
    }

    public function install(): bool
    {
        return parent::install() && $this->registerHook('displayHeader');
    }

    /**
     * Injecte l'état de consentement par défaut avant toute balise Google.
     */
    public function hookDisplayHeader(array $params): string
    {
        return $this->context->smarty->fetch(
            $this->getLocalPath() . 'views/templates/hook/consent-default.tpl'
        );
    }
}

Le template consent-default.tpl contient le script de l'étape 1. Le séparer du PHP respecte la séparation des responsabilités et facilite la maintenance.

Garantir la priorité de chargement

PrestaShop ne garantit pas l'ordre des modules sur un même hook. Pour forcer ce module à passer en premier, ajustez sa position après installation :

<?php

$hookId = (int) Hook::getIdByName('displayHeader');
$moduleId = (int) Module::getModuleIdByName('consentmodev2');

// Position 1 = exécuté avant les autres modules du hook
$this->updatePosition($hookId, false, 1);

Vérifiez aussi que le snippet GTM de votre thème se trouve après ce hook dans le <head>. Dans la plupart des thèmes, displayHeader est rendu très tôt, ce qui convient.

Étape 3 : mettre à jour le consentement depuis la CMP

Une fois l'utilisateur ayant fait son choix, la bannière (CMP) doit envoyer un consent update. La plupart des CMP certifiées Google (Axeptio, Cookiebot, Didomi, OneTrust) gèrent nativement le Consent Mode v2 — il suffit de l'activer dans leur configuration.

Si vous utilisez une CMP maison ou un déclenchement personnalisé, voici le mapping à respecter :

// Appelé quand l'utilisateur accepte tout
function grantConsent() {
    gtag('consent', 'update', {
        ad_storage: 'granted',
        analytics_storage: 'granted',
        ad_user_data: 'granted',
        ad_personalization: 'granted'
    });
}

// Appelé quand l'utilisateur refuse (ou ferme la bannière)
function denyConsent() {
    gtag('consent', 'update', {
        ad_storage: 'denied',
        analytics_storage: 'denied',
        ad_user_data: 'denied',
        ad_personalization: 'denied'
    });
}

Pour un consentement granulaire (l'utilisateur accepte la mesure mais refuse la publicité), mappez chaque catégorie de cookie de votre bannière vers le signal correspondant plutôt que de tout passer en bloc.

Intégration via GTM

Si vous pilotez tout depuis GTM, ne codez pas le consent update en dur. Utilisez plutôt la fonctionnalité de consentement intégrée de GTM : sur chaque balise, onglet Paramètres de consentement, déclarez les consentements requis (analytics_storage pour GA4, ad_storage + ad_user_data pour Google Ads). GTM bloque alors automatiquement la balise tant que le signal n'est pas granted.

Étape 4 : valider l'implémentation

Une implémentation non testée est une implémentation cassée. Trois outils complémentaires :

  • Google Tag Assistant : affiche l'état des signaux à chaque hit et signale si consent default manque ou arrive trop tard
  • L'onglet Console / Network : vérifiez que les hits avant consentement portent bien gcs=G100 (tout refusé) puis gcs=G111 après acceptation
  • Le diagnostic Google Ads : dans l'interface Ads, la section « Diagnostic des balises » confirme que le Consent Mode est détecté

Le paramètre gcs présent dans les requêtes vers Google est le moyen le plus rapide de vérifier l'état réel : G100 = analytics et ads refusés, G111 = tout accordé, G110 = ads accordé seulement.

Les erreurs fréquentes à éviter

Charger gtag.js avant le consent default

L'erreur la plus courante. Si le snippet GA4 ou GTM s'exécute avant l'appel consent default, Google considère le consentement comme accordé par défaut. Vérifiez systématiquement l'ordre dans le HTML rendu, pas dans le code source du thème.

Oublier les deux nouveaux signaux

Beaucoup de boutiques ont migré depuis le Consent Mode v1 sans ajouter ad_user_data et ad_personalization. Une implémentation v1 sur un compte Ads européen est aujourd'hui traitée comme une absence de consentement.

Bloquer aussi les cookies fonctionnels

Le Consent Mode ne gère que les balises Google. Vos cookies de session PrestaShop, de panier ou de langue ne doivent pas être conditionnés au consentement publicitaire : ce sont des cookies strictement nécessaires, exemptés de consentement.

Conclusion

Le Consent Mode v2 n'est pas une option : sans lui, vos campagnes Google Ads dans l'EEE tournent à l'aveugle et vos rapports GA4 se vident. L'implémentation tient en quatre étapes — état par défaut avant toute balise, injection via hook, mise à jour depuis la CMP, validation — et se marie naturellement avec une architecture GTM server-side pour fiabiliser encore davantage la donnée.

Le point critique reste l'ordre de chargement : 90 % des implémentations défaillantes viennent d'un consent default qui arrive trop tard. Testez avec Tag Assistant avant toute mise en production.

Besoin d'auditer ou d'implémenter le Consent Mode v2 sur votre boutique PrestaShop ? Contactez-moi pour en discuter !

Jonathan Le-Peru

Écrit par Jonathan Le-Peru

Développeur backend avec plus de 7 ans d'expérience, spécialisé dans la création de solutions e-commerce robustes avec Prestashop. Passionné par l'optimisation des performances et les bonnes pratiques de développement.