How To Ensure A Keyword Is Included In All Search Terms

Interesting question on Reddit today:

I am running a relatively small ad campaign for a local EV Charger installer. The PPC focus is for Commercial enquiries only.

I am targeting phrase match keywords such as “Commercial EV Charging” and “Commercial EV Charger Installations” among others.

The problem is these keywords are pulling in search terms like “EV Charger Installations” as an exact match (close variant). They are removing the commercial element from my keywords.

I am stumped. Even if I change to exact match, these search terms will still show as they are a close enough variant. Is there anything I can do? Can I instruct Google to strictly include the word “commercial” in all search terms?

I’d be reluctant to turn these keywords off, as they have by far the best search volume.

All help much appreciated.

You gotta love close variants, right?

Here’s my response:

Tricky B2B challenge here. Not uncommon though. Here’s what I would do:

1. Use a script to auto-negate all but your exact keywords (so every search term that pops up in the SQR is auto-negated unless it exactly matches your exact match keywords)

2. Try to pre-qualify the click via ad copy, i.e., add headline “for Commercial Enquiries Only” (be sure to pin the headlines/descriptions!)

3. Target specific B2B audiences and exclude typical B2C audiences

– Nils

Enhanced version of Google Ads Script: Negative Keywords Conflicts

One of my favorite use cases for scripts is managing negative keywords. I use scripts to:

  • suggest negative keywords candidates
  • allow for easy management of negatives via Google Sheets
  • do n-gram analyses to discover potential negative candidates
  • keep exact match keywords exact (super handy for brand campaigns to prevent non-brand from matching your brand keyword)
  • auto-negate converting search terms in HIGH prio Shopping campaigns, so that the queries get funneled into higher bid MED prio campaigns
  • automatically add positive keywords to a negative keyword list that is attached to my DSA campaigns to prevent cannibalization
  • …and a ton of other things.

Occasionally, I or my team members make the unfortunate mistake of accidentally adding a negative keyword that blocks one or more positive keywords. Not good. So, I use another script to alert me when that happens: the Negative Keyword Conflicts script.

The original script is developed by Google, but it has a major drawback: it also looks at keywords in campaigns that have ended (i.e., ended experiment campaigns). This results in a lot of false alerts, making you want to ignore them altogether.

To fix this issue, I decide to change the script to only look at campaigns that are still serving. This fix was easy. The only thing I need to add was the condition to only look at campaigns with serving_status = ‘SERVING’.

In the code, that means one extra condition in the GAQL query (extra condition emphasized):

WHERE campaign.status = "ENABLED" AND campaign.serving_status = "SERVING" AND ad_group.status = "ENABLED" +

Here’s the enhanced version of the Google Ads Script for Negative Keywords Conflicts:

https://nilsrooijmans.com/negative-keyword-conflicts-alert-script-update/

What the script does:

It sends out an email alert if an account has positive keywords which are blocked by negative keywords. The script saves all such conflicts to a spreadsheet and sends out the email alert.

Why this matters:

Negative keywords are intended to prevent ads from showing on irrelevant search queries, but they may inadvertently block normal keywords from matching relevant search queries, making your campaigns less effective.

Happy scripting!

-Nils

Why agency owners love scripts

I recently had the pleasure of talking with my PPC friend Ed Leake, who runs a great community of PPC agency owners over at The Forge. During our discussion, we talked about the many benefits of using Google Ads Scripts for agency owners.

Here are the top 5 benefits they can provide agency owners:

1. Improved Positioning

Agencies that use scripts (and AI) can position themselves as innovative leaders who use state-of-the-art technology.

Think: “We are {insert brandname}. We optimize Google Ads campaigns for {insert target audience}. Unlike our competitors, we use custom automation to reduce wasted ad spend and increase profits.”

2. Easier Scaling

Thanks to scripts, agencies can take on more clients without having to hire more staff to handle the workload.

Think: scripts that automate the setup of new accounts, scripts that decimate the work required for negative keyword management, scripts that automate budget management and pacing, scripts that create reports, and so on.

3. Enhanced Quality Assurance

Thanks to scripts, agency owners can delegate a lot of the work to less skilled team members and still sleep well.

Think: scripts that detect (and alert for) anomalies in performance, scripts that spot little mistakes by team members (e.g., campaign settings like ‘advanced location targeting’ and ‘url expansion’), scripts that alert you when conversion tracking is down or when payment issues occur.

4. Better Hiring Opportunities

Believe it or not, some PPC pros that have been in the field for a long time actually LOVE to gain a new superpower. Learning how to use scripts for client-specific optimizations feels just like that.

5. Impressing and Retaining Clients

Google Ads data contains a ton of insights about the audience of your clients. Proactively sharing new insights is a trust builder like no other.

Think: scripts that automatically share changes in the search behavior of the audience (*), scripts that detect and share new interests (trending in-market audiences), scripts that visualize change in geographic areas, etc.

(*) hey, that sounds like my Trending Search Terms report!

Happy scripting,

-Nils

Total ROI is not just initial revenue

When your clients are evaluating their ROI on Google Ads, they’re probably considering a lot more than just the initial revenue. They may also consider things like:

  • How many new customers did we get last month?
  • How much revenue do we expect from these new customers in the next 12 months?
  • Did we beat the competition?
  • Did we reach our new target audience?
  • Can we show numbers that indicate growth that will satisfy our investors?

Here’s the thing: Big budget decisions are often much more complex than meets the eye.

“Value” is often vaguely defined.

The better you understand what’s really going through your clients’ minds, the better you can optimize your PPC campaigns to satisfy their goals.

-Nils

new feature – HUGE improvement in Google Ads Scripts 

Last week, Google announced support for new generic mutate functionality in Google Ads scripts. It’s already available, and it is a HUGE expansion of our scripting superpowers!

From now on, most operations that can be performed from GoogleAdsService.mutate can also be performed in Google Ads scripts. This includes creating and managing campaigns, creating new conversion actions, assets, feeds, etc.

Here’s some more info: https://developers.google.com/google-ads/scripts/docs/features/mutate

I’ve yet to start playing with this new feature and will keep you updated on my progress.

Let me know if you are already playing around with this exciting new capability.

– Nils

Universal Analytics dashboard for GA4

Just came across this post on LinkedIn today:

If you’re like me, and finally getting up to speed with setting up GA4 dashboards for your clients, this might be of interest.

Here’s the link: https://lookerstudio.google.com/u/0/reporting/70357074-40fe-41b1-9766-045a5da7e660/page/LLwSD

– Nils

PS: If you don’t know Martin, you should. Follow him and watch his talks. A treasure trove of awe-inspiring strategic and tactical tips for mastering PPC management.

Go get that one extra character in your descriptions

Here’s a small little hack to end your PPC week.

Did you know?

Google will automatically put a full stop at the end of your description, whether you add the full stop yourself or not.

This means that if you remove that period at the end, you gain an extra character.

Here’s what that looks like…

Image 1: My original description with the full stop punctuation at the end of my description. (Notice the 90/90 character limit)

Image 2: Same description without the full stop. (Notice the 89/90 character limit)

Image 3: NiceR description. (Notice both the R and period in the final ad that is being displayed)

Now it’s time for me to take my little boat out on the canals because it’s blue skies and over 25 (Celsius) in Amsterdam!

– Nils

[Google Ads Script] New converting search terms alert

Fellow Dutch PPC friend Geert Groot showed absolute magic in a post on LinkedIn yesterday. Without any scripting knowledge, he was able to use ChatGPT to create this script for us.

[Google Ads Script] Alerts for new converting search terms

URLhttps://gist.github.com/Xyborg/9cdcaf4d3980ec559bcc27c442e1c4b2

What it does: This script looks at the search term report and sends an email with converting search terms that aren’t yet added as keywords in your account.

Why you care: Adding converting search terms as keywords to your account allows for…

  1. higher CTR and improved quality score (especially when you are using Dynamic Keyword Insertion)
  2. higher quality clicks from your broad match keywords (because broad matching takes other keywords in the ad group into account)
  3. more relevant impressions, more converting clicks

Back in the days when Hagakure was a thing in account structures, I created sort of a similar script. My script automatically adds the converting search terms to the most relevant ad group before it sends a report. I still use it today, with great success, for many of my setups. 

If you’re interested in adding that functionality, just ask ChatGPT to assist you. 🙂

Happy scripting!

– Nils

Turned off “search partners” but the option is toggling back on by itself? Here’s what to do.

Here’s a post from /r/PPC today:

“I have on multiple occasions turned off the Google search partners option, but the next day somehow the option keeps turning back on. Eating up my entire budget with useless Leads. Any ideas on why this might be happening and how I can fix it?”

Turns out it was an auto apply recommendation setting…

Easy fix: check the recommendations tab and the auto apply settings.

But here’s the thing: You CANNOT sit back and simply trust Google to apply automations that will benefit _your_ objectives.

Don’t trust, verify! Verify by testing. Use scripts to continuously monitor the test data for you.

Here’s one of my favorite examples: https://nilsrooijmans.com/google-ads-script-search-partner-alerts/

This script compares the performance of the Search Partners to the Google Search Network. In case of a significant difference in CPA/ROAS performance, the issue is logged in a sheet and an alert is sent via email. That way, you’ll know when Search Partners aren’t performing, and you can opt out of the Search Partner network for these campaigns.

Happy scripting!

– Nils

Google Ads Scripts does not support GA4. Here’s a workaround.

Two days ago, July 1st, good old Universal Analytics has stopped aggregating data. We all need to move to the new GA4 solution.

This is bad news for us scripters: currently, Google Ads Scripts does not support GA4. Under “Advanced APIs” there is only one Analytics and that is the old UA version. GA4 is not (yet) supported.

Here’s the workaround:

1. Use an App script within a Google Sheet that connects to the new Google Analytics Data API, and from there, fetch the data from GA4 into the Google Sheet.
2. Next, use a Google Ads Script that reads the GA4 data from the Google Sheet.

I am considering hosting a short webinar on this topic if there is enough interest. Let me know if you’re interested.

– Nils

[Google Ads Script] Pause Campaigns for Potential Invalid Activity

This is my last working day before my motorcycle road trip in California. For the next two weeks, the MV Agusta Brutale will be my best friend. Before I’m off to the canyons, here’s my latest find:

[Google Ads Script] Pause Campaigns for Potential Invalid Activity

URLhttps://github.com/hoofay/autoPauseCampaignsInvalidClicks/blob/master/autoPauseCampaignsInvalidClicks.txt

What it does: This script pauses campaigns that have >30% invalid click rate (and >20 clicks) during the day.

Why you care: Click fraud is a rampant issue on Google’s Display Network. Google Shopping ads also see a lot of click fraud activity. Although Google does a great job in detecting click fraud, fraudulent clicks _will_ pass their filters unnoticed. And _you_ will be paying for them. So, if your ads are being targeted by invalid click activity, you might want to pause them.

Note: The script does require some minor changes to make it work for you (i.e., add email address, change thresholds, and optionally add functions to pause shopping and PMax campaigns). 

If you’re interested in the latter, just ask ChatGPT to assist you, or email me and I’ll see what I can do when I get back from the twisty roads.

See you in two weeks, happy scripting!

– Nils

A hidden setting you probably want to change

Here’s your PPC Tip for today: turn off (most) automated assets.

A while ago I had a client asking me why their ads said they were established in 2001 — their year of birth was 2011!

The answer?

Automated Dynamic Callout Extension.

These days they are called “automated assets,” and Google takes a lot of liberty in coming up with their content.

Turning them off has become a serious pain in the ass, but here you go.

To turn off account-level automated assets, follow these steps:

  1. In your Google Ads account, go to the Campaigns view
  2. Click the Assets drop-down in the section menu.
  3. Click Assets.
  4. Select Association from the “Table view” drop-down menu.
  5. Click the three-dot menu on the right, then select Account level automated assets.
  6. Click the three-dot menu on the right again, then select Advanced options.
  7. Select Turn off specific automated assets, then choose which asset to turn off.
  8. Select your reason for turning off the asset and add additional comments.
  9. Click Turn off.

I know, it’s a horrible nuisance that takes waaay too many clicks.

BUT, it only takes 5 minutes.

AND, trust me, you’ll thank me later.

-Nils

no more mismatched values 

Last night, one of my client’s best-selling products got disapproved.

No more impressions. No more clicks. No more sales.

I did get more emails, though… from an unhappy client.

The issue?

“Mismatched value (page crawl) [price]”

However, the website clearly showed the actual price, matching the feed:

So I thought: WTF?! Do I really need to dive into this website code to figure out why the Google crawler cannot recognize the discounted price?

Turns out, the answer is No. There’s an easy tool for that.

Here’s Google’s Rich Results Tool: https://search.google.com/test/rich-results

It’s a quick and easy way to verify that you have correctly implemented the structured data markup for price [price] on your product landing pages. 

Thank you, Google.

I hope you appreciate it as much as I do.

– Nils

PS: Here’s more info on how to fix structured data issues like these: https://developers.google.com/search/docs/appearance/structured-data/product

[PPC Productivity] This game-changing workflow hack saved me tons of clicks and many hours

Navigating between different clients can be a HUGE time sink. I can only imagine the countless hours I’ve devoted to tirelessly clicking between different accounts across various tools.

Here’s a quick win for all of you with little time: deeplink bookmarks for every client.

Instead of having each bookmark go to the homepage of the tool, have it deeplink directly to your client.

Right-click the bookmark folder and open all tabs in one click!

Easy win, right?

– Nils

[custom column] easily monitor the percentage of daily budget spent

Want to easily see how much of your daily budget has been spent in a given date range?

You can, using this custom column (“Perc of Daily Budget Spent”):

I use this column to quickly see if we’re reaching our daily budget or not. If we do, and performance is right, there might be room for growth -> Let’s contact the client to increase budget!

Here’s how you create the custom column

Here’s the formula for you to copy-paste:

  (Cost / report_days_count()) / Daily_Budget

Go ahead, try it. It only takes 3 mins!

– Nils

P.S. Want to create a script that automagically alerts you when your percentage of daily budget spent reaches a certain threshold? 

If so, I’ve got good news for you!

If you can read English, you can create your own Google Ads Script and automate your way to free time.

In my Google Ads Scripts for Beginners workshop, you will learn exactly what to do to get your very own script running in your account. In ONE DAY.

Places are limited. Reserve your spot now: https://nilsrooijmans.com/google-ads-scripting-workshop-for-beginners/

Hope to see you there!

P.P.S. Here’s the link to the original Reddit post with more details:
https://www.reddit.com/r/PPC/comments/13qheuz/does_anyone_know_an_automted_way_to_prevent_the/

PPC Pareto Principle

Live the PPC Pareto Principle lifestyle:

1. Campaigns. What are the few campaigns that have the most positive impact on my account? Spend more time with them.

2. Priorities. What are the few actions that have the most positive impact on my performance? Prioritize them.

3. Learning. What are the few information sources I learn the most from? Focus on them.

4. Stress. What are the few sources that cause most of the stress and friction in my life? Eliminate them.

– Nils (who is inspired by productivity hero James Clear)

P.S. Want to automate the tedious repetitive tasks that keep you from doing the stuff that matters? I’ve got good news for you!

If you can read English, you can create your own Google Ads Script and automate your way to free time.

In my Google Ads Scripts for Beginners workshop, you will learn exactly what to do to get your very own script running in your account. In ONE DAY.

Places are limited. Reserve your spot now: https://nilsrooijmans.com/google-ads-scripting-workshop-for-beginners/

Hope to see you there!

P.P.S. Here’s the link to the original Reddit post with more details:
https://www.reddit.com/r/PPC/comments/13qheuz/does_anyone_know_an_automted_way_to_prevent_the/

please do prevent this nightmare: one copy-paste mishap cost an agency big bucks

This morning, I stumbled upon a gripping post on Reddit that vividly portrays a pain so relatable, it hits you right in the gut:

“…the client noticed and was annoyed, then my director noticed and was annoyed, and now he has to tell our new boss (who will be annoyed) and in the end we’ll have to write off the cost and I’ll have lost my agency a little chunk of commision.” 

OUCH!!

In the Reddit post, OP describes how he used the Google Ads UI to copy-paste YouTube campaigns. And without him knowing, the copies had the Display Network enabled, where the original did not…

The result? Display pissed away half of his budget on random websites and apps!

Yep, Google is like that.

Bug, or feature? You tell me…

Either way, this is a great example of one of my favorite use cases for scripts — prevent manual mistakes.

To prevent mistakes likes this: you could create a script that runs every hour and uses a GAQL query to check the ‘network_settings.target_content_network’ setting for your campaigns, and send an email alert if that setting is ‘true’.

Here’s the thing: You can easily ask GPT-4 to create a script that will prevent costly mistakes like this.

Here’s the query I used:

“Create a google ads script that uses gaql to check if my campaigns have the ‘network_settings.target_content_network’ setting set to true. The script should log all the campaigns that have this setting set to true and send an email alert if there is at least one campaign that has this setting set to true.”

Go ahead, try it for yourself. It only takes 5 minutes!

– Nils

P.S. Want to learn how to create a script like this?

I’ve got good news for you!

If you can read English, you can create your own Google Ads Script and have GPT assist you.

In my Google Ads Scripts for Beginners workshop, you will learn exactly what to do to get your very own script running in your account. In ONE DAY.

Places are limited. Reserve your spot now: https://nilsrooijmans.com/google-ads-scripting-workshop-for-beginners/

Hope to see you there!

P.P.S. Here’s the link to the original Reddit post with more details:
https://www.reddit.com/r/PPC/comments/13qheuz/does_anyone_know_an_automted_way_to_prevent_the/

[Google Ads Script] Update your Google Shopping Ads every hour of the day

Do your products’ prices change more than once per day?

Or do products easily go out of stock during the day?

If so, this script might be of interest to you:

Fetch Google Shopping Feeds Every Hour of the Day

URL: https://nilsrooijmans.com/google-ads-script-increase-shopping-feed-update-frequency/

What it does: This script fetches your shopping feed every hour. This way, all the data in your Merchant Center and Shopping Ads is always up to date.

Why you care: The Google Merchant Center interface only supports once-per-day updates of the product data in your shopping feed. Because of this fetch rate limitation, your shopping campaigns may show outdated product listing ads on the Google SERP.

– Nils