Mostrando entradas con la etiqueta gtm. Mostrar todas las entradas
Mostrando entradas con la etiqueta gtm. Mostrar todas las entradas

martes, marzo 02, 2021

Fire a tag in GTM once per user, using tag sequencing



Last week the marketing guys asked me to include a Floodlight pixel on the website. From now everything looks fine, but then taking to the agency, they told me to fire the pixel only once per user.

First thing that came to my mind was “why they need me to fire it once per user if we can handle it in the Floodlight built-in pixel itself?”




But then, the agency said this feature only has a 24 hour’s timeframe. OK, don’t panic. We have the Google Analytics cookie (_ga by default) so my plan B was: Check if the user has the GA cookie and if not, fire the tag.

However, life is never like is planned and there are other dependencies, in my case, the Consent Management Platform. Let me give you summarize background to explain you how it works.

First time, user lands on the site, it gets the cookie disclaimer. If the user consent, then an event, let’s call it “consent” allows you to fire the pixels from the page.

So, my problem was that at the time the pixel should fire, I already had the _ga cookie, so I couldn’t evaluate if it was a new user or not. Then I saw this article from Simo Ahava and got the update from dusoft and Stephen Harris talking about the set of the dataLayer, try to make it work but it didn’t. 

However, I started to spike about the set method of the dataLayer and ended in this article of Dan Wilkerson written more than 5 years ago with this beautiful code:

<script>
  (function(window) {
    var gtm = window.google_tag_manager[{{Container ID}}];
    try {
      gtm.dataLayer.set('balloonsPopped', undefined);
      // Notifies GTM our HTML Tag has finished
      gtm.onHtmlSuccess({{HTML ID}});
    } catch(e) {
      if({{Debug Mode}}) throw e;
      // Notifies GTM our HTML Tag has failed
      return gtm.onHtmlFailure({{HTML ID}});
    }
  })(window);
</script>

And this is where I saw the light: maybe I can’t control when something is going to fire because is asynchronous, but I can say to GTM if the pixel has succeeded or it has failed.

OK, so let’s get into the hot:

First we create the variable for reading the Google Analytics cookie (_ga):



Then what I did was to create a custom HTML tag for evaluating if the _ga exists, when the GTM is loaded, and therefore, before the “consent” event happens.

 


This is the code

<script>
 (function() {
    var gtm = window.google_tag_manager[{{Container ID}}];
  try {
    if ({{Cookie - _ga}}) {
// if _ga exists is NOT a new user and we fail the tag
      gtm.onHtmlFailure({{HTML ID}});
      return false;
    } else {
// if _ga does NOT exist is a new user and he tag succeed
      gtm.onHtmlSuccess({{HTML ID}});
      return true;
    }
  } catch(e) {
    if({{Debug Mode}}) throw e;
    return gtm.onHtmlFailure({{HTML ID}});
  }
 })();
</script>

And this is when the GTM container loads


Reader, one advice here: PLEASE, USE THE F*CKING NOTES on GTM to help your mates.



Then, once we have the 2 tags set up, we have to arrange the sequence of firing. This is where Tag sequencing come into scene:



With these 2 checkboxes I don’t know at what exactly time the Floodlight tag is going to be fire. But, I can be 100% sure, that is going to be fired after checking if it’s a new user, and if the tag hasn’t failed.

Finally, don’t forget to include the built-in variables needed for the custom HTML tag:



And that’s all folks. There are also a lot of things you can do like create a function name for checking if it’s a new user and call it in another tags or variables but that’s another topic.

Live long and prosper.

 

lunes, octubre 09, 2017

Schema in GTM using DOM scrapping

It seems it has been ages since the last time I post here. Well, not ages, but last year at least. Even this time I'll 'try' (and I mean try because my English is not so good) to write it in English as I moved a time to another country where they speak in English. So, to my Spanish readers, my apologies in advance, if you need something, I bet you know how to catch me and I'll be please to explain it in Spanish too.

Anyway, intro apart, this time I will write about something we did in the actual Company I work for. The post is not new and it's based on this big one: Using Gooble Tag Manager to dynamically generate a Schema Tag. I will write down more because, as the silly person I am, the most difficult part from me, was to extract the data from the DOM elements that were already on the page to create the JSON schema on the fly.

Speaking of DOM scrapping, it also has to be with my last post on how to retrieve values from that DOM, but this time, using GMT built-in variable, instead of querySelector javascript function. One thing that helps me so from a better understanding was the mozilla developer page attribute selectors . But all of you that know me a bit, know that I prefer to show it to you with examples, so, here we are.

By example we are going to use the same example I used last year, so if we go to http://www.damupi.com/test/damupi/index_en.html we will find this page:







And this is the source code:




Imagine that I want to create an schema like the following one, and you want to retrieve all the data from the page to create the JSON file on the fly:



And you want to retrieve all the data from the page to create the JSON file on the fly.

Let's start by getting the name "Suzuki". In GTM, go to variables and create a new variable like and, for example, call it "Schema product name - DOM":




As you see on the source code I start looking for a div with a specific class and then I drill down till the next element, which in our case is an img, with the attribute "type" equals to "brand". Let's say this is an example an in this particular case we could just get the value directly from "img[type="brand"]" but I have preferred to write you down like this because normally, all the pages have a lot of source code and the only thing for drilling down is to do it like this.

Check GTM preview mode to test if your expression is right or not



Let's do the same for getting image value for building our Schema JSON file. In this case we are going to retrieve the image value for the same element but a different attribute, so the only thing we are going to replace is "alt" per "scr".




Test it again in GTM preview mode:



And finally, following the instructions of Chris Goddard we can build the json we want to.








sábado, febrero 04, 2017

Insertando un pixel de Facebook: DOM element scraping con Google Tag Manager

A cuantos de nosotros no nos ha pasado que nos llegue un compi de marketing y nos diga que de la noche a la mañana - y si fuese posible para ayer - van a hacer una campaña de marketing superideal y que necesitan etiquetar unas cosas.

Tú, super analista digital que vas sobrado y que crees que has etiquetado perfectamente todo tu site, le preguntas a tu compi qué es lo que quiere medir y.... te enseña una parte que se te olvido etiquetar. Para colmo no puedes contar con los chicos de IT porque son muy malos y no te quieren, o porque a pesar de que te quieren mucho, tienen una cola de trabajo y las tareas de implementar analítica se encuentran relegadas a la ultima posición de cosas por hacer.

Ante esta perspectiva, no queda más que darle un poco al ingenio y hacer alguna ñapa que otra: Por suerte o por desgracia, Google Tag Manager dispone de un par de variables que nos pueden ayudar. La primera de ellas es la de elementos DOM, y la segunda es la variable javascript. La documentación oficial la podéis encontrar en este enlace. Y si queréis leer al dios Simo, tenéis su explicación en este otro enlace.

En mi caso, lo que me paso, consistia en implementar los típicos pixels de facebook, con sus acciones de pagina vista, búsqueda, añadir al carrito y compra. En mi caso la cosa estaba un poco más jodida porque casi todos los eventos (búsqueda, añadir al carrito y compra) estaban en la misma página y no podía crear triggers en Google Tag Manager en función de la página vista. También tuve que descartar que los tags se lanzase en funcion de unos triggers que escuchaban unos eventos que ya le había dicho a IT que los configurasen porque no estaban. ¿Qué hacer?. Pues bien, como no hay nada imposible para superdamupi, cree los eventos con funciones javascript que leían los valores de las variables y en función de los valores de estas variables, se lanzaba el tag o no.

Como ya me estoy enrollando, voy a hacer un ejemplo como si quisieramos implementar el pixel de búsqueda de facebook. Para ello, he creado una página de ejemplo en mi dominio que podéis acceder desde el siguiente enlace. El ejemplo que os he puesto tiene una pagina con dos campos de texto y el botón buscar.

Normalmente en los ejemplos que hay por internet, el código de la página, o bien tiene un id el control que estamos buscando, o bien la página tiene poco código html y el elemento DOM es relativamente fácil de recuperar. En el ejemplo que os pongo lo es, pero creedme cuando os digo que puede que haya páginas cuyo codigo sea un maldito infierno.


Cuando eso os pase, para recuperar el valor de un elemento DOM, yo creé en GTM una variable javascript que no es más que una función que recupera el primer elemento con la clase que le indiquemos. Por eso, por muy complejo que sea el código de tu página, y aunque no tenga un id, siempre podremos recuperar el valor de ese elemento DOM. La funcion javascript se llama querySelector.

Así que con esta función, en nuestro Google Chrome (supongo que se podrá hacer lo mismo con Firefox) nos vamos al elemento que queremos y le damos con el boton derecho en inspeccionar:




Una vez que tenemos el control, tenemos que saber qué propiedad de ese elemento nos va a devolver lo que está escrito en ese control de texto. Yo normalmente suelo comprobarlo con 3 propiedades: innerText, innerHTML o value. En el ejemplo que os pongo, el método que nos vale es "value"




Pero imaginaros si no os funciona value... en ese caso, sustituid las líneas de arriba en lugar de "value" por "innerHTML" o "innerText". En el caso que me paso, era innerHTML. El código en la consola es el siguiente:

var filtro1 = document.querySelector('body > div > div > div:nth-child(2) > input');
var filtro1Str = filtro1.value;
filtro1Str = filtro1Str.trim();
console.log('El Filtro1 es: ' + filtro1Str);

De esta manera, la última linea, console.log, nos va a mostrar si recoge o no ese control. En este caso nos devuelve "Hola", que es lo que he escrito en el cuadro de texto.

Una vez que tenemos identificados los selectores y sus controles para recuperar lo que introduce el usuario, es el momento de crear esas dos variables en tag manager. Nos vamos a variables, elegimos Custom Javascript y pegamos la funcion:




Para los que son tan vagos como yo (...o más), os copio el código de la función:

function(){
var filtro1 = document.querySelector('body > div > div > div:nth-child(2) > input');
  var filtro1Str = filtro1.innerText;
filtro1Str = filtro1Str.trim();
  // console.log('El Filtro1 es: ' + filtro1Str);
  return filtro1Str;
  }

Ahora hacemos lo mismo con el filtro 2, es decir, inspeccionamos el elemento, nos vamos al código fuente que está resaltado, y en windows (no tengo un Mac, si alguien se siente altuísta que me mande un DM) con el boton derecho --> Copiar --> Copiar Selector.... Y de nuevo los mismos pasos que para el filtro 1.




En GTM lo mismo, creamos otra variable para el filtro 2





Ahora lo que necesitamos es un trigger en nuestro GTM que diga algo como: "cuando tenga rellenos los dos campos de los controles de texto y le de al botón buscar.......". Para ello tenemos que hacer un trigger de tipo click, porque queremos que se lance cuando el usuario haga click sobre el botón Buscar. Para ver como se llama el click ID o la class de ese botón, abrimos GTM en modo preview pulsamos en el botón de búsqueda y nos vamos al evento gtm.click y a variables para ver alguna variable que nos pueda servir como referencia. En este ejemplo podemos coger "click classes"





En este ejemplo, el valor que nos da click classes cuando hacemos click sobre el botón es "btn btn-lg btn-primary btn-block".

Ahora es turno de la creación del trigger, en este ejemplo lo he llamado "Click Boton Buscar";  así que ahora construimos nuestro trigger diciéndole algo así como: si los controles de texto están rellenos y me pulsas ese botón.... entonces me lanzas el tag que yo te diga. Así que como diría jack el destripador, vamos por partes:

Si el control de texto filtro 1 está relleno:

{{damupi - CJ - filtro1}} -- does not mach RegEx -- (undefined|^$)

Si el control de texto filtro 2 está relleno:

{{damupi - CJ - filtro2}} -- does not mach RegEx -- (undefined|^$)

Y se hace click sobre el elemento con las clases:

click classes -- equals -- btn btn-lg btn-primary btn-block



Ahora ya solamente nos falta poner el tag que queremos, que en este caso, sería el pixel de facebook de búsqueda. La documentación dice que el pixel sería este:

fbq('track', 'Search', { search_string: 'leather sandals' });

Como nosotros queremos también saber lo que busca tanto para el filtro 1 como para el filtro 2, concatenaremos la cadena de búsqueda unida por un guión, retocamos un poco el tag de facebook para que incluya los dos campos. El pixel sería así:




Nota: recordad cambiar vuestro id de facebook

Y ya está :)


miércoles, mayo 27, 2015

Contenedor de Google Tag Manager para filtrar el trafico interno por cookie.

Lo prometido es deuda: terminado el MeasureCamp Madrid os dejo en los siguientes enlaces la presentación que hice y el contenedor de Google Tag Manager. Con respecto a este úlitmo, un par de puntos:


  1. Teneis que sustituir "www.misitio.com" por el nombre de vuestro sitio.
  2. Cambiar el valor de la variable UA www.misitio.com. En el contenedor que os adjunto he puesto el valor UA-XXXXXXXX-1.
---------------------


---------------------

Namaste.

lunes, diciembre 01, 2014

Bloquear el tráfico interno con Google Tag Manager por cookie

Este artículo trata de cómo filtrar el tráfico interno a través de una cookie en Google Tag Manager

Los que nos hemos puesto a analizar sitios web, queremos que nuestros datos sean lo más fieles posibles a la realidad, pero a veces, no es posible por muchos motivos. Por ejemplo, nosotros mismos entramos en el site para hacer pruebas y se quedan registradas nuestras visitas en analytics, o cuando los empleados de la empresa entran en la web, o cuando vemos el site desde otro sitio, etc…

Hasta ahora conocía la manera de filtrar el tráfico por IP, de manera que, por ejemplo, si toda la empresa, se conecta a internet a través de una IP, la excluíamos y así no quedaban registradas las visitas. Pero, ¿y qué pasa, por ejemplo, cuando nos conectamos desde otros dispositivos con 3G como un Tablet, nuestro teléfono, o cuando estamos en nuestra casa con nuestro portátil? Para eso podemos excluir el tráfico añadiendo una cookie a través de Google Tag Manager.

Todo empezó hace 15 días más o menos, cuando asistí a clase magistral de Xavier Colomés, en el master de analítica web de Kschool. Xavier nos estaba explicando un site y al entrar en él, dijo de pasada que analytics no registraba las visitas de su equipo porque tenía una cookie.

Desde ese momento empecé a darle vueltas a la cabeza para ver cómo hacerlo; y ese mismo día por la noche, lo configuré en un site que tengo de pruebas con Universal Analytics. Sin embargo, la cosa no quedó ahí, porque después lo que habló Rubén Gallardo, me di cuenta de que debía de ir más allá y configurarlo con Google Tag Manager. Pues bien, esta es la forma en la que lo he hecho.

 Creamos una nueva etiqueta en Google Tag Manager





En mi caso, la etiqueta lleva el nombre “generar_cookie_tipo_visitante” y lo que hacemos es añadir código HTML personalizado que crea una cookie con el nombre “tipo_visitante” con el valor 1. Vosotros podéis llamar a la cookie como queráis y decidir el valor que le queráis poner. En mi caso elegí que la cookie se llamaria tipo_visitante, y el valor que identificaría el tráfico interno sería el 1

El código HTML es el siguiente:


 <script type="text/javascript">  
 function createCookie(name,value,days) {  
    // Funcion para crear la cookie  
   if (days) {  
     var date = new Date();  
     date.setTime(date.getTime()+(days*24*60*60*1000));  
     var expires = "; expires="+date.toGMTString();  
   }  
   else var expires = "";  
   document.cookie = name+"="+value+expires+"; path=/";  
 }  
 // Generar and fijar la cookie tipo_visitante con valor 1 que expira al año  
 createCookie("tipo_visitante", "1", 365);  
 </script>  

 Creamos una macro que lea la variable de la URL


Como no queremos molestar a nuestro departamento de IT, para que nos haga una página con el código, lo que haremos será que cuando nos conectemos a la  URL http://damupi.com/?tipo_visitante=1 nos guarde la cookie "tipo_visitante", con el valor 1. Para hacerlo, creamos una macro, “URL consulta tipo visitante es 1” en mi caso, de tipo “URL” y de tipo de Componente “Consulta”





Creamos una regla para que se lance la macro anterior


A esta regla le voy a llamar “URL de consulta tipo_visitante es 1”  y lo que hace es comprobar que el valor que le hemos dado en la variable tipo_visitante de la URL http://damupi.com/?tipo_visitante=1 es igual a 1



Añadimos la regla a la etiqueta que nos crea la cookie


Nos vamos a la etiqueta que creamos en el punto 1 y que llamé “generar_cookie_tipo_visitante” y le decimos que queremos que lo haga cuando se cumpla la regla que creamos antes. Es decir, queremos que nos cree la cookie que le hemos dicho, cuando pongamos en la barra de direcciones http://damupi.com/?tipo_visitante=1





 Añadimos una regla de bloqueo a nuestra etiqueta de analytics


Lo que ahora queremos hacer, es que analytics no nos cuente como visita cuando entremos en la URL http://damupi.com/?tipo_visitante=1, para ello, añadimos como regla de bloqueo, la que ya creamos en el punto 3, “URL de consulta tipo_visitante es 1”, para que analytics no nos lance su código.




Añadimos una macro que se encargue de leer el valor de la cookie


El siguiente paso es leer el valor de la cookie que creamos en el punto 1, para que, si entramos en nuestro dominio, google tag manager lea nuestra cookie y sepa que no nos tiene que contar como visita. Para ello creamos una macro con el nombre “cookie tipo_visitante” y nombre de la cookie “tipo_visitante” que es como la hemos llamado.




Creamos una regla para que compruebe el valor de la regla





Añadimos una regla, que nos verifique si el valor de la cookie “tipo_visitante” es igual a 1




Añadimos la regla de bloqueo que comprueba el valor de la cookie



Por ultimo, como queremos navegar por todo el site sin que nos cuente como visita, tenemos que decirle que si detecta en cualquier lado por el que naveguemos, que tenemos una cookie llamada “tipo_visitante” con el valor 1, no nos escriba el código de analytics y por lo tanto no nos cuente como visita.




Ya está, ahora lo primero que tenemos que hacer si no queremos que analytics nos cuente como una visita en nuestro sitio web, es poner en la barra de direcciones http://damupi.com?tipo_visitante=1

Namaste.

------------

Agradecimientos:


Todo este artículo no hubiese sido posible sin, aparte de los profesores que me inspiraron y me ilusionaron para hacerlo, a los siguientes recursos:

Blog de Simo Ahava
Lunametrics
Guia de macros de Aureka