Contas a correr pelo menos 5 Google Ads Scripts gastam 18 a 26% menos orçamento desperdiçado — search terms parasitas, 404s não detetados, licitações inconsistentes. Contudo, apenas 12-18% das PMEs em França os usam em 2026. O fosso é o maior ROI de automação disponível, por algumas horas de instalação.
Os Google Ads Scripts continuam, em 2026, a ser uma das funcionalidades da plataforma mais subaproveitadas. Nas nossas contas auditadas em 2025, apenas 12-18% das PMEs francesas usam ativamente Google Ads Scripts (per source), enquanto cerca de uma dezena de scripts bem desenhados poupam 10 a 15 horas por semana às ops. O ticket de entrada é, no entanto, minúsculo: JavaScript de nível principiante, execução gratuita alojada pela Google, zero infra para manter.
Este guia lista os 10 scripts mais rentáveis para instalar de imediato, com para cada um o snippet de código-chave, o schedule cron recomendado, o ganho médio de tempo e o caso de uso adequado. Não é um copy-paste completo — para isso, a documentação oficial Google Ads Scripts permanece a referência. Aqui, focamos no o quê e no porquê, com os snippets que matam. Para uma visão mais larga sobre pilotar sem agência, lê também o nosso guia Pilotar Google Ads sem agência.
O que pode (e não pode) fazer um Google Ads Script?
Google Ads Scripts é JavaScript alojado e executado pela Google na sua infraestrutura, com acesso nativo aos objetos da conta Google Ads via API wrapped. Sem servidor Node para manter, sem chave OAuth para gerir, sem cron externo para alugar. Escreves uma função main(), colas o código na interface Scripts da conta, autorizas as permissões necessárias, e a Google executa-o por ti — em modo preview (dry-run) ou em schedule cron (hourly, daily, weekly). É gratuito, e corre nos servidores da Google.
Casos de uso onde Scripts brilha: monitoring (alertas de gasto, anomalias, 404s), automação ligeira (adicionar negativas, pausar keywords low-CVR), reporting custom (digest semanal por email, exportação para Sheets), auditorias agendadas (extensões em falta, tracking partido, QS a cair). Qualquer tarefa de ops repetitiva e bounded — ler stats, tomar uma decisão simples, enviar um alerta ou modificar uma entidade — é um candidato ideal.
Casos onde Scripts é inadequado: análise estatística profunda (sem libs científicas como numpy), dependências npm de terceiros (impossíveis de instalar), pilotagem em tempo real abaixo do segundo (mínimo 1 execução por hora), workflows que excedam 30 minutos (timeout duro). Para esses casos, passa para o backend Google Ads API (Python, Go) ou para uma SaaS de pilotagem que cobre infra de monitoring + alertas + ações sem código.
nas contas que observamos, contas com 5+ scripts ativos gastam em média 18-26% menos em orçamento desperdiçado (per maturity) (search terms parasitas, licitações inconsistentes, 404s não detetados) que contas sem automação. O ROI de um investimento de 2-3 horas para instalar o stack abaixo mede-se em semanas, não em meses.
Limites técnicos a reter: timeout de 30 minutos por execução, quota diária da API em mutações em bulk, frequência mínima de 1 execução por hora, sem package npm (tudo tem de ser ES5+ JavaScript Rhino-compatible puro), e sintaxe ligeiramente proprietária nos objetos AdsApp. Nada bloqueador para os 10 scripts abaixo, mas tem em mente se desenhares um script à medida que tenha de processar um catálogo grande. Para workflows que excedam estes limites, a Google Ads API oficial (Python, Java, Go) continua a ser o backend de fallback.
Total estimado: 10 a 15 horas por semana poupadas se os 10 scripts correrem em paralelo, numa conta média (3-8 campanhas ativas). É o equivalente a um terço de um ops júnior a tempo inteiro — por 3 horas de instalação inicial.
Como detetar automaticamente uma anomalia de gasto?
O script que deteta em menos de uma hora um pico anormal de gasto — fuga de orçamento, bug de licitação, ataque de bot, ou simplesmente uma sazonalidade mal antecipada. Comparamos o gasto horário atual com a média rolante dos últimos 7 dias, disparamos o alerta se exceder um limiar (aqui 1,5× a média). Versão mais fina: calcular o desvio-padrão, alertar acima de 2σ.
Caso de uso: qualquer conta com orçamento diário > €100. Crítico para e-commerce em pico sazonal e para SaaS onde um erro de feed pode arrasar o orçamento em 4 horas.
function main() {
var today = AdsApp.currentAccount().getStatsFor("TODAY").getCost();
var avg7d = AdsApp.currentAccount().getStatsFor("LAST_7_DAYS").getCost() / 7;
if (today > avg7d * 1.5) {
MailApp.sendEmail(
"ops@example.com",
"[SPEND ALERT] Anomaly detected",
"Today: " + today.toFixed(2) + "€ vs 7d avg: " + avg7d.toFixed(2) + "€"
);
}
}
Schedule: hourly. Tempo poupado: cerca de 1 hora por semana (sem mais verificações manuais de dashboard todas as manhãs). Melhoria nível 2: substituir o limiar 1,5× por um cálculo real de desvio-padrão sobre 30 dias para evitar falsos positivos ligados a picos de fim de mês.
Como adicionar negativas automaticamente a partir de search terms?
O script que examina os search terms dos últimos 30 dias e adiciona automaticamente como negativas os que custam mais de €X com 0 conversões. Rentabilidade imediata: nas nossas auditorias, em média 8 a 15% do orçamento Search escapa para queries fora de scope. O script não substitui a revisão manual semanal — captura os piores ofensores imediatamente.
Caso de uso: contas Search com broad match ou phrase match ativos, catálogo diversificado. Menos útil se correres 100% exact match bloqueado.
function main() {
var report = AdsApp.report(
"SELECT search_term_view.search_term, metrics.cost_micros, metrics.conversions " +
"FROM search_term_view WHERE segments.date DURING LAST_30_DAYS " +
"AND metrics.cost_micros > 20000000 AND metrics.conversions = 0"
);
var rows = report.rows();
var campaign = AdsApp.campaigns().withIds(["123456789"]).get().next();
while (rows.hasNext()) {
var r = rows.next();
campaign.createNegativeKeyword('[' + r["search_term_view.search_term"] + ']');
}
}
Schedule: daily. Tempo poupado: cerca de 2 horas por semana (sem mais caça manual a search terms parasitas). Guardrail indispensável: loga a lista de negativas adicionadas em cada execução, e envolve createNegativeKeyword em try/catch — um bug aqui pode negativar queries convertedoras se inverteres um operador.
Script 3 · Alerta de decay do Quality Score
O script que exporta diariamente o Quality Score das tuas top keywords para um Google Sheet, compara com a pontuação da semana anterior, e alerta se uma keyword cair mais de 1 ponto. Essencial para reagir antes que o CPC explode — um QS a passar de 8 para 6 aumenta o CPC médio em 40 a 60%. Para aprofundar a mecânica do Quality Score, vê o nosso checklist de auditoria Google Ads.
Caso de uso: contas Search maduras com 50+ keywords ativas. Permite identificar rapidamente uma landing page a degradar-se ou um anúncio a perder relevância.
function main() {
var sheet = SpreadsheetApp.openByUrl("https://docs.google.com/spreadsheets/d/XXX").getActiveSheet();
var keywords = AdsApp.keywords()
.withCondition("Status = ENABLED")
.withCondition("Impressions > 100")
.forDateRange("LAST_7_DAYS").get();
while (keywords.hasNext()) {
var kw = keywords.next();
sheet.appendRow([new Date(), kw.getText(), kw.getQualityScore()]);
// Comparar vs valor D-7 aqui, alertar se queda > 1 pt
}
}
Schedule: daily. Tempo poupado: cerca de 45 minutos por semana, mas sobretudo prevenção de perdas de orçamento: reagir em 24h num QS a cair evita 2 semanas a pagar CPC inflacionado.
Como monitorizar o budget pacing ao longo do ano?
O script que compara o gasto cumulativo do mês com o orçamento teórico em prorata (dia atual ÷ dias do mês × orçamento mensal) e dispara um alerta se o delta exceder ±15%. Underspend = campanhas estranguladas por licitações demasiado baixas ou orçamento diário mal dimensionado; overspend = pacing agressivo que vai queimar o orçamento a meio do mês. Ambos os cenários custam caro. Vê também o nosso guia dedicado sobre budget pacing Google Ads.
Caso de uso: todas as contas com orçamento mensal fixo (agências com clientes em retainer mensal, departamentos de marketing internos com envelope limitado).
function main() {
var MONTHLY_BUDGET = 10000; // € — a configurar
var now = new Date();
var dayOfMonth = now.getDate();
var daysInMonth = new Date(now.getFullYear(), now.getMonth() + 1, 0).getDate();
var expected = MONTHLY_BUDGET * (dayOfMonth / daysInMonth);
var actual = AdsApp.currentAccount().getStatsFor("THIS_MONTH").getCost();
var delta = (actual - expected) / expected;
if (Math.abs(delta) > 0.15) {
MailApp.sendEmail("ops@example.com", "[PACING] Delta " + (delta * 100).toFixed(0) + "%",
"Spent: " + actual + "€ vs expected: " + expected.toFixed(0) + "€");
}
}
Schedule: daily (fim do dia). Tempo poupado: cerca de 1h30 por semana, mais a segurança de evitar uma derrapagem orçamental anual embaraçosa do lado financeiro.
Script 5 · Detetor de fadiga de copy (CTR a cair)
O script que deteta anúncios cujo CTR dos últimos 7 dias cai mais de 25% vs o CTR dos últimos 30 dias. Sintoma clássico de fadiga criativa: a tua audiência viu o anúncio demasiadas vezes, faz scroll sem clicar. Reação: refresca a copy, testa um novo headline, roda assets RSA.
Caso de uso: contas a escalar orçamento, retargeting Display, campanhas always-on na mesma audiência. Pouco útil em aquisição fria ultradiversificada.
function main() {
var ads = AdsApp.ads().withCondition("Status = ENABLED").get();
while (ads.hasNext()) {
var ad = ads.next();
var ctr7 = ad.getStatsFor("LAST_7_DAYS").getCtr();
var ctr30 = ad.getStatsFor("LAST_30_DAYS").getCtr();
if (ctr30 > 0 && ctr7 < ctr30 * 0.75) {
Logger.log("FATIGUE: ad " + ad.getId() + " | 7d=" + ctr7 + " | 30d=" + ctr30);
// Opcional: marcar o anúncio com label "to-refresh"
}
}
}
Schedule: weekly. Tempo poupado: cerca de 1 hora por semana em revisão manual de stats de anúncios, e sobretudo deteção precoce que evita 2-3 semanas de CTR baixo.
Script 6 · Anomalia de licitação concorrente (top IS perdido)
O script que monitoriza o teu Impression Share (top e absolute top) nas tuas campanhas core e alerta se perderes mais de 10 pontos em 24h. Sinal típico: um concorrente acabou de subir as suas licitações, ou um novo entrante tomou posição. Reação rápida possível: ajustar o teu Target CPA, empurrar um asset diferenciador, ativar uma sitelink competitiva.
Caso de uso: verticais competitivas (seguros, saúde, B2B SaaS, e-commerce de moda). Menos crítico em nichos de baixa concorrência.
function main() {
var campaigns = AdsApp.campaigns().withCondition("Status = ENABLED").get();
while (campaigns.hasNext()) {
var c = campaigns.next();
var statsYd = c.getStatsFor("YESTERDAY");
var stats7d = c.getStatsFor("LAST_7_DAYS");
var isYd = statsYd.getSearchImpressionShare();
var is7d = stats7d.getSearchImpressionShare();
if (is7d > 0 && (is7d - isYd) > 0.10) {
MailApp.sendEmail("ops@example.com", "[IS DROP] " + c.getName(),
"IS dropped from " + (is7d * 100).toFixed(0) + "% to " + (isYd * 100).toFixed(0) + "%");
}
}
}
Schedule: daily. Tempo poupado: cerca de 1 hora por semana de monitoring concorrencial ativo, substituído por um alerta passivo.
Como detetar landing pages 404 nos teus anúncios?
O script que faz HTTP GET em cada final URL de anúncios ativos, verifica o status code, e alerta imediatamente se um URL retornar 404, 500 ou um redirect partido. Pagar para enviar tráfego para uma página partida é o erro mais humilhante de uma campanha. Na prática, 3% das contas auditadas têm pelo menos um URL 404 permanentemente ativo, muitas vezes após uma redesign ou mudança de CMS.
Caso de uso: e-commerce com rotação de produtos (esgotamentos, fim de coleção), sites recentemente migrados, multi-sites com URLs dinâmicos.
function main() {
var ads = AdsApp.ads().withCondition("Status = ENABLED").get();
var broken = [];
while (ads.hasNext()) {
var ad = ads.next();
var url = ad.urls().getFinalUrl();
if (!url) continue;
try {
var resp = UrlFetchApp.fetch(url, { muteHttpExceptions: true, followRedirects: false });
if (resp.getResponseCode() >= 400) broken.push(url + " → " + resp.getResponseCode());
} catch (e) { broken.push(url + " → FETCH ERROR"); }
}
if (broken.length) MailApp.sendEmail("ops@example.com", "[404] Broken landing pages", broken.join("\n"));
}
Schedule: hourly se for e-commerce, daily caso contrário. Tempo poupado: cerca de 2 horas por semana, mais a poupança direta no orçamento gasto numa página partida (que pode atingir várias centenas de euros num dia).
Script 8 · Drift do conversion tracking (taxa em queda)
O script que calcula a taxa de conversão das últimas 24 horas vs a média de 14 dias, e alerta se a taxa cair mais de 40% sem explicação por volume. Sintoma principal: tracking partido — tag GTM que já não dispara, consent mode mal configurado, GA4 desligado. O pesadelo absoluto quando o Smart Bidding perde o sinal de conversão. Para a re-auditoria completa de tracking, vê o nosso guia de conversion tracking.
Caso de uso: todas as contas com Smart Bidding ativo. Crítico sempre que se planeia uma redesign técnica no site.
function main() {
var acct = AdsApp.currentAccount();
var clicks1 = acct.getStatsFor("YESTERDAY").getClicks();
var conv1 = acct.getStatsFor("YESTERDAY").getConversions();
var clicks14 = acct.getStatsFor("LAST_14_DAYS").getClicks();
var conv14 = acct.getStatsFor("LAST_14_DAYS").getConversions();
if (clicks1 === 0 || clicks14 === 0) return;
var rate1 = conv1 / clicks1;
var rate14 = conv14 / clicks14;
if (rate14 > 0 && rate1 < rate14 * 0.6) {
MailApp.sendEmail("ops@example.com", "[TRACKING] Conversion drift",
"CVR 24h=" + (rate1 * 100).toFixed(2) + "% vs 14d=" + (rate14 * 100).toFixed(2) + "%");
}
}
Schedule: daily. Tempo poupado: cerca de 1 hora por semana, mas sobretudo a enorme poupança de um Smart Bidding a desviar-se durante 7 dias antes da deteção manual.
Script 9 · Auditoria de extensões (sitelinks em falta)
O script que lista todas as campanhas Search ativas e verifica a presença das extensões-chave: sitelinks (mínimo 4), callouts (mínimo 4), structured snippets, business info. Alerta se uma campanha não tiver extensões ou tiver menos do que o mínimo. As extensões aumentam o CTR em 10 a 15% em média — esquecê-las é puro desperdício. Documentação em Google Ads support sobre extensões.
Caso de uso: MCCs de agência com 20+ contas a supervisionar, ou equipas de marketing que lançam regularmente novas campanhas sem processo rigoroso.
function main() {
var missing = [];
var campaigns = AdsApp.campaigns().withCondition("Status = ENABLED").get();
while (campaigns.hasNext()) {
var c = campaigns.next();
var sitelinks = c.extensions().sitelinks().get().totalNumEntities();
var callouts = c.extensions().callouts().get().totalNumEntities();
if (sitelinks < 4 || callouts < 4) {
missing.push(c.getName() + " → sitelinks=" + sitelinks + ", callouts=" + callouts);
}
}
if (missing.length) MailApp.sendEmail("ops@example.com", "[EXT] Missing extensions", missing.join("\n"));
}
Schedule: weekly. Tempo poupado: cerca de 30 minutos por semana de auditoria manual substituída, mas sobretudo cobertura sistemática garantindo que nenhuma campanha nova fica sem extensões.
Script 10 · Email digest de performance semanal
O script que agrega cada segunda-feira de manhã as métricas-chave da semana passada (gasto, cliques, conversões, CTR, CPA, ROAS) e envia um email HTML resumido aos stakeholders. Fim dos 45 minutos cada segunda a montar o PowerPoint semanal. Bónus: adiciona a variação semana-sobre-semana, destaca campanhas top/flop, top 3 search terms convertedores.
Caso de uso: todas as estruturas com reporting semanal recorrente (agência, in-house, freelancer). Substitui um deliverable manual de 30 a 60 minutos.
function main() {
var s = AdsApp.currentAccount().getStatsFor("LAST_7_DAYS");
var prev = AdsApp.currentAccount().getStatsFor("LAST_14_DAYS");
var html = "<h2 data-speakable>Weekly digest</h2>" +
"<p>Spend: " + s.getCost().toFixed(0) + "€</p>" +
"<p>Conv: " + s.getConversions() + "</p>" +
"<p>CPA: " + (s.getCost() / Math.max(s.getConversions(), 1)).toFixed(2) + "€</p>" +
"<p>CTR: " + (s.getCtr() * 100).toFixed(2) + "%</p>";
MailApp.sendEmail({
to: "team@example.com",
subject: "[Weekly digest] Google Ads — week " + new Date().toLocaleDateString(),
htmlBody: html
});
}
Schedule: weekly, segunda-feira 8h. Tempo poupado: cerca de 1h30 por semana, e regularidade garantida (sem mais digests esquecidos em semanas atarefadas).
um Google Ads Script sem error handling pode despoletar uma ação massiva em caso de bug da API — imagina 500 negativas em broad acrescentadas em toda a tua estrutura porque a linha 12 retornou undefined. Regra absoluta: qualquer mutação de entidade (add, set, pause, remove) deve ser envolvida em try/catch com notificação de erro e um teto de modificação de entidades por execução (ex: máximo 50 negativas adicionadas/execução).
Estes 10 scripts cobrem 90% das necessidades de automação clássicas. Se quiseres uma camada de monitoring mais rica (deteção estatística de anomalias multicritério, alertas Slack/webhook, historização profunda, dashboards multi-conta), a maioria destes scripts está já incorporada no SteerAds — o nosso módulo Monitoring corre 24/7 sem teres de manter código, Auto-otimização acrescenta as ações automáticas (negativas, pacing, redistribuição de orçamento), e a nossa auditoria gratuita aponta em 72h os scripts a instalar prioritariamente na tua conta. Para escalar de forma mais estrutural, segue com o nosso guia completo Performance Max.
Fontes
Fontes oficiais consultadas para este guia:
FAQ
É preciso saber programar para usar Google Ads Scripts?
JavaScript básico chega para instalar e adaptar os scripts que disponibilizamos. Os objetos AdsApp.* estão bem documentados, o compilador embutido na interface Google Ads sinaliza erros antes da execução, e a maioria dos scripts úteis cabe em 40 a 120 linhas. Tens de saber ler uma função, perceber um for loop e manipular objetos JSON — nada mais. Para equipas não técnicas, copy-paste cauteloso a partir do nosso repo e 2-3 testes em preview (sem execução real) permitem instalar um script de monitoring em menos de 15 minutos. Para desenvolver um script à medida com lógica de negócio complexa, um developer júnior continua a ser preferível.
Os Google Ads Scripts são seguros?
Sim, do lado da execução — a Google corre-os na sua própria infraestrutura sandboxed, não tens servidor para manter nem credenciais para alojar. Risco principal do lado do código: um script com bug que altera massivamente a conta (ex: pausa todas as campanhas, muda todas as licitações) sem error handling. Testa sempre em modo preview antes de fazer schedule, envolve operações de escrita em try/catch com notificação de erro, e adiciona guardrails (ex: limita o número de entidades modificadas por execução). No nosso benchmark interno SteerAds, 14% dos incidentes Google Ads maiores encontrados em clientes de auditoria estão ligados a um script sem guardrails.
Quantos scripts se podem correr numa conta Google Ads?
Ao nível de conta individual, a Google permite até 250 scripts ativos, mas vais bater no teto da utilidade muito antes — cerca de uma dezena de scripts bem desenhados cobrem 90% das necessidades de automação. As quotas reais que te bloquearão primeiro são: máximo de 30 minutos de execução por script, limite diário de operações da API (mutações em bulk), e frequência máxima de 1 execução por hora para scripts horários. Uma MCC (manager account) pode executar um script que itera por dezenas de contas-filhas numa única execução, o que muda o jogo para agências. Começa pequeno, mede o impacto, depois escala.
Scripts vs ferramenta SaaS (como SteerAds): qual escolher?
As duas são complementares. Os scripts brilham em ações pontuais e hipercustomizadas onde já tens uma lógica de negócio precisa para codificar — uma SaaS nunca vai reproduzir a tua regra de exclusão interna. Uma SaaS como o SteerAds cobre a infraestrutura genérica (monitoring 24/7, alertas multicanal, deteção estatística de anomalias, auditorias automáticas, dashboards multi-conta, historização profunda) sem te exigir manutenção de código. No nosso benchmark interno SteerAds, contas que combinam 2-3 scripts custom de negócio + uma SaaS de pilotagem poupam 10 a 15h/semana, vs 4-5h para as que têm apenas scripts. A pergunta não é 'qual', mas 'onde colocar o cursor'.