ads-system.store

Before you run any script here

Every script in this library is read-only. Each one reads the account through GAQL and emails you the result. None of them changes a bid, a budget, a keyword or an ad, so you can authorise all of them and the account will look exactly the same afterwards.

That still leaves five things worth checking before you schedule anything. The table further down is generated from what each script declares about itself, so it stays correct as scripts are added.

1. Run it once by hand and read the log

Preview in the scripts editor, then run it once manually before scheduling. The log tells you whether the account holds the data the script expects. A script that returns nothing is usually a data problem, not a code problem.

2. Set EMAIL before anything else

Each script sends its output to one address defined at the top of the file. Nothing reaches you until that constant is yours. Use an address you read daily; a daily alert nobody opens is worse than no alert at all.

3. Confirm conversion tracking actually fires

Some of these read conversion data rather than cost alone. The N-gram waste report defines waste as spend with no conversions, so an account with broken or double-counted conversion tracking produces a confident and wrong list. Check the conversion action counting and attribution settings before trusting the output.

4. Know which campaign types the account holds

AdsApp.campaigns() silently skips Performance Max. The scripts here query FROM campaign in GAQL instead, which returns every channel type. The same knowledge matters in reverse: impression share is not reported for every campaign type, so the impression share loss report covers Search and Shopping and leaves the rest out rather than reporting a zero that looks like a result.

Date formats

GAQL takes yyyy-MM-dd. The older AWQL reports take yyyyMMdd. Passing one format where the other is expected returns an empty result rather than an error, which is why an empty report is the first thing to check.

5. Set thresholds to this account's scale

MIN_COST, THRESHOLD and the alert bands carry values that suit a mid-sized account. On a small account the defaults filter everything out; on a large one they flag everything. Set them against this account's own weekly spend before the first scheduled run.

What each script needs

ScriptNeeds in the accountEdit before runningSchedule
Budget pacing monitorAny account. A monthly budget figure you set at the top.MONTHLY_BUDGET, EMAIL, and the alert band at the top.Daily, early morning
Disapproved ads alertAny account with enabled ads.EMAIL and INCLUDE_LIMITED at the top.Daily
Final URL health checkAny account with enabled ads or keywords.EMAIL and MAX_URLS at the top.Daily
Impression share loss reportSearch or Shopping campaigns. Impression share is not reported for every campaign type.EMAIL, MIN_COST and the two thresholds at the top.Weekly
N-gram waste reportSearch campaigns with search term data. Conversion tracking that fires.EMAIL, MIN_COST, LOOKBACK_DAYS at the top.Weekly
Negative keyword conflict finderSearch campaigns with keywords. Any account.EMAIL and MAX_REPORT at the top.Monthly, and after any negative bulk upload
Spend anomaly alertAny account. Works with Performance Max and Demand Gen.EMAIL, THRESHOLD, MIN_COST at the top.Daily, early morning

Scheduling

A single script run is capped at 30 minutes. Stagger the daily ones across different hours rather than scheduling them all at the same early-morning slot, and give the URL check the widest window, since its runtime scales with the number of URLs it fetches rather than with account spend.

What this does not cover

These scripts report on an account; they do not set one up. Attribution settings, consent, a negative keyword baseline and somewhere for the output to live are one-time configuration decisions, and getting them wrong makes every report above unreliable. That is what the pack is for.

See what is in the pack