Missing Products Monitor
Finds products that were driving conversions in your Shopping and Performance Max campaigns but are now missing from the campaign or not eligible to serve. Writes findings and a per-campaign bidding-signal risk summary to a spreadsheet, with optional email alerts.
by Dmytro Tonkikh·chiliad.io
Overview
Converting products that silently drop out of a campaign (feed disapprovals, listing-group exclusions, out of stock) are the product disappearances that actually cost you money. This script diffs each Shopping/PMax campaign's converting products (from shopping_performance_view) against its current serving product set (from shopping_product) and flags any converter that is now MISSING or not eligible. Built for large accounts: it checkpoints progress in a hidden state tab and resumes across scheduled runs, so a full cycle completes even past the 30-minute script limit.
Setup
- 1Open your Google Ads account and go to Tools → Bulk Actions → Scripts.
- 2Click the + button to create a new script and paste the code below.
- 3(Optional) Put an existing spreadsheet URL in SPREADSHEET_URL — leave it empty and the first run creates one (URL appears in the logs; paste it into the config afterwards so every run reuses the same file).
- 4(Optional) Add addresses to EMAIL_RECIPIENTS to get an alert when a cycle completes with findings.
- 5Adjust LOOKBACK and MIN_CONVERSIONS to define what counts as a converting product.
- 6Authorize and preview once, then schedule: hourly for large accounts (cycles complete across runs); daily is fine for small accounts.
- 7Don't edit or delete the hidden _monitor_state tab — the script uses it to checkpoint and resume.
Configuration Variables
| Variable | Default |
|---|---|
SPREADSHEET_URL | (empty) |
OUTPUT_SHEET | missing_converters |
IMPACT_SHEET | campaign_impact |
RISK_HIGH_PCT | 30 |
RISK_MEDIUM_PCT |
Expected Output
Resuming cycle 2026-07-07: 42/117 campaigns done. This run: 35 campaign(s), 12 product(s) flagged. Remaining in cycle: 40 Cycle continues next run (40 campaigns left). Schedule this script hourly to finish cycles faster. --- and on the final run of a cycle --- Started new cycle 2026-07-07 over 23 campaigns. This run: 23 campaign(s), 4 product(s) flagged. Remaining in cycle: 0 Alert email sent to: you@example.com Cycle 2026-07-07 COMPLETE. Sheet: https://docs.google.com/spreadsheets/d/...
Notes
Read-only towards your campaigns — it only writes to the spreadsheet. MISSING means the item left the campaign's product set (dropped from the feed, excluded by listing groups, out of stock); any other flagged state is the product's current non-serving status from Google Ads. The email goes out only when a full cycle completes with findings, so on large accounts alerts arrive once per cycle, not once per run.