Mesurer précisément les transactions avec Analytics

Le plugin e-commerce de Google Analytics permet d’enregistrer l’ensemble des transactions d’un e-commerce. Néanmoins, comme le règlement se fait la plupart du temps sur le site de la banque (ou Paypal), les transactions sont enregistrées avant la validation du paiement. Cette méthode fausse largement les statistiques puisque l’ensemble des abandons de paiement ne sont pas comptabilisés. Nous allons voir comment il est possible d’enregistrer les conversions après validation du paiement.

En règle générale, les transactions sont soient enregistrées avant le paiement, soit après ce dernier, lorsque l’utilisateur est redirigé sur la page de remerciement. Dans le premier cas on a de nombreux faux positifs, dans le second, tous les utilisateurs qui quittent le page de paiement avant d’être redirigés sur le site du e-commerçant ne sont pas comptabilisés. Vous admettrez que c’est fâcheux.

Pourtant, il est possible d’enregistrer les conversions de manière très fiables. Le back office ou le CRM de votre site enregistre bien les commandes validées non ? Il n’y a donc pas de raisons que GA ne puisse en faire autant.

Si votre site est en mesure de savoir les commandes qui ont été réglées, c’est parce que les organismes de paiement envoient une notification à votre site pour l’informer de l’état du paiement. Les principales solutions du marché fonctionnent d’une manière semblable.

Bien entendu, lorsque le serveur de la banque ou de Paypal envoie l’information à votre site, il s’agit d’un dialogue de serveur à serveur et le code JavaScript de Google Analytics ne fonctionne pas dans ce cadre là. Cependant, Google met à notre disposition une interface REST pour dialoguer avec Analytics. Il est donc possible d’envoyer à ce dernier l’ensemble de la transaction dès lors que celle-ci a bien été validée.

Enregistrer la transaction en base de données

Lorsque le serveur de la banque appelle votre site pour lui dire que le paiement a été validé (ou non), vous n’avez plus le contexte de cette transaction. Le seul moyen de faire le lien avec le client et la commande est l’id de transaction (ou la réf transaction). Bref, quoi qu’il en soit, Google ou pas Google, ce système doit déjà être en place sur votre site puisque pour valider une commande, il faut bien que votre back office puisse faire le lien entre la référence transaction et le client qui a payé. Dans le cas contraire, Michel sera très heureux de recevoir la commande de Claudine, mais Claudine parlera du pays à votre service clients !

La spécificité avec GA, c’est qu’il faut que vous enregistriez aussi l’id GA de l’internaute afin d’attribuer la transaction à la bonne session. En effet, comme il n’y a plus de contexte, d’internaute, ni de cookie, c’est à vous de dire à GA que telle transaction correspond à telle session. Vous devez pour cela récupérer en amont le numéro de cookie du visiteur.

Il n’y a rien de très complexe là dedans. Dans votre JavaScript, vous récupérez l’id du client puis vous l’envoyer en base de données avec les autres informations concernant le client et sa commande. Voici comment récupérer l’id GA :

var gaCid;
ga(function(tracker) {
  gaCid = tracker.get('clientId');
});

Il faut bien entendu que le script Google Analytics soit chargé avant l’exécution de cette fonction. L’implémentation varie en fonction de la manière dont fonctionne votre système e-commerce. Pour ma part, sur les sites que je mets en place, l’ensemble du panier fonctionne en JavaScript. Ainsi, j’envoie toutes les informations d’un seul tenant avant que l’internaute ne parte sur le site de la banque. Ce qui ressemble à quelque chose de la sorte en jQuery :

$.post('/register-transaction/', {cid: gaCid, firstname: firstname, lastname: lastname, email: email,
                            tel: tel, street: street, city: city, postcode: postcode,
                            country: country, products: products, price: total});

Envoyer la transaction après validation

Ensuite, dès que vous recevez la validation de la transaction depuis l’organisme de paiement, qu’il s’agisse de l’IPN de Paypal ou de l’autoresponse d’ATOS, vous pouvez envoyer la transaction à Analytics. Ainsi, lorsque je reçois la notification de paiement depuis ATOS ou Paypal, j’appelle ma fonction ga_transaction et je lui passe les paramètres de transaction. Voici la fonction que j’utilise.

<?php

/*
 * @param {string} cid Google Analytics id
 * @param {string} order_id
 * @param {float} price
 * @param {float} shipping
 * @param {string} productsString "1 * produitA @ 5.20 [– 2 * produitB @ 56.93]"
 */
function gaTransaction($cid, $order_id, $price, $shipping, $productsString) {
  $ga_url = 'https://ssl.google-analytics.com/collect';
  $productsArray = explode('–', $productsString);
  $products_number = count($productsArray) - 1;
  $tva = $price * 0.20;

  $transaction = array(
    'v' => 1,
    'tid' => 'UA-000000-1',
    'cid' => $cid,
    't' => 'transaction',
    'ti' => $order_id,
    'tr' => $price,
    'tt' => $tva,
    'ts' => $shipping,
    'cu' => 'EUR' 
  );
    
  $url_transaction = http_build_query($transaction);
    
  $ch = curl_init();
  curl_setopt($ch, CURLOPT_URL, $ga_url);
  curl_setopt($ch, CURLOPT_HEADER, 0);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  curl_setopt($ch, CURLOPT_POST, true);
  curl_setopt($ch, CURLOPT_POSTFIELDS, $url_transaction);
  curl_exec($ch);
  curl_close($ch);
    
  for ($i = 0; $i < $products_number; $i++) {
    $prodNqt = explode('*', $productsArray[$i]);
    $prodNameNPrice = explode('@', $prodNqt[1]);
    $itemPriceTTC = trim($prodNameNPrice[1]);

    $item = array(
      'v' => 1,
      'tid' => 'UA-18624038-1',
      'cid' => $cid,
      't' => 'item',
      'ti' => $order_id,
      'in' => trim($prodNameNPrice[0]),
      'ip' => $itemPriceTTC,
      'iq' => trim($prodNqt[0]),
      'cu' => 'EUR' 
    );
        
    $url_item = http_build_query($item);
        
    $ch2 = curl_init();
    curl_setopt($ch2, CURLOPT_URL, $ga_url);
    curl_setopt($ch2, CURLOPT_HEADER, 0);
    curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch2, CURLOPT_POST, TRUE);
    curl_setopt($ch2, CURLOPT_POSTFIELDS, $url_item);
    curl_exec($ch2);
    curl_close($ch2);       
  }
}

Vous remarquerez que l’ensemble des détails de la commande se trouvent dans une chaine de caractères sous la forme quantité * nom du produit @ prix du produit et séparés par un tiret demi-cadratin « – ». C’est un choix personnel qui facilite le stockage en base de données puisque je ne stocke qu’un string. Vous pouvez aussi sérialiser un tableau ou stocker la commande dans plusieurs tables avec des clefs étrangères. Il ne tient qu’à vous d’adapter la fonction à vos besoins.

On utilise http_build_query pour convertir le tableau sous forme d’url aux lignes 35 et 63. Vous noterez aussi que Google nécessite que l’on envoie d’abord les informations de la transaction, puis ensuite les détails de celle-ci.

Je tiens enfin à attirer votre attention sur les différents moyens de présenter les données. Google présente le chiffre d’affaire, le montant de la livraison ainsi que les taxes. C’est à vous de décider si le chiffre d’affaire est TTC ou HT et s’il inclue ou non la livraison. En ce qui me concerne, le CA est TTC et inclue la livraison. Je renseigne simplement en sus le prix de la TVA. Néanmoins, si vous décidez d’avoir le CA (donc la variable $price) HT, soyez cohérent et renseignez aussi les prix individuels des produits en HT.

Conclusion

Il n’est pas très difficile de configurer Analytics pour fonctionner avec le measurement protocol et cela permet de récolter des données de transactions justes.

Récolter des données fiables est primordial en web analytics, car elles constituent la base d’analyses webmarketing pertinentes et qui vous aideront à prendre des décisions plus justes.

Utilisiez-vous déjà Google Analytics pour enregistrer vos transactions e-commerce ? Avez-vous pu mettre en place cette méthode ou projetez-vous de le faire ?

Il n'y a pas encore de commentaire

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *