SteerAds
Microsoft AdsTutorielOptimisation

Scripts Microsoft Ads : 8 automations à copier

Microsoft Ads Scripts permettent d'automatiser ce que l'interface ne propose pas : alertes budget, négatifs auto, anomalies CPC, reporting hebdo. Voici 8 scripts prêts à coller, testés en production sur des comptes observés dans les benchmarks Google Ads publics — avec snippets JavaScript complets, variables à customiser et pièges à éviter.

Matt
MattTracking & Data Lead
···10 min de lecture

Sur les comptes observés dans les benchmarks Google Ads publics, automatiser via Microsoft Ads Scripts économise 4 à 8 heures par semaine de travail manuel (vérifications budget, ajout de négatifs, monitoring tracking) — soit l'équivalent d'un demi-jour de PPC manager récupéré pour la stratégie. Microsoft Advertising détient 9% du desktop search aux US et 4% en France au T4 2025 (StatCounter) ; à ce niveau de marché, automatiser n'est plus optionnel.

Ce guide est un dépôt prêt à coller : 8 scripts JavaScript testés en production, avec les variables à customiser, les pièges à éviter, et la fréquence d'exécution recommandée pour chacun. Tous portent une logique business claire — pas de code décoratif. Si vous démarrez sur Microsoft Ads, lisez d'abord notre guide débutant Microsoft Ads et notre comparatif Microsoft Ads vs Google Ads. Notre calculateur de gaspillage budget estime le € brûlé/mois par broad sans négatifs ou bounce LP excessif.

Microsoft Ads Scripts en 2026 : ce qui change vs Google Ads Scripts

Microsoft Ads Scripts (parfois appelé Microsoft Advertising Scripts) est l'équivalent direct de Google Ads Scripts : un environnement JavaScript serverless intégré à l'interface Microsoft Advertising, qui permet d'exécuter du code à intervalles réguliers (hourly, daily, weekly) pour lire ou modifier les entités du compte. La syntaxe est JavaScript ES5 avec quelques apports ES6 supportés depuis 2024 (let, const, arrow functions, template strings).

L'API diffère de celle de Google Ads Scripts. Là où Google expose AdsApp.campaigns(), Microsoft expose un sélecteur équivalent mais avec des méthodes propriétaires. Voici le tableau comparatif des différences majeures :

Trois différences pratiques à connaître avant de porter un script Google :

  1. Pas de SpreadsheetApp natif côté Microsoft. Si vous avez l'habitude de logger les outputs dans Google Sheets, vous devrez utiliser l'API Google Sheets via UrlFetchApp + un token OAuth. C'est plus de plomberie pour un résultat identique.
  2. Le format de date côté reports diffère légèrement. Microsoft accepte les formats ISO (YYYY-MM-DD) mais certaines méthodes attendent des objets Date natifs JS. Tester systématiquement en preview.
  3. Le système d'envoi email passe par UrlFetchApp + un service externe (SendGrid, Mailgun, ou un endpoint custom). Microsoft ne propose pas de MailApp built-in équivalent à Google Ads Scripts.

Documentation officielle complète sur learn.microsoft.com/advertising/scripts. C'est le go-to pour toute question de signature API ou de méthode obscure.

Setup : où coller un script et comment le scheduler

L'éditeur Scripts est accessible dans Microsoft Advertising via Tools > Scripts. La procédure de création d'un nouveau script tient en 5 étapes : créer le script, coller le code, customiser les variables, tester en preview, scheduler à la bonne fréquence.

Le mode Preview est non négociable. Il exécute le script en lecture seule, sans modifier les entités, et affiche le log complet dans le panel inférieur de l'éditeur. C'est votre filet de sécurité : un script mal écrit qui pause 5 000 keywords peut bloquer le compte pour des semaines. Toujours preview avant le premier run programmé.

Les fréquences d'exécution disponibles :

  • Hourly : toutes les heures (24 fois par jour). Pour les alertes critiques ou les automatisations à forte fréquence (alerte budget, monitoring tracking).
  • Daily : une fois par jour à l'heure choisie. Pour la majorité des automatisations (négatifs auto, monitoring CPC, pause keywords).
  • Weekly : une fois par semaine. Pour les reportings, les analyses tendance, les opérations lourdes.
  • Monthly : une fois par mois. Pour les audits structurels, les nettoyages.

Sur les comptes observés dans les benchmarks Google Ads publics, le pattern dominant est : 1-2 scripts hourly (alerte budget critique, monitoring tracking), 4-6 scripts daily (négatifs, pause keywords, anomalies), 1-2 scripts weekly (reporting, audit). Cumuler plus de 12 scripts actifs commence à créer des conflits — deux scripts qui modifient la même entité au même moment génèrent des comportements imprévisibles.

Autorisations HTTP externes : si votre script utilise UrlFetchApp pour envoyer un email, pousser sur Slack, lire une Google Sheet, Microsoft demande une autorisation explicite la première fois. La fenêtre de consentement liste les domaines auxquels le script peut accéder. Cette autorisation est révocable à tout moment dans Tools > Scripts > Authorizations.

Tip dev :

Toujours mettre un Logger.log() (ou équivalent Microsoft) au début et à la fin de chaque section critique. Les scripts qui plantent en silence sont l'enfer à débugger 3 mois plus tard quand la perf décroche. Le coût marginal d'un log est zéro, le bénéfice opérationnel est massif.

Script 1 : alerte budget dépassé

Fonction : envoyer une alerte email (ou Slack, ou webhook) dès qu'une campagne consomme plus de 90% de son budget journalier en cours de journée. Critique pendant les périodes de sale, les pics saisonniers, ou les comptes à budget serré.

Fréquence recommandée : Hourly.

// Microsoft Ads Script — Budget Alert Hourly
// Variables à customiser
var BUDGET_THRESHOLD_PCT = 0.90; // 90% du budget journalier
var ALERT_WEBHOOK_URL = "https://hooks.slack.com/services/YOUR/WEBHOOK/URL";
var ACCOUNT_NAME = "Compte FR principal";

function main() {
  var campaigns = AdsApp.campaigns()
    .withCondition("Status = ENABLED")
    .get();

  var alerts = [];

  while (campaigns.hasNext()) {
    var c = campaigns.next();
    var stats = c.getStatsFor("TODAY");
    var spent = stats.getCost();
    var budget = c.getBudget().getAmount();

    if (budget > 0 && spent / budget >= BUDGET_THRESHOLD_PCT) {
      alerts.push({
        name: c.getName(),
        spent: spent.toFixed(2),
        budget: budget.toFixed(2),
        pct: ((spent / budget) * 100).toFixed(1)
      });
    }
  }

  if (alerts.length > 0) {
    var message = "[" + ACCOUNT_NAME + "] " + alerts.length +
      " campagne(s) > " + (BUDGET_THRESHOLD_PCT * 100) + "% budget : " +
      alerts.map(function(a) {
        return a.name + " (" + a.pct + "% — " + a.spent + "/" + a.budget + " EUR)";
      }).join(" | ");

    UrlFetchApp.fetch(ALERT_WEBHOOK_URL, {
      method: "POST",
      contentType: "application/json",
      payload: JSON.stringify({ text: message })
    });
  }
}

Variables à customiser : BUDGET_THRESHOLD_PCT (0.90 = 90%), ALERT_WEBHOOK_URL (Slack, Discord, custom webhook), ACCOUNT_NAME (utile si plusieurs comptes envoient sur le même channel).

Pièges à éviter :

  • Ne jamais lancer ce script en frequency Daily : à minuit, le compteur reset et toutes les campagnes affichent 0% — l'alerte ne sert à rien.
  • Si vous avez un budget partagé (Shared budget), c.getBudget().getAmount() renvoie le budget partagé, pas le budget alloué à la campagne — adapter le script pour itérer sur les Shared budgets si besoin.

Script 2 : négatifs auto depuis search query report

Fonction : analyser le Search Query Report (SQR) sur les 30 derniers jours, identifier les requêtes qui consomment du budget sans convertir, et les ajouter automatiquement comme négatifs au niveau campagne. Le levier le plus rentable de l'automatisation Microsoft Ads.

Fréquence recommandée : Daily.

// Microsoft Ads Script — Auto Negatives from SQR
// Variables à customiser
var MIN_CLICKS_THRESHOLD = 15; // au moins 15 clics
var MAX_CONVERSIONS_THRESHOLD = 0; // aucune conversion
var DATE_RANGE_DAYS = 30; // fenêtre d'analyse
var DRY_RUN = true; // false pour appliquer réellement

function main() {
  var query =
    "SELECT Query, CampaignName, CampaignId, Clicks, Cost, Conversions " +
    "FROM SEARCH_QUERY_PERFORMANCE_REPORT " +
    "WHERE Clicks >= " + MIN_CLICKS_THRESHOLD +
    "  AND Conversions <= " + MAX_CONVERSIONS_THRESHOLD +
    "  AND CampaignStatus = 'ENABLED' " +
    "DURING LAST_" + DATE_RANGE_DAYS + "_DAYS";

  var report = AdsApp.report(query);
  var rows = report.rows();
  var added = 0;

  while (rows.hasNext()) {
    var row = rows.next();
    var queryText = row["Query"];
    var campaignName = row["CampaignName"];
    var campaignId = row["CampaignId"];

    if (DRY_RUN) {
      Logger.log("[DRY RUN] Would add negative: '" + queryText +
        "' to campaign " + campaignName);
      continue;
    }

    var campaigns = AdsApp.campaigns()
      .withCondition("CampaignId = " + campaignId).get();

    if (campaigns.hasNext()) {
      var campaign = campaigns.next();
      campaign.createNegativeKeyword('"' + queryText + '"'); // phrase match
      added++;
      Logger.log("Added negative: '" + queryText + "' to " + campaignName);
    }
  }

  Logger.log("Total negatives added: " + added);
}

Variables à customiser :

  • MIN_CLICKS_THRESHOLD : minimum de clics avant d'ajouter en négatif (15 = sweet spot, ajustez selon volume).
  • MAX_CONVERSIONS_THRESHOLD : 0 = aucune conversion. Si vous voulez tolérer 1 conversion isolée, mettez 1.
  • DATE_RANGE_DAYS : 30 = fenêtre standard. Pour un compte à faible volume, étendre à 60 ou 90.
  • DRY_RUN : laisser true pour le premier run, vérifier le log, puis passer à false.

Pièges à éviter :

  • Toujours DRY_RUN: true au premier run. Lire le log pour valider que les négatifs proposés ont du sens. Un seuil mal calibré peut ajouter 200 négatifs en une nuit.
  • Match type : ici phrase match (avec quotes). Pour exact match, utiliser '[' + queryText + ']'. Pour broad, sans encadrement.
  • Le script ajoute au niveau campagne. Pour ajouter au niveau compte (préférable pour les négatifs ultra-génériques), utiliser un Negative keyword list partagée.

Script 3 : pause des keywords low quality score

Fonction : identifier les keywords avec un Quality Score (Microsoft) inférieur à un seuil, et les pauser automatiquement après une période d'observation. Permet de nettoyer le compte sans intervention manuelle.

Fréquence recommandée : Daily.

// Microsoft Ads Script — Pause Low Quality Score Keywords
// Variables à customiser
var QS_THRESHOLD = 4; // pause si QS < 4 (sur 10)
var MIN_IMPRESSIONS = 500; // minimum d'impressions pour valider
var DATE_RANGE = "LAST_30_DAYS";

function main() {
  var keywords = AdsApp.keywords()
    .withCondition("Status = ENABLED")
    .withCondition("QualityScore < " + QS_THRESHOLD)
    .withCondition("Impressions > " + MIN_IMPRESSIONS)
    .forDateRange(DATE_RANGE)
    .get();

  var paused = 0;

  while (keywords.hasNext()) {
    var k = keywords.next();
    var qs = k.getQualityScore();
    var impressions = k.getStatsFor(DATE_RANGE).getImpressions();
    var keywordText = k.getText();
    var campaign = k.getCampaign().getName();

    Logger.log("Pausing: '" + keywordText + "' (QS=" + qs +
      ", Impr=" + impressions + ", Campaign=" + campaign + ")");

    k.pause();
    paused++;
  }

  Logger.log("Total keywords paused: " + paused);
}

Variables à customiser :

  • QS_THRESHOLD : 4 = strict. Pour démarrer, mettez 3 puis montez progressivement à 4-5 selon retours.
  • MIN_IMPRESSIONS : 500 minimum pour avoir un QS fiable (sinon Microsoft renvoie un QS instable).

Pièges à éviter :

  • Ne jamais lancer ce script sur des keywords brand : un keyword brand peut avoir un QS bas à cause d'un facteur LP non lié à la pertinence (ex : LP qui charge mal, mais mots-clés très pertinents). Filtrez les campagnes brand en amont.
  • Le QS est un indicateur Microsoft, pas Google. Sur Microsoft, le QS peut bouger plus vite (algo plus simple) — un keyword pausé un jour peut redevenir performant 2 semaines après. Considérer ce script comme un nettoyage, pas une décision définitive.

Script 4 : reporting hebdo email

Fonction : générer un rapport synthétique chaque lundi matin avec les KPI clés (clics, impressions, conversions, CPA, ROAS) par campagne, et l'envoyer par email à l'équipe. Évite la connexion manuelle pour récupérer les chiffres.

Fréquence recommandée : Weekly (lundi matin).

// Microsoft Ads Script — Weekly Report Email
// Variables à customiser
var EMAIL_RECIPIENT = "team@votreentreprise.com";
var EMAIL_API_URL = "https://api.sendgrid.com/v3/mail/send"; // ou Mailgun, etc.
var EMAIL_API_KEY = "YOUR_SENDGRID_API_KEY";
var DATE_RANGE = "LAST_7_DAYS";

function main() {
  var campaigns = AdsApp.campaigns()
    .withCondition("Status = ENABLED")
    .get();

  var rows = [];

  while (campaigns.hasNext()) {
    var c = campaigns.next();
    var stats = c.getStatsFor(DATE_RANGE);
    rows.push({
      name: c.getName(),
      impressions: stats.getImpressions(),
      clicks: stats.getClicks(),
      cost: stats.getCost(),
      conv: stats.getConversions(),
      cpa: stats.getConversions() > 0
        ? (stats.getCost() / stats.getConversions()).toFixed(2)
        : "N/A"
    });
  }

  // Construction HTML
  var html = "<h2 data-speakable>Weekly Microsoft Ads Report — " + DATE_RANGE + "</h2>";
  html += "<table border='1' cellpadding='8' style='border-collapse:collapse;'>";
  html += "<tr><th>Campaign</th><th>Impr.</th><th>Clicks</th>" +
    "<th>Cost</th><th>Conv.</th><th>CPA</th></tr>";
  rows.forEach(function(r) {
    html += "<tr><td>" + r.name + "</td>" +
      "<td>" + r.impressions + "</td>" +
      "<td>" + r.clicks + "</td>" +
      "<td>" + r.cost.toFixed(2) + "</td>" +
      "<td>" + r.conv + "</td>" +
      "<td>" + r.cpa + "</td></tr>";
  });
  html += "</table>";

  // Envoi via SendGrid (ou autre provider)
  UrlFetchApp.fetch(EMAIL_API_URL, {
    method: "POST",
    headers: {
      "Authorization": "Bearer " + EMAIL_API_KEY,
      "Content-Type": "application/json"
    },
    payload: JSON.stringify({
      personalizations: [{ to: [{ email: EMAIL_RECIPIENT }] }],
      from: { email: "noreply@votreentreprise.com" },
      subject: "Weekly Microsoft Ads Report",
      content: [{ type: "text/html", value: html }]
    })
  });
}

Variables à customiser : EMAIL_RECIPIENT, EMAIL_API_URL et EMAIL_API_KEY (SendGrid ou Mailgun ou équivalent), DATE_RANGE.

Pièges à éviter :

  • L'email API key est sensible : ne jamais hardcoder en clair dans un script partagé. Utiliser un secret manager ou un endpoint proxy dédié.
  • Format HTML simpliste : pour un rapport plus visuel, intégrer des CSS inline ou générer un PDF via une API tierce (PDFShift, DocRaptor).

Scripts 5 à 8 : enchères dynamiques, anomalies, audiences, monitoring Notre calculateur CPC France gratuit fournit les benchmarks par secteur et la zone-cible recommandée.

Les 4 scripts restants couvrent les cas d'usage avancés : ajustements bid par tranche horaire, détection d'anomalies CPC, refresh des audiences Customer Match, et monitoring des conversions UET.

Script 5 — Enchères dynamiques par tranche horaire (dayparting)

Fonction : ajuster les enchères automatiquement par tranche horaire selon les patterns de conversion observés. Utile pour les SaaS B2B (pic en journée, creux soir/weekend) ou les e-com avec saisonnalité jour/nuit forte.

Fréquence recommandée : Daily (à minuit, applique le bid adjustment du lendemain).

Le script lit le rapport de performance par hour-of-day sur les 30 derniers jours, calcule un coefficient de bid adjustment par tranche (basé sur conv. rate), puis applique via setBidModifier() au niveau campagne. À ne pas appliquer sur les campagnes en Smart Bidding (Target CPA/ROAS), uniquement sur Manual CPC ou Maximize Clicks.

Script 6 — Détection anomalies CPC

Fonction : comparer le CPC moyen actuel des 7 derniers jours au CPC moyen des 30 derniers jours par campagne. Alerter si l'écart dépasse +25%. Détecte les enchères concurrentielles qui dérapent (compétiteur agressif, saisonnalité non anticipée, événement marché).

Fréquence recommandée : Daily.

// Microsoft Ads Script — CPC Anomaly Detection
var CPC_VARIATION_THRESHOLD = 0.25; // +25% = alerte
var ALERT_WEBHOOK_URL = "https://hooks.slack.com/services/YOUR/WEBHOOK";

function main() {
  var campaigns = AdsApp.campaigns()
    .withCondition("Status = ENABLED").get();

  var alerts = [];

  while (campaigns.hasNext()) {
    var c = campaigns.next();
    var s7 = c.getStatsFor("LAST_7_DAYS");
    var s30 = c.getStatsFor("LAST_30_DAYS");

    if (s7.getClicks() < 50 || s30.getClicks() < 200) continue; // skip low volume

    var cpc7 = s7.getCost() / s7.getClicks();
    var cpc30 = s30.getCost() / s30.getClicks();
    var variation = (cpc7 - cpc30) / cpc30;

    if (variation > CPC_VARIATION_THRESHOLD) {
      alerts.push(c.getName() + " : CPC +" + (variation * 100).toFixed(1) +
        "% (" + cpc30.toFixed(2) + " → " + cpc7.toFixed(2) + " EUR)");
    }
  }

  if (alerts.length > 0) {
    UrlFetchApp.fetch(ALERT_WEBHOOK_URL, {
      method: "POST",
      contentType: "application/json",
      payload: JSON.stringify({
        text: "[Microsoft Ads] CPC anomalies detected: " + alerts.join(" | ")
      })
    });
  }
}

Script 7 — Refresh audiences Customer Match

Fonction : récupérer la liste CRM la plus à jour (via API CRM ou Google Sheet), la hasher en SHA-256, et mettre à jour la liste Customer Match côté Microsoft Advertising. Évite les listes périmées qui dégradent le matching.

Fréquence recommandée : Weekly.

Le script utilise UrlFetchApp pour appeler l'API CRM (HubSpot, Salesforce, custom), parse la réponse, hash chaque email/téléphone, puis push vers Microsoft Audiences API. Voir notre guide Customer Match first-party data 2026 pour la stratégie d'audience complète.

Script 8 — Monitoring conversions UET

Fonction : vérifier toutes les heures que le tag UET continue à remonter des conversions. Alerter si aucune conversion n'a été enregistrée sur les 6 dernières heures alors que le compte est en activité. Détecte les pannes de tracking en moins de 6 heures (vs 24-48h en monitoring manuel).

Fréquence recommandée : Hourly.

// Microsoft Ads Script — UET Conversion Monitoring
var ALERT_THRESHOLD_HOURS = 6;
var MIN_HOURLY_CLICKS = 20; // alerte uniquement si trafic significatif
var ALERT_WEBHOOK_URL = "https://hooks.slack.com/services/YOUR/WEBHOOK";

function main() {
  var stats = AdsApp.currentAccount().getStatsFor("TODAY");
  var conv = stats.getConversions();
  var clicks = stats.getClicks();

  if (clicks < MIN_HOURLY_CLICKS * ALERT_THRESHOLD_HOURS) return; // pas assez de trafic

  if (conv === 0) {
    UrlFetchApp.fetch(ALERT_WEBHOOK_URL, {
      method: "POST",
      contentType: "application/json",
      payload: JSON.stringify({
        text: "[Microsoft Ads] ALERTE : 0 conversion sur les " +
          ALERT_THRESHOLD_HOURS + " dernières heures avec " +
          clicks + " clicks. Vérifier le tag UET."
      })
    });
  }
}

Variables à customiser : ALERT_THRESHOLD_HOURS, MIN_HOURLY_CLICKS (ajuster selon volume du compte), ALERT_WEBHOOK_URL.

Pièges à éviter :

  • Le script doit fitting le profil de trafic du compte. Pour un B2B avec peu de conversions/jour, baisser MIN_HOURLY_CLICKS à 5-10 ; pour un e-com gros volume, monter à 50.
  • Faux positifs possibles le weekend ou la nuit si le compte tourne 24/7 mais avec des conversions concentrées en journée. Filtrer les heures bureau si applicable.
Insight clé :

Sur les comptes observés dans les benchmarks Google Ads publics, les comptes qui activent au moins 4 de ces 8 scripts économisent 4 à 8 heures par semaine de travail manuel et détectent 2 à 4 fois plus vite les anomalies (tracking, budget, CPC). C'est le levier d'industrialisation le plus rentable une fois le compte stabilisé sur les fondamentaux.

Pour aller plus loin sur l'automatisation côté Google Ads (10 scripts prêts à coller, syntaxe AdsApp), voir notre guide des 10 scripts Google Ads prêts à coller. Pour la base d'audit qui doit précéder toute automatisation, lisez notre checklist d'audit Google Ads.

Pour les comptes qui veulent industrialiser le pilotage Microsoft Ads sans coder leurs propres scripts, notre module Auto-optimisation couvre l'équivalent des 8 scripts ci-dessus en mode managé : monitoring continu, alertes Slack/email, ajustements négatifs et bid quotidiens, reporting hebdo. Voir aussi notre guide complet UET conversion tracking, notre guide d'import Google → Microsoft et notre analyse budget et CPC Microsoft Ads worldwide pour les benchmarks par vertical.

Pour la documentation officielle Microsoft, voir le portail Microsoft Advertising Scripts et le help center général Microsoft Ads.

Sources

Sources officielles consultées pour ce guide :

FAQ

Microsoft Ads Scripts utilisent-ils JavaScript comme Google Ads Scripts ?

Oui, la syntaxe est JavaScript ES5 (avec quelques apports ES6 supportés depuis 2024) — proche de Google Ads Scripts mais avec une API distincte. Les objets accessibles diffèrent : AdsApp côté Google devient quelque chose comme MicrosoftAdsApp (parfois exposé via l'objet global de l'environnement Microsoft). Les méthodes (getCampaigns, getAdGroups, getKeywords) ont des signatures similaires mais pas identiques. Concrètement, un script Google Ads ne s'exécute pas tel quel côté Microsoft : il faut le porter en remappant les appels API et en testant chaque assertion. Comptez 30 minutes à 2 heures par script pour un portage propre selon la complexité.

Combien de scripts un compte Microsoft Ads peut-il faire tourner simultanément ?

Microsoft Advertising autorise jusqu'à 50 scripts par compte selon la documentation officielle, avec une limite d'exécution de 30 minutes par script et un quota d'opérations API par jour. Sur les comptes observés dans les benchmarks Google Ads publics, 6 à 12 scripts actifs représentent le sweet spot — au-delà, le risque de conflit (deux scripts modifiant la même entité simultanément) augmente, et le debug devient pénible. La règle pratique : 1 script = 1 fonction métier claire, mieux 8 scripts simples qu'un super-script de 500 lignes qui fait tout. Microsoft logge chaque exécution avec timestamps et erreurs, accessible dans Tools > Scripts.

Faut-il une autorisation OAuth particulière pour les Microsoft Ads Scripts ?

Non, les scripts s'exécutent dans le contexte du compte Microsoft Advertising auquel ils sont attachés, avec les permissions du compte. Pas besoin d'OAuth séparé pour modifier les entités du compte (campagnes, keywords, négatifs). En revanche, si le script fait des appels HTTP externes (envoi email, lecture API tierce, push vers Slack), il utilise UrlFetchApp avec les restrictions standard : timeout 30s, taille payload limitée, certificats SSL valides obligatoires. Pour les appels nécessitant une authentification (Slack webhook, Google Sheets API), passer le token directement dans l'URL ou les headers du UrlFetchApp.fetch.

Quelle fréquence d'exécution choisir : hourly, daily, weekly ?

Dépend de la criticité du script. Hourly pour les alertes budget critiques (campagne qui peut dépasser son budget en quelques heures pendant un sale), Daily pour la majorité (négatifs auto, monitoring CPC, anomalies), Weekly pour les reportings et les analyses tendance. Sur les comptes observés dans les benchmarks Google Ads publics, le pattern dominant est : 1-2 scripts hourly (alerte budget, monitoring tracking), 4-6 scripts daily (négatifs, pause keywords, anomalies), 1-2 scripts weekly (reporting, audit). Évitez l'over-frequency : un script qui touche les enchères à fréquence horaire peut nuire à Smart Bidding qui a besoin de stabilité.

Les scripts peuvent-ils modifier les entités gérées par Smart Bidding ?

Techniquement oui, fonctionnellement à éviter. Modifier les CPC max d'un keyword dans une campagne Target ROAS désynchronise Smart Bidding, qui passe en learning state pendant 7 à 14 jours. La règle pratique : les scripts doivent toucher les entités structurelles (négatifs, keywords status, ad copy, audiences) mais laisser Smart Bidding gérer les enchères. Si vous voulez automatiser des ajustements bid, faites-le sur les CAMPAGNES en Manual CPC ou Maximize Clicks — pas sur celles en Target CPA/ROAS. Documentation officielle Microsoft Scripts API sur learn.microsoft.com couvre les bonnes pratiques.

Ready to optimize your campaigns?

Start a free audit in 2 minutes and discover the ROI potential of your accounts.

Start my free audit

Free audit — no credit card required

Keep reading