Orçamentos flexíveis: conta única

This script is for a single account. For operating on multiple accounts in a Manager Account, use the Manager Account version of the script.

O Google AdWords permite definir um valor de orçamento diário para cada campanha. Porém, algumas iniciativas de marketing terão um custo fixo associado a elas. Por exemplo, "Quero gastar US$ 5.000 com nossas vendas de outono". A estratégia de lances oferece certo controle sobre como o orçamento diário é gasto, mas nenhum controle sobre como o orçamento é consumido durante a campanha.

Por exemplo, se quiséssemos gastar apenas US$ 5.000 para anunciar nossas vendas de outubro por 10 dias, poderíamos definir um orçamento diário de US$ 500 de forma a usar todo o orçamento. No entanto, isso pressupõe que gastaremos todo o valor diariamente E que desejamos gastá-lo por igual. Não é possível informar ao Google AdWords que você deseja gastar a maior parte do seu orçamento durante os últimos dias.

Este script ajustará dinamicamente o orçamento diário da sua campanha com um esquema personalizado de distribuição do orçamento.

Como funciona

Teste de estratégias de orçamento

O script inclui um código de teste para simular os efeitos da execução em vários dias. Isso dá uma ideia melhor de o que acontecerá quando o script for agendado para ser executado diariamente durante um período.

Por padrão, este script simulará a distribuição por igual de um orçamento de US$ 500 ao longo de 10 dias.

function main() {
  testBudgetStrategy(calculateBudgetEvenly, 10, 500);
//  setNewBudget(calculateBudgetEvenly, CAMPAIGN_NAME, TOTAL_BUDGET, START_DATE, END_DATE);
}

A chamada da função setNewBudget está comentada, o que significa que só executaremos o código de teste. Aqui está a saída do exemplo:

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

A cada dia calculamos um novo orçamento para termos a certeza de que estamos gastando o orçamento por igual diariamente. Depois de excedermos o orçamento alocado para a iniciativa, ele é definido como zero, suspendendo o gasto.

Você pode alterar a estratégia de orçamento utilizada mudando a função usada ou modificando a função propriamente dita. O script acompanha duas estratégias previamente criadas: calculateBudgetEvenly e calculateBudgetWeighted. Acabamos de testar a primeira. Atualize a linha testBudgetStrategy para usar a outra:

testBudgetStrategy(calculateBudgetWeighted, 10, 500);

Clique em Visualização e verifique a saída do registro. Essa estratégia de orçamento aloca menos orçamento no início do período e mais durante os últimos dias.

Você pode usar esse método de teste para simular alterações feitas nas funções de cálculo do orçamento e testar sua própria abordagem na distribuição de um orçamento.

Alocação de um orçamento

Vejamos mais detalhadamente a estratégia de orçamento calculateBudgetWeighted:

function calculateBudgetWeighted(costSoFar, totalBudget, daysSoFar, totalDays) {
  var daysRemaining = totalDays - daysSoFar;
  var budgetRemaining = totalBudget - costSoFar;
  if (daysRemaining <= 0) {
    return budgetRemaining;
  } else {
    return budgetRemaining / (2 * daysRemaining - 1) ;
  }
}

Essa função usa quatro argumentos:

  • costSoFar: quanto a campanha acumulou em custos desde a START_DATE até hoje.
  • totalBudget: quanto desejamos gastar de START_DATE a END_DATE.
  • daysSoFar: quantos dias decorridos desde a START_DATE até hoje.
  • totalDays: número total de dias entre a START_DATE e a END_DATE.

Você pode escrever sua própria função, desde que ela use esses argumentos. Usando esses valores, você pode comparar quanto gastou em dinheiro até agora com quanto deve gastar no geral e determinar em que ponto está no momento dentro do cronograma de todo o orçamento.

Em especial, essa estratégia de orçamento procura saber quanto orçamento resta (totalBudget - costSoFar) e divide esse valor pelo dobro do número de dias restantes. Assim, ela pondera a distribuição do orçamento mais para o final da campanha. Usando o custo desde a START_DATE, ela também leva em conta "dias fracos", quando você não gasta todo o orçamento definido.

Criação de um orçamento de verdade

Se estiver satisfeito com sua estratégia de orçamento, você precisará fazer algumas alterações antes de agendar este script para ser executado diariamente.

Primeiro, atualize as constantes no início do arquivo:

  • START_DATE: defina como o início da sua estratégia de orçamento. Ela deve ser a data atual ou um dia no passado.
  • END_DATE: defina como o último dia no qual você deseja anunciar usando esse orçamento.
  • TOTAL_BUDGET: o valor total que você está tentando gastar. Esse valor está na moeda da conta e pode ser excedido dependendo do agendamento de execução do script.
  • CAMPAIGN_NAME: o nome da campanha à qual a estratégia de orçamento deve ser aplicada.

Em seguida, desative o teste e ative a lógica para alterar efetivamente o orçamento:

function main() {
//  testBudgetStrategy(calculateBudgetEvenly, 10, 500);
  setNewBudget(calculateBudgetWeighted, CAMPAIGN_NAME, TOTAL_BUDGET, START_DATE, END_DATE);
}

Programação

Agende este script para ser executado diariamente, à meia-noite ou pouco depois no fuso horário local, para que ele direcione o máximo possível o orçamento do dia seguinte. Porém, dados de relatórios recuperados, como custos, podem sofrer atrasos de aproximadamente três horas. Assim, o parâmetro "costSoFar" pode estar referenciando o total de ontem em um script agendado para ser executado depois da meia-noite.

Configuração

  • Crie um novo script do Google AdWords usando o código-fonte abaixo.
  • Salve o script e clique no botão Visualizar. Este script simulará (por padrão) uma estratégia de orçamento com US$ 500 durante 10 dias. A saída do registro refletirá o dia simulado, o orçamento alocado para esse dia e o valor total gasto até essa data.

Código-fonte

// 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/adwords/scripts/docs/solutions/flexible-budgets
 *     for more details.
 *
 * @author AdWords Scripts Team [adwords-scripts@googlegroups.com]
 *
 * @version 1.0.3
 *
 * @changelog
 * - 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.
 */

var START_DATE = new Date('May 1, 2016 0:00:00 -0500');
var END_DATE = new Date('June 1, 2016 0:00:00 -0500');
var TOTAL_BUDGET = 500;
var CAMPAIGN_NAME = 'Special Promotion';

function main() {
  testBudgetStrategy(calculateBudgetEvenly, 10, 500);
//  setNewBudget(calculateBudgetEvenly, CAMPAIGN_NAME, TOTAL_BUDGET,
//      START_DATE, END_DATE);
}

function setNewBudget(budgetFunction, campaignName, totalBudget, start, end) {
  var today = new Date();
  if (today < start) {
    Logger.log('Not ready to set budget yet');
    return;
  }
  var campaign = getCampaign(campaignName);
  var costSoFar = campaign.getStatsFor(
      getDateStringInTimeZone('yyyyMMdd', start),
      getDateStringInTimeZone('yyyyMMdd', end)).getCost();
  var daysSoFar = datediff(start, today);
  var totalDays = datediff(start, end);
  var newBudget = budgetFunction(costSoFar, totalBudget, daysSoFar, totalDays);
  campaign.getBudget().setAmount(newBudget);
}

function calculateBudgetEvenly(costSoFar, totalBudget, daysSoFar, totalDays) {
  var daysRemaining = totalDays - daysSoFar;
  var budgetRemaining = totalBudget - costSoFar;
  if (daysRemaining <= 0) {
    return budgetRemaining;
  } else {
    return budgetRemaining / daysRemaining;
  }
}

function calculateBudgetWeighted(costSoFar, totalBudget, daysSoFar,
    totalDays) {
  var daysRemaining = totalDays - daysSoFar;
  var budgetRemaining = totalBudget - costSoFar;
  if (daysRemaining <= 0) {
    return budgetRemaining;
  } else {
    return budgetRemaining / (2 * daysRemaining - 1);
  }
}

function testBudgetStrategy(budgetFunc, totalDays, totalBudget) {
  var daysSoFar = 0;
  var costSoFar = 0;
  while (daysSoFar <= totalDays + 2) {
    var newBudget = budgetFunc(costSoFar, totalBudget, daysSoFar, totalDays);
    Logger.log('Day %s of %s, new budget %s, cost so far %s', daysSoFar + 1,
        totalDays, newBudget, costSoFar);
    costSoFar += newBudget;
    daysSoFar += 1;
  }
}

/**
 * Returns number of days between two dates, rounded up to nearest whole day.
 */
function datediff(from, to) {
  var millisPerDay = 1000 * 60 * 60 * 24;
  return Math.ceil((to - from) / millisPerDay);
}

function getDateStringInTimeZone(format, date, timeZone) {
  date = date || new Date();
  timeZone = timeZone || AdWordsApp.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) {
    var selectors = [AdWordsApp.campaigns(), AdWordsApp.videoCampaigns(),
      AdWordsApp.shoppingCampaigns()];
  for(var i = 0; i < selectors.length; i++) {
    var campaignIter = selectors[i].
        withCondition('CampaignName = "' + campaignName + '"').
        get();
    if (campaignIter.hasNext()) {
      return campaignIter.next();
    }
  }
  throw new Error('Could not find specified campaign: ' + campaignName);
}

Looking for the Manager Account (MCC) version? Click here

Enviar comentários sobre…

Precisa de ajuda? Acesse nossa página de suporte.