It finds the worst-performing Demand Gen ad in every ad group, on its own.
You get an email listing the candidates to pause, ready to be replaced with fresh ads.
The Google Ads Scripts API currently allows neither pausing nor editing ads in Demand Gen campaigns. So the script identifies the underperforming ads and emails you the candidates to pause, leaving you to pause them in Google Ads and create the replacement.
It analyses, scores and flags how your Demand Gen ads are performing
Every ad gets a score weighted across CTR, conversion rate, CPC and CPA. You decide how much each metric counts.
CoreIt blends the whole period with the last 30 days, so a recent decline cannot hide behind a good history.
CoreNo premature calls. An ad has to pass an impression threshold and a stability check (weekly CV) before it is judged at all.
A daily email with the ads that are candidates to pause: name, ID, score and a link straight to the ad group in Google Ads.
CoreA trend column comparing recent performance against the history. Green = improving, red = declining.
If an immature ad already has enough impressions and performs far below the leader, it is flagged without waiting for full maturity.
4 weighted metrics, all adjustable, that define how an ad is performing
Clicks as a percentage of impressions
β Higher = betterConversions divided by clicks
β Higher = betterAverage cost per click
β Lower = betterCost per conversion
β Lower = betterThe script works in 3 phases to keep watch over your Demand Gen ads and flag what needs attention
Using GAQL (Google Ads Query Language), the script pulls the data for every active ad in your Demand Gen campaigns. It then works out a dual score, blending whole-period performance with the last 30 days.
Two complementary rules pick out the candidates to pause. A low score on its own is not enough: the ad has to sit a configurable minimum gap below the best ad in the group.
The candidates it finds are written to the PendingAlerts tab of the spreadsheet, and a smartly designed daily email goes out with links straight to the ad group in Google Ads, ready for you to pause and replace.
A daily email with the ads that need your attention
My Company | 12/03/2026 09:00
2 ad(s) are underperforming. Pause them manually in Google Ads.
| Campaign / Ad group | Ad to pause | Score | Gap | Action |
|---|---|---|---|---|
|
DG - Lead Generation
Similar Audience
|
Discover our offers
ID: 987654321
|
42.1 | 38.5% | Go to the ad group |
|
DG - Summer Remarketing
Site visitors 30d
|
Last chance - 20% off
ID: 123456789
PREMATURE
|
31.8 | 52.1% | Go to the ad group |
Not every ad is ready to be judged. Maturity is what protects you from premature decisions.
Everything laid out in one Google Sheet with 6 tabs
Scoring weights, impression thresholds, the email address, campaign scope and a reference legend
A visual dashboard with every ad ranked, colour-coded by status, plus a campaign-by-campaign comparison
A running record of the candidates found, each marked PENDING / COMPLETED / DISCARDED
A daily snapshot of every ad's CTR and conversions, used to work out stability (CV)
A detailed run log and a set-up manual explaining every single parameter
Choose your scoring weights (CTR/Conv/CPC/CPA), the impression thresholds, the campaign scope and the email address.
β±οΈ 5 minutes (first time only)Set a daily trigger in Google Ads Scripts. The script runs, does the analysis and sends the results to the sheet and to your inbox.
β±οΈ 2 minutesIf there are candidates to pause, an email arrives with the name, ID, score and a direct link to the ad group in Google Ads.
β±οΈ AutomaticGo into Google Ads, pause the ad it flagged, create a new one and mark it COMPLETED in the PendingAlerts tab.
β±οΈ 5-10 minutesCatch the underperforming ads before they spend another euro they should not
Get started WhatsAppFull documentation with examples and best practice
Join other professionals and swap strategies
You no longer need to link your account to any manager account (MCC) or give anyone access: you log in to your client panel, download the script loader and paste it into your own Google Ads account. Done. Zero friction β and you keep full control of who can see your account.