Tag : google-analytics

Utiliser les données de Google Analytics avec Google Docs pour faire un tableau de bord

Je ne sais pas vous mais google analytics peut avoir des limites dans la génération de certains tableaux de bord. Prenons par exemple un site donc le CA n’est pas identifié dans Google Analytics, ce dernier ne pourra pas avoir une vue simple et unique de son trafic et de son chiffre d’affaires.

Si vous utilisez Google Docs voici une solution testée et approuvée pour récupérer les données de votre profil analytics pour les manipuler dans Google Docs.

Premièrement il faut utiliser le template Google Docs de SEOMOZ qui va vous permettre de vous connecter à votre compte GA (Google Analytics). Pour utiliser ce dernier il faut faire « make a copy ». Ensuite vous avez deux possibilités, soit vous utilisez le template et vous construisez votre tableau de bord dedans soit vous avez déjà un tableau de bord et dans ce cas il va falloir ajouter le script de connection (Google Apps Script) : Tools/Script editor/ puis copié/coller de qui suit :

function getGAauthenticationToken(email, password) {

  //Fetches GA authentication token, which can then be used to fetch data with the getGAdata function
//Created by Mikael Thuneberg
    try {
      
        if (typeof email == "undefined") {
            return "Email address missing";
        }
        if (typeof password == "undefined") {
            return "Password missing";
        }
        if (email.length == 0) {
            return "Email address missing";
        }
        if (password.length == 0) {
            return "Password missing";
        }
        password = encodeURIComponent(password);
        var responseStr
        var randnumber = Math.random()*5000;

      Utilities.sleep(randnumber);
      Utilities.sleep(randnumber);

        var response = UrlFetchApp.fetch("https://www.google.com/accounts/ClientLogin", {
            method: "post",
            payload: "accountType=GOOGLE&Email=" + email + "&Passwd=" + password + "&service=analytics&Source=Mikael Thuneberg-GA Google Docs functions-1.0"
        });
        responseStr = response.getContentText();
        responseStr = responseStr.slice(responseStr.search("Auth=") + 5, responseStr.length);
        return responseStr;
    } catch (e) {
        if (e.message.indexOf("CaptchaRequired") != -1) {
            return "Complete CAPTCHA at http://www.google.com/accounts/" + e.message.slice(e.message.indexOf("CaptchaUrl=") + 11, e.message.length);
        } else {
            return "Authentication failed (" + e.message + ")";
        }
    }
}

function getGAaccountData(authToken, dataType, includeHeaders, maxRows, startFromRow) {
//Fetches account data for the authenticated user
//Input authentication token produced by the getGAauthenticationToken function
//If dataType parameter is omitted, the functions fetches a list profiles to which the user has access
//By specifying the dataType parameters as "goals", the functions will fetch a list of goals by profile
//By specifying the dataType parameters as "segments", the functions will fetch a list of advanced segments
//Created by Mikael Thuneberg
  if (typeof authToken == "undefined") {
        return "Authentication token missing";
    }
    dataType = (typeof dataType == "undefined") ? "profiles" : dataType;
    maxRows = (typeof maxRows == "undefined") ? 200 : maxRows;
    maxRows = (typeof maxRows == "string") ? 200 : maxRows;
    startFromRow = (typeof startFromRow == "undefined") ? 1 : startFromRow;
    startFromRow = (typeof startFromRow == "string") ? 1 : startFromRow;
    if (authToken.length == 0) {
        return "Authentication token missing";
    }
    if (dataType.length == 0) {
        dataType = "profiles";
    }
    if (authToken.indexOf("Authentication failed") != -1) {
        return "Authentication failed";
    }
    try {
        authToken = authToken.replace(/\n/g, "");
        dataType = dataType.toLowerCase();
        var URL = "https://www.google.com/analytics/feeds/accounts/default?max-results=" + maxRows + "&start-index=" + startFromRow
        var responseStr;
      
        var response = UrlFetchApp.fetch(URL, {
            method: "get",
            headers: {
                "Authorization": "GoogleLogin auth=" + authToken,
                "GData-Version": "2"
            }
        });
        responseStr = response.getContentText();
        var XMLdoc = Xml.parse(responseStr);
        var lapset2;
        var TempArray = [];
        var RowArray = [];
        var HeaderArray = [];
        if (includeHeaders == true) {
            var rivi = 1;
            if (dataType == "segments") {
                HeaderArray[0] = "Segment ID";
                HeaderArray[1] = "Segment Name";
                HeaderArray[2] = "Segment Definition";
            } else {
                HeaderArray[0] = "Account Name";
                HeaderArray[1] = "Profile Title";
                HeaderArray[2] = "Profile Number";
            }
            TempArray[0] = HeaderArray;
        } else {
            var rivi = 0;
        }
        var sar = 0;
        var lapset;
        var dataFound = false;
        if (dataType == "segments") {
            lapset = XMLdoc.getElement().getElements();
            for (i = 0; i < lapset.length; i++) {
                if (lapset[i].getName().getLocalName() == "segment") {
                    sar = 0;
                    RowArray[0] = lapset[i].getAttribute("id").getValue();
                    RowArray[1] = lapset[i].getAttribute("name").getValue();
                    lapset2 = lapset[i].getElements();
                    for (j = 0; j < lapset2.length; j++) {
                        if (lapset2[j].getName().getLocalName() == "definition") {
                            RowArray[2] = lapset2[j].getText();
                        }
                    }
                    TempArray[rivi] = RowArray;
                    RowArray = [];
                    dataFound = true;
                    rivi++;
                    if (rivi == maxRows) {
                        return TempArray;
                    }
                } else {
                    if (lapset[i].getName().getLocalName() == "entry") {
                        break;
                    }
                }
            }
        } else { // datatype = profiles 
            lapset = XMLdoc.getElement().getElements("entry");
            for (i = 0; i < lapset.length; i++) {
                sar = 0;
                lapset2 = lapset[i].getElements();
                for (j = 0; j < lapset2.length; j++) {
                    if (lapset2[j].getName().getLocalName() == "title") {
                        RowArray[1] = " " + lapset2[j].getText();
                        dataFound = true;
                    } else {
                        if (lapset2[j].getName().getLocalName() == "property") {
                            if (lapset2[j].getAttribute("name").getValue() == "ga:accountName") {
                                RowArray[0] = lapset2[j].getAttribute("value").getValue();
                            }
                            if (lapset2[j].getAttribute("name").getValue() == "ga:profileId") {
                                RowArray[2] = lapset2[j].getAttribute("value").getValue();
                                break;
                            }
                        }
                    }
                }
                TempArray[rivi] = RowArray;
                RowArray = [];
                dataFound = true;
                rivi++;
                if (rivi == maxRows) {
                    return TempArray;
                }
            }
        }
        if (dataFound == false) {
            //return "No data found";
        }
        return TempArray;
    } catch (e) {
        return "0";
    }
}

function getGAdata(authToken, profileNumber, metrics, startDate, endDate, filters, dimensions, segment, sort, includeHeaders, maxRows, startFromRow) {
//Fetches data from the GA profile specified, using the authentication token generated by the getGAauthenticationToken function
//For instructions on the parameters, see http://bit.ly/bUYMDs
//Created by Mikael Thuneberg
  try {
        startDate.getYear();
    } catch (e) {
        return "Invalid start date";
    }
    try {
        endDate.getYear();
    } catch (e) {
        return "Invalid end date";
    }
    try {
        if (typeof authToken == "undefined") {
            return "Authentication token missing";
        }
        if (typeof profileNumber == "undefined") {
            return "Profile number missing";
        }
        if (typeof metrics == "undefined") {
            return "Specify at least one metric";
        }
        if (profileNumber != parseInt(profileNumber)) {
            return "Invalid profile number";
        }
        filters = (typeof filters == "undefined") ? "" : filters;
        dimensions = (typeof dimensions == "undefined") ? "" : dimensions;
        segment = (typeof segment == "undefined") ? "" : segment;
        maxRows = (typeof maxRows == "undefined") ? 100 : maxRows;
        maxRows = (typeof maxRows == "string") ? 100 : maxRows;
        startFromRow = (typeof startFromRow == "undefined") ? 1 : startFromRow;
        startFromRow = (typeof startFromRow == "string") ? 1 : startFromRow;
        if (authToken.length == 0) {
            return "Authentication token missing";
        }
        if (profileNumber.length == 0) {
            return "Profile number missing";
        }
        if (metrics.length == 0) {
            return "Specify at least one metric";
        }
        if (authToken.indexOf("Authentication failed") != -1) {
            return "Authentication failed";
        }
        authToken = authToken.replace(/\n/g, "");
        var startDateString
        var endDateString
        var dMonth
        var dDay
        if (startDate.getMonth() + 1 < 10) {
            dMonth = "0" + (startDate.getMonth() + 1);
        } else {
            dMonth = startDate.getMonth() + 1;
        }
        if (startDate.getDate() < 10) {
            dDay = "0" + startDate.getDate();
        } else {
            dDay = startDate.getDate();
        }
        startDateString = startDate.getYear() + "-" + dMonth + "-" + dDay
        if (endDate.getMonth() + 1 < 10) {
            dMonth = "0" + (endDate.getMonth() + 1);
        } else {
            dMonth = endDate.getMonth() + 1;
        }
        if (endDate.getDate() < 10) {
            dDay = "0" + endDate.getDate();
        } else {
            dDay = endDate.getDate();
        }
        endDateString = endDate.getYear() + "-" + dMonth + "-" + dDay
        if (startDateString > endDateString) {
            return "Start date should be before end date";
        }
        var URL = "https://www.google.com/analytics/feeds/data?ids=ga:" + profileNumber + "&start-date=" + startDateString + "&end-date=" + endDateString + "&max-results=" + maxRows + "&start-index=" + startFromRow;
        if (metrics.slice(0, 3) != "ga:") {
            metrics = "ga:" + metrics;
        }
        metrics = metrics.replace(/&/g, "&ga:");
        metrics = metrics.replace(/ga:ga:/g, "ga:");
        metrics = metrics.replace(/&/g, "%2C");
        URL = URL + "&metrics=" + metrics
        if (dimensions.length > 0) {
            if (dimensions.slice(0, 3) != "ga:") {
                dimensions = "ga:" + dimensions;
            }
            dimensions = dimensions.replace(/&/g, "&ga:");
            dimensions = dimensions.replace(/ga:ga:/g, "ga:");
            dimensions = dimensions.replace(/&/g, "%2C");
            URL = URL + "&dimensions=" + dimensions;
        }
        if (filters.length > 0) {
            if (filters.slice(0, 3) != "ga:") {
                filters = "ga:" + filters;
            }
            filters = filters.replace(/,/g, ",ga:");
            filters = filters.replace(/;/g, ";ga:");
            filters = filters.replace(/ga:ga:/g, "ga:");
            filters = encodeURIComponent(filters);
            URL = URL + "&filters=" + filters;
        }
        if (typeof(segment) == "number") {
            segment = "gaid::" + segment;
        }
        if (segment.length > 0) {
            if (segment.indexOf("gaid::") == -1 && segment.indexOf("dynamic::") == -1) {
                if (segment.slice(0, 3) != "ga:") {
                    segment = "ga:" + segment;
                }
                segment = "dynamic::" + segment;
            }
            segment = encodeURIComponent(segment);
            URL = URL + "&segment=" + segment;
        }
        if (sort == true) {
            URL = URL + "&sort=-" + metrics;
        }
    }
    catch (e) {
        return "0";
    }
    try {
        var response = UrlFetchApp.fetch(URL, {
            method: "get",
            headers: {
                "Authorization": "GoogleLogin auth=" + authToken,
                "GData-Version": "2"
            }
        });
    } catch (e) {
        if (e.message.indexOf("Timeout") != -1) {
            response = UrlFetchApp.fetch(URL, {
                method: "get",
                headers: {
                    "Authorization": "GoogleLogin auth=" + authToken,
                    "GData-Version": "2"
                }
            });
        } else {
            return "0";
        }
    }
    try {
        var responseStr = response.getContentText();
        var XMLdoc = Xml.parse(responseStr);
        var lapset = XMLdoc.getElement().getElements("entry");
        var lapset2;
        var TempArray = [];
        var RowArray = [];
        var HeaderArray = [];
        if (includeHeaders == true) {
            var rivi = 1;
        } else {
            var rivi = 0;
        }
        var sar = 0;
        var dataFound = false;
        for (i = 0; i < lapset.length; i++) {
            sar = 0;
            lapset2 = lapset[i].getElements();
            for (j = 0; j < lapset2.length; j++) {
                if (lapset2[j].getName().getLocalName() == "dimension") {
                    RowArray[sar] = lapset2[j].getAttribute("value").getValue();
                    if (rivi == 1) {
                        HeaderArray[sar] = lapset2[j].getAttribute("name").getValue();
                    }
                    sar++;
                }
                if (lapset2[j].getName().getLocalName() == "metric") {
                    RowArray[sar] = Number(lapset2[j].getAttribute("value").getValue());
                    if (rivi == 1) {
                        HeaderArray[sar] = lapset2[j].getAttribute("name").getValue();
                    }
                    sar++;
                }
            }
            TempArray[rivi] = RowArray;
            RowArray = [];
            dataFound = true;
            rivi++;
        }
        if (dataFound == false) {
            //return "No data found";
        }
        if (includeHeaders == true) {
            TempArray[0] = HeaderArray;
        }
        return TempArray;
    } catch (e) {
        return "0";
    }

}

J’ai volontairement modifié les messages d’erreurs pour afficher des « 0 » afin de pouvoir tout de même faire des graphiques (même avec des erreurs de connection).

Pour vous connecter vous avez besoin de votre email de compte GA, de votre mot de passe (vous pouvez en faire un spécifique pour cet outil c’est un peu plus secure il me semble) et du profil GA pour lequel vous souhaitez avoir les données. Cet id de profil se trouve dans l’url de votre compte GA soit après « id » pour l’ancienne version de GA ou après le « p » pour la nouvelle interface.

Voilà donc pour la partie connection à GA et script à intégrer. Ensuite il faut copier/coller la page du template de SEOMOZ ou alors se faire sa propre page de récupération de données ce qui est finalement assez simple en utilisant les formules du template. De mon côté ce qui m’intéressait c’était d’avoir des données quotidiennes et non mensuelles, j’ai donc modifié la formule en conséquence.

Attention lors de la récupération des données si vous demandez beaucoup d’information GA va vous retourner des erreurs de connection (des « 0 » avec mon script modifié), il faut donc y aller doucement, je dirai que 30 données à chaque fois c’est un max. Il suffit de faire copié/collé sur 30 cellules.

Et voilà le travail (données issues d’un autre site que 2803.fr), on retrouve des données en provenance de GA et d’autres données comme le total sur ce graphique :

Plus d’information ici et .


Un gadget pour suivre vos statistiques analytics sur votre mac

« GAget » est un gadget pour le dashboard des macs développé par Zoltan Hosszu. Ce gadget vous permettra d’afficher les statistiques de vos sites internet et blog. Pour avoir testé de nombreux gadgets de ce type, celui-ci est de loin le plus esthétique et le plus pertinent.

On retrouve effectivement le style Google Analytics dans les graphiques et les données de synthèse sont suffisantes pour avoir une vue d’ensemble d’un compte. Notez aussi que ce gadget est gratuit et est à télécharger ici.


Générer des urls permettant le suivi des campagnes dans Google Analytics

Suivre son trafic dans Google Analytics est une première étape à l’analyse de l’audience de votre site. L’étape d’après est celle de l’affinage! En effet, maintenant que vous suivez les métriques les plus importants comme le nombre de visiteurs, le nombre de pages vues, le bounce rate (taux de rebond), le temps de chargement, les visites en provenance des moteurs de recherche… Il va falloir aller un peu plus loin.

Si vous faites des campagnes d’emailing ou si vous avez un flux RSS qui passe par feedburner vous avez certainement vu passer des urls bizarre avec des choses comme cela à la fin : ?utm_source=2803&utm_medium=qr&utm_campaign=mobile. Sachez que ces informations sont très utiles pour suivre les campagnes que vous lancez autour de votre site.

Google propose même un outil pour générer des liens qui permettront un suivi efficace dans l’interface Google Analytics. Il faut :

1- Renseigner l’url
2- Nommer la source de la campagne (2803.fr, Google, Twitter…) – utm_source
3- Définir le support de la campagne (bannière, qr code…) – utm_medium

4- Les termes de campagne si vous faite une campagne en mode payant – utm_term
5- Le contenu de la campagne pour différencier plusieurs campagnes éventuellement – utm_content
6- Et enfin le nom de la campagne – utm_campaign

Une fois ceci renseigné (partiellement d’ailleurs, les points en gras sont les plus importants), vous allez avoir un url de cette nature :

http://www.vingthuitzerotrois.fr/?utm_source=2803&utm_medium=qr&utm_campaign=mobile

Qui sera facile de suivre dans google analytics dans « TRAFFIC SOURCES/Campaigns ».

Voici comment je suis l’intégration des QR Codes sur ce blog. Reste à voir maintenant s’ils sont véritablement efficaces!


Google intègre webmastertools dans google analytics

Auparavant il fallait consulter google webmastertools pour obtenir le nombre de fois où votre site était « imprimé » dans une requête sur le moteur de recherche. Depuis hier Google a rendu possible la consultation de ces informations directement dans Google Analytics.

Cette intégration rend donc plus pratique la gestion des données analytiques et on ne peut que s’en féliciter!


Mettre par défaut Google Analytics à la date du jour

Google Analytics est un superbe outil de statistique pour suivre l’évolution d’un trafic, d’un référencement, etc mais l’affichage des données est par défaut proposé sur la date de la veille, ce qui est un peu énervant lorsque l’on sait que Google Analytics propose des données en live normalement.

Heureusement un script greasemonkey va vous permettre de paramétrer automatiquement la période avec la date du jour. Notez que ce script est aussi par définition une extension de Google Chrome puisque l’outil accepte les scripts greasemonkey.

Et voilà deux clics de gagnés par jour ! Le script se télécharge sur le site du développeur.

Merci à Alexis pour le tuyau


Enfin des annotations dans Google Analytics

Voici une fonctionnalité que je viens de découvrir par hasard d’autant qu’elle n’est pas disponible sur tous mes comptes google analytics. Cette fameuse fonctionnalité est toute bête puisque c’est la possibilité d’annoter vos courbes Google Analytics, une fonction toute conne mais qui va ravir les fans de données analytiques et de statistiques web.

Sur le principe vous sélectionnez une date à laquelle un évènement c’est déroulé et vous le marquez… Un bon moyen de suivre et d’expliquer pour plus tard pourquoi une baisse de trafic, un pic d’audience, un changement de serveur ou un passage à la TV….

Comme vous pouvez le voir sur le graphique ci-dessus (qui n’est pas celui de 2803.fr), chaque annotation peut être privée ou partagée avec ceux qui ont un accès à votre compte Google Analytics.

L’explication en vidéo :

Si vous n’avez pas cette fonctionnalité c’est normal, Google la met en place à un rythme de 10% des comptes par semaine (ceci depuis le 7 décembre), donc d’ici fin février tout le monde devrait pouvoir annoter ses courbes dans Analytics.


La check list des choses à faire pour un nouveau site

Vous vous lancez sur Internet, ou tout simplement vous montez un nouveau site. Comme vous l’imaginez très certainement le travail autour du site est lui aussi très important autant pour le positionnement du site dans les moteurs de recherche, que pour votre compréhension de vos visiteurs ou pour la mise en place de fonctionnalités à valeur ajoutée. Voici ce que j’essaye de faire pour chaque nouveau site, en espérant que cela vous serve aussi…

D’un point de vu technique :

-Créez vous une adresse gmail cela vous permettra d’utiliser pleins d’outils gratuits proposés par Google.

-Tester votre site sous des nagivateurs différents : Internet Explorer 6,7 et 8, Safari, Firefox, Chrome… Utilisez des services comme browsershots qui le font très bien à votre place.

-Mise en place des solutions de statistique, pour ma part j’en mets à chaque fois deux : Google Analytics et Statcounter. Le premier me permet de faire des analyses sur l’historique plus performante que le second mais Statcounter me permet d’avoir une vision rapide sur les statistiques de chaque site. Ceci est certainement le plus important à faire car sans statistiques vous naviguer à vue en plein brouillard. Il faut savoir de quoi vous parlez…

-Inscription du site dans le Google Webmaster Tools. C’est un outil de Google qui « mache » le travail pour le moteur de recherche et qui vous donnera des informations sur l’indexation de votre contenu ou sur les requêtes les plus fréquentes. Et vous allez voir que le site va s’indexer mais que cela prend du temps…

-Dans le même style vous pouvez intégrer votre site dans le Yahoo Site Explorer qui donne des informations complètes sur les liens notamment.

L'interface de Yahoo Site Explorer
L'interface de Yahoo Site Explorer

-Mise en place d’un sitemap pour les moteurs de recherche (grâce à un plugin pour wordpress dans mon cas).

-Si vous avez un flux RSS sur votre site n’hésitez pas à publier le flux avec une solution comme Feedburner vous aurez ainsi des informations quantitatives sur la consultation de votre flux.

-Réfléchissez à votre stratégie de backlinks, il va vous en falloir quelques uns au début car votre site sera tout neuf pour les moteurs de recherche. Il faut donc identifier des sites dans la même thématique et leur proposer un partenariat (échange, article, argent éventuellement).

-Si votre site a beaucoup de contenu dès le départ essayer de ne pas tout envoyer d’un coup, j’imagine que Google ne doit pas trop aimer se prendre des paquets de 10.000 pages tous les jours.

D’un point de vu marketing :

-Réserver des noms sur les réseaux sociaux ne semblent pas complètement idiots. Courrez donc prendre la page fan facebook et le compte Twitter du nom de votre site.

-Utilisez votre nom de domaine pour vous faire de belles adresses emails comme contact@monsite.com ou henri@monsite.com, Google Apps le fait simplement et c’est plus vendeur et sérieux qu’une pauvre adresse hotmail, yahoo ou gmail…

-Pensez aux mots clés (10-15) qui définissent votre site ainsi qu’à une description afin de les intégrer dans les balises meta de l’entête de vos pages.

-Réfléchissez à un texte de présentation de votre site, vous aurez très certainement à l’envoyer à vos partenaires. Faites en de plusieurs tailles : 250 mots, 500 mots et 1000 mots. N’oubliez pas de faire apparaitre les mots représentatifs de votre site, au cas où votre partenaire publie votre texte sans modification de sa part.

-Faites des captures d’écrans de votre site, si possible faites un zip avec des captures d’écran de la page d’accueil et de toutes les autres pages significatives. Pour un site e-commerce, les pages de galerie, produit et la home sont suffisantes pour ce pack d’images. Ces images vous serviront pour votre communication et aussi pour votre référencement. Sur ce dernier point prévoyez de faire des images de tailles différentes par exemple : 800px, 400px, 200px de large.

-Sur votre site, n’oubliez pas de remplir les pages qui ne sont pas prioritaires de prime abord comme la page de contact, les mentions légales et surtout la page à propos avec une belle description du projet, de la société ou de votre pomme.

Voilà maintenant vous êtes parés… Si j’ai oublié des choses n’hésitez pas à me le signaler dans les commentaires je ferais un update de l’article avec vos inputs.


Concentrate pour analyser vos mots clés google

Concentrate est l’un des services utilisant l’API de Google Analytics pour proposer une analyse des mots clés basée sur le service de statistique de google. L’outil va donc piocher les données directement sur votre compte pour ensuite les analyser sous un autre angle.

Concentrate se positionne comme étant un outil plus à destination des experts qui souhaitent avoir une vision claire des mots clés tapés par les visiteurs d’un site. Avec cet outil vous pouvez regrouper les mots clés liés à votre nom ou marque afin de déterminer si les recherches Google sont plus liées à votre image ou à votre contenu (très intéressant comme données).

Une représentation intéressante elle aussi est celle du wordtree qui va construire un arbre de représentation des mots clés entre eux. Sur l’exemple ci-dessous vous allez voir que les visiteurs cherchent des informations précisent sur des modèles Audi (nouveauté, prix, phare…) et qu’ensuite viennent les différents modèles de la marque allemande et en dernier il y a une segmentation par année…

Le wordtree de concentrate
Le wordtree de concentrate

Concentrate donne aussi bien entendu le top des recherches (query), et le top des mots (issus des queries). A tester dans une version gratuite limité à une analyse sur les 1000 dernières requêtes (cela donne tout de même une bonne idée de l’outil).