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.
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
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 LicenceThis 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.