Les comptes qui font tourner au moins 5 Google Ads Scripts dépensent 18 à 26% de budget gaspillé en moins — search terms parasites, 404 non détectés, enchères incohérentes. Pourtant seuls 12-18% des SMB FR en utilisent en 2026. L'écart est le plus gros ROI d'automation disponible, pour quelques heures d'installation
Google Ads Scripts reste en 2026 l'une des fonctionnalités les plus sous-exploitées de la plateforme. Sur nos comptes audités en 2025, seuls 12-18% des SMB français utilisent activement des Google Ads Scripts (selon source), alors qu'une dizaine de scripts bien conçus font économiser 10 à 15 heures par semaine à l'ops. Le ticket d'entrée est pourtant minuscule : JavaScript niveau débutant, exécution gratuite hébergée par Google, zéro infra à maintenir Notre calculateur de gaspillage budget estime le € brûlé/mois par broad sans négatifs ou bounce LP excessif.
Ce guide liste les 10 scripts les plus rentables à installer tout de suite, avec pour chacun l'extrait de code clé, le schedule cron recommandé, le gain temps moyen et le cas d'usage adapté. Pas un copier-coller complet — pour cela, la documentation officielle Google Ads Scripts reste la référence. Ici, on se concentre sur le quoi et le pourquoi, avec les snippets qui tuent. Pour un panorama plus large du pilotage sans agence, lisez en parallèle notre guide Piloter Google Ads sans agence.
Qu'est-ce qu'un Google Ads Script peut faire (et pas faire) ?
Google Ads Scripts, c'est du JavaScript hébergé et exécuté par Google sur leur infrastructure, avec un accès natif aux objets du compte Google Ads via une API wrappée. Pas de serveur Node à maintenir, pas de clé OAuth à gérer, pas de cron externe à louer. Vous écrivez une fonction main(), vous collez le code dans l'interface Scripts du compte, vous autorisez les permissions requises, et Google l'exécute pour vous — en mode preview (dry-run) ou en schedule cron (hourly, daily, weekly). C'est gratuit, et ça tourne sur les serveurs de Google.
Cas d'usage où Scripts brille : monitoring (alertes spend, anomalies, 404), automation légère (ajout de négatifs, pause de keywords low CVR), reporting custom (digest hebdo par email, export Sheets), audit programmé (extensions manquantes, tracking cassé, QS en chute). Toute tâche ops répétitive et bornée — lire des stats, prendre une décision simple, envoyer une alerte ou modifier une entité — est candidate idéale.
Cas où Scripts est inadapté : analyse statistique profonde (pas de libs scientifiques type numpy), dépendances npm tierces (impossibles à installer), pilotage temps-réel sous la seconde (minimum 1 exécution par heure), workflows qui dépassent 30 minutes (timeout hard). Pour ces cas-là, passer à l'API Google Ads côté backend (Python, Go) ou à un SaaS de pilotage qui couvre l'infra monitoring + alertes + actions sans code.
sur les comptes observés dans les benchmarks publics, les comptes avec 5+ scripts actifs dépensent en moyenne 18-26% de moins en budget gaspillé (selon maturité) (search terms parasites, enchères incohérentes, 404 non détectés) que les comptes sans automation. Le ROI d'un investissement de 2 à 3 heures à installer la stack ci-dessous est mesuré en semaines, pas en mois.
Limites techniques à retenir : timeout 30 minutes par run, quota API quotidien sur les mutations bulk, fréquence d'1 exécution par heure minimum, pas de package npm (tout doit être en JavaScript pur ES5+ compatible Rhino), et une syntaxe légèrement propriétaire côté objets AdsApp. Rien de bloquant pour les 10 scripts ci-dessous, mais à garder en tête si vous concevez un script custom qui doit processer un gros catalogue. Pour les workflows qui dépassent ces limites, la Google Ads API officielle (Python, Java, Go) reste l'issue de secours côté backend.
Total cumulé estimé : 10 à 15 heures par semaine économisées si les 10 scripts tournent en parallèle, sur un compte moyen (3 à 8 campagnes actives). C'est l'équivalent d'un tiers de temps plein d'ops junior — pour 3 heures d'installation initiale.
Comment détecter une anomalie de spend automatiquement ?
Le script qui détecte en moins d'une heure un pic de dépense anormal — fuite budgétaire, bug de bidding, attaque de bots, ou simplement un changement de saisonnalité mal anticipé. On compare le spend horaire courant à la moyenne glissante sur 7 jours, on déclenche l'alerte si on dépasse un seuil (ici 1,5× la moyenne). Version plus fine : calculer l'écart-type, alerter à plus de 2σ.
Cas d'usage : tout compte avec budget quotidien > 100€. Critique pour les e-com en pic saisonnier et les SaaS où une erreur de feed peut ruiner le budget en 4 heures.
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] Anomalie détectée",
"Aujourd'hui: " + today.toFixed(2) + "€ vs moy 7j: " + avg7d.toFixed(2) + "€"
);
}
}
Schedule : hourly. Gain temps : environ 1 heure par semaine (fini les check manuels du dashboard chaque matin). Amélioration niveau 2 : remplacer le seuil 1,5× par un vrai calcul d'écart-type sur 30 jours, pour éviter les faux positifs liés aux pics de fin de mois.
Comment ajouter des négatifs automatiquement depuis les search terms ?
Le script qui scanne les search terms des 30 derniers jours et ajoute automatiquement en négatif ceux qui ont coûté plus de X€ avec 0 conversion. Rentabilité immédiate : sur nos audits, c'est en moyenne 8 à 15% du budget Search qui fuit vers des requêtes hors scope. Le script ne remplace pas la revue manuelle hebdomadaire — il capture les pires offenders tout de suite.
Cas d'usage : comptes Search avec broad match ou phrase match actif, catalogue diversifié. Moins utile si vous tournez 100% exact match bien cadenassé.
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. Gain temps : environ 2 heures par semaine (fini la chasse manuelle aux search terms parasites). Garde-fou indispensable : logguer la liste des négatifs ajoutés chaque run, et wrapper le createNegativeKeyword dans un try/catch — un bug ici peut négativer des requêtes converties si vous inversez un opérateur.
Script 3 · Quality Score decay alert
Le script qui exporte le Quality Score de vos keywords principaux tous les jours dans une Google Sheet, compare au score de la semaine précédente, et alerte si un keyword baisse de plus d'1 point. Essentiel pour réagir avant que le CPC n'explose — un QS qui passe de 8 à 6 augmente le CPC moyen de 40 à 60%. Pour creuser la mécanique du Quality Score, voir notre checklist d'audit Google Ads.
Cas d'usage : comptes Search matures avec 50+ keywords actifs. Permet d'identifier vite une landing page qui se dégrade ou une annonce qui perd sa pertinence.
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()]);
// Comparaison vs la valeur N-7 ici, alerte si chute > 1 pt
}
}
Schedule : daily. Gain temps : environ 45 minutes par semaine, mais surtout prévention de pertes budgétaires : réagir en 24h sur un QS qui chute évite 2 semaines à payer un CPC gonflé.
Comment surveiller le pacing budget toute l'année ?
Le script qui compare le spend cumulé du mois au budget théorique prorata (jour courant ÷ jours du mois × budget mensuel) et déclenche une alerte si l'écart dépasse ±15%. Sous-dépense = campagnes bridées par des bids trop bas ou un budget daily mal dimensionné ; surdépense = pacing agressif qui va griller le budget en milieu de mois. Les deux scénarios coûtent cher. Voir aussi notre guide dédié budget pacing Google Ads.
Cas d'usage : tous les comptes avec budget mensuel fixe (agences clients mensualisés, départements marketing interne à enveloppe).
function main() {
var MONTHLY_BUDGET = 10000; // € — à paramétrer
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] Écart " + (delta * 100).toFixed(0) + "%",
"Spent: " + actual + "€ vs expected: " + expected.toFixed(0) + "€");
}
}
Schedule : daily (en fin de journée). Gain temps : environ 1h30 par semaine, plus la sécurité d'éviter un dépassement budget annuel embarrassant côté finance.
Script 5 · Ad copy fatigue detector (CTR en baisse) Notre calculateur CTR gratuit compare votre taux de clics aux médianes France 2026 par vertical.
Le script qui détecte les annonces dont le CTR 7 derniers jours chute de plus de 25% vs le CTR 30 derniers jours. Classique symptôme de fatigue créative : votre audience a vu l'annonce trop de fois, elle scrolle sans cliquer. Réaction : refresh le copy, tester une nouvelle headline, rotation des assets RSA.
Cas d'usage : comptes qui scalent en budget, retargeting Display, campagnes toujours-on sur même audience. Pas utile sur acquisition froide ultra-diversifiée.
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);
// Optionnel : labeler l'annonce "to-refresh"
}
}
}
Schedule : weekly. Gain temps : environ 1 heure par semaine sur la revue manuelle des stats d'annonces, et surtout détection plus précoce qui évite 2 à 3 semaines de CTR bas.
Script 6 · Competitor bid anomaly (top IS tombé)
Le script qui surveille votre Impression Share (top et absolute top) sur vos campagnes core et alerte si vous perdez plus de 10 points en 24h. Signal typique : un concurrent vient de booster ses enchères, ou un nouvel entrant a pris position. Réaction rapide possible : ajuster votre Target CPA, pousser un asset différenciant, activer un sitelink compétitif.
Cas d'usage : verticals compétitifs (assurance, mutuelle, SaaS B2B, e-com mode). Moins critique en niche à faible concurrence.
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 tombé de " + (is7d * 100).toFixed(0) + "% à " + (isYd * 100).toFixed(0) + "%");
}
}
}
Schedule : daily. Gain temps : environ 1 heure par semaine de veille concurrentielle active, remplacée par une alerte passive.
Comment détecter les landing pages 404 dans ses annonces ?
Le script qui fait un fetch HTTP GET sur chaque URL finale des annonces actives, vérifie le status code, et alerte immédiatement si une URL renvoie 404, 500 ou une redirection cassée. Payer pour envoyer du trafic vers une page cassée est l'erreur la plus humiliante d'une campagne. En pratique, 3% des benchmarks publics ont au moins une URL 404 active en permanence, souvent après une refonte ou un changement de CMS.
Cas d'usage : e-com avec rotation de produits (ruptures, fins de collection), sites migrés récemment, multi-sites avec URLs dynamiques.
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] Landing pages cassées", broken.join("\n"));
}
Schedule : hourly si e-com, daily sinon. Gain temps : environ 2 heures par semaine, plus l'économie directe de budget dépensé sur une page cassée (qui peut atteindre des centaines d'euros en une journée).
Script 8 · Conversion tracking drift (taux drop)
Le script qui calcule le taux de conversion des 24 dernières heures vs la moyenne des 14 derniers jours, et alerte si le taux chute de plus de 40% sans explication de volume. Principal symptôme : tracking cassé — tag GTM qui ne fire plus, consent mode mal configuré, GA4 déconnecté. Le cauchemar absolu quand Smart Bidding perd son signal de conversion. Pour la remise à plat complète du tracking, voir notre guide conversion tracking.
Cas d'usage : tous les comptes avec Smart Bidding actif. Critique dès qu'il y a une refonte technique prévue sur le 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] Drift conversion",
"CVR 24h=" + (rate1 * 100).toFixed(2) + "% vs 14j=" + (rate14 * 100).toFixed(2) + "%");
}
}
Schedule : daily. Gain temps : environ 1 heure par semaine, mais surtout l'économie colossale d'un Smart Bidding qui déraille 7 jours avant détection manuelle.
Script 9 · Extensions audit (sitelinks manquants)
Le script qui liste toutes les campagnes Search actives et vérifie la présence des extensions clés : sitelinks (minimum 4), callouts (minimum 4), structured snippets, business info. Alerte si une campagne n'a aucune extension ou moins du minimum. Les extensions boostent le CTR de 10 à 15% en moyenne — les oublier est un gaspillage pur. Documentation support Google Ads sur les extensions.
Cas d'usage : MCC agence avec 20+ comptes à surveiller, ou équipes marketing qui lancent régulièrement de nouvelles campagnes sans process strict.
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] Extensions manquantes", missing.join("\n"));
}
Schedule : weekly. Gain temps : environ 30 minutes par semaine d'audit manuel remplacé, mais surtout couverture systématique qu'aucune nouvelle campagne ne reste sans extensions.
Script 10 · Weekly performance digest email
Le script qui agrège chaque lundi matin les métriques clés de la semaine écoulée (spend, clicks, conversions, CTR, CPA, ROAS) et envoie un email HTML résumé aux stakeholders. Fin des 45 minutes chaque lundi à construire le PowerPoint hebdo. Bonus : ajouter la variation vs semaine précédente, highlight des campagnes top/flop, top 3 des search terms converters.
Cas d'usage : toutes les structures avec un reporting hebdo récurrent (agence, in-house, freelance). Remplace un livrable à main de 30 à 60 minutes.
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 — semaine " + new Date().toLocaleDateString(),
htmlBody: html
});
}
Schedule : weekly, lundi 8h. Gain temps : environ 1h30 par semaine, et régularité garantie (fini les digests oubliés les semaines chargées).
un Google Ads Script sans error handling peut déclencher une action massive en cas de bug API — imaginez 500 négatifs ajoutés en broad sur toute votre structure parce que la ligne 12 retourne undefined. Règle absolue : toute mutation d'entité (add, set, pause, remove) doit être wrappée dans un try/catch avec notification d'erreur et limite d'entités modifiées par run (ex : max 50 négatifs ajoutés/run).
Ces 10 scripts couvrent 90% des besoins d'automation classiques. Si vous voulez une couche de monitoring plus riche (détection d'anomalies statistiques multi-critères, alertes Slack/webhook, historisation profonde, dashboards multi-comptes), la plupart de ces scripts sont déjà intégrés dans SteerAds — notre module Monitoring tourne 24/7 sans que vous ayez à maintenir du code, Auto-optimisation ajoute les actions automatiques (négatifs, pacing, budget redistrib), et notre audit gratuit pointe en 72h les scripts à installer en priorité sur votre compte. Pour un scaling plus structurel, enchaînez avec notre guide complet Performance Max.
Sources
Sources officielles consultées pour ce guide :
FAQ
Faut-il savoir coder pour utiliser Google Ads Scripts ?
Un niveau JavaScript basique suffit pour installer et adapter les scripts que nous donnons. Les objets AdsApp.* sont très bien documentés, le compilateur intégré à l'interface Google Ads remonte les erreurs avant exécution, et la plupart des scripts utiles tiennent en 40 à 120 lignes. Vous devez savoir lire une fonction, comprendre une boucle for et manipuler des objets JSON — rien de plus. Pour les équipes non techniques, un copier-coller prudent depuis notre dépôt et 2 à 3 essais en mode preview (sans exécution réelle) permettent d'installer un script de monitoring en moins de 15 minutes. Pour développer un script custom avec logique métier complexe, un développeur junior reste préférable.
Les scripts Google Ads sont-ils sécurisés ?
Oui, côté exécution — Google les run sur leur propre infrastructure sandboxée, vous n'avez aucun serveur à maintenir et aucun credential à héberger. Risque principal côté code : un script buggé qui modifie massivement le compte (ex : pause toutes les campagnes, change tous les bids) sans error handling. Toujours tester en mode preview avant de schedule, wrapper les opérations d'écriture dans un try/catch avec notification d'erreur, et ajouter des garde-fous (ex : limite le nombre d'entités modifiées par run). Sur notre benchmark interne SteerAds, 14% des incidents majeurs Google Ads rencontrés par les clients en audit sont liés à un script sans garde-fou.
Combien de scripts peut-on faire tourner sur un compte Google Ads ?
Au niveau compte individuel, Google autorise jusqu'à 250 scripts actifs, mais vous atteindrez le plafond d'utilité bien avant — une dizaine de scripts bien conçus couvrent 90% des besoins d'automation. Les quotas réels qui vous bloqueront en premier sont : 30 minutes d'exécution maximum par script, limite API d'opérations par jour (mutations bulk), et fréquence maximale d'1 exécution par heure pour les scripts hourly. Un MCC (manager account) peut exécuter un script qui itère sur des dizaines de comptes enfants en une seule run, ce qui change la donne pour les agences. Commencez petit, mesurez l'impact, puis scalez.
Scripts vs outil SaaS (comme SteerAds) : lequel choisir ?
Les deux sont complémentaires. Les scripts brillent sur des actions ponctuelles, hyper-custom, où vous avez déjà une logique métier précise à encoder — un SaaS ne saura jamais reproduire votre règle d'exclusion maison. Un SaaS comme SteerAds couvre l'infrastructure générique (monitoring 24/7, alertes multi-canaux, détection d'anomalies statistiques, audit automatique, dashboards multi-comptes, historisation profonde) sans que vous ayez à maintenir du code. Sur notre benchmark interne SteerAds, les comptes qui combinent 2 à 3 scripts custom métier + un SaaS de pilotage gagnent 10 à 15h/semaine, contre 4 à 5h pour ceux qui n'ont que des scripts. La question n'est pas « lequel », mais « où placer le curseur ».