Tracking GA4 · 2 events à corriger

view_item & add_to_cart

La situation sur le site en ligne, puis exactement quoi envoyer et quand. Avec le code à intégrer.

⬇ Télécharger l'Excel (codes & variables)
view_itemLa situation

La variante est inconnue au chargement de la page

Sur la page produit, il n'y a pas encore de variante. Le client choisit d'abord le genre, le produit, la couleur, le col et la taille. Seul un ID de groupe stable existe dès le départ, et le prix peut changer avant tout ajout au panier.

1 · Aucune variante Arrivée sur le t-shirt : le genre n'est même pas choisi. Pas de variante, pas de taille.
2 · Configuration Genre, produit, couleur, col. La variante se construit étape par étape.
3 · Le prix bouge En choisissant « Pack 2 produits » : 129€ devient 206,40€. Toujours rien dans le panier.
Aucune variante

au chargement. Seul un ID de groupe stable est connu.

Pas de prix fixe

le prix affiché change selon l'option pack.

ID de groupe

ne change jamais, quelle que soit la taille, la couleur ou le pack.

add_to_cartLa situation

Ajouter un produit peut changer le prix d'un autre

Un seul « add to cart » peut ajouter plusieurs lignes, et un ajout ultérieur peut recalculer rétroactivement le prix d'un produit déjà dans le panier (packs, offres groupées). Une valeur figée au moment de l'ajout ne correspond donc plus au panier réel.

1 · Un ajout, plusieurs lignes Matelas + oreiller (-50%) + protège regroupés dans un seul « add to cart ».
2 · Offre conditionnelle Ajouter le sommier déclenche un prix pack (+899,40€ au lieu de 1499€).
3 · Recalculé Dans le panier, les DEUX lignes baissent (-449,70 / -209,70). Total 1 538,60€.
Était cassé

AddingWell écoutait le clic et avalait l'événement.

1 ajout = N lignes

un pack ajoute plusieurs produits d'un coup.

Rétroactif

un nouvel ajout peut baisser le prix d'un produit déjà dans le panier.

view_itemLa solution

Quoi envoyer, et quand

On garde la structure dataLayer existante et tous les champs. Les noms d'événements prennent un suffixe _custom (les noms GA4 standards sont déjà utilisés, on ne peut donc pas les réutiliser). Seules deux règles de valeur changent : laisser les champs variante vides tant qu'aucune variante n'est choisie, et traiter le prix comme une valeur d'affichage, pas comme la valeur de conversion finale.

1Quand le déclencher
Une seule fois, au chargement de la page produit. Ne pas re-déclencher view_item à chaque changement de taille ou d'option, cela gonflerait les vues produit.
2Ce qui change (vs le dataLayer actuel)
VariableValeurEnvoyer ?
item_id"{{item_group_id}}"change · GROUP ID (regroupe les variantes)
item_product_id"10243669852506"garder · ID produit Shopify
item_variant_id""vide · jusqu'au choix
item_variant""vide · jusqu'au choix
sku""vide · jusqu'au choix
price89garder · prix d'affichage, pas final
configuration_state"unresolved"ajouter · nouveau flag
3Quand le client choisit ses options
Envoie un événement séparé product_variant_selected avec la variante résolue. view_item n'est pas modifié.
au chargement de la page
dataLayer.push({
  event: "view_item_custom",     // _custom (nom standard pris)
  ecommerce: {
    currency: "EUR",
    value: 89,                       // prix affiche, pas final
    items: [{
      item_id: "{{item_group_id}}",       // GROUP id (pas le product id)
      item_product_id: "10243669852506",  // product id Shopify
      item_product_title: "Soutien-gorge",
      item_name: "Soutien-gorge",
      item_brand: "Percko",
      item_category: "",
      item_variant: "",                 // vide
      item_variant_id: "",              // vide
      item_variant_title: "",           // vide
      sku: "",                         // vide
      price: 89,                       // prix d'affichage
      discount: 0,
      inventory_quantity: 8569,
      quantity: 1,
      item_list_id: null,
      item_list_name: null,
      url: "/products/soutien-gorge",
      configuration_state: "unresolved"  // NOUVEAU
    }]
  }
});
quand une variante est choisie
dataLayer.push({
  event: "product_variant_selected",    // NOUVEL evenement
  ecommerce: {
    currency: "EUR",
    value: 89,
    items: [{
      item_id: "{{item_group_id}}",       // GROUP id, inchange
      item_variant: "Noir / S A-B",       // maintenant rempli
      item_variant_id: "51433313272154",  // maintenant rempli
      item_variant_title: "Noir / S A-B",
      sku: "FR-SOUTIEN-GORGE-NOIR-S-A-B",
      price: 89,
      configuration_state: "resolved",
      pack_selected: false
    }]
  }
});
Résultat : une métrique « produit vu » propre. La vraie valeur est captée plus tard, au add_to_cart, quand la variante et le pack sont figés.
add_to_cartLa solution

Quoi envoyer, et quand

Déclenche add_to_cart pour l'action réelle, puis un cart_updated avec le panier complet recalculé pour que le total soit toujours juste.

1Quand déclencher add_to_cart
Après la confirmation de l'ajout par le panier, pas au clic sur le bouton (c'est ce qu'AddingWell cassait). Un seul événement, avec toutes les lignes réellement ajoutées.
2Quoi envoyer (mêmes champs que le dataLayer)
VariableValeurEnvoyer ?
value89oui · somme des lignes ajoutées
item_id"{{item_group_id}}"oui · GROUP ID
item_variant_id"51433313272154"oui · résolu
sku"FR-SOUTIEN-GORGE-..."oui
price89oui · prix final de la ligne
discount0oui
quantity1oui
3Puis, après chaque changement de panier
Envoie cart_updated avec le panier complet recalculé. Cela gère le cas où un nouvel ajout baisse le prix d'une autre ligne. Ne jamais simuler un remove_from_cart pour corriger ça.
quand l'ajout est confirmé
dataLayer.push({
  event: "add_to_cart_custom",    // _custom (nom standard pris)
  ecommerce: {
    currency: "EUR",
    value: 89,                       // somme des lignes ajoutees
    items: [{
      item_id: "{{item_group_id}}",       // GROUP id
      item_name: "Soutien-gorge",
      item_variant: "Noir / S A-B",
      item_variant_id: "51433313272154",
      sku: "FR-SOUTIEN-GORGE-NOIR-S-A-B",
      price: 89,                       // prix final
      discount: 0,
      quantity: 1,
      url: "/products/soutien-gorge"
    }]
  }
});
après chaque changement de panier
dataLayer.push({
  event: "cart_updated",            // NOUVEL evenement
  change_type: "discount_applied",
  ecommerce: {
    currency: "EUR",
    value: 1538.60,            // total recalcule = verite
    items: [
      {
        item_id: "{{item_group_id}}",
        item_name: "Sommier zoné",
        item_variant: "80x200",
        item_variant_id: "...",
        sku: "...",
        price: 1049.30,
        discount: 449.70,
        quantity: 1
      },
      {
        item_id: "{{item_group_id}}",
        item_name: "Matelas hybride",
        item_variant: "80x200",
        item_variant_id: "...",
        sku: "...",
        price: 489.30,
        discount: 209.70,
        quantity: 1
      }
    ]
  }
});
Sans cart_updated : add_to_cart indique 1 049€ pour le sommier, le matelas tombe silencieusement à 489€, et la valeur du funnel ne correspond plus à la commande. cart_updated porte toujours le vrai total (ici 1 538,60€).