how to NOT use scripts

How to NOT use scripts:

One of my students proudly presented a Google Ads script that would make 5% changes back and forth to budgets and tROAS on a weekly basis, just to “look busy.”

I immediately removed him from the class, of course 😉

– Nils

PS: Want to learn the exact prompts for creating scripts of real value with the help of ChatGPT?

Sign up for my next ‘5-Day ChatGPT and Google Ads Scripts Challenge’:

LINK: https://nilsrooijmans.com/5-day-chatgpt-and-google-ads-scripts-challenge-2025/

Data exclusions don’t affect conversion reporting

Here’s an email I got from a team member this morning:

“Hey Nils, I’ve excluded the faulty conversion data for Oct 12-14, but Google is still showing the conversions in the conversion column.” 

True. 

It’s not obvious, and IMO doesn’t make any sense, but still:

“Data exclusions only affect the data that Smart Bidding uses. You can still find these excluded conversions in your reporting.”

SOURCE: https://support.google.com/google-ads/answer/10370710?hl=en

Another thing about data exclusions that is far from intuitive, but DOES make sense:

“Data exclusions apply to clicks: Your data exclusions must exclude clicks that could have had the affected conversions attributed to them. When these clicks are excluded, the associated conversions are also excluded.” 

This means that if conversion tracking showed a defect October 12-14, and a big chunk of your conversions (i.e., >30%) take more than 1 day from last interaction to convert with a conversion delay of 2 days, you might want to exclude more clicks (i.e., October 10-14).

Makes sense, but not intuitive at all, if you ask me. If you agree, I recommend you discuss with your colleagues to get your head around it.

– Nils

[AMA] “What do advertisers get wrong with (scripts) automation?”

Yesterday, we talked about how automation doesn’t replace strategy. (Email shared below for your convenience.)

Today, fellow member of the list Mark Andoljšek (name shared with permission) asked:

“What’s the one thing most advertisers still get wrong with (scripts) automation of Google Ads?”

Thanks for asking, Mark!

Here’s a common “missed opportunity”: I see a lot of advertisers automate outputs, not inputs. They’re happy to let scripts add negatives, pause ads, or tweak budgets — but they never automate the data feeding the system.

Examples:

  • They’ll have a script running that adjusts CPA targets for smart bidding while the OCI conversion tracking is buggy without them noticing, or
  • They’ll have a script labeling products (“hero,” “zombies,” etc.) while the product data in the feed is outdated, or
  • They’ll have a script pause low-performing keywords while the landing pages for out-of-stock products are still part of the RSA.

Garbage in -> garbage out.

Want a real edge?

Automate data hygiene, such as by using:

  • Scripts that alert when conversion tags stop firing.
  • Scripts that check feed freshness every hour.
  • Scripts that check for out-of-stock landers or broken links.

Automation isn’t only about “doing more.” It’s also about feeding better signals so the machine can actually work for you, not against you.

Cleaner inputs. Smarter automation. More profit.

Happy scripting!

– Nils

PS: I’m trying to help some more PPC friends by answering questions via an ‘Ask Me Anything’ each Wednesday. If you’ve got a question to which my answer would benefit a larger part of the community, send it my way, and I’ll try to answer it 🙂

PPS: Here’s the link to yesterday’s email: https://nilsrooijmans.com/daily/automation-doesnt-replace-strategy

Automation doesn’t replace strategy

Always remember: automation doesn’t replace strategy. It amplifies it — for better or worse.

Too many accounts I audit look like this: PMax and Smart Bidding everywhere, zero strategy behind it. No clear objectives, no structure, no well-defined targets, no profit tracking, no guardrails, no clue. Just Google “optimizing” itself into your client’s wallet.

Think of Smart Bidding like a self-driving car: great at following a route, terrible at picking destinations. If you don’t set the destination, Google will — and it always leads to Mountain View. If you don’t define what “good” looks like (e.g., profit, ROAS, CPA, new customers), Google will define it for you -> it optimizes for spend, not success.

So before you turn on PMax / smart bidding, ask yourself:

  1. What is the machine optimizing towards? 
    * Have you translated business objectives into the right Google Ads goals?
  2. Does the machine get the right input? 
    * Are you tracking the thing you want to optimize for? (e.g., profit, new customers)
    * Are you feeding the machine the right data? (product data, audience data, creatives)
  3. What do you do when the machine gets it wrong?
    * Too much wasted spend in the learning phase? (how to prevent/anticipate)
    * Campaign not meeting its target? (how to fix beyond simply editing the tROAS/tCPA setting)

Implement your strategy first. Build scripts or automated rules to monitor if the machine starts drifting off-course. Guide it — don’t blindly trust it.

Otherwise, automation won’t save you time. It’ll just make your mistakes happen faster.

– Nils

PS: Here’s a link to my SMX Advanced session that presents some ideas and scripts related to the above.

easy way to share negative keyword lists across your accounts

Are you still copying negative keyword lists between accounts?

Here’s your PPC Productivity tip for the day:

You can use the Shared library in your manager account to create, edit, and remove negative keyword lists that can be applied to your client accounts.

If you’ve been laboriously adding the same lists of negative keyword accounts manually, this is for you.

I use them to share generic negative keyword lists that are not client-specific. 

Examples include negative keyword lists for:
– HR-related (“jobs,” “resume,” etc.) 
– Question words (“how,” “what,” “when,” etc)
– DIY (“diy,” “make,” “create,” “do it yourself,” “home made,” etc.)

Here’s how to create and share these lists in your manager account:  https://support.google.com/google-ads/answer/7519927?hl=en

NOTE: When you create negative keyword lists in your manager account, they’re added to the Shared library of all your client accounts by default. Your clients can see all the shared lists in your manager account.

– Nils

my negative keyword list naming convention

When it comes to naming my negative keyword lists, I prefer to use the following template: asterisk + descriptive name in all caps.

Here are examples:

  * ACCOUNT NEGATIVES  
  * COMPETITOR BRANDS
  * LOCATION NEGATIVES
  * QUESTION WORDS

Here’s why: in the Google Ads UI, when looking at the negative keywords and keyword lists in your campaigns, Google sorts them alphabetically. This makes it difficult to quickly see what negative keyword lists are attached to your campaigns, as they are buried between the negative keywords.

Adding the asterisks in front of the names of your negative keyword lists makes it easier to see all the lists attached to your campaign at a glance.

Here’s what that looks like:

– Nils

When GPT returns invalid code: how to fix it

Long-time member of the list and script fanatic Alberto Esteves Correia (name shared with permission) asked:

“Some people think GPT will do everything for them, even if they know nothing about programming or scripting.

When GPT returns invalid code, how to get out of it?”

It’s true: most LLMs still hallucinate a lot when it comes to Google Ads Scripts and often return code that is broken.

Here’s how to fix that and learn some things along the way (works for any LLM):

1. Assign ChatGPT the role of a Google Ads Script developer tasked with debugging the code.
2. Copy-paste the code. Then, ask ChatGPT to explain the code that shows the issue.
3. Copy-paste the error. Then, ask ChatGPT to explain the error message.
4. Ask ChatGPT to fix the code and explain the fix.
5. If a new error message pops up: rinse and repeat steps 2, 3, and 4.
6. If the same error message pops up: 
  6.1: Ask ChatGPT to find supporting documentation on the Google Ads Scripts Developer documentation site.
  6.2: Copy-paste the documentation into ChatGPT.
  6.3: Repeat steps 2, 3, and 4.

If all that doesn’t work, post your issue on the Google Ads Scripts Developer Forum: https://groups.google.com/g/adwords-scripts

Want to learn the exact prompts I use to get the most out of ChatGPT script development?

Sign up for my next 5-Day ChatGPT and Google Ads Scripts Challenge.

Link: https://nilsrooijmans.com/5-day-chatgpt-and-google-ads-scripts-challenge-2025/

– Nils

GPT power

Last week, I shared my Custom GPT for Google Ads scripting with you.

Fellow member of the list Klára Bognár (name shared with permission) put it to the test. Here’s her experience:

“I just wanted to thank you for creating this custom GPT. It really helped me simplify what seemed to be a very complex problem.

Before finding your GPT, I had tried three different AI models (ChatGPT, Claude.ai, and Gemini) to figure out how to add and remove headlines in PMax campaigns using Google Ads Scripts with time-based scheduling.

All of them concluded that it could only be done with a combination of Google Sheets + Apps Script + a GCP project for OAuth, and I even started developing such a solution. But that approach turned out to be complicated to share with colleagues due to the developer tokens and OAuth credentials.

I didn’t give up hope and asked your custom GPT if there might be another way — and now it’s actually working, entirely within Google Ads Scripts!

Win!

Thanks for sharing, Klára. I hope this experience will convince others to give the Google Ads Scripts Sensei a try.

Here’s the link again:
https://chatgpt.com/g/g-68d80c18068c819186aeb92dde66348e-nils-script-sensei

I recommend you go play around with it for the next 10-15 minutes and let me know how it goes.

Happy scripting!

[AMA] “Can you share a custom GPT to help us with Google Ads Scripts?”

Fellow member of the list, Wijnand Meijer (name shared with permission), asked:

“In your presentations, you often talk about custom GPTs to help with scripting. Can you share it?”

Sure thing!

My “Google Ads Scripts Sensei” will help you understand, fix, and create Google Ads Scripts 🙂

Zero coding skills needed.

Here it is:
https://chatgpt.com/g/g-68d80c18068c819186aeb92dde66348e-nils-script-sensei

I recommend you go play around with it for the next 10-15 minutes and let me know how it goes.

Happy scripting!

– Nils

PS: I’m trying to help some more PPC friends by answering questions via an ‘Ask Me Anything’ each Wednesday.

If you’ve got a question to which my answer would benefit a larger part of the community, send it my way, and I’ll try to answer it 🙂

what script to create, and 50% discount on AdworldExperience

When determining what script to create next, ask yourself: 

What went terribly wrong this week/month?

Then, feed that issue into your favorite LLM and ask it:

“Suggest 3 ideas for a Google Ads Script that would prevent {issue}”

Start there. 

Master the art of coming up with ideas for scripts that create real value. 

Then advance.

– Nils

P.S. I’ve got two tickets with a 50% discount on next week’s edition of AdworldExperience (Bologna, Oct 2-3). If you’re interested, reply within the next 24 hours. The random price draw will be tomorrow morning (Saturday) CET. Here’s the program: https://www.adworldexperience.it/en/program/

[AMA] “How do you handle budget increases when campaigns are limited by budget?”

Fellow member of the list, Marcus Halberstram (fake name for privacy), asked:

“I made the mistake of doubling our budget. […] The campaign ROAS was around 500%; it’s now below 300%. CPC exploded. 

How do you handle budget increases when campaigns are limited by budget?”

Ouch! That’s a BIG drop in ROAS there. 

The reason CPCs exploded was caused by the campaign “overperforming” its ROAS target, combined with the drastic budget increase by Marcus.

Remember: Google will try to spend as much as it can as long as you let it!

If Google’s smart bidding is meeting its ROAS targets and you are suddenly giving it waaaay more budget to spend, it will spend it!

However, the algorithms often get thrown off, spending a lot of money on clicks that do not convert.

To prevent this, I have 3 things in place:

1) Part of my SOP: instead of making massive changes to campaign budgets, I rarely increase budgets by more than 20% per week
2) I am a big fan of portfolio bid strategies with a CPC bid limit. This prevents exploding CPCs
3) Google Ads Script: campaign spend alerts. This script warns me when any campaign shows a significant (*) change in yesterday’s spend compared to the same day for the last 8 weeks.  

(*): a change is considered “significant” when the delta is over 1.5 times the standard deviation  

– Nils

PS: If you don’t know Marcus Halberstram, then don’t worry, neither do most of his colleagues 😉

PPS: I’m trying to help some more PPC friends by answering questions via an ‘Ask Me Anything’ each Wednesday. If you’ve got a question to which my answer would benefit a larger part of the community, send it my way, and I’ll try to answer it 🙂

[AMA] “Why would I want to exclude mobile app categories in Display?”

Fellow member of the list, Arnoud Adam (name shared with permission), asked:

“Why would I want to exclude mobile app categories in Display?” 

Short answer here: unless you love paying for fat-fingered clicks from Candy Crush kids, mystery placements, and apps that never convert, excluding app categories is your wallet’s best friend.

In-app advertising is notorious for irrelevant placements, fraudulent and accidental clicks, and poor engagement and conversion rates.

Don’t believe me? Read what the researchers have to say:

  1. “An Empirical Study of In-App Advertising Issues” https://arxiv.org/abs/2008.12112
  2. “Automated Ad Fraud Detection for Android Apps” https://arxiv.org/abs/1709.01213

In my experience, excluding all mobile apps can cause a drop in impressions but often results in an improvement in conversion rate / ROAS, because many app placements were low quality or non-converting.

Here’s how to exclude all Mobile App Placements from all the campaigns (including PMax and Demand Gen) in your account:

https://nilsrooijmans.com/excluding-all-mobile-app-placements-the-quicker-and-easier-way/

BONUS TIP: When running PMax campaigns, be sure to run this script to check all your Placements (including Non-App placements like video, etc):

https://nilsrooijmans.com/google-ads-script-pmax-placement-exclusion-suggestions/

– Nils

PS: I’m trying to help some more PPC friends by answering questions via an ‘Ask Me Anything’ each Wednesday.

If you’ve got a question to which my answer would benefit a larger part of the community, send it my way, and I’ll try to answer it 🙂

3 ideas for automated accounts audits

I am in London (UK) this week for a speaking gig at Search Marketing eXpo (SMX London).

My session is titled: “Little-known tactics to audit your Google Ads account (partly automated, of course)” 

If you’re at the event, don’t be a stranger, come say hi. 🙂

Here are three of the 20+ ideas I’ll be talking about:

1) Ad Extensions Usage Audit

Check the top campaigns to ensure they’re using all recommended ad extensions, customized at the campaign/ad group level to increase CT, CVR, and QS (think: sitelinks, callouts, snippets).

Script the process so that you get a list of the top campaigns that could be improved with campaign-level assets. Run monthly.

2) Outdated Ad Copy Checker

Scan for old dates (i.e., ‘2024’) or expired promotions (i.e., ‘BF Discount’) in ad copy to keep messaging current.

Script the process so that you get an email with a link to outdated ads. Run weekly.

3) Geo-Performance Auditor

Analyse performance by geographic region to refine geo-targeting and budget allocation. Exclude or segment underperforming regions.

Script the process so that you get an email if a region is significantly under- or overperforming. Run monthly.

– Nils

[AMA] “Why does nobody in the industry talk about scripting for Microsoft Ads?”

Fellow member of the list, Darryl Hall (name shared with permission), asked:

“Why does nobody in the industry talk about scripting for Microsoft Ads?”

It’s true; compared to Google Ads Scripts, scripting for Microsoft Ads gets little to no attention.

Of course, I can’t speak for others, but here are my reasons: 

1) For the majority of my clients, Microsoft Ads is either absent or only a very small percentage of their PPC efforts.
2) Compared to Google Ads Scripts, it has limited functionality (a lot of the functions in Google Ads Scripts are missing in Microsoft Ads)
3) Integration with Google Sheets is possible, but cumbersome 
4) Microsoft Ads Scripts environment is relatively buggy compared to Google Ads

All in all, it’s about the ROI for me; creating Microsoft Ads Scripts simply shows much lower returns.

That being said, here’s how you can send Microsoft Ads data to a Google Sheet, and process it from there (using Apps Scripts):
https://nilsrooijmans.com/google-ads-scripts-faq/can-i-use-bing-ads-scripts-to-send-microsoft-advertising-data-to-a-google-sheet/

– Nils

PS: I’ve decided to try and help some more PPC friends by answering questions via an ‘Ask Me Anything’ each Wednesday.

If you’ve got a question to which my answer would benefit a larger part of the community, send it my way, and I’ll try to answer it 🙂

saved by the script again, or “how to immediately know your ads have stopped running”

Here’s a message that popped up in one of my clients’ accounts on Friday late afternoon:

“Your ads have stopped running – You reached your monthly account spend limit. To get your ads running again, increase your ad spend”

The client hires me to advertise his products.

But… the ads stopped running… and could potentially not have been running for the whole weekend!

Luckily, I have my ‘account down alert’ script monitoring my accounts on an hourly basis. 

Without it, I wouldn’t have caught the issue until my client called me on Monday, raging about the revenue drop.

Here’s what saved me:

Thanks to the script, I was able to notify the client and fix the issue before the Friday beers were poured 🍻

PHEW…

THE SCRIPT: 
Account Down Alerts for both individual Client Accounts and Google Ads Manager (MCC) Accounts 

WHAT IT DOES:
The script checks your account(s) every hour, and if an account is down, it will send you an alert via email, SMS, and WhatsApp. You can configure the number of alerts per account you want to receive per day.

The script normally sells for $270.

As a thank you for being a loyal subscriber, I am offering an exclusive $100 discount for the first 20 buyers of the script. Be among the first to grab this deal before it’s gone!

Use this DISCOUNT CODE: 1of20

Click here to secure your discount: https://nilsrooijmans.gumroad.com/l/account-down-alerts

Don’t wait—this deal won’t last long.

Happy scripting,

– Nils 

massive opportunity

I just spoke with Jill, an angel investor, at dinner today.

Jill met a PPC specialist, Jake, earlier today for lunch.

Jake talked about the AI opportunity in our industry for 2026.

Jake, the PPC specialist, “optimizes 1000 accounts per day now, thanks to AI.”

Jill: “This is probably an edge case, but still. He’s a real PPC pro. He knows PPC very well and has been in the industry for over 3 years. He’s working on his own, 60 hours per week, but still, it’s a massive opportunity.”

Me: … (questions if he has been using too much hallucinogens lately).

– Nils

PS: You’ve guessed it, Jake and Jill are fake names for privacy. The rest is real. Yes, that includes the hallucinogens.

[AMA] “Can you give a few tips on optimizing the landing page quality score?”

Fellow member of the list, Ralph Denzler (name shared with permission), asked:

“Can you give a few tips on optimizing the landing page quality score?”

Thanks for the question, Ralph!

Here are three things that immediately come to mind:

1. Nail the intent behind the user query, not just the keyword

To do this, research the intent behind the search terms that match your keywords. Next, make sure the ad copy reflects your understanding of that intent and delivers a promise to fulfill the intent. Lastly, make sure the lander makes good on the promise of the ad; mirror the ad’s promise in copy above the fold (info-scent), and make next steps stupid-obvious.

All in all, the lander should resonate with the searcher’s intent and the promise of the ad copy. No surprises -> higher LP experience. 

2. Fix Core Web Vitals 

A bit technical, but very important. Think: LCP <2.5s, INP <200ms, CLS <0.1. Ship SSR or static pages, preconnect critical origins, kill render-blocking JS, and trim third-party tags. Faster pages drive better user experience.

TIP: Monitor the ‘Mobile speed scores’ of your landers. (See: https://support.google.com/google-ads/answer/7450207

PRO TIP: Use a Google Ads script to monitor the speed scores and send alerts if any of your top X landers scores <7.

3. Add trust signals

Think: prominent contact info, detailed product/service specifications, clear shipping/return policies, certifications/trustmarks, guarantees (if applicable), and customer reviews near the product/service.

BONUS: No pop-ups! You won’t believe the number of account audits I’ve done where pop-ups turned a warm lead into a cold exit…

Hope this helps!

– Nils

PS: I’ve decided to try and help some more PPC friends by answering questions via an ‘Ask Me Anything’ each Wednesday.

If you’ve got a question to which my answer would benefit a larger part of the community, send it my way, and I’ll try to answer it 🙂