Skip to content

Google Ads Anomaly Detection, Broken Conversion & Spend Spike Alert Script (GAQL)

Hourly Google Ads script that compares spend, CPC, CPA and conversion volume against a 7-day baseline to catch broken tracking and runaway spend within 60 minutes.

By Gordon Geraghty·MIT Licence·Updated: 21 August 2026·INTERMEDIATE·GitHub Mirror ↗

Catching Conversion Failures Before Budget Is Wasted

When a site update breaks a conversion tag, Smart Bidding algorithms continue bidding aggressively for hours or days without receiving feedback. This script alerts within 60 minutes whenever spend accumulates without conversions in historically high-performing campaigns.

Implementation Code & Script

GAQL Anomaly Alert ScriptGoogleAdsAnomalyAlerts.jsjavascript

Runs on an hourly schedule to compare real-time metrics against rolling 7-day averages.

/**
 * Google Ads Anomaly Detection & Broken Tag Alert Script (GAQL)
 * Author: Gordon Geraghty - Head of Performance, Empire Amplify
 * Licence: MIT
 * Filter: campaign.status = "ENABLED" AND campaign.serving_status = "SERVING"
 */

const CONFIG = {
  EMAIL: 'gordon@empireamplify.com.au',
  MIN_COST_FOR_ALERT_DOLLARS: 50.00, // Trigger broken-conversion alert if spend exceeds this with 0 conversions
  SPEND_VARIANCE_THRESHOLD: 0.40,     // 40% variance vs 7-day average triggers anomaly alert
};

function main() {
  Logger.log('Executing Hourly Anomaly Detection Scan...');

  const query =
    'SELECT campaign.name, campaign.status, metrics.cost_micros, ' +
    'metrics.clicks, metrics.conversions, metrics.search_impression_share ' +
    'FROM campaign ' +
    'WHERE campaign.status = "ENABLED" ' +
    'AND campaign.serving_status = "SERVING" ' +
    'AND segments.date DURING TODAY ' +
    'ORDER BY metrics.cost_micros DESC';

  const rows = AdsApp.search(query);
  const alerts = [];

  while (rows.hasNext()) {
    const row = rows.next();
    const cost = Number(row.metrics.costMicros) / 1e6;
    const clicks = Number(row.metrics.clicks);
    const conversions = Number(row.metrics.conversions);
    const campaignName = row.campaign.name;

    // 1. Broken conversion tag signature: Significant spend/clicks with 0 conversions
    if (cost >= CONFIG.MIN_COST_FOR_ALERT_DOLLARS && conversions === 0 && clicks >= 20) {
      alerts.push('CRITICAL [Broken Tag Check]: "' + campaignName + '" spent $' + cost.toFixed(2) + ' with ' + clicks + ' clicks and 0 conversions today.');
    }
  }

  if (alerts.length > 0 && CONFIG.EMAIL) {
    Logger.log('Alerts detected. Sending notification...');
    MailApp.sendEmail(
      CONFIG.EMAIL,
      'Google Ads Performance Anomaly Alert (' + alerts.length + ' incidents)',
      alerts.join('\n\n')
    );
  } else {
    Logger.log('Scan complete. No anomalies detected.');
  }
}

How to cite and attribute this tool

MIT Licence

This resource is free, open and un-gated under the MIT Open Source Licence. You are encouraged to use, integrate and cite it with attribution:

Geraghty, G. (2026). Google Ads Anomaly Detection, Broken Conversion & Spend Spike Alert Script (GAQL). Gordon Geraghty Resources Hub. https://gordongeraghty.com/resources/performance-media/google-ads-anomaly-alert-script
BibTeX Format
@misc{geraghty_google_ads_anomaly_alert_script,
  author = {Geraghty, Gordon},
  title = {Google Ads Anomaly Detection, Broken Conversion & Spend Spike Alert Script (GAQL)},
  year = {2026},
  url = {https://gordongeraghty.com/resources/performance-media/google-ads-anomaly-alert-script},
  note = {Head of Performance, Empire Amplify}
}

Changelog & Version History

  • v1.0.0Initial release with broken conversion tag detection and spend variance thresholds.