Google AdWords ahora se llama Google Ads. Este nuevo nombre refleja toda la gama de opciones publicitarias que ofrecemos en las redes de Búsqueda y de Display, en YouTube y en muchos otros sitios y plataformas web. Más información

460 anunciantes en línea
460 anunciantes en línea
Bienvenidos a la Comunidad Oficial de Google AdWords
favorite_border

Secuencias de Comandos (Scripts): Revisar las Páginas de Destino de manera automática

En este artículo, veremos cómo hacer para revisar de manera automática, y con una frecuencia constante, si todas las páginas de destino de nuestra cuenta están funcionando correctamente. Muchas veces, suele ocurrir que hay problemas en esta página, y desde el sistema de AdWords se vuelve difícil de detectar en el corto plazo, sobre todo en cuentas grandes (nos damos cuenta probablemente por la caída de conversiones, al tiempo de que sucede). Estos problemas pueden ser:

 

- El servidor está caído

- Ha habido un rediseño en el sitio y cambiaron las URLs

- El producto que estamos promocionando ya no tiene stock

 

entre otros.

 

¡Buenas noticias! Ejecutando una secuencia de comando que les dejaré a continuación, y personalizándola para tu caso, vas a poder ahorrarte mucho tiempo y disgustos ante estos problemas.

 

El Script


El script puntualmente va a hacer lo siguiente:

- Una vez por hora, revisará todas las páginas de destino de los anuncios activos dentro de grupos de anuncios activos.

- Al encontrar páginas de destino que den un error del servidor (error 404 ó 500 son los más comunes), o al encontrar determinados textos en las páginas que podremos personalizar (como "no se ha encontrado" ó "sin stock"), pausará estos anuncios, les pondrá una etiqueta para que los podamos identificar y nos enviará un e-mail avisando cuántos anuncios fueron pausados.

 

Desde ya que cada uno de estos puntos es personalizable a gusto y los estaremos explicando en este post.

 

Bueno. ¡empecemos!

 

Paso 1: Ingresar a Google AdWords y crear una nueva secuencia de comandos.

 

Para crear un script, debes ingresar a tu cuenta de AdWords, hacer click en "Operaciones masivas" (en la columna izquierda), ir a "Secuencias de comandos" y presionar el botón verde: Crear secuencia de comandos.

 

En cualquier momento, haciendo click en "vista previa" podremos observar qué cambios le realizaría el script a nuestra cuenta antes de ejecutarlo por primera vez. Es fundamental SIEMPRE ver la vista previa de lo que el script hará, porque no hay manera de deshacer esos cambios una vez ejecutados.

 

Para poder usar el script, primero debemos hacer click en "Autorizar ahora" para autorizar el script a tener acceso a nuestra cuenta:

 

 

 

Paso 2: copiar este código:

 

// Van los créditos Guiño
// Nombre: Revisión Automática de Páginas de Destino
// Creador: AlanDaitch
// Sitio web: TictAds.com
// Exclusivo para la Comunidad de AdWords en Español


function main() {
  var is_error = 0;
  
// Comenzamos revisando si existen las etiquetas que vamos a utilizar para
// clasificar a los anuncios: "Revisado" y "Error_Pagina_Destino"  
// cuando el script revisa un anuncio, le pone "Revisado" y cuando
// le encuentra un error, le pone "Error_Pagina_Destino".
// Si no existen, las crea.  

  
  var CheckedExist = AdWordsApp.labels()
  .withCondition("Name = 'Revisado'")
  .get();
  var LandingErrorExist = AdWordsApp.labels()
  .withCondition("Name = 'Error_Pagina_Destino'")
                 .get();
  if (CheckedExist.hasNext() && LandingErrorExist.hasNext()){} else {
AdWordsApp.createLabel("Error_Pagina_Destino");
AdWordsApp.createLabel("Revisado");
  }
  
// esta opción es técnica, sobre autenticaciones  
 var options =
 {
   "muteHttpExceptions" : true
 };

// aquí ponemos el texto que, si está en la página, la vamos a considerar
// un error. Ejemplos: "sin stock", "no hemos encontrado lo que buscas".
  
 var SiLaPaginaTieneEsteTextoEsError = "Não conseguimos encontrar esta página";

  
// Armamos el selector de anuncios, solamente activos en
// grupos de anuncios activos.
  
 var adSelector = AdWordsApp.ads()
 .withCondition("Status = ENABLED")
 .withCondition("AdGroupStatus = ENABLED")
 
// Ponemos también como condición no revisar los grupos de anuncios ya revisados.
// Esto es útil porque en cuentas grandes el tiempo límite del script puede no
// llegar a revisar todos los anuncios de una sola pasada.
// Cuando todos los anuncios están revisados, abajo ejecutamos un restablecedor
// que les quita la etiqueta "Revisado" a todos para volver a empezar.
 
 .withCondition("LabelNames CONTAINS_NONE ['Revisado']")
 ;

 var adIterator = adSelector.get();
if (adIterator.hasNext()) {
 while(adIterator.hasNext()) {
 
// Cuestión técnica de tiempo de ejecución de script, no hace falta tocar.
   
   var remainingTime = AdWordsApp.getExecutionInfo().getRemainingTime(); 
   Logger.log("Tiempo restante en segundos: "+remainingTime);
   if ( remainingTime < 30) {return;} else {
     
// Extraemos los atributos del anuncio (Campaña, Grupo de Anuncios, ID, URL de destino)
     
   var ad = adIterator.next();
   var adCampaign = ad.getCampaign();
   var adAdGroup = ad.getAdGroup();
   var adId = ad.getId();
   var urlToTest = ad.getDestinationUrl();
   Logger.log("Testeando la URL "+urlToTest+" del anuncio del grupo "+adAdGroup+" campaña "+adCampaign);
   var response = UrlFetchApp.fetch(encodeURI(urlToTest), options);
     
// Si la página está OK, el código HTTP es "200". Si es diferente, es error.     
     
   Logger.log(ad.getDestinationUrl() + " response = " + response.getHeaders() + " code = " + response.getResponseCode());
   if(response != undefined) {
     var responseCode = response.getResponseCode();
     if(responseCode == 200){
       
// Revisa si la página tiene el texto que configuramos como error
       
       var responseText = response.getContentText();
       if(responseText != "") {
         if(responseText.indexOf(SiLaPaginaTieneEsteTextoEsError) != -1) {
           var is_error = (is_error + 1);
           Logger.log("Pausando el anuncio:" + adId);
           ad.pause();
           ad.applyLabel("Error_Pagina_Destino");
         }
         
// Si no hay error, le pone la etiqueta "Revisado"    
         
         else {
           ad.applyLabel("Revisado");
           ad.removeLabel("Error_Pagina_Destino");
         }
       }
     } else if (responseCode == 404){
       var is_error = (is_error + 1);
       Logger.log("Pausando el anuncio:" + adId + " (error 404)");
       ad.pause();
       ad.applyLabel("Error_Pagina_Destino");
     }
     else {
       Logger.log(responseCode);
       ad.applyLabel("Revisado");
       ad.removeLabel("Error_Pagina_Destino");
     }
   }
   }}
}
  
// Si todo salió bien, nos enviamos un e-mail a nosotros (o a quienes queramos)  
  
else  {
      MailApp.sendEmail("tu-email@gmail.com", "Revisadas todas las páginas de destino", "Volviendo a comenzar el chequeo.") 

// Como ya están revisadas todas las páginas de destino, quitamos las etiquetas
// de "Revisado" para que, en la próxima ejecución, vuelva a comenzar la revisión.      
      
  var adReseter = AdWordsApp.ads().get();
while (adReseter.hasNext() ) {
var adToReset = adReseter.next();
  adToReset.removeLabel("Revisado");
  

}
}
  
// En cambio, si hubo errores, nos enviamos un e-mail anunciando.  
  
  if (is_error > 0) {
    MailApp.sendEmail("tu-email@gmail.com", "Páginas de destino con errores", "Hubo " + is_error + " anuncios que reportaron errores. Revisar http://adwords.google.com para más información.") 
  }
}

 

Acerca de Alan Daitch

Fundador de la consultora Digodat Analytics, con presencia local en Argentina, México y Portugal. Google Regional Trainer. Estamos certificados en toda la suite de Google Analytics 360: Optimize, Data Studio y Tag Manager. Contacto: alan@digodat.com

Comentarios
por DanielJurado Colaborador Principal
abril 2014

Muy interesante Alan.

 

Saludos

por José Luis Juy
abril 2014

Muchas gracias por el aporte Alan.

 

Desde ya lo tengo probando en una campaña de volumen considerable y por el momento me está funcionando correctamente.

 

Creo que esto puede ahorrar mucho dinero a nuestros clientes y mucho trabajo mecánico a nosotros. Un gran aporte, sin duda.

 

Saludos!

por MarcusRB
abril 2014

Muchas gracias!

por Marcel Odena
abril 2014

Muchas gracias Alan, será de mucha utilidad, en especial para ecommerces.

Un saludo,

Marcel Odena

por Abraham M
abril 2014

Muchas Gracias Alan, gran aporte.

Un saludo

por Gerard G
abril 2014

Muchas gracias por el aporte.

 

Voy a probarla con algunas campañas de clientes a ver que tal funciona.

por Gerard G
abril 2014

Lo he probado, y me ha parado unos cuantos anuncios porque la URL de destino da error.

 

Revisando las URL's son caracteres como "Ñ" que se sustituyen por "%C3%B1"

 

 

ejemplo: pesta%C3%B1as-postizas/

 

La URL del cliente realmente es con la Ñ.

 

ejemplo: pestañas-postizas/

 

Estos errores no serían correctos verdad? Ya que he copiado y pegado la URL y automaticamente convierte "%C3%B1 en una "Ñ".

por AlanDaitch Colaborador Principal
abril 2014

Gerard: gracias por el feedback. Si la URL carga correctamente, no debería dar error. Si este es el caso (está pausando anuncios con la URL que no da error), entonces hay algo que arreglar en el script para los caracteres especiales como bien dices. Te pediría si me pudieras dar una URL completa de ejemplo, así lo testeamos en la agencia y llegamos a una solución.

 

Saludos y gracias!

por Benjamin C
abril 2014

Hola Alan,,

Estoy implementando tu script para Revisar las Páginas de Destino de manera automática, pero me encontrado con algunas dudas.

El Log me muestra lo siguiente: The label Revisado does not exist. (line 57).

Y el texto que lleva la variable SiLaPaginaTieneEsteTextoEsError puede estar en cualquier parte de la pagina o debe estar dentro de <body></body>.

 

Muchas gracias, saludos!!

por NicoDavila
abril 2014

Funciona con campañas pausadas?

por Tonatiu C
mayo 2014

Super cool gracias

por NachoG Colaborador Principal
marzo 2015

Hola Alan,

 

Una duda. Entiendo que la programación de hacerlo cada hora, debe ser desde el Schedule de Script, que no está dentro de la propia programación.

 

Otra duda que tengo es que, con campañas masivas, ¿afecta algo? Son más de 1000 líneas de logs y no sé si esto tiene algún impacto en las cuentas.

 

Saludos, y millones de gracias, se ve bastante útil.

por Matías F
octubre 2015

Hola Alan, Cómo estás?

Cómo sería el script actualizado con los nuevos cambios de scripts de adwords:? Ya que no estaría funcionando y no puedo dar solución desde las guías de developer

 

Gracias!

por kamal B
octubre 2015
Gracias lo tendré muy en cuente .m buena info
por Matías F
octubre 2015

Si era de gran utilidad, pero ya no estaría funcionando con las nuevas actualizaciones de script de Adwords...Emoticono triste

por David T
abril 2016

Hola Alan, 

 

Acabo de introducir el Script en una de nuestras cuentas.

 

Puse el script tal y como aparece, pero al darle a previsualizar me dice:

 

Preview completed with errors. See the logs for details. (00:02)

Tiempo restante en segundos: 1798
Testeando la URL null del anuncio del grupo [ad group Money Transfer] campaña [campaign (B) -Money Transfer]
DNS error: http://null (line 68)

La linea 68 dice:
var response = UrlFetchApp.fetch(encodeURI(urlToTest), options);

 

Sabes a que puede ser debido? 

 

Gracias y un saludo!

 

por Israel O
agosto

Buenos a tod@s,

[Actualización]

Desde que Google Adwords ha cambiado la URL de destino por la URL Final hay que hacer un cambio el el Script propuesto por Alan Daitch.

Hay dos partes que hay que cambiar:

// Extraemos los atributos del anuncio (Campaña, Grupo de Anuncios, ID, URL de destino)
     
   var ad = adIterator.next();
   var adCampaign = ad.getCampaign();
   var adAdGroup = ad.getAdGroup();
   var adId = ad.getId();
   var urlToTest = ad.getDestinationUrl();
   Logger.log("Testeando la URL "+urlToTest+" del anuncio del grupo "+adAdGroup+" campaña "+adCampaign);
   var response = UrlFetchApp.fetch(encodeURI(urlToTest), options);
  Logger.log(ad.getDestinationUrl() + " response = " + response.getHeaders() + " code = " + response.getResponseCode());
   if(response != undefined) {
     var responseCode = response.getResponseCode();
     if(responseCode == 200){
       

Las dos partes que he destacado en azul: ad.getDestinationUrl() tienen que ser reemplazadas por:

ad.urls().getFinalUrl();

 

Un saludo,

por Lucía C
mayo

Hola @AlanDaitch

 

He lanzado este script que propones poniendo la última actualización de 

 

ad.urls():getFinalUrl()

en vez de 

ad.getDestinationUrl()

 y me hace 347 cambios a "revisado" pero no me llega el email ni me quita las etiquetas. De hecho, he tenido que lanzar otro scritpt para que me las elimine. 

¿alguno ha tenido este problema? 

Gracias!