What is budget pacing?
Pacing compares how fast an account is spending against where it should be for the month. If you have a $35,000 monthly target and you are 14 days in having spent $18,240, a simple run-rate projection puts you around $39,000 by month end, roughly 12% over. Pacing scripts calculate that projection automatically and alert you the moment an account drifts off target.
A working pacing script
Paste this into Tools & Settings, Bulk actions, Scripts in Google Ads, then authorize and schedule it to run daily. It sums month-to-date cost, projects a month-end total, and emails you when the account is pacing over threshold.
function main() {
const TARGET = 35000; // monthly budget target
const ALERT_THRESHOLD = 0.1; // alert at 10% over pace
const now = new Date();
const dayOfMonth = now.getDate();
const daysInMonth = new Date(now.getFullYear(), now.getMonth() + 1, 0).getDate();
// Month-to-date cost across the account
const report = AdsApp.report(
"SELECT metrics.cost_micros " +
"FROM customer " +
"WHERE segments.date DURING THIS_MONTH"
);
let costMicros = 0;
const rows = report.rows();
while (rows.hasNext()) {
costMicros += Number(rows.next()["metrics.cost_micros"]);
}
const mtdSpend = costMicros / 1e6;
// Simple run-rate projection
const projected = (mtdSpend / dayOfMonth) * daysInMonth;
const pace = projected / TARGET - 1;
Logger.log("MTD: $" + mtdSpend.toFixed(0));
Logger.log("Projected: $" + projected.toFixed(0));
if (pace > ALERT_THRESHOLD) {
MailApp.sendEmail(
"you@example.com",
"Budget pacing alert",
"Projected $" + projected.toFixed(0) +
" vs target $" + TARGET +
" (" + (pace * 100).toFixed(0) + "% over pace)."
);
}
}Customizing the script
- Change the target. Set
TARGETto each account's monthly budget, or read it from a Google Sheet so non-technical teammates can update it. - Tune the alert threshold. Lower
ALERT_THRESHOLDto catch drift earlier, or raise it to cut noise on volatile accounts. - Smarter projections. Weight recent days more heavily, or exclude weekends, if your spend curve is not linear across the month.
- Multiple recipients. Swap
MailApp.sendEmailfor a comma separated list, or post to Slack via a webhook.
Where scripts fall short
Scripts are powerful but they live inside a single Google Ads account, run on Google's schedule, and break quietly when the API changes. They also do not cover Meta Ads, so cross-channel budgets still need stitching together by hand. If you manage many accounts or want one view across Google and Meta, a dedicated tool saves the maintenance overhead.
Skip the scripting
Ad Narrator Budget Monitor does the same pacing math across Google Ads and Meta Ads, with month-to-date spend, projected month-end totals, and email alerts before you overspend, without a line of code to maintain.
Explore Budget Monitor