Google Ads te permite establecer un importe de presupuesto diario para cada campaña. Sin embargo, algunas iniciativas de marketing tendrán un costo fijo asociado. Por ejemplo, "Quiero invertir USD 5,000 antes de nuestra oferta de otoño". La estrategia de ofertas te permite controlar en cierta medida cómo se invierte el presupuesto diario, pero no cómo se consume el presupuesto durante la campaña.
Por ejemplo, si queremos invertir solo USD 5,000 para promocionar nuestra oferta de otoño y queremos publicar anuncios durante 10 días, podemos establecer un presupuesto diario de USD 500 para utilizar todo el presupuesto. Sin embargo, esto supone que invertiremos el importe total todos los días Y que deseamos invertirlo de manera uniforme. No es posible indicarle a Google Ads que deseas invertir la mayor parte de tu presupuesto durante los últimos días.
Este script ajustará de forma dinámica el presupuesto de tu campaña todos los días con un esquema de distribución de presupuesto personalizado.
Cómo funciona
Prueba de estrategias de presupuesto
La secuencia de comandos incluye código de prueba para simular los efectos de la ejecución durante varios días. Esto te dará una mejor idea de lo que podría suceder cuando el script se programe para ejecutarse diariamente durante un período.
De forma predeterminada, esta secuencia de comandos simula una distribución uniforme del presupuesto de USD 500 gastados en 10 días.
function main() {
testBudgetStrategy(calculateBudgetEvenly, 10, 500);
// setNewBudget(calculateBudgetEvenly, CAMPAIGN_NAME, TOTAL_BUDGET, START_DATE, END_DATE);
}
La llamada a la función setNewBudget
está comentada, lo que indica que solo se ejecutará el código de prueba. Este es el resultado del ejemplo:
Day 1.0 of 10.0, new budget 50.0, cost so far 0.0
Day 2.0 of 10.0, new budget 50.0, cost so far 50.0
Day 3.0 of 10.0, new budget 50.0, cost so far 100.0
Day 4.0 of 10.0, new budget 50.0, cost so far 150.0
Day 5.0 of 10.0, new budget 50.0, cost so far 200.0
Day 6.0 of 10.0, new budget 50.0, cost so far 250.0
Day 7.0 of 10.0, new budget 50.0, cost so far 300.0
Day 8.0 of 10.0, new budget 50.0, cost so far 350.0
Day 9.0 of 10.0, new budget 50.0, cost so far 400.0
Day 10.0 of 10.0, new budget 50.0, cost so far 450.0
Day 11.0 of 10.0, new budget 0.0, cost so far 500.0
Todos los días, la secuencia de comandos calcula un presupuesto nuevo para garantizar que la inversión del presupuesto se distribuya de manera uniforme. Cuando se alcanza el límite de presupuesto asignado, el presupuesto se establece en cero y se detiene la inversión.
Puedes cambiar la estrategia de presupuesto utilizada cambiando la función que se usa o modificando la función en sí. La secuencia de comandos incluye dos estrategias prediseñadas: calculateBudgetEvenly
y calculateBudgetWeighted
. Para establecer una estrategia de presupuesto de prueba ponderada, cambia testBudgetStrategy
de la siguiente manera:
testBudgetStrategy(calculateBudgetWeighted, 10, 500);
Haz clic en Vista previa y verifica el resultado del registrador. Observa que esta estrategia de presupuesto asigna menos presupuesto al principio del período y más durante los últimos días.
Puedes usar este método de prueba para simular cambios en las funciones de cálculo del presupuesto y probar tu propio enfoque para distribuir un presupuesto.
Cómo asignar un presupuesto
La estrategia de presupuesto calculateBudgetWeighted
se implementa a través de la siguiente función:
function calculateBudgetWeighted(costSoFar, totalBudget, daysSoFar, totalDays) {
const daysRemaining = totalDays - daysSoFar;
const budgetRemaining = totalBudget - costSoFar;
if (daysRemaining <= 0) {
return budgetRemaining;
} else {
return budgetRemaining / (2 * daysRemaining - 1) ;
}
}
Esta función toma los siguientes argumentos:
costSoFar
- Costo acumulado de la campaña desde el
START_DATE
hasta hoy. totalBudget
- Inversión asignada de
START_DATE
aEND_DATE
. daysSoFar
- Días transcurridos desde el
START_DATE
hasta hoy. totalDays
- Cantidad total de días entre
START_DATE
yEND_DATE
.
Puedes escribir tu propia función siempre que tome estos argumentos. Con estos valores, puedes comparar cuánto dinero invertiste hasta el momento con cuánto debes invertir en general y determinar en qué punto te encuentras actualmente dentro del cronograma para el presupuesto total.
En particular, esta estrategia de presupuesto calcula cuánto presupuesto queda (totalBudget - costSoFar
) y lo divide por el doble de la cantidad de días restantes. Esto hace que la distribución del presupuesto se incline hacia el final de la campaña. Si utilizas el costo desde START_DATE
, también se tienen en cuenta los "días lentos" en los que no se invierte por completo el presupuesto establecido.
Presupuesto real
Una vez que estés conforme con tu estrategia de presupuesto, deberás realizar algunos cambios antes de programar la ejecución diaria de esta secuencia de comandos.
Primero, actualiza las constantes en la parte superior del archivo:
START_DATE
: Establece este parámetro en el inicio de tu estrategia de presupuesto. Debe ser la fecha actual o una anterior.END_DATE
: Establece este parámetro en el último día en el que deseas publicar anuncios con este presupuesto.TOTAL_BUDGET
: Es el importe total que intentas invertir. Este valor se indica en la moneda de la cuenta y es posible que se supere según el momento para el que esté programada la ejecución de la secuencia de comandos.CAMPAIGN_NAME
: Es el nombre de la campaña a la que se aplicará la estrategia de presupuesto.
A continuación, inhabilita la prueba y habilita la lógica para cambiar el presupuesto:
function main() {
// testBudgetStrategy(calculateBudgetEvenly, 10, 500);
setNewBudget(calculateBudgetWeighted, CAMPAIGN_NAME, TOTAL_BUDGET, START_DATE, END_DATE);
}
Programación
Programa esta secuencia de comandos para que se ejecute diariamente, a la medianoche o poco después en la zona horaria local, de modo que ajuste, en la medida de lo posible, el presupuesto del día siguiente. Sin embargo, ten en cuenta que los datos de los informes recuperados, como el costo, podrían tener un retraso de aproximadamente 3 horas, por lo que el parámetro costSoFar
podría hacer referencia al total del día anterior para una secuencia de comandos programada para ejecutarse después de la medianoche.
Configuración
Haz clic en el botón que se encuentra a continuación para crear la secuencia de comandos en tu cuenta de Google Ads.
Guarda la secuencia de comandos y haz clic en el botón Vista previa. De forma predeterminada, este script simula una estrategia de presupuesto con USD 500 durante 10 días. El registro refleja el día que se simula, el presupuesto asignado para ese día y el importe total invertido hasta la fecha.
Código fuente
// Copyright 2015, Google Inc. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
/**
* @name Flexible Budgets
*
* @overview The Flexible budgets script dynamically adjusts campaign budget for
* an advertiser account with a custom budget distribution scheme on a daily
* basis. See
* https://developers.google.com/google-ads/scripts/docs/solutions/flexible-budgets
* for more details.
*
* @author Google Ads Scripts Team [adwords-scripts@googlegroups.com]
*
* @version 2.1
*
* @changelog
* - version 2.1
* - Split into info, config, and code.
* - version 2.0
* - Updated to use new Google Ads scripts features.
* - version 1.0.3
* - Add support for video and shopping campaigns.
* - version 1.0.2
* - Use setAmount on the budget instead of campaign.setBudget.
* - version 1.0.1
* - Improvements to time zone handling.
* - version 1.0
* - Released initial version.
*/
/**
* Configuration to be used for the Flexible Budgets script.
*/
CONFIG = {
'total_budget': 500,
'campaign_name': 'Special Promotion',
'start_date': 'November 1, 2021 0:00:00 -0500',
'end_date': 'December 1, 2021 0:00:00 -0500'
};
const TOTAL_BUDGET = CONFIG.total_budget;
const CAMPAIGN_NAME = CONFIG.campaign_name;
const START_DATE = new Date(CONFIG.start_date);
const END_DATE = new Date(CONFIG.end_date);
function main() {
testBudgetStrategy(calculateBudgetEvenly, 10, 500);
// setNewBudget(calculateBudgetEvenly, CAMPAIGN_NAME, TOTAL_BUDGET,
// START_DATE, END_DATE);
}
function setNewBudget(budgetFunction, campaignName, totalBudget, start, end) {
const today = new Date();
if (today < start) {
console.log('Not ready to set budget yet');
return;
}
const campaign = getCampaign(campaignName);
const costSoFar = campaign.getStatsFor(
getDateStringInTimeZone('yyyyMMdd', start),
getDateStringInTimeZone('yyyyMMdd', end)).getCost();
const daysSoFar = datediff(start, today);
const totalDays = datediff(start, end);
const newBudget = budgetFunction(costSoFar, totalBudget, daysSoFar,
totalDays);
campaign.getBudget().setAmount(newBudget);
}
function calculateBudgetEvenly(costSoFar, totalBudget, daysSoFar, totalDays) {
const daysRemaining = totalDays - daysSoFar;
const budgetRemaining = totalBudget - costSoFar;
if (daysRemaining <= 0) {
return budgetRemaining;
} else {
return budgetRemaining / daysRemaining;
}
}
function calculateBudgetWeighted(costSoFar, totalBudget, daysSoFar,
totalDays) {
const daysRemaining = totalDays - daysSoFar;
const budgetRemaining = totalBudget - costSoFar;
if (daysRemaining <= 0) {
return budgetRemaining;
} else {
return budgetRemaining / (2 * daysRemaining - 1);
}
}
function testBudgetStrategy(budgetFunc, totalDays, totalBudget) {
let daysSoFar = 0;
let costSoFar = 0;
while (daysSoFar <= totalDays + 2) {
const newBudget = budgetFunc(costSoFar, totalBudget, daysSoFar, totalDays);
console.log(`Day ${daysSoFar + 1} of ${totalDays}, new budget ` +
`${newBudget}, cost so far ${costSoFar}`);
costSoFar += newBudget;
daysSoFar += 1;
}
}
/**
* Returns number of days between two dates, rounded up to nearest whole day.
*/
function datediff(from, to) {
const millisPerDay = 1000 * 60 * 60 * 24;
return Math.ceil((to - from) / millisPerDay);
}
function getDateStringInTimeZone(format, date, timeZone) {
date = date || new Date();
timeZone = timeZone || AdsApp.currentAccount().getTimeZone();
return Utilities.formatDate(date, timeZone, format);
}
/**
* Finds a campaign by name, whether it is a regular, video, or shopping
* campaign, by trying all in sequence until it finds one.
*
* @param {string} campaignName The campaign name to find.
* @return {Object} The campaign found, or null if none was found.
*/
function getCampaign(campaignName) {
const selectors = [AdsApp.campaigns(), AdsApp.videoCampaigns(),
AdsApp.shoppingCampaigns()];
for (const selector of selectors) {
const campaignIter = selector
.withCondition(`CampaignName = "${campaignName}"`)
.get();
if (campaignIter.hasNext()) {
return campaignIter.next();
}
}
throw new Error(`Could not find specified campaign: ${campaignName}`);
}