Gli account che eseguono almeno 5 Google Ads Scripts spendono dal 18 al 26% in meno di budget sprecato — termini di ricerca parassiti, 404 non rilevate, offerte incoerenti. Eppure solo il 12-18% delle PMI in Francia li usa nel 2026. Il gap è il maggior ROI di automazione disponibile, per qualche ora di installazione.
Google Ads Scripts resta nel 2026 una delle funzionalità della piattaforma più sotto-sfruttate. Sugli account auditati nel 2025, solo il 12-18% delle PMI francesi usa attivamente i Google Ads Scripts (secondo fonte), mentre una decina di script ben progettati fa risparmiare 10-15 ore a settimana agli ops. Il ticket d'ingresso è tuttavia minuscolo: JavaScript a livello principiante, esecuzione gratuita ospitata da Google, zero infra da mantenere.
Questa guida elenca i 10 script più profittevoli da installare immediatamente, con per ciascuno lo snippet di codice chiave, la cadenza cron raccomandata, il guadagno di tempo medio e il caso d'uso adatto. Non è un copia-incolla completo — per quello, la documentazione ufficiale Google Ads Scripts resta il riferimento. Qui ci concentriamo sul cosa e sul perché, con gli snippet che fanno la differenza. Per una panoramica più ampia sul pilotaggio senza agenzia, leggi anche la nostra guida al pilotaggio di Google Ads senza agenzia.
Cosa può fare (e non fare) un Google Ads Script?
Google Ads Scripts è JavaScript ospitato ed eseguito da Google sulla loro infrastruttura, con accesso nativo agli oggetti dell'account Google Ads tramite un'API incapsulata. Nessun server Node da mantenere, nessuna chiave OAuth da gestire, nessun cron esterno da affittare. Scrivi una funzione main(), incolli il codice nell'interfaccia Scripts dell'account, autorizzi i permessi richiesti, e Google lo esegue per te — in modalità preview (dry-run) o su cron schedule (oraria, giornaliera, settimanale). È gratuito, e gira sui server di Google.
Casi d'uso in cui Scripts brilla: monitoraggio (alert di spesa, anomalie, 404), automazione leggera (aggiunta di negative, pausa di keyword a basso CVR), reporting custom (digest settimanale via email, export Sheets), audit pianificati (estensioni mancanti, tracking rotto, QS in calo). Qualsiasi task ops ripetitivo e delimitato — leggere statistiche, prendere una decisione semplice, inviare un alert o modificare un'entità — è un candidato ideale.
Casi in cui Scripts è inadeguato: analisi statistica approfondita (nessuna libreria scientifica come numpy), dipendenze npm di terze parti (impossibili da installare), pilotaggio in tempo reale sub-secondo (minimo 1 esecuzione all'ora), workflow che superano i 30 minuti (timeout rigido). Per questi casi, passa al backend Google Ads API (Python, Go) o a un SaaS di pilotaggio che copre monitoring + alert + infra di azioni senza codice.
sugli account che osserviamo, gli account con 5+ script attivi spendono in media il 18-26% in meno di budget sprecato (per maturità ) (termini di ricerca parassiti, offerte incoerenti, 404 non rilevate) rispetto agli account senza automazione. Il ROI di un investimento di 2-3 ore per installare lo stack qui sotto si misura in settimane, non in mesi.
Limiti tecnici da ricordare: timeout di 30 minuti per esecuzione, quota API giornaliera su bulk mutation, frequenza minima di 1 esecuzione all'ora, nessun pacchetto npm (tutto deve essere puro ES5+ JavaScript compatibile Rhino), e sintassi leggermente proprietaria sugli oggetti AdsApp. Niente di bloccante per i 10 script qui sotto, ma tieni a mente se progetti uno script custom che deve processare un grande catalogo. Per workflow che superano questi limiti, la Google Ads API ufficiale (Python, Java, Go) resta il fallback di backend.
Totale stimato: da 10 a 15 ore a settimana risparmiate se i 10 script girano in parallelo, su un account medio (3-8 campagne attive). È l'equivalente di un terzo di un full-time junior ops — per 3 ore di installazione iniziale.
Come rilevare automaticamente un'anomalia di spesa?
Lo script che rileva in meno di un'ora un picco di spesa anomalo — budget leak, bug di bidding, attacco bot, o semplicemente uno scostamento di stagionalità mal anticipato. Confrontiamo la spesa oraria corrente con la media mobile a 7 giorni, facciamo scattare l'alert se supera una soglia (qui 1,5× la media). Versione più fine: calcolare la deviazione standard, allertare oltre 2σ.
Caso d'uso: qualsiasi account con budget giornaliero > 100€. Critico per e-commerce a picchi stagionali e per SaaS dove un errore di feed può distruggere il budget in 4 ore.
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) + "€"
);
}
}
Cadenza: oraria. Tempo risparmiato: circa 1 ora a settimana (basta controlli manuali alla dashboard ogni mattina). Miglioramento di livello 2: sostituire la soglia 1,5× con un vero calcolo di deviazione standard su 30 giorni per evitare falsi positivi legati a picchi di fine mese.
Come aggiungere automaticamente negative dai termini di ricerca?
Lo script che scansiona i termini di ricerca degli ultimi 30 giorni e aggiunge automaticamente come negative quelli che costano più di X€ con 0 conversioni. Profittabilità immediata: nei nostri audit, è in media dall'8 al 15% del budget Search che fugge su query fuori scope. Lo script non sostituisce la revisione manuale settimanale — cattura subito i peggiori colpevoli.
Caso d'uso: account Search con broad match o phrase match attivi, catalogo diversificato. Meno utile se esegui 100% exact match blindato.
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"] + ']');
}
}
Cadenza: giornaliera. Tempo risparmiato: circa 2 ore a settimana (basta caccia manuale ai termini di ricerca parassiti). Guardrail indispensabile: loggare l'elenco delle negative aggiunte ad ogni esecuzione, e racchiudere createNegativeKeyword in un try/catch — un bug qui può negative query convertite se inverti un operatore.
Script 3 · Alert di decadimento del Quality Score
Lo script che esporta quotidianamente il Quality Score delle tue top keyword in un Google Sheet, lo confronta con il punteggio della settimana precedente, e allerta se una keyword cala di più di 1 punto. Essenziale per reagire prima che il CPC esploda — un QS che passa da 8 a 6 aumenta il CPC medio del 40-60%. Per approfondire le meccaniche del Quality Score, consulta la nostra checklist di audit Google Ads.
Caso d'uso: account Search maturi con 50+ keyword attive. Permette di identificare rapidamente una landing page in degrado o un annuncio che perde pertinenza.
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()]);
// Compare vs the D-7 value here, alert if drop > 1 pt
}
}
Cadenza: giornaliera. Tempo risparmiato: circa 45 minuti a settimana, ma soprattutto prevenzione delle perdite di budget: reagire in 24h su un QS in calo evita 2 settimane di CPC gonfiato.
Come monitorare il budget pacing tutto l'anno?
Lo script che confronta la spesa cumulativa del mese con il budget teorico prorata (giorno corrente ÷ giorni del mese × budget mensile) e fa scattare un alert se il delta supera ±15%. Underspend = campagne strozzate da offerte troppo basse o budget giornaliero mal dimensionato; overspend = pacing aggressivo che brucerà il budget a metà mese. Entrambi gli scenari costano caro. Consulta anche la nostra guida dedicata al budget pacing su Google Ads.
Caso d'uso: tutti gli account con budget mensile fisso (agenzie con clienti a retainer mensile, dipartimenti marketing interni con budget capped).
function main() {
var MONTHLY_BUDGET = 10000; // € — to configure
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) + "€");
}
}
Cadenza: giornaliera (fine giornata). Tempo risparmiato: circa 1h30 a settimana, più la sicurezza di evitare un imbarazzante sforamento di budget annuale lato finanza.
Script 5 · Rilevatore di ad copy fatigue (CTR in calo)
Lo script che rileva gli annunci il cui CTR negli ultimi 7 giorni cala di più del 25% vs il CTR degli ultimi 30 giorni. Sintomo classico di fatigue creativa: la tua audience ha visto l'annuncio troppe volte, scorrono senza cliccare. Reazione: rinfresca la copy, testa un nuovo titolo, ruota gli asset RSA.
Caso d'uso: account in scaling del budget, retargeting Display, campagne always-on sulla stessa audience. Non utile su acquisizione fredda ultra-diversificata.
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);
// Optional: label the ad "to-refresh"
}
}
}
Cadenza: settimanale. Tempo risparmiato: circa 1 ora a settimana sulla revisione manuale delle stats degli annunci, e soprattutto un rilevamento anticipato che evita 2-3 settimane di CTR basso.
Script 6 · Anomalia di offerte concorrenti (IS top calato)
Lo script che monitora la tua Impression Share (top e absolute top) sulle tue campagne core e allerta se perdi più di 10 punti in 24h. Segnale tipico: un concorrente ha appena aumentato le offerte, o un nuovo entrante ha preso posizione. Reazione rapida possibile: regola il tuo Target CPA, pusha un asset differenziante, attiva un sitelink competitivo.
Caso d'uso: settori competitivi (assicurazioni, mutue sanitarie, B2B SaaS, fashion e-commerce). Meno critico nelle nicchie a bassa concorrenza.
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) + "%");
}
}
}
Cadenza: giornaliera. Tempo risparmiato: circa 1 ora a settimana di monitoraggio attivo della concorrenza, sostituito da un alert passivo.
Come rilevare landing page 404 nei tuoi annunci?
Lo script che effettua HTTP GET su ogni URL finale degli annunci attivi, verifica il codice di stato, e allerta immediatamente se un URL restituisce 404, 500 o un redirect rotto. Pagare per inviare traffico a una pagina rotta è l'errore più umiliante di una campagna. In pratica, il 3% degli account auditati ha almeno un URL 404 attivo in modo permanente, spesso dopo un redesign o un cambio di CMS.
Caso d'uso: e-commerce con rotazione di prodotti (stock-out, fine collezione), siti recentemente migrati, multi-siti con URL dinamiche.
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"));
}
Cadenza: oraria se e-commerce, giornaliera altrimenti. Tempo risparmiato: circa 2 ore a settimana, più il risparmio diretto sul budget speso su una pagina rotta (che può raggiungere centinaia di euro in un giorno).
Script 8 · Deriva del conversion tracking (tasso in calo)
Lo script che calcola il tasso di conversione delle ultime 24 ore vs la media di 14 giorni, e allerta se il tasso cala di più del 40% senza spiegazione di volume. Sintomo principale: tracking rotto — tag GTM che non si attiva più, consent mode mal configurato, GA4 disconnesso. L'incubo assoluto quando Smart Bidding perde il suo segnale di conversione. Per il re-audit completo del tracking, consulta la nostra guida al conversion tracking.
Caso d'uso: tutti gli account con Smart Bidding attivo. Critico ogni volta che è previsto un redesign tecnico sul sito.
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) + "%");
}
}
Cadenza: giornaliera. Tempo risparmiato: circa 1 ora a settimana, ma soprattutto il risparmio enorme di uno Smart Bidding che va in tilt per 7 giorni prima del rilevamento manuale.
Script 9 · Audit delle estensioni (sitelink mancanti)
Lo script che elenca tutte le campagne Search attive e verifica la presenza delle estensioni chiave: sitelink (minimo 4), callout (minimo 4), snippet strutturati, informazioni aziendali. Allerta se una campagna non ha estensioni o ne ha meno del minimo. Le estensioni aumentano il CTR del 10-15% in media — dimenticarle è puro spreco. Documentazione su il supporto Google Ads sulle estensioni.
Caso d'uso: MCC di agenzia con 20+ account da supervisionare, o team marketing che lancia regolarmente nuove campagne senza 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"));
}
Cadenza: settimanale. Tempo risparmiato: circa 30 minuti a settimana di audit manuale sostituito, ma soprattutto una copertura sistematica che garantisce che nessuna nuova campagna resti senza estensioni.
Script 10 · Email digest di performance settimanale
Lo script che aggrega ogni lunedì mattina le metriche chiave della settimana trascorsa (spesa, click, conversioni, CTR, CPA, ROAS) e invia un'email HTML riassuntiva agli stakeholder. Basta i 45 minuti ogni lunedì a costruire il PowerPoint settimanale. Bonus: aggiungi la variazione settimana su settimana, evidenzia le campagne top/flop, i top 3 termini di ricerca convertitori.
Caso d'uso: tutte le strutture con un reporting settimanale ricorrente (agenzia, in-house, freelance). Sostituisce un deliverable manuale di 30-60 minuti.
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
});
}
Cadenza: settimanale, lunedì alle 8. Tempo risparmiato: circa 1h30 a settimana, e regolarità garantita (basta digest dimenticati nelle settimane frenetiche).
un Google Ads Script senza gestione degli errori può scatenare un'azione massiva in caso di bug API — immagina 500 broad negative aggiunte su tutta la tua struttura perché la riga 12 ha restituito undefined. Regola assoluta: qualsiasi mutazione di entità (add, set, pause, remove) deve essere racchiusa in un try/catch con notifica di errore e un cap di modifiche di entità per esecuzione (es. max 50 negative aggiunte/esecuzione).
Questi 10 script coprono il 90% dei bisogni di automazione classici. Se vuoi un layer di monitoraggio più ricco (rilevamento di anomalie statistiche multi-criterio, alert Slack/webhook, storicizzazione profonda, dashboard multi-account), la maggior parte di questi script è già integrata in SteerAds — il nostro modulo Monitoring gira 24/7 senza che tu debba mantenere codice, Auto-optimization aggiunge le azioni automatiche (negative, pacing, redistrib budget), e il nostro audit gratuito segnala in 72h gli script da installare in priorità sul tuo account. Per uno scaling più strutturale, prosegui con la nostra guida completa a Performance Max.
Fonti
Fonti ufficiali consultate per questa guida:
FAQ
Bisogna saper programmare per usare i Google Ads Scripts?
Un JavaScript di base è sufficiente per installare e adattare gli script che forniamo. Gli oggetti AdsApp.* sono ben documentati, il compilatore integrato nell'interfaccia Google Ads fa emergere gli errori prima dell'esecuzione, e la maggior parte degli script utili sta in 40-120 righe. Devi saper leggere una funzione, capire un ciclo for, e manipolare oggetti JSON — niente di più. Per team non tecnici, un copia-incolla prudente dal nostro repo e 2-3 test in preview (senza esecuzione reale) ti permettono di installare uno script di monitoraggio in meno di 15 minuti. Per sviluppare uno script custom con logica aziendale complessa, uno sviluppatore junior resta preferibile.
I Google Ads Scripts sono sicuri?
Sì, dal lato dell'esecuzione — Google li esegue sulla propria infrastruttura sandbox, non hai server da mantenere né credenziali da ospitare. Rischio principale lato codice: uno script con bug che altera massicciamente l'account (es. mette in pausa tutte le campagne, cambia tutte le offerte) senza gestione degli errori. Testa sempre in modalità preview prima di pianificare, racchiudi le operazioni di scrittura in try/catch con notifica di errore, e aggiungi guardrail (es. limita il numero di entità modificate per esecuzione). Sul nostro benchmark interno SteerAds, il 14% degli incidenti Google Ads maggiori incontrati dai clienti in audit sono legati a uno script senza guardrail.
Quanti script si possono eseguire su un account Google Ads?
A livello di account individuale, Google permette fino a 250 script attivi, ma raggiungerai il soffitto di utilità ben prima — una decina di script ben progettati coprono il 90% dei bisogni di automazione. Le quote reali che ti bloccheranno prima sono: 30 minuti di esecuzione massima per script, limite giornaliero di operazioni API (bulk mutation), e frequenza massima di 1 esecuzione all'ora per gli script orari. Un MCC (manager account) può eseguire uno script che itera su decine di account figli in una singola esecuzione, il che cambia le regole del gioco per le agenzie. Inizia piccolo, misura l'impatto, poi scala.
Script vs tool SaaS (come SteerAds): cosa scegliere?
I due sono complementari. Gli script brillano su azioni puntuali, iper-personalizzate dove hai già una logica aziendale precisa da codificare — un SaaS non riprodurrà mai la tua regola di esclusione interna. Un SaaS come SteerAds copre l'infrastruttura generica (monitoraggio 24/7, alert multi-canale, rilevamento di anomalie statistiche, audit automatici, dashboard multi-account, storicizzazione profonda) senza richiedere di mantenere codice. Sul nostro benchmark interno SteerAds, gli account che combinano 2-3 script custom business + un SaaS di pilotaggio risparmiano 10-15h/settimana, vs 4-5h per quelli con solo script. La domanda non è 'cosa', ma 'dove mettere il cursore'.