Las personas que manejan el presupuesto de una marca tienen la responsabilidad de hacerle seguimiento a los anuncios y poder optimizarlos. El problema más común es que muchas veces esperan que se acabe el presupuesto para recién tomar una decisión.

Con este script podemos definir cuando queremos que nos llegue un correo avisándonos sobre el consumo de nuestros anuncios.

Primero, ingresamos a Google Adwords y vamos a la sección Script. Luego copiamos el siguiente código y lo pegamos. Y, por último, lo que debemos de configurar son los tres campos: nombre, correo y el porcentaje de cuando queremos activar la alarma.

Alerta de Presupuesto para Google Ads

// Copyright 2018, Fox Project All Rights Reserved.
//
/**
* @nombre Alerta de Presupuestos
*
* @detalles: Este script envía un resumen en tabla de las campañas que consumieron un porcentaje diario del presupuesto definido por el usuario. Dicha tabla contiene los campos, Impressions,Clicks,Conversions,CPC,CPA
*
* @distribucion: Fox Project Team
* @version 1.0
* Use under your own responsability none of the authors are responsible for any misuse of this script
*/

var thresholdPercentage = 0.6 // Esta es la fracción del presupuesto diario gastado por campaña la cual se enviará por mail las siguientes estadisticas:

var toEmail = ‘receipt@gmail.com’; // Todos los mails serán enviados a esta dirección en caso de ser mas de uno escribirlos separado por comas (Ej:”mail1@domain.com,mail2@domain.com”)

var clientName = ‘Company/Account Name’; // Nombre del cliente

function getTodaysSpend(campaign)
{
var stats = campaign.getStatsFor(‘TODAY’);
return stats.getCost();
}

function getTodaysStats(campaign)
{
var stats = campaign.getStatsFor(‘TODAY’);
return stats;
}

function main()
{
var account = AdWordsApp.currentAccount();

var subject = ‘Campañas en la cuenta ‘+account.getCustomerId()+’ (‘+clientName+’) que han consumido al menos ‘ + (thresholdPercentage * 100).toFixed(0) + ‘% de su presupuesto diario’; // Asunto del mail

var outMatrix = [];

var externalCID = account.getCustomerId();

var campaignIterator = AdWordsApp.campaigns().get();
var shoppingCampaignIterator = AdWordsApp.shoppingCampaigns().get();

while (shoppingCampaignIterator.hasNext())
{
var campaign = shoppingCampaignIterator.next();
var currBudget = campaign.getBudget().getAmount();
var campaignName = campaign.getName();

var todaysStats = getTodaysStats(campaign);

var todaysSpend = todaysStats.getCost();
var todaysImpressions = todaysStats.getImpressions();
var todaysClicks = todaysStats.getClicks();
var todaysConversions = todaysStats.getConversions();
var todaysCPA = (todaysConversions != 0) ? (todaysSpend / todaysConversions).toFixed(2) : ‘N/A’;
var todaysCPC = (todaysClicks != 0 ) ? (todaysSpend / todaysClicks).toFixed(2) : ‘N/A’;

var exhaustedPercentage = ((todaysSpend / currBudget)*100).toFixed(1) + ‘%’;
var thresholdSpend = thresholdPercentage * currBudget;

if ( todaysSpend >= thresholdSpend )
{
outMatrix.push([ externalCID, campaignName, currBudget, todaysSpend, exhaustedPercentage, todaysImpressions, todaysClicks, todaysConversions, todaysCPC, todaysCPA ]);
}
}
Logger.log(outMatrix);
while (campaignIterator.hasNext())
{
var campaign = campaignIterator.next();
var currBudget = campaign.getBudget().getAmount();
var campaignName = campaign.getName();

var todaysStats = getTodaysStats(campaign);

var todaysSpend = todaysStats.getCost();
var todaysImpressions = todaysStats.getImpressions();
var todaysClicks = todaysStats.getClicks();
var todaysConversions = todaysStats.getConversions();
var todaysCPA = (todaysConversions != 0) ? (todaysSpend / todaysConversions).toFixed(2) : ‘N/A’;
var todaysCPC = (todaysClicks != 0 ) ? (todaysSpend / todaysClicks).toFixed(2) : ‘N/A’;

var exhaustedPercentage = (todaysSpend / currBudget * 100).toFixed(1) + ‘%’;
var thresholdSpend = thresholdPercentage * currBudget;

if ( todaysSpend >= thresholdSpend )
{
outMatrix.push([ externalCID, campaignName, currBudget, todaysSpend, exhaustedPercentage, todaysImpressions, todaysClicks, todaysConversions, todaysCPC, todaysCPA ]);
}
}
Logger.log(outMatrix);
var csvOutput = matrixToCSV(outMatrix);

var blobOutput = Utilities.newBlob(csvOutput);
blobOutput.setName(‘campaign_stats.csv’);
var html = [];
html.push(
‘<html>’,
‘<body>’,
‘<table width=1000 cellpadding=0 border=0 cellspacing=0>’,
“<tr bgcolor=’#3c78d8′>”,
‘<td width=500>’,
“<div style=’font: normal 18pt verdana, sans-serif; ” +
“padding: 3px 10px; color: white’>Campañas cerca de agotar presupuesto</div>”,
‘</td>’,
‘<td align=right>’,
“<div style=’font: normal 18pt verdana, sans-serif; ” +
“padding: 3px 10px; color: white’>”,
AdWordsApp.currentAccount().getCustomerId(), ‘</h1>’,
‘</td>’,
‘</tr>’,
‘</table>’,
‘<table width=1000 cellpadding=0 border=1 border-color: gray cellspacing=2px>’,
“<tr bgcolor=’#ddd’>”,
“<td style=’font: 10pt verdana, sans-serif; ” +
‘padding: 5px 0px 5px 5px; background-color: #ddd; ‘ +
“text-align: center’>Cuenta</td>”,
“<td style=’font: 10pt verdana, sans-serif; ” +
‘padding: 5px 0px 5px 5px; background-color: #ddd; ‘ +
“text-align: center’>Campaña</td>”,
“<td style=’font: 10pt verdana, sans-serif; ” +
‘padding: 5px 0px 5x 5px; background-color: #ddd; ‘ +
“text-align: center’>Presupuesto diario</td>”,
“<td style=’font: 10pt verdana, sans-serif; ” +
‘padding: 5px 0px 5x 5px; background-color: #ddd; ‘ +
“text-align: center’>Consumido</td>”,
“<td style=’font: 10pt verdana, sans-serif; ” +
‘padding: 5px 0px 5x 5px; background-color: #ddd; ‘ +
“text-align: center’>Agotado(%)</td>”,
“<td style=’font: 10pt verdana, sans-serif; ” +
‘padding: 5px 0px 5x 5px; background-color: #ddd; ‘ +
“text-align: center’>Impressions</td>”,
“<td style=’font: 10pt verdana, sans-serif; ” +
‘padding: 5px 0px 5x 5px; background-color: #ddd; ‘ +
“text-align: center’>Clicks</td>”,
“<td style=’font: 10pt verdana, sans-serif; ” +
‘padding: 5px 0px 5x 5px; background-color: #ddd; ‘ +
“text-align: center’>Conversions</td>”,
“<td style=’font: 10pt verdana, sans-serif; ” +
‘padding: 5px 0px 5x 5px; background-color: #ddd; ‘ +
“text-align: center’>CPC</td>”,
“<td style=’font: 10pt verdana, sans-serif; ” +
‘padding: 5px 0px 5x 5px; background-color: #ddd; ‘ +
“text-align: center’>CPA</td>”,
‘</tr>’);
outMatrix.forEach(function(el) {
var i=0; html.push(emailRow(
el[i],el[i+1],el[i+2],el[i+3],el[i+4],el[i+5],el[i+6],el[i+7],el[i+8],el[i+9]));
});
html.push(‘</table>’, ‘</body>’, ‘</html>’)

function emailRow(c1, c2, c3, c4, c5, c6, c7, c8, c9, c10) {
var html = [];
html.push(‘<tr>’,
“<td style=’padding: 5px 10px; text-align: center’>” + c1 + ‘</td>’,
“<td style=’padding: 0px 10px; text-align: center’>” + c2 + ‘</td>’,
“<td style=’padding: 0px 10px; text-align: center’>” + c3 + ‘</td>’,
“<td style=’padding: 0px 10px; text-align: center’>” + c4 + ‘</td>’,
“<td style=’padding: 0px 10px; text-align: center’>” + c5 + ‘</td>’,
“<td style=’padding: 0px 10px; text-align: center’>” + c6 + ‘</td>’,
“<td style=’padding: 0px 10px; text-align: center’>” + c7 + ‘</td>’,
“<td style=’padding: 0px 10px; text-align: center’>” + c8 + ‘</td>’,
“<td style=’padding: 0px 10px; text-align: center’>” + c9 + ‘</td>’,
“<td style=’padding: 0px 10px; text-align: center’>” + c10 +'</td>’,
‘</tr>’);
return html.join(‘n’);
}
if (outMatrix.length > 1) {
MailApp.sendEmail(toEmail, subject,”, {
htmlBody: html.join(‘n’),
name: ‘Adwords Script Fox’,
attachments: [blobOutput.getAs(MimeType.CSV)]
});

}
}

function matrixToCSV(matrix)
{
csv = new csvWriter(‘,’, ‘”‘);
csvOutput = csv.arrayToCSV(matrix)
return csvOutput;
}

function csvWriter(del, enc)
{
this.del = del || ‘,’; // CSV Delimiter
this.enc = enc || ‘”‘; // CSV Enclosure

// Convertir objeto en columna CSV
this.escapeCol = function (col) {
if(isNaN(col)) {
// No es booleano or numerico
if (!col) {
// is null or undefined
col = ”;
} else {
// is string or object
col = String(col);
if (col.length > 0) {
// use regex to test for del, enc, r or n
// if(new RegExp( ‘[‘ + this.del + this.enc + ‘rn]’ ).test(col)) {

// escape inline enclosure
col = col.split( this.enc ).join( this.enc + this.enc );

// wrap with enclosure
col = this.enc + col + this.enc;
}
}
}
return col;
};

// Convierta una matriz de columnas en una fila CSV escapada
this.arrayToRow = function (arr) {
var arr2 = arr.slice(0);

var i, ii = arr2.length;
for(i = 0; i < ii; i++) {
arr2[i] = this.escapeCol(arr2[i]);
}
return arr2.join(this.del);
};

// Convierta una matriz bidimensional en un archivo CSV de múltiples filas escapado
this.arrayToCSV = function (arr) {
var arr2 = arr.slice(0);

var i, ii = arr2.length;
for(i = 0; i < ii; i++) {
arr2[i] = this.arrayToRow(arr2[i]);
}
return arr2.join(“rn”);
};
}