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.
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
| Script | Needs in the account | Edit before running | Schedule |
|---|---|---|---|
| Budget pacing monitor | Any 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 alert | Any account with enabled ads. | EMAIL and INCLUDE_LIMITED at the top. | Daily |
| Final URL health check | Any account with enabled ads or keywords. | EMAIL and MAX_URLS at the top. | Daily |
| Impression share loss report | Search 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 report | Search campaigns with search term data. Conversion tracking that fires. | EMAIL, MIN_COST, LOOKBACK_DAYS at the top. | Weekly |
| Negative keyword conflict finder | Search campaigns with keywords. Any account. | EMAIL and MAX_REPORT at the top. | Monthly, and after any negative bulk upload |
| Spend anomaly alert | Any 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.