Cómo conectar GA4 y Zapier con Google Sheets + Apps Script

En el artículo de hoy, quería hablar de un apaño que he hecho recientemente para conectar el protocolo de medición de Google Analytics 4 (GA4 Measurement Protocol) con Zapier para enviar eventos de conversión a Analytics aunque estos no hayan tenido lugar ni en nuestra web ni en nuestra app que estamos midiendo.

1. Los fundamentos para conectar GA4 y Zapier con Google Sheets + Apps Script

Para familiarizarnos con el protocolo de medición de GA4, lo mejor es ver este vídeo de Julius Federovicius, de Analytics Mania, que explica paso por paso cómo enviar una evento de forma exitosa a través del event builder de GA4.

Por otra parte, este otro tutorial de cómo utilizar el Measurement Protocol de Google Analytics 4 hecho por Michele Pisani es el que inspira principalmente esta solución. De ahí extraje el código que luego fui adaptando según lo que necesitaba con un poco de ayuda de ChatGPT.

2. ¿Por qué esta solución para conectar GA4 y Zapier?

En algunas plataformas publicitarias, algunas de las campañas de captación de leads consisten en publicar anuncios y recoger la información de contacto directamente en estas plataformas con un formulario con los datos precargados y sin necesidad de navegar por tu sitio web. Es el caso de LinkedIn con Lead Gen Forms o Facebook con Lead Ads.

Esto tiene la ventaja de que la generación de leads es mucho más efectiva, ya que el usuario no tiene que navegar por un sitio web desconocidos ni introducir sus datos manualmente en un formulario. Desgraciadamente, esto dificulta la medición de resultados, pues al no aterrizar en nuestro sitio web no podemos trackear su actividad con el píxel de Google Analytics 4.

Es por ello que empleamos herramientas como Zapier, que es una plataforma de automatización que permite a los usuarios conectar aplicaciones y servicios web para automatizar tareas repetitivas mediante la creación de «Zaps», flujos de trabajo automatizados que trasladan datos entre aplicaciones de manera eficiente. Estos «Zaps» constan de unos activadores (o triggers) y acciones, de modo que cuando se ocurre algún evento (activador) se genera una acción.

En nuestro caso, sería algo tal que así:

  • Cada vez que llegue un formulario de LinkedIn Lead Gen Forms o Facebook Lead Ads (activador),
  • Entonces envía una conversión a Google Analytics 4 (acción).

Fácil, ¿no? Aparentemente, pero no va a ser tan sencillo, pues a este evento no puedes añadirle parámetros, ni tampoco un user id que te permita trazar la navegación del usuario en posteriores visitas a tu web. A día de la publicación de este artículo, el conector de Zapier con GA4 no te deja hacer más, y utilizar un conector del tipo «custom webhook» para enviar esa llamada HTTP tampoco me ha dado garantías de que se ejecute correctamente y con regularidad. Este protocolo de medición es bastante delicado y a la mínima hace que esa llamada falle.

Entonces, la solución será utilizar una Hoja de Cálculo de Google, que nos servirá de pivote para enviar la información desde la plataforma publicitaria a GA4:

Vayamos entonces a configurar cada una de las partes implicadas:

  • Google Sheets
  • Apps Script
  • Zapier

3. Configurando el archivo de Google Sheets

En este archivo, vamos a necesitar 2 pestañas:

  • Una llamada «input«, en la que aterrizarán los datos procedentes de Zapier.
  • Otra llamada «output«, en la que moveremos los datos de la hoja «input» tras completar el envío de la información a GA4. Digo «mover», porque tras cada envío de información, la hoja «input» quedará vacía, tan solo con la fila de cabecera.

Y en las columnas, los campos que necesitamos para poder enviar un evento:

  • client_id: este es el id del dispositivo del usuario, formado por dos cadenas de 8 y 10 números, respectivamente, separadas entre sí por un punto. Por ejemplo: «40039303.1658742998».
  • user_id: este será el id del usuario que permitirá identificarlo en diferentes dispositivos, como el Chrome de su PC de su trabajo o el Safari de su iPhone, cuando haga login o rellene otro formulario en nuestra web. Por ejemplo, podemos usar este, que es un email encriptado con SHA256: «45bb5ffe4de9e31aae408ef38a38a82de3289ea8c4344857c93d288052b5da9c».
  • event_name: el nombre del evento de conversión que queremos enviar. En nuestro caso, será «lead».
  • timestamp_micro: esta variable es muy importante. Como comentaba Julius en el tutorial que citaba al principio, el timestamp debe ser entregado en formato numérico y en microsegundos. Por ejemplo: 1701723824000000 es el timestamp en microsegundos para el 04/12/2023 a las 21:44:03.
  • eventParam1 (opcional): este sería un parámetro adicional para enriquecer la información que envías bajo el «event_name». Renómbralo como gustes y dale el valor que más te ayude.
  • eventParam2 (opcional): lo mismo que con el «eventParam1».
  • page_location: aquí envías una URL de página en la que pretendes simular la conversión. Por ejemplo «https://misitioweb.com/mi-url-de-conversion».
  • ev_traffic: este parámetro lo vamos a utilizar para pasar los parámetros UTM, que si bien no he encontrado la forma de enviarlos con esta solución, al menos poder pasarlos como parámetro de evento. Ojalá alguien lea esto y contribuya con su solución a esto. En este caso, hemos concatenado medium, source y campaign, separados por un carácter pipe «|». Por ejemplo: «paid|linkedin|mi-nombre-de-campana».
  • user_id_cd: sería el mismo valor que usamos para la variable «user_id». La vamos a utilizar como ejemplo para pasar parámetros de usuario en la llamada a GA4.
  • session_id: será el id de la sesión del usuario, que llevará el valor del timestamp, pero en segundos. Por ejemplo: 1701723824 (el mismo que usamos antes pero sin los seis ceros).

Utilizaremos estos encabezados tanto en la hoja «input» como en la hoja «output»:

Importante: formatea la columna del client_id como texto y la del timestamp_micros como número sin decimales ni separadores de miles para evitar disgustos:

4. Configurando Apps Script

Una vez preparado el archivo, vamos a preparar el código de Apps Script, que viene a ser a Google Sheets lo que las macros de VBA son para Excel. Para ello, accedemos a través del menú Extensiones -> Apps Script:

Una vez aquí, dale un nombre al proyecto y crea un archivo para introducir código:

Y en ese archivo, pega el código que te adjunto en este archivo de texto. Localiza y añade tus credenciales de GA4 (Julius lo explica en su vídeo), modifícalo a tu gusto y según tus necesidades. Lo he dejado con comentarios para que puedas seguirlo/corregirlo/mejorarlo. En el pantallazo anterior verás un fragmento del mismo.

¿Qué hace este script?

  • Se autentica en tu propiedad de Google Analytics 4.
  • Recorre el contenido de las columnas de tu hoja de Google Sheets fila a fila.
  • Por cada fila, envía un evento a GA4 con la información de cada una de las columnas que le hemos especificado.
  • Limpia la hoja «input», excepto las cabeceras, y se lleva el contenido a la primera fila vacía de la hoja «output», añadiendo una columna al final con la fecha y hora en la que se hizo la llamada a GA4.

Importante: modifica la variable «nColumns» en la línea 16 de la captura de pantalla en función del número de columnas que haya en tu hoja «input». En el caso de este ejemplo, teníamos 10 columnas.

5. Alimentando el archivo de Google Sheets desde Zapier

Con todo esto preparado, pasaríamos a preparar el Zap y sus diferentes tareas. A continuación, exponemos un ejemplo de un Zap real de 16 tareas. Las tareas que no nos interesan están tachadas y las que nos incumben están marcadas en rojo:

Como ves, la tarea número 12 es con la que enviábamos la información del Measurement Protocol de Google Analytics Universal desde Zapier. Esta tarea ya no está disponible para Zaps de nueva creación. Este conector nos permitía construir la llamada HTTP de forma muy cómoda, tan solo mapeando los valores establecidos en las tareas anteriores. El conector de GA4 es mucho más limitado en ese sentido, como comentamos anteriormente. Dicho esto, pasamos a crear nuestros parámetros necesarios para construir nuestra llamada HTTP.

Vamos con la tarea número 13 del Zap anterior. Aquí, vamos a crear un número aleatorio de 8 dígitos que emplearemos para crear la primera parte de nuestro client_id. Para ello, elegimos:

  • App: Formatter by Zapier
  • Event: Numbers
  • Transform: Random number
  • Lower Range: 1000000 (para 8 dígitos, empezamos desde el valor «10 millones»)
  • Upper Range: 9999999 (el número más alto que podemos coger con 8 dígitos)
  • Decimal points: 0

De esta forma, la tarea quedaría así:

Pasamos a la tarea número 14. Aquí, buscamos generar un timestamp que vamos a utilizar para:

  • Generar la segunda parte del client_id
  • Generar el session_id
  • Generar el timestamp_micros cuando lo multipliquemos por 1 millón

De este modo, crearíamos la tarea así:

Siguiente tarea, la número 15. Esta es sencilla: tan solo tenemos que multiplicar el timestamp obtenido en el paso anterior por 1 millón de esta forma:

  • App: Formatter by Zapier
  • Event: Numbers
  • Transform: Spreadsheet-Style Formula
  • Formula: timestamp*1000000

Nos quedaría el paso final, que sería mapear todos estos valores más los de user_id y otros parámetros de evento que queremos introducir en nuestra hoja de cálculo de Google:

Elegimos la App Google Drive y buscamos el archivo que contiene los campos y los scripts. A partir de ahí, comenzamos a mapear valores calculados en pasos anteriores. Si hay algún valor que es estático, como el page_location, se puede introducir incluso a mano:

Testeamos la acción, y comprobamos que todo haya llegado correctamente a la hoja de Google:

Volvemos a Apps Script y ejecutamos el código:

Y por último, comprobamos que la hoja de «input» está vacía tras la ejecución del script, así como la de «output» contiene los datos con la fecha y hora de la ejecución del script:

6. Comprobar la llegada de eventos en GA4 real time y BigQuery

Ahora, tendríamos que comprobar si el evento y los parámetros ha llegado a GA4. Lo podemos comprobar con el tiempo real:

Deberían aparecer todos los parámetros que has enviado en la llamada. Aquí una muestra:

Si envías muchos eventos de golpe, es posible que el tiempo real de GA4 no te los muestre todos. No te preocupes, al día siguiente, también podremos comprobarlo en BigQuery:

7. Ejecutar el código de Apps Script periódicamente

Hemos probado que el proceso se realiza correctamente en la hoja de cálculo de Google y que el evento llega a Analytics. Zapier enviará la información a la hoja cada vez que llegue un lead, pero ahora tenemos que programar la hoja de Google para que envíe esa información a GA4 periódicamente.

Para ello, volvemos a Apps Script y buscamos en el menú de la izquierda la opción «Activadores«:

Una vez allí, buscamos «Añadir activador«:

Y establecemos la frecuencia. Para nuestro caso, lo he configurado «según tiempo» y por horas. Puedes ponerlo igualmente por minutos, días, semanas o meses, según te convenga.

8. Limitaciones de esta solución

Como dije al principio, esto es sólo un apaño, y ello no solventa algunas de las limitaciones que ya existían y añade alguna más:

  1. Vigila el consumo de tareas en Zapier: dependiendo del tipo de licencia que tengas y del volumen de conversiones que quieras importar a GA4, ten en cuenta que Zapier factura por tareas (o «tasks») y no por Zap. Para esta importación, hemos añadido 4 tareas dentro del Zap, por lo que multiplícalo por el número de conversiones que esperas obtener por estas vías cada mes para estimar el impacto en tu licencia de Zapier.
  2. El protocolo de medición de GA4 no permite definir los UTMs sin una sesión previa en un navegador a día de hoy. Lo he intentado de varias formas y no he sido capaz de conseguirlo, de ahí que me haya inventado ese parámetro «ev_traffic» para simularlos. Esto requiere trabajo adicional de transformación tanto en BigQuery como en Looker Studio si quieres imputar correctamente las conversiones.
  3. Número de filas de Google Sheets: esto aplica principalmente a la pestaña «output» que nos irá haciendo de log de todas las importaciones que hagamos. Google sheets tiene un máximo de 5 millones de filas, así que ve limpiando el log de vez en cuando cuando veas que te acerques a esa cifra y/o haz copias de seguridad periódicamente.
  4. Frecuencia de importación de datos: en nuestro caso, hemos aplicado una frecuencia horaria sin problemas. GA4 te permite importar datos vía protocolo de medición hasta 72 horas después de que ocurra cada evento, aunque personalmente te recomiendo que no dejes más de 48. Normalmente dices «ah, 72 horas son 3 días», pero luego pasan 3 días y unas pocas horas y ya has perdido datos. Lo dicho, con cuidado 🙂

Y hasta aquí el post de hoy, que ha quedado largo. Di con esta forma tras meses chocando contra una pared ¿Se te ocurre alguna forma de mejorar esta solución? Me gustaría mucho conocerla, especialmente con el tema de los UTMs.

Deja un comentario