How to monitor ad account health across platforms and get alerted before spend stops
Ad account health has three layers, and most monitoring watches only one: whether the account can serve (suspension, verification, billing), whether the connection reading it is still alive, and whether its numbers have crossed a line. This playbook sets up all three, with the traps we hit running them across 22 platforms.
Layer 1 — can the account serve at all?
Spend that stops overnight is rarely a bidding problem. It is a suspension, an advertiser verification deadline that passed, a billing method that failed, or an account a platform still calls pending. None of those shows up in a performance report until the day the numbers go to zero.
- Google Ads has the most to read: the account status (ENABLED, SUSPENDED, CANCELED, CLOSED), whether advertiser verification is required with its start and completion deadlines, billing setup and account budget status, and disapproved ads by policy topic. One read returns all of it — what the API can and cannot tell you.
- A manager account is where to start: one read lists every child by status, which is the fast way to find the one suspended account among fifty.
- Funding is part of health. On X Ads the agent reads each funding instrument and whether it can currently pay; on Snapchat an ad account without a funding source sits in PENDING until it is added in Snap's own Ads Manager.
- The reason for a Google Ads suspension is not in the API. Google gives it in the interface and by email to the account's admins — so the alert has to reach an admin, not just the analyst.
Layer 2 — is the connection still alive?
The quietest failure is a connection that stopped working. Reports keep running, return nothing or fail, and nobody notices for a week. Every platform's tokens die on a different clock, and two of them are traps.
| Platform | How the connection ends | What to watch |
|---|---|---|
| Google (all products) | Up to 100 refresh tokens per Google account per OAuth client; the 101st silently invalidates the oldest | Re-authorizing again and again from many workspaces |
| LinkedIn Ads | The refresh token lives 365 days from the FIRST authorization, fixed — it never extends | A warning 30 days before; re-authorize before it lapses |
| Reddit, Pinterest, X Ads, Shopify | Refresh tokens rotate: each renewal spends the old one | Two copies of one grant break each other — keep one grant per account |
| GitHub | No expiry; ends when the app is revoked on GitHub | The card reports the revocation |
Layer 3 — have the numbers crossed your line?
A threshold rule watches one metric once a day and emails only when it is breached: "Google Ads cost above 500 a day for 2 days", "Stripe settled revenue down 30% against the previous week", "Klaviyo spam complaints rising". Rules evaluate twice a day on closed days and send at most one email per rule per day; a cooldown can keep them quiet for a few days after each alert.
- Four comparisons: above, below, drop % and rise %. The percentage forms compare each day with the average of the seven days before it.
- Closed days only, in the account's own time zone. A partial today never fires an alert — or hides one.
- A missing day is unknown, not zero. Data lag would otherwise fake a breach on every "below" rule; an unknown day breaks the streak and the email says so.
- 22 platforms take rules, from Google Ads, Meta and TikTok to Shopify, Klaviyo, HubSpot and Stripe. X Ads and GitHub do not yet: X Ads has no closed-day series adapter, and a code host has no spend series to threshold.
The unit traps that make an alert never fire
- GA4 rates are ratios from 0 to 1. A rule "bounce rate above 60" can never fire; the threshold is 0.6.
- Shopify's conversion rate is a ratio too — 2% is 0.02.
- Search Console and YouTube finalize late (about three days), so their rules end on the last finalized day rather than yesterday.
- Stripe settles per currency. A revenue rule reads one settlement currency and names the ones it left out; summing currencies would give a number nobody can act on.
- Money thresholds are in each account's own currency on every platform; nothing is converted.
The setup we recommend
- 1A weekly health check as a schedule. "Every Monday at 9, check every Google Ads account under the manager: list anything not enabled, any advertiser verification due in the next 14 days or overdue, and disapproved ads by policy topic; email the account admins." A schedule runs the whole task and emails its report; report recipients can be any address.
- 2Two or three threshold rules per platform that spends. Cost above a ceiling, conversions or revenue dropping, and — where you have it — Stripe settled revenue dropping, which catches a broken checkout the ad platforms cannot see.
- 3Anomaly detection for what you cannot set a line for. A weekday-aware baseline flags a Tuesday that looks nothing like other Tuesdays.
- 4Fix nothing automatically from an alert. A scheduled run never auto-approves its writes; if a check proposes a change, it waits for a person in the app.
Frequently asked questions
- How do I get alerted if my Google Ads account is suspended?
- Schedule a weekly account-health check that reads every account's status under your manager and emails the account admins anything not enabled, along with advertiser verification deadlines in the next 14 days. The suspension reason itself comes from Google by email and in the Google Ads interface.
- Why does my GA4 bounce rate alert never fire?
- GA4 reports bounce rate and engagement rate as ratios from 0 to 1, not percentages. A rule 'bounce rate above 60' can never be true; write 0.6.
- Why do threshold alerts fire falsely after a data delay?
- Usually because a missing day is counted as zero, which breaches every 'below' rule. A day with no data should be unknown: it breaks the streak instead of firing.
- How many refresh tokens can a Google account have?
- Google documents a limit of 100 refresh tokens per Google account per OAuth client; issuing a 101st silently invalidates the oldest, which looks like a random disconnect.
- Can alerts automatically fix the problem?
- Alerts only report. A scheduled run that proposes a change never auto-approves it; the change waits for a person in the app.