“Gastou e não converteu” parece um diagnóstico pronto, mas não é. A coluna de conversões pode estar atrasada, a ação primária pode estar errada, uma importação offline pode ainda não ter chegado ou a venda pode acontecer depois de vários dias. O papel do script é priorizar onde olhar primeiro.

Critério do alerta

Você define um período e um gasto mínimo. O script lista apenas campanhas ativas que atingiram esse investimento e continuam com zero conversões registradas.

Script completo

/**
 * CAMPANHAS COM GASTO E ZERO CONVERSÕES
 * Somente leitura: gera uma lista para revisão humana.
 */
const CONFIG = {
  EMAIL: 'seu-email@empresa.com.br',
  LOOKBACK_DAYS: 7,
  MIN_COST: 200,
  MAX_ROWS: 50
};

function main() {
  const account = AdsApp.currentAccount();
  const timezone = account.getTimeZone();
  const end = new Date();
  const start = new Date(end.getTime());
  start.setDate(start.getDate() - (CONFIG.LOOKBACK_DAYS - 1));
  const minCostMicros = Math.round(CONFIG.MIN_COST * 1e6);

  const query = `
    SELECT
      campaign.id,
      campaign.name,
      metrics.cost_micros,
      metrics.clicks,
      metrics.conversions
    FROM campaign
    WHERE segments.date BETWEEN '${formatDate(start, timezone)}'
      AND '${formatDate(end, timezone)}'
      AND campaign.status = 'ENABLED'
      AND metrics.cost_micros >= ${minCostMicros}
      AND metrics.conversions = 0
    ORDER BY metrics.cost_micros DESC
    LIMIT ${CONFIG.MAX_ROWS}
  `;

  const rows = AdsApp.search(query);
  const problems = [];
  while (rows.hasNext()) {
    const row = rows.next();
    problems.push({
      id: row.campaign.id,
      name: row.campaign.name,
      cost: Number(row.metrics.costMicros || 0) / 1e6,
      clicks: Number(row.metrics.clicks || 0)
    });
  }

  if (!problems.length) {
    Logger.log('Nenhuma campanha atingiu o limite com zero conversões.');
    return;
  }

  const body = problems.map((item, i) =>
    `${i + 1}. ${item.name} [${item.id}] - ${money(item.cost)} - ${item.clicks} cliques`
  ).join('\n');

  Logger.log(body);
  if (!AdsApp.getExecutionInfo().isPreview()) {
    MailApp.sendEmail(
      CONFIG.EMAIL,
      `[Google Ads] Gasto sem conversão - ${account.getName()}`,
      body + '\n\nAntes de pausar, valide tracking, atraso de conversão, CRM e objetivo primário.'
    );
  }
}

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()
  });
}

Antes de pausar uma campanha

Alerta não é recomendaçãoO script identifica uma condição. Ele não sabe margem, qualidade do lead, ciclo comercial ou o que aconteceu depois do formulário.

Quando o alerta é mais útil?

Em contas com muitas campanhas, o script reduz a dependência de uma revisão manual completa todo dia. Ele cria uma fila objetiva: quais campanhas merecem investigação agora.

Quando ajustar o gasto mínimo

O valor depende do ticket, CPC, taxa de conversão e volume. Um limite de R$ 200 pode ser irrelevante em uma conta e agressivo demais em outra. Comece com um valor que represente um volume minimamente analisável para sua operação.

Fontes oficiais