17/7/20

Algunos aprendizajes con Gtag.js



Demoré un poco es encontrar la solución a estos temas. Como vieron en el post anterior, el estándar de Global Tag es menos complicado en algunos aspectos, pero más complicado en otros. Vamos por paso.

Luego de investigar en profundidad, hice algunas modificaciones que admiten las mejoras que verán a continuación.

<script async src="https://www.googletagmanager.com/gtag/js?id=GA_TRACKING_ID"></script>
<script>
  window.dataLayer = window.dataLayer || [];
  function gtag(){dataLayer.push(arguments);}
  gtag('js', new Date());
  gtag('config', 'GA_TRACKING_ID', {
    'anonymize_ip': true,
    'send_page_view': false});
  gtag('event', 'page_view');
</script>

Por defecto la función "config" envía la página vista a Google Analytics. En esta versión editada, el "config" no envía el pageview. Y luego el evento "page_view" se encarga de enviar la página vista.


Google Optimize con Gtag.js


Si estás utilizando Google Optimize, hay que hacer algunas modificaciones importantes para incluir el ID de Optimize y el código Anti-Flickr.

<script async src="https://www.googletagmanager.com/gtag/js?id=GA_TRACKING_ID"></script>
<script>
 window.dataLayer = window.dataLayer || [];
 function gtag(){dataLayer.push(arguments);}
 gtag('js', new Date());
 gtag('config', 'GA_TRACKING_ID', {
  'anonymize_ip': true,
  'send_page_view': false});
 gtag('event', 'page_view');
</script>
<style>.async-hide { opacity: 0 !important} </style>
<script>(function(a,s,y,n,c,h,i,d,e){s.className+=' '+y;h.start=1*new Date;
h.end=i=function(){s.className=s.className.replace(RegExp(' ?'+y),'')};
(a[n]=a[n]||[]).hide=h;setTimeout(function(){i();h.end=null},c);h.timeout=c;
})(window,document.documentElement,'async-hide','dataLayer',3000,
{'OPT_CONTAINER_ID':true});</script>
<script async src="https://www.googleoptimize.com/optimize.js?id=OPT_CONTAINER_ID" onerror="dataLayer.hide.end && dataLayer.hide.end()"></script>

(Se agrega el Anti-Flickr y se agrega el nuevo código de optimize.js asíncrono).

Páginas Virtuales con Gtag.js


Hay dos métodos para hacer páginas virtuales. La que propone Google, y la que yo uso desde hace algún tiempo:

 gtag('event', 'page_view', {
  'page_path': '/ruta-de-la-pagina/',
  'page_title': 'Título de la página'});

(El evento page_view envía la metadata page_path y page_title. También puede enviar page_location, que corresponde a la verdadera URL de la página donde se activa la página virtual).


Dimensiones Personalizadas con Gtag.js


Las dimensiones y métricas personalizadas se envían con los eventos de Gtag.js. Pero es obligatorio crear un mapa dentro del "config" de Gtag.js para que sepa qué valor asignar a qué dimensión o métrica.

 gtag('config', 'GA_TRACKING_ID', {
  'anonymize_ip': true,
  'custom_map': {
    'dimension3': 'haircolor',
    'metric7': 'size'},
  'send_page_view': false});
 gtag('event', 'page_view', { 
  'haircolor': "brown", 
  'size': "12"});


Otros eventos con Gtag.js


Se pueden enviar otros eventos. Por ejemplo, los eventos personalizados clásicos que se ven en el reporte de Eventos de Google Analytics.

<script>
  gtag('event', 'hit', {
    'event_category': 'Evento sin Pageview',
    'event_label': 'Label del evento',
    'event_value': 0,
    'non_interaction': true });
</script>

El evento tiene dos particularidades, a diferencia de la manera cómo se configuraban antes:
  1. Acción del evento es el nombre del evento: "hit".
  2. Es un evento non_interaction=true; esto quere decir que no envía un pageview.
Si no agregas la línea de no-interacción=true al evento, cualquier evento que sea, agregará pageviews a la página y deformará las métricas.

Puedes agregar una línea con event_action, pero no es necesario. Gtag.js admite que coloques cualquier nombre al evento personalizado.

¿Hay alguna característica de Gtag.js que te esté causando dolor de cabeza? Pregunta en los comentarios por favor.

23/6/20

Implementar Gtag.js y Google Tag Manager (separados) para mejorar la Performance


No hay una sola manera de implementar de Google Analytics en un sitio Web. La manera que suelo recomendar en mi día a día profesional es la siguiente:

Lo más arriba del HEAD posible, en este orden:
  • Definir dataLayer estático.
  • Código anti-flickr de Google Optimize.
  • Código Script de Google Tag Manager.
E inmediatamente después de la etiqueta BODY:
  • Código Noscript de Google Tag Manager.
Este último se debe excluir para los sitios que dependen de Javascript del navegador del usuario.

Pero durante los últimos meses me he encontrado con distintas alertas de performance que dicen que GTM, Optimize y GA hacen mi sitio más lento. Hice de todo para mejorar la performance pero no lograba alcanzar el 95% dorado de optimización.

Así que hice algunas pruebas y tomé decisiones difíciles, basado en que GA se puede implementar sin un intermediario como GTM. 
  1. No más experimentos con Optimize. Cuando tenga necesidad de hacer experimentos, lo volveré a instalar.
  2. Colocaré Gtag.js en la cabecera.
  3. Optimizaré GTM para operar al mínimo, y su código se va al Footer.

Quitar Google Optimize de mi sitio.


Me fascina hacer experimentos para mejora la usabilidad y la experiencia del usuario. Me mantienen despierto. Pero la verdad es que no necesito hacerlos todo el tiempo. 

Así que quitar el código Anti-Flickr del sitio y pausar Google Optimize en GTM es la decisión correcta. 

Cambiar el Google Analytics de GTM por Gtag.js en código


Si quieren saber la diferencia entre hacerlo con GTM o en el código, pues la diferencia es mínima y se reduce a hacer bien la implementación del JS y activar los eventos como script en GTM. Por ejemplo:



Este código está arriba dentro del HEAD.

Primero se define el dataLayer. En mi caso las variables se construyen con PHP usando la metadata de la página en Wordpress. Este dataLayer luego es usado en GTM y también se pueden usar sus variables para nutrir las dimensiones personalizadas en Gtag.js

var miData = window.dataLayer[0];

Y puedes usar las variables del dataLayer así:

var UserId = miData.userid;

Luego está el código de Gtag.js con la configuración de los datos que necesito medir: User-ID, IP anónimo, mapa de dimensiones personalizadas y el enlace cross-domain. El mapa de dimensiones personalizadas es necesario para construir el evento page_view.

IMPORTANTE: el «config» del gtag,js envía un pageview. Siempre. Y si agregas un evento después, tienes que tomar una decisión: uso el pageview de «config» o uso el pageview del evento. Yo prefiero tener un evento que envíe el pageview, junto con otras variables. Por lo tanto hay que prevenir que el «config» envíe el pageview. Esto se logra con la siguiente línea (dentro del «config»): 

'send_page_view': false
 
Y al final está el evento page_view que envía las variables personalizadas definidas en el custom_map, junto con el hit a Google Analytics. 

Cambiar los eventos de GA en GTM


Una vez que GA queda implementado en el código con Gtag.js, tienes que pausar el tag en GTM para que no siga enviando datos.



Si tienes eventos de GA configurados en GTM, también tienes que cambiarlos por Custom HTML. Por ejemplo:


El activador de este tag sigue siendo el mismo de cuando era un tag de GA para evento. Se mantienen las variables de categoría, acción, etiqueta, valor, no-interacción. En este ejemplo además hay una variable "geo" que está definida en el mapa de dimensiones personalizadas y que se define en un dataLayer.push() en el footer del sitio, debajo del código Script de GTM.

El resultado al final del ejercicio fue una mejora en performance inmediata. Y ninguna diferencia en el reporte de datos en Google Analytics.

IMPORTANTE: todos los eventos se envían "con interacción" por defecto. Para que no dañen las métricas del sitio, siempre coloca la línea de no-interacción verdadera dentro de los eventos.

'non_interaction': true

Puedes usar los eventos estándar o crear los tuyos propios. Y casi todos los eventos se reflejarán en el reporte de Eventos de Google Analytics.

10/2/20

Corregir el Schema con error A value for the url field is required

Desde principios de enero de 2020 apareció en Google Search Console una alerta AMP. Había elementos ausentes. "A value for the url field is required".

Actualicé mi plugin. Actualicé mis códigos. Hice todo lo que estaba en mi poder sin tener que editar PHP. Y aún así el error persistió.

A mi sitio AMP le faltaba un logo. Si lo colocaba con el AIOSEO, agregaba el logo al sitio Web y al AMP. Pero yo solo lo quería en el AMP. Resumen, no se podía hacer sin editar PHP.



Pues resulta que tú puedes agregar variables al esquema de JSON y se suman dentro de la validación de Search Console. Sin tener que editar mucho más.

El ejemplo para mi blog personal fue el siguiente. Lo pueden editar.

<script type="application/ld+json">{
  "@context": "https://schema.org",
  "@graph": [{
    "@id": "https://guajars.cl/#person",
    "logo": {
      "@type": "ImageObject",
      "url": "https://guajars.cl/wp-uploads/2020/02/guajars-logo.png",
      "width": 190,
      "height": 36
    }
  }
}</script>

Esto lo pegué en la opción avanzada de la configuración del plugin AMP que uso en mi sitio web. Y se aplica automáticamente a todas las páginas.

Y saz! Cero errores y cero advertencias en AMP.