# Enhanced Ecommerce sous Google Analytics Universal pour WooCommerce

> Prouver le ROI d'une boutique WooCommerce passe par un tracking fiable des ventes. Voici comment instrumenter l'Enhanced Ecommerce d'Analytics Universal, étape par étape.

- Auteur : WordPress Développement
- Publié le : 2020-04-09
- Mis à jour le : 2026-09-30
- Catégorie : E-commerce
- URL : https://www.wpmoderne.fr/ecommerce/enhanced-ecommerce-google-analytics-universal-woocommerce/

## L’essentiel

- Le dataLayer transporte les données produit avant l'envoi
- Chaque étape du tunnel a son propre événement Enhanced Ecommerce
- Google Tag Manager évite de coder le tracking en dur dans le thème

Une agence qui gère les campagnes publicitaires d'un client e-commerce entend régulièrement la même question en réunion mensuelle : « combien rapporte vraiment telle campagne ? ». Sans Enhanced Ecommerce correctement branché, Google Analytics ne voit que des sessions et des pages vues, jamais les produits vendus ni leur valeur. Ce billet détaille l'instrumentation Enhanced Ecommerce sous Analytics Universal, la version encore très largement déployée sur les boutiques WooCommerce en 2020.

L'objectif n'est pas de configurer GA4, qui n'existe pas encore sous cette forme, ni de traiter le mode de consentement des cookies : il s'agit uniquement de faire remonter à Analytics des données de vente fiables, exploitables ensuite dans les rapports Ecommerce natifs.

## Le principe du dataLayer

Enhanced Ecommerce fonctionne par étapes : chaque action du visiteur (vue d'un produit, ajout au panier, passage en caisse, achat) pousse un objet structuré dans le `dataLayer`, que Google Tag Manager lit ensuite pour envoyer les bons hits à Analytics. Rien n'est envoyé directement à Analytics depuis WooCommerce : tout transite par ce tableau JavaScript intermédiaire.

## Activer Enhanced Ecommerce côté Analytics

> L'essentiel à retenir : Le dataLayer transporte les données produit avant l'envoi ; Chaque étape du tunnel a son propre événement Enhanced Ecommerce ; Google Tag Manager évite de coder le tracking en dur dans le thème

Avant tout code, il faut activer l'option dans l'interface Analytics, sous *Administration > Paramètres Ecommerce > Activer Ecommerce amélioré* pour la vue concernée. Sans cette activation, les rapports Ecommerce restent vides même si les hits arrivent correctement.

## Pousser les données produit dans le dataLayer

Sur la page produit, un script inline dans le thème enfant génère l'événement de détail produit consulté :

```
window.dataLayer = window.dataLayer || [];

dataLayer.push({
    'event': 'detailProduit',
    'ecommerce': {
        'detail': {
            'products': [{
                'name': 'Veste technique Aroa',
                'id': 'AROA-VESTE-014',
                'price': '129.00',
                'category': 'Vêtements techniques'
            }]
        }
    }
});
```

Ce bloc s'insère via le hook `woocommerce_after_single_product`, en boucle sur le produit courant grâce à `global $product;`. Il faut veiller à échapper correctement le nom et la catégorie du produit pour éviter toute casse du JSON si un titre contient des guillemets.

## Suivre l'ajout au panier

L'ajout au panier via AJAX déclenche un événement JavaScript propre, `added_to_cart`, sur lequel on peut se brancher côté front :

```
jQuery(document.body).on('added_to_cart', function(event, fragments, hash, button) {
    dataLayer.push({
        'event': 'ajoutPanier',
        'ecommerce': {
            'add': {
                'products': [{
                    'id': button.data('product_id'),
                    'quantity': button.data('quantity') || 1
                }]
            }
        }
    });
});
```

## Le tunnel de commande et l'achat final

La page de paiement pousse un événement `checkout` avec l'étape courante, et la page de remerciement pousse l'événement `purchase` contenant l'identifiant de transaction et le montant réel encaissé :

```
window.dataLayer = window.dataLayer || [];

dataLayer.push({
    'event': 'achat',
    'ecommerce': {
        'currencyCode': 'EUR',
        'purchase': {
            'actionField': {
                'id': 'WC-10482',
                'affiliation': 'Boutique en ligne',
                'revenue': '154.80',
                'tax': '25.80',
                'shipping': '6.90'
            },
            'products': [{
                'name': 'Veste technique Aroa',
                'id': 'AROA-VESTE-014',
                'price': '129.00',
                'category': 'Vêtements techniques',
                'quantity': 1
            }]
        }
    }
});
```

Ce gabarit est la cible : `actionField` décrit la transaction (identifiant, montant, taxes, frais de port), `products` détaille chaque ligne. Reste à le produire à partir de la vraie commande, et non de valeurs écrites en dur. Le crochet `woocommerce_thankyou` reçoit l'identifiant de la commande et convient parfaitement :

```
add_action( 'woocommerce_thankyou', 'wpm_datalayer_achat' );

function wpm_datalayer_achat( $order_id ) {
    $commande = wc_get_order( $order_id );

    // Évite de compter deux fois la vente si la page est rechargée.
    if ( ! $commande || $commande->get_meta( '_wpm_ga_envoye' ) ) {
        return;
    }

    $produits = array();
    foreach ( $commande->get_items() as $ligne ) {
        $produit    = $ligne->get_product();
        $categories = $produit ? wp_strip_all_tags( wc_get_product_category_list( $produit->get_id() ) ) : '';
        $produits[] = array(
            'name'     => $ligne->get_name(),
            'id'       => $produit && $produit->get_sku() ? $produit->get_sku() : (string) $ligne->get_product_id(),
            'price'    => wc_format_decimal( $commande->get_item_total( $ligne ), 2 ),
            'category' => $categories,
            'quantity' => $ligne->get_quantity(),
        );
    }

    $donnees = array(
        'event'     => 'achat',
        'ecommerce' => array(
            'currencyCode' => $commande->get_currency(),
            'purchase'     => array(
                'actionField' => array(
                    'id'       => $commande->get_order_number(),
                    'revenue'  => wc_format_decimal( $commande->get_total(), 2 ),
                    'tax'      => wc_format_decimal( $commande->get_total_tax(), 2 ),
                    'shipping' => wc_format_decimal( $commande->get_shipping_total(), 2 ),
                ),
                'products'    => $produits,
            ),
        ),
    );

    echo '<script>window.dataLayer = window.dataLayer || []; dataLayer.push('
        . wp_json_encode( $donnees ) . ');</script>';

    $commande->update_meta_data( '_wpm_ga_envoye', 1 );
    $commande->save();
}
```

Deux détails comptent. La fonction `wp_json_encode()` règle le problème des guillemets dans les titres de produits, évoqué plus haut : elle produit un JSON valide quelle que soit la chaîne. Et le drapeau `_wpm_ga_envoye` empêche le doublon classique : un client qui actualise la page de remerciement ne doit pas gonfler le chiffre d'affaires de la campagne.

L'étape de paiement suit le même schéma, avec un objet `checkout` et un numéro d'étape : 1 pour l'affichage du formulaire, 2 pour le choix du mode de paiement, par exemple. Le crochet `woocommerce_before_checkout_form` permet d'y poser un petit script, qui liste les produits du panier via `WC()->cart->get_cart()` :

```
dataLayer.push({
    'event': 'checkout',
    'ecommerce': {
        'checkout': {
            'actionField': { 'step': 1, 'option': 'Formulaire de livraison' },
            'products': [{
                'name': 'Veste technique Aroa',
                'id': 'AROA-VESTE-014',
                'price': '129.00',
                'quantity': 1
            }]
        }
    }
});
```

Dans Analytics, les libellés des étapes se renseignent dans les paramètres Ecommerce, rubrique d'étiquetage de l'entonnoir de paiement : c'est ce qui donne ensuite, dans le rapport de comportement d'achat, le taux d'abandon entre deux étapes.

## Brancher Google Tag Manager sur ces événements

Côté Google Tag Manager, la configuration se résume à quelques éléments, à créer une seule fois :

- une variable de type *Variable de couche de données* dont le nom est `ecommerce` ;
- un déclencheur de type *Événement personnalisé* par événement poussé : `detailProduit`, `ajoutPanier`, `checkout`, `achat` ;
- une balise *Google Analytics : Universal Analytics* de type de suivi « Événement » ou « Page vue », avec l'option « Activer les fonctionnalités d'e-commerce amélioré » cochée et « Utiliser la couche de données » sélectionnée ;
- pour les événements qui ne sont pas de vraies pages vues, la balise est de type « Événement » avec une catégorie et une action explicites, par exemple « Ecommerce » et « Achat ».

Le mode aperçu de Google Tag Manager affiche, pour chaque poussée dans le `dataLayer`, les balises déclenchées et le contenu de la variable `ecommerce`. C'est l'outil de recette à utiliser avant toute mise en production.

## Les pièges qui faussent les rapports

- **Le montant.** Décidez une fois pour toutes si `revenue` est hors taxes ou toutes taxes comprises, et documentez ce choix : un écart entre Analytics et la comptabilité vient presque toujours d'une convention floue.
- **Le doublon de transaction.** Sans le drapeau en base, chaque rechargement recrée la vente ; Analytics dédoublonne parfois sur l'identifiant de transaction, mais il ne faut pas s'y fier.
- **Les paiements externes.** Si le client est renvoyé vers la banque puis revient, la page de remerciement n'est pas toujours atteinte : comparez régulièrement le nombre de ventes Analytics au nombre de commandes WooCommerce.
- **Les types de données.** Envoyez les montants sous forme de chaînes décimales avec un point, pas de virgule, et les quantités sous forme d'entiers.
- **Les bloqueurs de suivi.** Une partie des visiteurs n'enverra jamais rien : le rapport reste une estimation, pas une comptabilité.

> Un tracking fiable ne se prouve pas par un joli rapport, mais par un écart maîtrisé entre les commandes de la boutique et les transactions d'Analytics.

## Un contrôle concret avant la recette

Passez une commande de test avec un produit dont le titre contient des guillemets, puis vérifiez trois choses : la poussée `achat` apparaît une seule fois dans le `dataLayer` (console du navigateur, commande `dataLayer`), le montant correspond à la commande dans WooCommerce, et la transaction s'affiche dans le rapport Ecommerce en temps réel de la vue Analytics concernée. Recommencez en actualisant la page de remerciement : aucune seconde transaction ne doit apparaître.

## En résumé

Enhanced Ecommerce sous Analytics Universal repose sur une discipline simple : des événements nommés, des objets de données conformes, et un point d'entrée unique, Google Tag Manager, qui évite de semer du suivi en dur dans le thème. Une fois le `dataLayer` alimenté par les données réelles des commandes, les rapports répondent enfin à la question posée en réunion : combien rapporte vraiment cette campagne.
