Privacy preferences

Your account works regardless of these choices. Preferences are remembered for 180 days.

Google Ads MCC Spend Monitoring: Email Alerts Below $100 in 14 Days

By Nicolas Garfinkel · 2026-10-05

Your MCC can look healthy while one client account quietly stops spending. The other accounts keep delivering, the portfolio total barely moves, and the problem stays hidden until someone opens that account.

A simple Google Ads Script can check spend across your manager account and email you when any individual account spends less than $100 over the last 14 days. You get a short list of accounts to investigate without opening every account yourself.

This tutorial includes the complete script, setup instructions, and an example alert.

The rule: less than $100 in 14 days

The script checks total account spend over the last 14 completed calendar days, excluding today. It calculates the dates in each account's time zone. For an account whose local date is October 5, that means September 21 through October 4, inclusive.

Account spend in the windowResult
$0.00Email alert
$72.50Email alert
$99.99Email alert
$100.00No spend alert
$650.00No spend alert

This is an account-level total across campaigns, not a $100 daily budget or a campaign-by-campaign check. One account below the threshold is enough to trigger an email, even if the rest of your MCC is spending normally.

The rule tests whether spend is currently below the threshold. It does not need a previous run showing spend above $100. An account with zero spend is included.

What counts as your entire MCC?

The script requests the client accounts available under the manager account hierarchy, including accounts beneath sub-managers. It does not filter for accounts that already have spend. Google excludes closed, canceled, and suspended accounts by default; intermediate manager accounts are not advertising accounts in the scan. See Google's manager scripts documentation for account selection behavior.

Start with no exclusions to check every eligible client account. If your MCC contains deliberately dormant accounts, add their customer IDs to EXCLUDED_ACCOUNT_IDS after reviewing the first scan. The email reports how many accounts were checked and explicitly excluded.

Copy the Google Ads Script

Download the MCC spend monitoring script, or copy the code below into a new script at the manager account level.

Replace you@example.com with your email address. You can add multiple recipients separated by commas. The default threshold is 100 USD.

Mixed currencies: Google reports spend in each account's own currency. If your MCC includes other currencies, add a threshold for each one, such as THRESHOLDS: { USD: 100, CAD: 140 }. Those are separate local-currency thresholds you choose, not automatic exchange-rate conversions. An account with an unconfigured currency appears as a check issue instead of being silently compared against $100. Account currency and spend methods are documented in Google's ManagedAccount reference and Stats reference.

// Install in Google Ads > your manager account > Scripts.
// Change EMAIL_TO before running. Thresholds are in each account's currency.
const CONFIG = {
  EMAIL_TO: 'you@example.com',
  THRESHOLDS: { USD: 100 },
  EXCLUDED_ACCOUNT_IDS: [], // Optional: ['123-456-7890']
  SEND_EMAIL: true // Preview mode always logs instead of emailing.
};

function main() {
  if (!CONFIG.EMAIL_TO || CONFIG.EMAIL_TO.indexOf('example.com') !== -1) {
    throw new Error('Replace EMAIL_TO with your alert recipient.');
  }

  const manager = AdsApp.currentAccount();
  const runTime = new Date();
  const accounts = AdsManagerApp.accounts().get();
  const alerts = [];
  const errors = [];
  let checked = 0;
  let excluded = 0;

  while (accounts.hasNext()) {
    // Reserve time to report an incomplete scan before the runtime limit.
    if (AdsApp.getExecutionInfo().getRemainingTime() < 60) {
      errors.push('Scan stopped early: runtime nearly exhausted. Some accounts were not checked.');
      break;
    }

    const account = accounts.next();
    const id = account.getCustomerId();
    if (CONFIG.EXCLUDED_ACCOUNT_IDS.some(function(value) {
      return String(value).replace(/-/g, '') === id.replace(/-/g, '');
    })) {
      excluded++;
      continue;
    }

    try {
      const currency = account.getCurrencyCode();
      const threshold = CONFIG.THRESHOLDS[currency];
      if (typeof threshold !== 'number' || !isFinite(threshold) || threshold <= 0) {
        throw new Error('Set a positive THRESHOLDS.' + currency + ' value; no currency conversion is performed.');
      }

      const range = last14CompletedDays(runTime, account.getTimeZone());
      const spend = account.getStatsFor(range.start, range.end).getCost();
      if (typeof spend !== 'number' || !isFinite(spend) || spend < 0) {
        throw new Error('Unexpected spend value: ' + spend);
      }

      checked++;
      if (spend < threshold) {
        alerts.push((account.getName() || 'Unnamed account') + ' (' + id + ')' +
          '\n  Spend: ' + currency + ' ' + spend.toFixed(2) +
          ' | Threshold: ' + currency + ' ' + threshold.toFixed(2) +
          '\n  Dates: ' + range.start + ' to ' + range.end +
          ' | Time zone: ' + account.getTimeZone());
      }
    } catch (error) {
      errors.push(id + ': ' + String(error));
    }
  }

  const body = [
    'MCC: ' + (manager.getName() || 'Unnamed manager') + ' (' + manager.getCustomerId() + ')',
    'Window: last 14 completed calendar days in each account time zone.',
    'Successfully checked: ' + checked + ' | Explicitly excluded: ' + excluded,
    'Below threshold: ' + alerts.length + ' | Check issues: ' + errors.length,
    '',
    alerts.length ? 'ACCOUNTS BELOW THRESHOLD\n\n' + alerts.join('\n\n') : 'No low-spend accounts found among successfully checked accounts.',
    '',
    errors.length ? 'CHECK ISSUES - COVERAGE IS INCOMPLETE\n\n' + errors.join('\n') : 'Scan completed without reported check issues.'
  ].join('\n');

  Logger.log(body);
  if (!alerts.length && !errors.length) return;

  if (!CONFIG.SEND_EMAIL || AdsApp.getExecutionInfo().isPreview()) {
    Logger.log('Email suppressed: preview mode or SEND_EMAIL is false.');
    return;
  }

  const recipientCount = CONFIG.EMAIL_TO.split(',').filter(function(value) {
    return value.trim();
  }).length;
  if (MailApp.getRemainingDailyQuota() < recipientCount) {
    throw new Error('Insufficient email quota. Review the scan results in the logs.');
  }

  MailApp.sendEmail({
    to: CONFIG.EMAIL_TO,
    subject: '[MCC spend monitor] ' + alerts.length + ' low-spend account(s)' +
      (errors.length ? ' - incomplete scan' : ''),
    body: body
  });
}

function last14CompletedDays(now, timeZone) {
  // Use the account's local calendar date, then do date-only arithmetic in UTC.
  // This avoids shifting the window when daylight saving time changes.
  const parts = Utilities.formatDate(now, timeZone, 'yyyy-MM-dd').split('-');
  const today = Date.UTC(Number(parts[0]), Number(parts[1]) - 1, Number(parts[2]));
  return {
    start: Utilities.formatDate(new Date(today - 14 * 86400000), 'UTC', 'yyyyMMdd'),
    end: Utilities.formatDate(new Date(today - 86400000), 'UTC', 'yyyyMMdd')
  };
}

Install it and schedule a daily check

  1. Open the Google Ads manager account whose clients you want to monitor.
  2. Find Scripts under the tools menu, create a new script, and name it MCC low-spend monitor.
  3. Paste the code. Set your recipient, confirm your currency thresholds, and leave the exclusion list empty for the first check.
  4. Authorize the script so it can read account data and send email through MailApp.
  5. Run Preview. Review the logs for dates, checked-account counts, spend, and any check issues. This script explicitly suppresses email during Preview.
  6. Run it normally to enable email delivery. If there are low-spend accounts or check issues, confirm the summary reaches your inbox.
  7. Set the script's frequency to daily, at a time that suits your account review routine.

If you want to inspect a normal run without email, set SEND_EMAIL: false. Restore it to true before relying on scheduled alerts.

With a daily schedule, you receive one summary each day while any account remains below its threshold. If all accounts are above their thresholds and the scan has no reported issues, the script sends no email. It also sends an email when a check fails, so an incomplete scan does not look like an all-clear.

What the email looks like

For example, if two USD accounts are below $100:

Subject: [MCC spend monitor] 2 low-spend account(s)

ACCOUNTS BELOW THRESHOLD

Example Plumbing (123-456-7890)
  Spend: USD 0.00 | Threshold: USD 100.00
  Dates: 20260921 to 20261004 | Time zone: America/Los_Angeles

Example Dental (234-567-8901)
  Spend: USD 72.50 | Threshold: USD 100.00
  Dates: 20260921 to 20261004 | Time zone: America/Los_Angeles

The real email also includes the MCC name, customer ID, scan counts, and any check issues.

When an account triggers an alert

Open the flagged account and check whether low spend was intentional. Look at campaign status, billing, ad eligibility, budgets, targeting, and recent changes. A newly launched or intentionally paused account may legitimately spend less than $100.

A low-spend alert gives you an account to investigate; it does not diagnose the cause. It also uses a rolling total, so an account that stopped spending yesterday could remain above $100 because of spend earlier in the window. For faster detection, use a shorter window and an appropriate threshold in a separate monitor.

Check coverage before relying on it

This version scans accounts sequentially. Google normally limits manager scripts to 30 minutes. The code reserves time to report an incomplete scan, but a slow request or hard timeout can still prevent the final email. Check execution history and successful account counts, especially for large MCCs. If the scan cannot finish, divide accounts into explicit groups or build a batched parallel version. Google's script limits and parallel processing reference explain the constraints.

Email delivery also depends on available sending quota. The script checks quota before sending and logs an error if there is not enough. Review failed scheduled runs rather than treating a quiet inbox as proof that every account is healthy.

The script reads spend and sends notifications. It does not change campaigns, budgets, bids, or account settings.

Monitor campaign performance and spend with AdCortex

Spend is one part of campaign health. AdCortex's Google Ads monitoring tool reviews enabled accounts and campaigns nightly, tracking changes in spend, traffic, conversions, CPA, and ROAS. Campaign-level monitoring helps surface changes that can be hidden by steady account totals, while Portfolio Health gives MCC teams a view of the client accounts with active findings.

Our Google Ads anomaly detection compares fresh performance with each account's historical patterns and prioritizes findings for review. Pro monitoring sends plain-English email digests so your team can see what changed and where to investigate first.

For spend oversight, explore our Google Ads budget alerts and budget pacing. Nightly monitoring surfaces unusual spend movement, and the free Budget Pacing report compares month-to-date spend and projected month-end spend with your saved monthly target.

Get started with AdCortex to connect your Google Ads account and explore free reporting and budget pacing, then enable Pro monitoring for ongoing account and campaign oversight.

google ads google ads scripts spend monitoring mcc monitoring