Siii… ¡el GPT!

Ehhh no, GPT no es un auto de carreras (y no corrió en Le Mans) 🤷

Aprendí a manejar hace poco 😅 y no sé de autos, pero GPT… es la sigla de Google Publisher Tag y nada tiene que ver con el Ford GT… 🏎

Hablando de motores podríamos definir al GPT como el “motor” del ad serving de cualquier sitio web usando Google Ad Manager (GAM).

Hoy vamos a desarmarlo pieza por pieza para aprenderlo en detalle ✔

Let’s go 🔧 👇

💬 NOTA: Este artículo no pretende ser una guía extremadamente técnica, más bien dar una idea general a modo de introducción para cualquiera que quiera aprender, profundizar o tenga actualmente problemas puntuales en la implementación del GPT.

Antes de comenzar vamos a explicar brevemente la diferencia entre GAM, GPT y como se relacionan el uno con el otro.

Para ponerlo en términos simples GAM (Google Ad Manager anteriormente conocido como Double Click for Publishers) es un Ad Server de la empresa Google para editores (publishers) que sirve para gestionar los espacios publicitarios en los sitios web, pudiendo despachar campañas directas, así como también programática de networks de terceros, AdX, Adsense, Open Bidding, etc, etc.

GPT es por otra parte el “motor” que ejecuta el GAM en el sitio web del publisher y hace efectivamente que los anuncios se muestren. Y es en este punto, donde muchas veces comienzan los problemas…

Vamos a abordar el funcionamiento de GAM en próximas entregas, pero ahora derecho al GPT.

Podemos desglosar el funcionamiento del GPT básicamente en 3 partes bien definidas:

Script de inicialización ✔

La Configuración ✔

La Ejecución del Ad Serving ✔

Vamos al detalle 👇

GENTLEMEN, START YOUR ENGINES🚦

El GPT no puede arrancar sin la siguiente línea de código (script de inicialización):

<script async src="https://securepubads.g.doubleclick.net/tag/js/gpt.js"></script>

NOTA: Agregala… no te quedes como John buscando los ads… 😅

✔ TIP Publishers: NO agregar el script de inicialización más de una vez por página, no es necesario y suma latencia. Más latencia = menos viewability = menos CPM = menos plata.

✔ TIP Publishers II: Si está usando el siguiente script de inicialización:

<script async src="https://www.googletagservices.com/tag/js/gpt.js "></script>

🚨¡REEMPLAZAR DE INMEDIATO! ¡IMPLEMENTACIÓN AÑEJA!

✔ TIP Media Buyers: Detectar el script de inicialización nos permite saber que el publisher está utilizando GAM y no otro ad server, lo cual es un buen dato para comenzar la charla. Por ejemplo sobre integraciones vía el flamante MCM.

✔ TIP para el que se siente leyendo un manuscrito de lenguas muertas, pero quiere aprender: Paciencia 😅

LA CONFIGURACIÓN

Si bien el GPT posee funciones avanzadas, hoy vamos a enfocarnos en el funcionamiento básico y desglosar sus partes.

La configuración básica se realiza de la siguiente manera 👇

Declaración de la variable del GPT

window.googletag = window.googletag || {cmd: []};

El siguiente paso es sumar al CMD todas las configuraciones y comandos que queramos ejecutar.

✔ CMD = cola de comandos global para la ejecución asíncrona de llamadas relacionadas con GPT.

googletag.cmd.push(function() { [CONFIGURACIONES Y COMANDOS] });

Lo básico (y más habitual) es definir un Slot/s

Si desglosamos los componentes de googletag.defineSlot tenemos lo siguiente:

googletag.defineSlot('/[id GAM]/[codigo del adunit]', [tamaño/s], 'ID del DIV donde se va mostrar el adunit').addService(googletag.pubads());

Por ejemplo:

googletag.defineSlot('/32221233376/header_top', [970, 90], 'div-gpt-ad-1607300503733-0').addService(googletag.pubads());

En donde ‘/32221233376/header_top’ es la ruta completa del adunit compuesta por id del GAM + código del adunit. [970, 90] es el tamaño, aunque también es posible declarar un conjunto de tamaños como por ejemplo de esta manera [[970, 90], [728,90], [970,250]], finalmente ‘div-gpt-ad-1607300503733-0’ es el ID del DIV donde se va a mostrar (renderizar) el anuncio.

✔ TIP: Si se trata de una relación de MCM del tipo Manage Inventory deben usarse separados por coma, el ID del Parent y el ID del Child, encontrándose el adunit creado en el GAM del Parent.

googletag.defineSlot('/[ID PARENT, ID CHILD]/[Nombre del Adunit]', [Tamaño/s], 'ID del DIV donde se va a ejecutar este Adunit').addService(googletag.pubads());

✔ TIP II: Atentos a los nombres de adunits porque son “Case Sensitive”, esto quiere decir diferencian entre mayúsculas y minúsculas. En el ejemplo anterior si el código del adunit en el GAM es por ejemplo “header_top” y nosotros lo declaramos como “Header_top” para el GTP es otro adunit totalmente diferente.

✔ TIP III: No reutilizar el ID del DIV, tienen que ser únicos.

El siguiente comando debe ir al final:

googletag.enableServices();

Todo junto:

window.googletag = window.googletag || {cmd: []}

googletag.cmd.push(function() { 

googletag.defineSlot('/[id GAM]/[codigo del adunit]', [tamaño/s], 'ID del DIV donde se va mostrar el adunit').addService(googletag.pubads());

….

googletag.enableServices();

});;

LA EJECUCIÓN 🚀

Una vez realizada la configuración, llega el momento de decirle a GPT donde vamos a renderizar los anuncios que configuramos. Para eso es necesario ubicar el siguiente código/s (tag) en el lugar exacto donde queremos que el anuncio se muestre.

Siguiendo el ejemplo que vimos más arriba:

<div id="div-gpt-ad-1607300503733-0" style="width: 970px; height: 90px; margin:auto;"><script>googletag.cmd.push(function() { googletag.display("div-gpt-ad-1607300503733-0"); });</script></div>

Es muy importante el ID del DIV sea el mismo que utilizamos en la declaración anterior.

 TIP: Por regla general cada DIV ID tiene que figurar 3 veces por página. Una vez en la declaración del encabezado y dos veces en el tag. Si figura más o menos veces, es un error a revisar.

LOS PROBLEMAS FRECUENTES…

😩 PROBLEMA 1

– Uso los mismos adunits para desktop y mobile, pero los anuncios renderizan de manera indistinta en uno y otro y no tengo manera de controlarlo.

– El problema es la ausencia de un size mapping o la mala configuración de uno existente, chequear el siguiente enlace: https://developers.google.com/publisher-tag/guides/ad-sizes#responsive_ads

😰 PROBLEMA 2

– Arme un passback tag para un publisher pero no despacha ni AdX ni Adsense. El MCM (Inventory) ya está aceptado por el Publisher, el line de AdX ya está puesto en el ads.txt, el child publisher está incorporado también en la ruta del adunit, el sitio web aprobado, no es problema de UPRs ni de Protections…

– Sí, parece estar todo bien y que ya nos quedamos sin opciones… pero falta un pequeño detalle…, chequear el siguiente enlace: https://developers.google.com/publisher-tag/guides/passback-tags#specify_page_url

😱 PROBLEMA 3

– Implementé Header Bidding con PrebidJS y los avisos parpadean y cambian apenas carga el sitio web.

– Hay un problema de sincronización entre PrebidJS y el GAM. El ad serving se está disparando dos veces y para solucionarlo es necesario frenar el ad serving hasta que PrebidJS termine la subasta utilizando la siguiente línea de código en el CMD:

googletag.pubads().disableInitialLoad();

💥 ¿Estás como John? ¿Dudas, feedback, comentarios?