Weekly
Check for disapproved ads and weak keywords
A weekly email lists disapproved ads and keywords with low quality scores.
- Runs
- Weekly
- Apps
- Google Ads
- AI
- Not needed
- Access
- read
Send this to your assistant
Create a ClickRuntime automation: every Monday, email me disapproved Google Ads ads and keywords with a quality score under 4.
First time? Adding ClickRuntime to your assistant takes about two minutes.
Why use it
Why teams use this automation
A local plumbing company runs Google Ads with a handful of campaigns and a freelancer who checks in monthly. In between, an ad gets disapproved for a policy issue after a landing page edit, and three keywords drop to a quality score of 3. The ads stop serving or get more expensive, and the owner only notices when the phone goes quiet or the card statement looks wrong.
Every week, ClickRuntime queries your Google Ads account for ads whose policy summary shows a disapproval and for keywords with a low quality score, then emails the two lists. No AI is involved: the lists come straight from Google Ads data, so each row is an ad or keyword you can open and fix.
It fits agencies managing many small accounts, where nobody logs in to each one every day.
What you get out of it
Disapproved ads found within days
An ad that stops serving after a policy flag is listed in the next weekly email. You fix the wording or the landing page quickly, instead of losing a month of impressions on your best-converting ad.
Low quality scores explain high costs
Keywords with weak expected CTR or poor landing page experience pay more per click. Seeing them listed gives you a short, specific list to rewrite or pause rather than a vague sense that costs are creeping up.
Agencies can cover more accounts
One email per account replaces a manual login routine. A freelancer with twenty clients can scan each report in a minute and spend billable time only on accounts where something is actually wrong.
Landing page edits stop causing silent damage
When a site change triggers a policy problem, the connection is obvious from the dates. You can roll the page back or request a review before the issue costs you a whole campaign.
A routine check you never skip
Weekly audits happen on schedule even during holidays or busy launches. That consistency matters because the ad problems that hurt most are the ones nobody was looking at. A thirty-second look at the weekly email beats an audit you keep meaning to do.
How it works
What happens, step by step
Every week, ClickRuntime checks your Google Ads account for ads that have been disapproved.
It also looks for keywords with a low quality score.
You get one email with the number of issues in the subject and a line for each ad or keyword that needs attention.
Before it runs live
- Connect Google Ads
What you get
Build your own
Need it to work differently?
Your own rules
Conditions, thresholds, filters and exceptions, written the way you'd explain them to a colleague.
Any number of apps
One automation can read from one app and update several others. Over 248 apps are ready, and anything with an API works too.
AI where it helps
Summaries, classification, extraction and drafts use ClickRuntime's built-in AI, with no extra key.
On a schedule or on each event
Runs as often as every 5 minutes, or the moment an app sends an event, and keeps track of what it already handled.
Changes you can ask for
- Run it at a different time, more or less often, or only on weekdays
- Add an AI step, for example to summarize, sort or draft a reply
- Add another app, for example also send it to Slack
- Combine it with other Google Ads steps into one automation
Under the hood
The code that runs this automation
from clickruntime import on_trigger, credentials, http, notify
CUSTOMER_ID = "1234567890"
def gaql(query):
headers = {"Authorization": f"Bearer {credentials.connection('google', 'ads')}",
"developer-token": credentials.secret("GOOGLE_ADS_DEVELOPER_TOKEN")}
batches = http.post(f"https://googleads.googleapis.com/v21/customers/{CUSTOMER_ID}/googleAds:searchStream",
headers=headers, json={"query": query}).json()
return [row for b in batches for row in b.get("results", [])]
@on_trigger
def run(event):
ads_rows = gaql("SELECT ad_group_ad.ad.id, ad_group.name, ad_group_ad.policy_summary.approval_status "
"FROM ad_group_ad WHERE ad_group_ad.policy_summary.approval_status IN ('DISAPPROVED', 'APPROVED_LIMITED')")
kw_rows = gaql("SELECT ad_group_criterion.keyword.text, ad_group.name, ad_group_criterion.quality_info.quality_score "
"FROM keyword_view WHERE ad_group_criterion.quality_info.quality_score <= 4 AND ad_group_criterion.status = 'ENABLED'")
lines = [f"Ad {r['adGroupAd']['ad']['id']} in {r['adGroup']['name']}: {r['adGroupAd']['policySummary']['approvalStatus']}" for r in ads_rows]
lines += [f"Keyword '{r['adGroupCriterion']['keyword']['text']}' in {r['adGroup']['name']}: quality score "
f"{r['adGroupCriterion']['qualityInfo']['qualityScore']}" for r in kw_rows]
if lines:
notify.email_me(f"Google Ads health: {len(lines)} issues", "\n".join(lines))
return {"issues": len(lines)}FAQ
Common questions
What counts as a disapproved ad in this audit?
What quality score is treated as low?
Do I need a developer token to use this?
What permissions does it need?
Does it need AI?
How many runs does it use?
Can I change how it works?
Related
You might also like
Get last week's results per campaign
Every Monday you see spend, clicks, conversions and cost per conversion for each campaign.
See how it worksCatch campaigns that overspend
You get an email when a campaign spent far more yesterday than it usually does.
See how it worksFind keywords spending with no conversions
Each week you get the keywords that cost money for a month without converting, and can have them paused.
See how it worksKeep exploring
Set up “Check for disapproved ads and weak keywords” from your assistant
Copy the prompt above, or connect your assistant first. Free plan, no credit card.