O problema de orçamento nem sempre é “gastar demais”. Uma conta também pode terminar o mês muito abaixo da verba planejada por limitação de demanda, configuração, reprovação ou mudança de estratégia. Por isso, um alerta útil precisa mostrar gasto atual, percentual consumido e projeção.

O que este script monitora

ImportanteO orçamento mensal é um parâmetro seu. O script não tenta inferir sozinho a verba “correta” e não altera budgets da conta.

Script completo

/**
 * ALERTA DE RITMO DO ORÇAMENTO MENSAL
 * Somente leitura: não altera orçamento nem pausa campanhas.
 */
const CONFIG = {
  EMAIL: 'seu-email@empresa.com.br',
  MONTHLY_BUDGET: 10000,
  ALERT_WHEN_USED_PERCENT: 85,
  PROJECTED_OVERSPEND_TOLERANCE_PERCENT: 5
};

function main() {
  validateConfig();
  const account = AdsApp.currentAccount();
  const timezone = account.getTimeZone();
  const today = new Date();
  const monthStart = new Date(today.getFullYear(), today.getMonth(), 1);
  const monthEnd = new Date(today.getFullYear(), today.getMonth() + 1, 0);
  const spent = getCost(monthStart, today, timezone);
  const elapsedDays = Math.max(today.getDate(), 1);
  const totalDays = monthEnd.getDate();
  const usedPercent = (spent / CONFIG.MONTHLY_BUDGET) * 100;
  const projectedSpend = (spent / elapsedDays) * totalDays;
  const projectedLimit = CONFIG.MONTHLY_BUDGET *
    (1 + CONFIG.PROJECTED_OVERSPEND_TOLERANCE_PERCENT / 100);

  const lines = [
    `Conta: ${account.getName()} (${account.getCustomerId()})`,
    `Gasto acumulado: ${money(spent)}`,
    `Orçamento mensal: ${money(CONFIG.MONTHLY_BUDGET)}`,
    `Consumido: ${usedPercent.toFixed(1)}%`,
    `Projeção: ${money(projectedSpend)}`
  ];

  Logger.log(lines.join('\n'));

  if (usedPercent >= CONFIG.ALERT_WHEN_USED_PERCENT || projectedSpend > projectedLimit) {
    if (!AdsApp.getExecutionInfo().isPreview()) {
      MailApp.sendEmail(
        CONFIG.EMAIL,
        `[Google Ads] Ritmo do orçamento - ${account.getName()}`,
        lines.join('\n') + '\n\nRevise contexto e qualidade das conversões antes de mudar verba.'
      );
    }
  }
}

function getCost(startDate, endDate, timezone) {
  const query = `
    SELECT metrics.cost_micros
    FROM customer
    WHERE segments.date BETWEEN '${formatDate(startDate, timezone)}'
      AND '${formatDate(endDate, timezone)}'
  `;
  const rows = AdsApp.search(query);
  let micros = 0;
  while (rows.hasNext()) micros += Number(rows.next().metrics.costMicros || 0);
  return micros / 1e6;
}

function formatDate(date, timezone) {
  return Utilities.formatDate(date, timezone, 'yyyy-MM-dd');
}

function money(value) {
  return Number(value || 0).toLocaleString('pt-BR', {
    style: 'currency',
    currency: AdsApp.currentAccount().getCurrencyCode()
  });
}

function validateConfig() {
  if (!/@/.test(CONFIG.EMAIL)) throw new Error('Configure CONFIG.EMAIL.');
  if (!(CONFIG.MONTHLY_BUDGET > 0)) throw new Error('MONTHLY_BUDGET precisa ser maior que zero.');
}

Como configurar

  1. Troque EMAIL.
  2. Informe o orçamento em MONTHLY_BUDGET.
  3. Ajuste o percentual de alerta conforme sua tolerância.
  4. Rode em Visualizar e compare o gasto com a interface.
  5. Agende diariamente somente depois da conferência.

O que não fazer com esse alerta

Não use a projeção isoladamente para reduzir ou aumentar verba. O ritmo pode mudar por sazonalidade, mudança de CPC, volume de busca, atraso de conversão ou decisão comercial. O alerta deve abrir uma investigação, não executar a decisão.

Como interpretar três cenários

SituaçãoLeitura inicialPróxima checagem
Projeção acima da verbaRitmo aceleradoCampanhas, CPC, demanda e limites.
Projeção muito abaixoSubinvestimentoImpressões perdidas, demanda, reprovações e estratégia.
Gasto normal e vendas fracasProblema pode não ser orçamentoConversões, página, CRM e qualidade do lead.

Fontes oficiais