Google Ads te permite establecer un importe de presupuesto diario para cada campaña. Sin embargo, algunos las iniciativas de marketing tendrán un costo fijo asociado. por ejemplo, “Quiero invertir USD 5,000 antes de nuestra venta de otoño”. La estrategia de ofertas tienes algo de control sobre cómo se invierte el presupuesto diario, pero no controlas el presupuesto se consume durante la campaña.
Por ejemplo, si queremos gastar solo USD 5000 para publicitar nuestra oferta de otoño y desea 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 todo el importe cada día Y queremos 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.
Esta secuencia de comandos ajustará diariamente el presupuesto de su campaña de forma dinámica de distribución del presupuesto.
Cómo funciona
Prueba estrategias de presupuesto
La secuencia de comandos incluye código de prueba para simular los efectos de su ejecución varios días. Esto te da una mejor idea de lo que podría pasar cuando el guion está programado para ejecutarse diariamente durante un período determinado.
De forma predeterminada, esta secuencia de comandos simula una distribución uniforme del presupuesto de USD 500 invertidos. más de 10 días.
function main() {
testBudgetStrategy(calculateBudgetEvenly, 10, 500);
// setNewBudget(calculateBudgetEvenly, CAMPAIGN_NAME, TOTAL_BUDGET, START_DATE, END_DATE);
}
La llamada a 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
Cada día, la secuencia de comandos calcula un presupuesto nuevo para asegurarse de que la inversión distribuidos de manera uniforme. Cuando se alcanza el límite de presupuesto asignado, se establece el presupuesto. a cero, lo que detiene la inversión.
Puedes cambiar la estrategia de presupuesto utilizada cambiando la función que se utiliza.
modificar la función en sí. La secuencia de comandos incluye dos estrategias prediseñadas:
calculateBudgetEvenly
y calculateBudgetWeighted
. Cómo establecer una prueba ponderada
estrategia de presupuesto, cambia testBudgetStrategy
de la siguiente manera:
testBudgetStrategy(calculateBudgetWeighted, 10, 500);
Haz clic en Preview y revisa el resultado del registrador. Observa que esta estrategia de presupuesto asigna menos presupuesto al comienzo del período y más durante los últimos días.
Puedes usar este método de prueba para simular cambios en el cálculo del presupuesto. y probar tu propio enfoque para distribuir el presupuesto.
Cómo asignar un presupuesto
La estrategia de presupuesto calculateBudgetWeighted
se implementa de la siguiente manera:
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 estos argumentos:
costSoFar
- Costo acumulado de la campaña desde el
START_DATE
hasta hoy totalBudget
- La inversión asignada del
START_DATE
alEND_DATE
. daysSoFar
- Días transcurridos desde el
START_DATE
hasta hoy. totalDays
- Cantidad total de días entre el
START_DATE
y elEND_DATE
.
Puedes escribir tu propia función siempre que tome estos argumentos. Usando estos valores, puedes comparar cuánto dinero gastaste hasta el momento cuánto invertir en general y determinar dónde te encuentras actualmente dentro del plazo para todo el presupuesto.
En particular, esta estrategia presupuestaria determina cuánto presupuesto queda
(totalBudget - costSoFar
) y lo divide por el doble de la cantidad de días
restantes. Esto pondera la distribución del presupuesto hacia el final del
campaña. Si usa el costo de START_DATE
, también tiene en cuenta la latencia
días” que no se inviertan por completo.
Presupuesto real
Una vez que estés conforme con tu estrategia de presupuesto, debes hacer 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 esta opción como el inicio de tu estrategia de presupuesto. Debe ser la fecha actual o una anterior.END_DATE
: Establece esta opción como el último día en el que deseas publicar anuncios con este presupuesto.TOTAL_BUDGET
: Es el importe total que intentas invertir. Este valor está en moneda de la cuenta y es posible que se supere según el momento programado para ejecutarse.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 el país
la zona horaria para definir
el presupuesto del día siguiente en la medida de lo posible. Nota:
Sin embargo, los datos de informes recuperados, como el costo, podrían retrasarse unos 3
por lo que el parámetro costSoFar
podría hacer referencia al total de ayer para un
de comandos que está programada
para ejecutarse después de la medianoche.
Configuración
Haz clic en el siguiente botó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. Esta secuencia de comandos (de predeterminada) simula una estrategia de presupuesto de USD 500 durante 10 días. El resultado del registrador 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}`);
}