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

Free Google Ads Script

Multi-Account Budget Pacing Monitor

Track monthly budget pacing for up to 30 accounts in one daily run. Know which accounts are overpacing, underpacing, or exhausted — before your client notices.

This script tracks a monthly budget you define in CONFIG — it is not linked to Google Ads Budget Orders or billing limits.

What it monitors

  • Monthly budget per account — you define each account's budget in CONFIG; the script does not read it from Google Ads
  • Actual spend — real spend for the current calendar month in the account's time zone
  • Linear plan — proportional monthly target for today's date: budget × (days elapsed / days in month)
  • Deviation — how far actual spend is from the linear plan, expressed as a percentage
  • End-of-month forecast — projected total if the current daily pace continues unchanged
  • Remaining budget — how much of the monthly budget is left to spend
  • Required daily spend — what average daily spend is needed to finish the month exactly on budget

Calculation

linear plan = monthlyBudget × (daysElapsed / daysInMonth)

deviation = ((actualSpend − linearPlan) / linearPlan) × 100

forecast = actualSpend / daysElapsed × daysInMonth

remaining = monthlyBudget − actualSpend

required daily spend = remaining / daysRemaining

Linear pacing is a reference benchmark. It does not account for seasonality, weekends, or campaign flight dates.

How Multi-Account Budget Pacing Monitor works — Google Ads Script checks spend pacing across multiple accounts and sends one summary per run via Email, Telegram, and optional Google Sheets
Pacing check delivery flow — Email, Telegram, and optional Google Sheets. Demo data.

Pacing statuses

Status Meaning
BUDGET_EXHAUSTED Actual spend has reached or exceeded the monthly budget. No more spend is expected this month under the current budget.
NO_SPEND No spend recorded since the start of the month. The account may be paused, have no active campaigns, or be newly added.
OVERPACING Spend is ahead of the linear plan by more than the configured tolerance. At this pace, the budget will be exhausted before month end.
UNDERPACING Spend is behind the linear plan by more than the configured tolerance. At this pace, the budget will not be fully spent by month end.
ON_TRACK Deviation is within the configured tolerance (±PACING_TOLERANCE_PERCENT). Accounts at exactly the tolerance boundary count as ON_TRACK.
ERROR The account could not be accessed or its data could not be read. Does not block other accounts or notification delivery.

Notification examples

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

Email — one summary per run (accounts need attention)

Subject: Google Ads Alert - Multi-Account Budget Pacing Monitor - Check completed

Multi-Account Budget Pacing Monitor

Check completed

Environment: MCC

Accounts checked: 5

Overpacing: 1

Underpacing: 1

Budget exhausted: 0

No spend: 0

On track: 3

Errors: 0

Overpacing: E-commerce Demo (123-456-7890)

Monthly budget: 5 000 EUR

Actual spend: 2 100 EUR

Linear plan: 1 667 EUR

Deviation: +26.0%

Forecast: 6 300 EUR

Remaining: 2 900 EUR

Required daily: 181 EUR

Underpacing: SaaS Demo (987-654-3210)

Monthly budget: 3 000 EUR

Actual spend: 600 EUR

Linear plan: 1 000 EUR

Deviation: -40.0%

Forecast: 1 800 EUR

Remaining: 2 400 EUR

Required daily: 240 EUR

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

One email per run. Non-ON_TRACK accounts are listed in detail with deviation, forecast, remaining, and required daily spend. ON_TRACK accounts are shown as a count only.

Email — all accounts on track

Subject: Google Ads Alert - Multi-Account Budget Pacing Monitor - Check completed

Multi-Account Budget Pacing Monitor

Check completed

Environment: STANDALONE

Accounts checked: 1

Overpacing: 0

Underpacing: 0

Budget exhausted: 0

No spend: 0

On track: 1

Errors: 0

All accounts are on track.

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

Every run sends one summary. You always know the script ran even when all accounts are on track.

Telegram — one message per run

⚠️ Multi-Account Budget Pacing Monitor

Check completed

Environment: MCC

Accounts checked: 5

Overpacing: 1

Underpacing: 1

Budget exhausted: 0

No spend: 0

On track: 3

Errors: 0

Overpacing: E-commerce Demo (123-456-7890)

Deviation: +26.0% · Forecast: 6 300 EUR

Underpacing: SaaS Demo (987-654-3210)

Deviation: -40.0% · Forecast: 1 800 EUR

Telegram is disabled by default. Requires a private bot token and chat ID in your installed copy. No Maker Unit branding in Telegram messages.

Google Sheets — optional, 3 sheets

Sheet 1: BPM Current Pacing (upsert per account)

customer_idaccount_namepacing_statusmonthly_budgetactual_spendlinear_plandeviation_pctforecastremainingrequired_dailyrun_timestamp
123-456-7890E-commerce DemoOVERPACING500021001667+26.0630029001812026-07-29T09:00:00Z

Sheet 2: BPM Event History (append-only)

run_timestampevent_typeprevious_statuscustomer_idaccount_namepacing_statusdeviation_pctforecastremaining
2026-07-29T09:00:00ZSTATUS_CHANGEDON_TRACK123-456-7890E-commerce DemoOVERPACING+26.063002900

Sheet 3: BPM Run Log (append-only)

run_timestampmodeenvironmentaccounts_checkedoverpacingunderpacingexhaustedno_spendon_trackerrorsemail_resulttelegram_resultsheets_result
2026-07-29T09:00:00ZPRODUCTIONMCC5110030SENTDISABLEDUPDATED

Google Sheets is optional. BPM Current Pacing keeps one up-to-date row per Customer ID (upsert). BPM Event History records INITIAL_OBSERVATION and STATUS_CHANGED events only — repeated runs with the same status do not create duplicate rows. BPM Run Log records every run.

Multi-Account Budget Pacing Monitor email alert example showing accounts with spend pacing deviations from expected linear plan with UNDERPACING and OVERPACING status
Example pacing alert summary — sanitized demo data, not real account values.

Setup

  1. 1 Open Google Ads Scripts in your MCC or standalone account.
  2. 2 Create a new script and paste the full multi-account-budget-pacing-monitor.js code.
  3. 3 Edit only the CONFIG block — do not change logic outside it.
  4. 4 Fill in ACCOUNT_BUDGETS: add one entry per account with customerId and monthlyBudget.
  5. 5 Set PACING_TOLERANCE_PERCENT if needed (default: 10 means ±10% from the linear plan).
  6. 6 Add your email address to EMAIL_RECIPIENTS.
  7. 7 Set TEST_MODE to true for your first run.
  8. 8 Click Preview — verify spend figures match what you see in Google Ads.
  9. 9 Check the email you received and confirm it looks correct.
  10. 10 (Optional) Add your Telegram bot token and chat ID, run Preview again to test Telegram.
  11. 11 (Optional) Enable Google Sheets: set GOOGLE_SHEETS_ENABLED to true, add GOOGLE_SHEETS_SPREADSHEET_ID, run Preview and confirm three tabs are created.
  12. 12 Set TEST_MODE to false.
  13. 13 Set a daily schedule — morning is recommended so you see alerts at the start of your working day.

CONFIG reference

ACCOUNT_BUDGETS Array<{customerId, monthlyBudget}>

List of accounts to monitor. Each entry requires a customerId string (format: '123-456-7890') and monthlyBudget number. Supports up to 30 accounts. Required.

PACING_TOLERANCE_PERCENT number

Acceptable deviation from the linear plan in percentage points. Default: 10. Accounts at exactly ±10% count as ON_TRACK. Increase to reduce noise; decrease for stricter monitoring.

MAX_ACCOUNTS_IN_NOTIFICATION number

Maximum number of non-ON_TRACK accounts shown in detail in notifications. Default: 20. ON_TRACK accounts are always shown as a count only.

NOTIFICATION_LANGUAGE string

Language for notification text. Options: 'en', 'uk', 'ru'. Default: 'en'. Affects email and Telegram message language.

EMAIL_ENABLED boolean

Send an email summary after each run. Default: true. One email per run regardless of account count.

EMAIL_RECIPIENTS string[]

Array of email addresses to receive the summary. Set only in your installed copy — never commit real addresses.

TELEGRAM_ENABLED boolean

Send a Telegram message after each run. Default: false. Requires TELEGRAM_BOT_TOKEN and TELEGRAM_CHAT_ID.

TELEGRAM_BOT_TOKEN string

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

TELEGRAM_CHAT_ID string

Telegram chat or group ID where the bot will post messages. Set only in your private installed copy.

GOOGLE_SHEETS_ENABLED boolean

Log pacing data to Google Sheets. Default: false. Requires GOOGLE_SHEETS_SPREADSHEET_ID. An error in Sheets does not block email or Telegram delivery.

GOOGLE_SHEETS_SPREADSHEET_ID string

ID of the target Google Spreadsheet (from the URL). Set only in your private installed copy — never commit this value.

GOOGLE_SHEETS_CURRENT_SHEET_NAME string

Name of the tab that holds the current pacing snapshot (one row per Customer ID, upsert). Default: 'BPM Current Pacing'.

GOOGLE_SHEETS_EVENT_HISTORY_SHEET_NAME string

Name of the append-only tab for INITIAL_OBSERVATION and STATUS_CHANGED events. Default: 'BPM Event History'.

GOOGLE_SHEETS_RUN_LOG_SHEET_NAME string

Name of the append-only tab that records every run. Default: 'BPM Run Log'.

TEST_MODE boolean

Adds [TEST] prefix to notifications and skips scheduling checks. Default: false. Use for initial setup and verification runs.

BRAND_NAME string

Your agency or brand name shown in the email footer. Default: 'Maker Unit'.

BRAND_URL string

URL linked from the brand name in the email footer. Default: 'https://maker-unit.com'.

Limitations

  • Linear pacing is a reference benchmark, not a recommendation — it does not account for seasonality, weekends, promotional periods, or your business plan.
  • Google Ads may spend a daily budget unevenly; actual end-of-month spend can differ from the forecast.
  • Monthly budget is set manually in CONFIG and does not update automatically at the start of each new month.
  • Currencies across different accounts are not converted or summed — each account is evaluated independently.
  • The script does not modify campaign budgets, bids, targeting, or any other Google Ads settings.
  • Supports up to 30 accounts per run. For larger portfolios, run multiple script instances.
  • Does not integrate with Google Ads billing limits or Budget Orders — tracks only against your CONFIG value.
  • Requires Google Ads Script execution permissions and access to each monitored Customer ID.

Script code

multi-account-budget-pacing-monitor-v0.1.0.js 763 lines

Video walkthrough

Video walkthrough coming soon.

FAQ

What is budget pacing?

Budget pacing means tracking how evenly your ad spend is distributed throughout the month. A perfectly paced account spends the same proportion of its budget each day. Overpacing means spending too fast; underpacing means spending too slowly. This script uses a linear model as a reference point.

How is the linear plan calculated?

Linear plan = monthlyBudget × (daysElapsed / daysInMonth). For example, on the 10th of a 30-day month, the expected spend is 33.3% of the budget. This is a simple benchmark — it does not account for weekends, seasonality, or campaign flight dates.

How is deviation calculated?

Deviation = ((actualSpend − linearPlan) / linearPlan) × 100. A positive deviation means overpacing; negative means underpacing. Accounts within ±PACING_TOLERANCE_PERCENT are marked ON_TRACK.

What does OVERPACING mean exactly?

OVERPACING means the account's actual spend is more than PACING_TOLERANCE_PERCENT above the linear plan. At the current daily pace, the monthly budget will be exhausted before the month ends. The default tolerance is 10%.

Does this work for a single account, not just MCC?

Yes. You can run the script in a standalone account by adding just one entry to ACCOUNT_BUDGETS. The script works identically in MCC and standalone mode.

How many accounts can I monitor?

Up to 30 accounts per run. If you manage more, run multiple script instances with different ACCOUNT_BUDGETS lists, or contact us about a custom solution.

Why are different currencies not summed?

Summing amounts in different currencies without conversion would produce meaningless totals. Each account is evaluated independently against its own monthlyBudget in its own currency.

Can I set a different budget each month?

Not automatically. You update the monthlyBudget values in CONFIG manually. The script applies the current CONFIG values to the current month and all future months until you change them.

What's the difference between this and Account Budget Balance Monitor?

Account Budget Balance Monitor tracks Google Ads Budget Orders — the billing-level spend limit tied to your payment profile. This script tracks a monthly budget you define yourself in CONFIG. Use ABBM if you rely on Budget Orders; use this script if you set per-account monthly targets manually.

Does the script change anything in Google Ads?

No. The script is read-only. It only reads spend data and sends notifications. It never modifies campaign budgets, bids, statuses, or any other setting.

What is TEST_MODE?

TEST_MODE adds a [TEST] prefix to email subjects and Telegram messages, and skips scheduling validation. Use it during setup to verify the output looks correct without risking false alerts to your team.

Is Google Sheets required?

No. Google Sheets logging is optional and off by default. Email is on by default. Each channel — email, Telegram, Sheets — is independent and can be enabled or disabled separately.

Get notified when this script updates

No spam. A short email when v0.2.0 or higher drops.

No spam. Unsubscribe any time.