Budget and spend MCC + Individual Read-only Email + Telegram Optional Google Sheets Available

$ scripts --run account-budget-balance-monitor

Account Budget Balance Monitor

Monitor an active Google Ads Budget Order, estimate the remaining days from recent spend, and receive one concise summary across an individual account or MCC.

This script monitors an active account-level Budget Order used with consolidated billing. It does not monitor campaign budget pacing, perform top-ups, or guarantee the exact date when funds will run out.

What this script monitors

  • Active Budget Order spending limit set on each monitored account.
  • Account cost from the Budget Order start date through today.
  • Average daily spend over a configurable recent calendar window (default: last 10 days).
  • Estimated full days remaining before the balance is depleted.
  • An inclusive critical threshold: estimated days left equal to or below CRITICAL_DAYS (default: 3).
  • The full allowlist of Customer IDs across MCC child accounts or standalone accounts.
  • Observable exceptional states — unlimited, no recent spend, no active order — without assuming a balance.

Calculation

remaining = max(spending limit − spend since Budget Order start, 0)

average daily spend = recent cost / averaging days

estimated days left = floor(remaining / average daily spend)

This is an estimate based on recent spend. Changes to bids, schedules, or campaign settings affect the actual result.

How Account Budget Balance Monitor works — Google Ads Script estimates days remaining on Budget Orders and sends one account summary per run via Email, Telegram, and optional Google Sheets
Alert delivery flow — Email, Telegram, and optional Google Sheets. Demo data.

Health statuses

Status Meaning
CRITICAL Estimated days left are equal to or below the configured threshold. With the default CRITICAL_DAYS: 3, estimates of 0, 1, 2, or exactly 3 days are CRITICAL; 4 days or more is OK.
DEPLETED The calculated remaining amount is zero. Always grouped with CRITICAL accounts in notifications.
OK Estimated days left are above the configured threshold.
UNLIMITED The active Budget Order has no spending limit. No day estimate is calculated.
NO_RECENT_SPEND A positive balance exists but average daily spend over the recent window is zero. A day estimate cannot be calculated.
NO_ACTIVE_BUDGET_ORDER No active Budget Order was found on the account. This does not indicate a zero balance — billing may be configured differently.
ERROR The account could not be checked. Reported in the summary without blocking other accounts.

Notification examples

Sanitized demo data — no real account credentials or client information.

Email — daily summary (one per run)

Subject: Google Ads Alert - Account Budget Balance Monitor - Check completed

Account Budget Balance Monitor

Checked at 2026-08-05 09:00

Demo Store (123-456-7890)

Balance: 290 EUR

Estimated coverage: ≈2 days (avg. spend over the last 10 days)

Average daily spend: 100 EUR/day

⚠ Replenishment required

Family Store (234-567-8901)

Balance: 1,840 EUR

Estimated coverage: ≈18 days (avg. spend over the last 10 days)

Average daily spend: 100 EUR/day

Seasonal Store (345-678-9012)

Active Budget Order has no spending limit — coverage is not estimated.

Archive Store (456-789-0123)

Balance: 60 EUR

No recent spend in the last 10 days — coverage forecast unavailable.

Maker Unit: https://maker-unit.com/

Every successfully checked account is listed with its own balance, estimated coverage, and average daily spend. Only accounts with CRITICAL_DAYS or fewer estimated days left show a replenishment flag. Unlimited and no-recent-spend accounts show an explanation instead of an invented number of days. Environment and status counters are not shown here — they remain in ABB Run Log.

Email — all accounts above the threshold

Subject: Google Ads Alert - Account Budget Balance Monitor - Check completed

Account Budget Balance Monitor

Checked at 2026-08-05 09:00

Demo Store (123-456-7890)

Balance: 1,240 EUR

Estimated coverage: ≈12 days (avg. spend over the last 10 days)

Average daily spend: 100 EUR/day

All checked balances are above the 3-day alert threshold.

Maker Unit: https://maker-unit.com/

Every run sends a summary, even when nothing is critical — you always know the script ran and what it found.

Email — check failed

Subject: Google Ads Alert - Account Budget Balance Monitor - Check completed

Account Budget Balance Monitor

Checked at 2026-08-05 09:00

Check failed: no configured account was successfully checked.

Budget balance status is unknown.

Problem details:

• Demo Store (123-456-7890): authorization error

• Family Store (234-567-8901): Budget Order query failed

• Seasonal Store (345-678-9012): request timed out

Maker Unit: https://maker-unit.com/

When zero accounts are successfully checked, the notification never claims balances are fine. It states that budget status is unknown and lists up to three sanitized problem causes; the full technical error stays in ABB Run Log.

Telegram — one message per run

⚠️ Account Budget Balance Monitor

Demo Store (123-456-7890)

Balance: 290 EUR

≈2 days left · avg 100 EUR/day (10-day avg)

⚠ Replenishment required

Family Store (234-567-8901)

Balance: 1,840 EUR

≈18 days left · avg 100 EUR/day (10-day avg)

Seasonal Store (345-678-9012)

Unlimited Budget Order — no coverage estimate.

Telegram is disabled by default. Requires a private bot token and chat ID in your installed copy. Token is redacted in error messages. No Maker Unit name or site URL in Telegram; an optional Google Sheets report link is included only when Sheets is enabled. Link preview is disabled.

Large MCC — critical list is capped

When more accounts are CRITICAL or DEPLETED than MAX_CRITICAL_ACCOUNTS_IN_NOTIFICATION (default: 20) in the same run, the notification details the first accounts up to that limit and reports how many additional critical accounts are hidden. The exact total is always shown. The complete list is available in Google Sheets only if you have enabled it.

Google Sheets — optional, 3 sheets

Sheet 1: ABB Current Balances (upsert per account)

customer_idaccount_namehealth_statusspending_limitremainingaverage_daily_spendestimated_days_leftrun_timestamp
123-456-7890Demo StoreCRITICAL500029010022026-07-29T09:00:00Z

Sheet 2: ABB Event History (append-only)

run_timestampevent_typeprevious_statuscustomer_idaccount_namehealth_statusremainingaverage_daily_spendestimated_days_left
2026-07-29T09:00:00ZSTATUS_CHANGEDOK123-456-7890Demo StoreCRITICAL2901002

Sheet 3: ABB Run Log (append-only)

run_timestampmodeenvironmentaccounts_requestedaccounts_checkedcritical_or_depletedokunlimitederrorsemail_resulttelegram_resultsheets_result
2026-07-29T09:00:00ZPRODUCTIONMCC551310SENTDISABLEDUPDATED

Google Sheets is optional. ABB Current Balances keeps one up-to-date row per Customer ID (upsert). ABB Event History records INITIAL_OBSERVATION and STATUS_CHANGED events only — repeated runs with the same status do not create duplicate rows. ABB Run Log records every run. TEST_MODE creates sheet headers and one TEST row in ABB Run Log; ABB Current Balances and ABB Event History are not modified.

Account Budget Balance Monitor email alert example — script showing CRITICAL accounts with low days remaining on Budget Order balance and estimated spend forecast
Example email alert summary — sanitized demo data, not real account values.

Installation

  1. 1 Open Google Ads → Tools → Bulk actions → Scripts (or MCC Scripts for MCC accounts).
  2. 2 Click New script and paste the complete release artifact.
  3. 3 In the CONFIG block at the top, add your allowed Customer IDs to ACCOUNT_IDS.
  4. 4 Set EMAIL_RECIPIENTS to one or more recipient email addresses.
  5. 5 Leave TELEGRAM_ENABLED: false and GOOGLE_SHEETS_ENABLED: false for the initial test.
  6. 6 Set TEST_MODE: true.
  7. 7 Authorize access — Google Ads read access is required for all runs.
  8. 8 Run Preview and compare the account name, spending limit, start date, and recent spend against your Google Ads Billing → Budget Orders view.
  9. 9 Verify the [TEST] summary email arrives with the correct balance, estimated coverage, and average daily spend for each account.
  10. 10 Test Telegram separately by setting TELEGRAM_ENABLED: true after the bot token and chat ID are configured in your private installed copy.
  11. 11 Enable optional Google Sheets by setting GOOGLE_SHEETS_ENABLED: true and providing a valid GOOGLE_SHEETS_SPREADSHEET_ID. Run Preview to verify the three sheets are created with correct headers and one TEST row in ABB Run Log.
  12. 12 Set TEST_MODE: false.
  13. 13 Configure a daily schedule (recommended: 09:00 in your account timezone).

CONFIG reference

ACCOUNT_IDS string[]

Allowlist of Google Ads Customer IDs to monitor. Required for both MCC and standalone mode. In standalone mode, must include the current account's ID.

CRITICAL_DAYS number

Remaining-days threshold. Estimated days left equal to or below this value triggers CRITICAL (inclusive). Default: 3.

AVERAGING_DAYS number

Inclusive calendar-day window used to calculate average daily spend. Default: 10.

MAX_CRITICAL_ACCOUNTS_IN_NOTIFICATION number

Maximum number of CRITICAL or DEPLETED accounts shown in detail in each notification. Total count is always reported. Default: 20.

NOTIFICATION_LANGUAGE string

Language for notification labels. Supported values: 'en' (English) or 'uk' (Ukrainian). Default: 'en'.

EMAIL_ENABLED boolean

Enables one Email summary per run. Default: true.

EMAIL_RECIPIENTS string[]

One or more email addresses to receive the run summary. Required when EMAIL_ENABLED is true.

TELEGRAM_ENABLED boolean

Enables one Telegram message per run. Default: false. Enable only after credentials are configured and tested in your private copy.

TELEGRAM_BOT_TOKEN string

Telegram bot token. Set only in your private installed copy — never share or commit this value.

TELEGRAM_CHAT_ID string

Destination Telegram chat or group ID. Set only in your private installed copy.

GOOGLE_SHEETS_ENABLED boolean

Enables the optional detailed Google Sheets report. Default: false. The script runs fully without it.

GOOGLE_SHEETS_SPREADSHEET_ID string

ID of an existing Google Spreadsheet the authorized user can write to. Required only when GOOGLE_SHEETS_ENABLED is true.

GOOGLE_SHEETS_CURRENT_SHEET_NAME string

Worksheet name for the current balance snapshot. One row per Customer ID, upserted on each run. Default: 'ABB Current Balances'.

GOOGLE_SHEETS_EVENT_HISTORY_SHEET_NAME string

Worksheet name for the append-only status-change history. Rows are added on INITIAL_OBSERVATION and STATUS_CHANGED events only. Default: 'ABB Event History'.

GOOGLE_SHEETS_RUN_LOG_SHEET_NAME string

Worksheet name for the append-only run log. One row per script execution with counts and delivery results. Default: 'ABB Run Log'.

TEST_MODE boolean

Sends [TEST]-prefixed notifications and creates Sheets structure with one TEST row in ABB Run Log, but does not save production state or write to ABB Current Balances or ABB Event History. Default: false. Use true for initial verification.

BRAND_NAME string

Sender label shown at the bottom of Email notifications only. Default: 'Maker Unit'.

BRAND_URL string

Branding link included at the bottom of Email notifications only.

Limitations

  • Budget Orders are used for account-level consolidated billing — this script is not a universal prepaid or payment balance check.
  • The absence of an active Budget Order does not indicate a zero balance; billing may be configured differently.
  • Average daily spend is based on a calendar window and does not guarantee future spend.
  • Changes to bids, targeting, schedules, and campaigns affect the actual remaining duration.
  • Large MCC accounts may approach the Google Ads Scripts execution quota.
  • Email, Telegram, and Google Sheets delivery depend on external services and authorized permissions.
  • Script state is stored in Script Properties of your installed copy and is not shared between copies.
  • The script does not change budgets, submit top-ups, or make any modifications to your Google Ads account.

Script code

account-budget-balance-monitor-v0.2.0.js 1408 lines

Video walkthrough

Video guide coming soon — follow us on Telegram to get notified.

FAQ

Does it work in MCC and individual accounts?

Yes. In MCC mode it iterates over child accounts listed in ACCOUNT_IDS and processes each one separately. In standalone mode, the current account's ID must be included in ACCOUNT_IDS.

Does it change budgets or perform a top-up?

No. The script is entirely read-only in Google Ads. It reads Budget Order data and account spending, then sends notifications. No budgets, orders, or campaign settings are modified.

What is a Budget Order?

A Budget Order is a Google Ads mechanism used with consolidated billing and managed client accounts. It sets an account-level spending limit and a billing period. This script reads that limit and your account cost since the Budget Order start date to estimate the remaining balance.

Is this the same as campaign budget pacing?

No. This script monitors the account-level Budget Order — a billing mechanism. It does not compare campaign-level budgets to a monthly spend plan or forecast whether individual campaigns are pacing correctly. Campaign budget pacing is a separate concern.

Why does the default alert include exactly three days left?

The threshold is inclusive: estimatedDaysLeft <= CRITICAL_DAYS. With CRITICAL_DAYS: 3, estimates of 0, 1, 2, or exactly 3 days are CRITICAL; 4 days or more is OK. Adjust CRITICAL_DAYS to match your replenishment lead time.

What does UNLIMITED mean?

UNLIMITED means the active Budget Order has no spending limit set. The account can spend freely until the billing period ends. No day estimate is calculated because there is no cap to deplete.

Why can days left be unavailable?

Days left cannot be estimated when average daily spend over the recent window is zero (NO_RECENT_SPEND). The script reports the positive remaining balance but skips the forecast to avoid dividing by zero.

What does No Active Budget Order mean?

The script queried the account but found no active Budget Order. This does not mean the account has a zero balance — billing may be configured differently or the order may not have started yet.

Can I use Email without Telegram?

Yes. EMAIL_ENABLED and TELEGRAM_ENABLED are independent switches. Enable whichever channels you need. Telegram requires a private bot token and chat ID configured in your installed copy.

Is Google Sheets required?

No. Google Sheets is optional. The script runs fully with GOOGLE_SHEETS_ENABLED: false. Enable it when you need a per-account history and run log beyond the daily summary.

What does TEST_MODE do?

TEST_MODE: true reads real Google Ads data, sends summary notifications marked with [TEST], and — when Sheets is enabled — creates the sheet structure and appends one TEST row to ABB Run Log. Production state is not saved, and ABB Current Balances and ABB Event History are not modified.

Can it send to multiple Telegram groups or spreadsheets?

Version 0.2.0 uses one Telegram chat ID and one Spreadsheet ID. The architecture isolates the Telegram and Sheets adapters from the health logic, so multiple destinations can be added in a future version without changing the calculation or sheet schemas.

How do I verify the result?

In TEST_MODE, compare the account name, spending limit, and Budget Order start date in the summary with your Google Ads Billing → Budget Orders UI. Manually calculate remaining = spending limit minus spend since start, then check that the estimated days match floor(remaining / average daily spend).

Why did an alert not arrive?

Check that EMAIL_ENABLED is true and EMAIL_RECIPIENTS contains a valid address. Verify MailApp authorization in Google Ads Scripts and check your spam folder. For Telegram, confirm the bot token and chat ID are correct and the bot has access to the chat.

Get notified when new scripts drop

No spam. Just a short email when a new script is published.

No spam. Unsubscribe any time.