πŸ“Š Google Ads Scripts

Demand Gen Ads Optimizer

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.

⚠️

Why does it not pause the ads itself?

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 β†’ πŸ† It scores β†’ πŸ“§ It emails the alert β†’ βœ‹ You pause it by hand

The headline features

It analyses, scores and flags how your Demand Gen ads are performing

πŸ“Š

Scoring on 4 metrics

Every ad gets a score weighted across CTR, conversion rate, CPC and CPA. You decide how much each metric counts.

Core
⏱️

Dual score

It blends the whole period with the last 30 days, so a recent decline cannot hide behind a good history.

Core
πŸ”¬

A maturity system

No premature calls. An ad has to pass an impression threshold and a stability check (weekly CV) before it is judged at all.

πŸ“§

Email alerts

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.

Core
πŸ“ˆ

30-day trend

A trend column comparing recent performance against the history. Green = improving, red = declining.

⚑

Early discard

If an immature ad already has enough impressions and performs far below the leader, it is flagged without waiting for full maturity.

The scoring system

4 weighted metrics, all adjustable, that define how an ad is performing

🎯
CTR
20%

Clicks as a percentage of impressions

↑ Higher = better
πŸ’°
Conv rate
20%

Conversions divided by clicks

↑ Higher = better
πŸ’²
CPC
30%

Average cost per click

↓ Lower = better
🏷️
CPA
30%

Cost per conversion

↓ Lower = better

How the process works

The script works in 3 phases to keep watch over your Demand Gen ads and flag what needs attention

1

Diagnosis and scoring

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.

βœ…
BEST
The mature ad with the best score in the ad group
❌
PAUSE
Performing significantly worse than the rest
πŸ”Ά
PREMATURE
Immature, but already performing badly
⏳
ACCUMULATING
Still settling into a stable pattern
⏸️
ON HOLD
Not enough impressions yet
2

The detection rules

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.

πŸ“ Rule 1 β€” Mature: the worst mature ad is past the gap threshold
⚑ Rule 2 β€” Premature: an immature ad with enough impressions is performing far worse
πŸ›‘οΈ Safeguard: Rule 1 only applies when there are at least 2 mature ads
πŸ”„ No duplicates: if an Ad ID is already PENDING in PendingAlerts, it is not repeated
3

Alert, then your call

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.

πŸ“§ An email with the name, ID and score of every candidate
πŸ”— A "Go to the ad group" button straight into Google Ads
πŸ“‹ A running record in the PendingAlerts tab
βœ… Mark it COMPLETED once you have created the replacement

Email alerts

A daily email with the ads that need your attention

The maturity system

Not every ad is ready to be judged. Maturity is what protects you from premature decisions.

⏸️
On hold
Not enough impressions to enter the ranking
β†’
⏳
Accumulating
It has a score, but weekly stability is not confirmed yet (CTR coefficient of variation)
β†’
βœ…
Mature
Past both the impressions and the stable weeks. The pause rules now apply

Your control panel

Everything laid out in one Google Sheet with 6 tabs

βš™οΈ
Config

Scoring weights, impression thresholds, the email address, campaign scope and a reference legend

πŸ“Š
Summary

A visual dashboard with every ad ranked, colour-coded by status, plus a campaign-by-campaign comparison

🚨
PendingAlerts

A running record of the candidates found, each marked PENDING / COMPLETED / DISCARDED

πŸ“…
History

A daily snapshot of every ad's CTR and conversions, used to work out stability (CV)

πŸ“
Log + Manual

A detailed run log and a set-up manual explaining every single parameter

Your workflow

1

Set the parameters

Choose your scoring weights (CTR/Conv/CPC/CPA), the impression thresholds, the campaign scope and the email address.

⏱️ 5 minutes (first time only)
2

Schedule it daily

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 minutes
3

Get the email alert

If there are candidates to pause, an email arrives with the name, ID, score and a direct link to the ad group in Google Ads.

⏱️ Automatic
4

Pause and replace by hand

Go into Google Ads, pause the ad it flagged, create a new one and mark it COMPLETED in the PendingAlerts tab.

⏱️ 5-10 minutes

Optimise your Demand Gen campaigns automatically

Catch the underperforming ads before they spend another euro they should not

Get started WhatsApp

Included in your subscription

πŸ“š

PDF guides

Full documentation with examples and best practice

πŸ‘₯

Telegram community

Join other professionals and swap strategies

⚑ Installed in minutes, with no account access needed

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.