Automagically adding radius targeting in bulk

Imagine having to spend 2 hours per day adding radius targeting to your campaigns:

1. Grab a coffee while the Google Ads interface loads your campaign view
2. Click Campaign Settings
3. Stare at the screen in full awe, not understanding why it takes ages to load
4. Click Locations
5. Click Advanced Search
6. Lookup target
7. Set radius
8. Click Save
9. Navigate to the next campaign
10. Wait for at least 5 seconds (seconds that feel like forever) for the page to load
11. Click Locations, click Advanced Search, lookup target, set radius, click Save
12. Rinse and repeat

All the above. For two hours. Every day.

Yesterday, one of my clients complained about this horror show and asked me if we could automate this process using scripts.

He was looking for a solution that automagically adds radius targets based on location names (i.e., cities) in the campaign name.

Good news: you can use scripts to add radius targets in bulk!

Here’s a code snippet to help you get started: https://developers.google.com/google-ads/scripts/docs/examples/proximity

If you want to automate your radius targets too and have me create your script for you, send me an email at nils@nilsrooijmans.com.

– Nils

A question I always say yes to

Every now and then, an email lands in my inbox that requires only one word in the reply.

The one word is “Yes.”

The email usually goes something like this:

“Hey Nils, I just thought of X, should I test this?” (*)

And then I go: 

“Yes!”

X can be anything.

“I want to add dashes at the start of my headlines to stand out, should I test this?” 

Yes.

“My colleague suggested we add custom sitelinks to our top ad groups to increase clicks. Should we test this?”

Yes.

“You suggested adding converting search terms as keywords to our ad groups. Sounds like a lot of work. Should we really test this?”

Yes (and use a script to do so).

“Google suggested changing our keywords to broad. Should I test this?”

Yes.

“Should we test Max Conversions bidding on our competitor campaign?”

Yes.

The answer is yes.

Always Be Testing.

– Nils

(*) By the way, I love emails like these! So, if you are testing things now, or are considering testing something, please share by sending me an email at nils@nilsrooijmans.com.

“It’s so much better to have everything in GAQL”

Long-time list member Vincent Hsu sent in this response below to one of my latest emails, shared with permission. (A URL to my original email’s contents is provided below for your convenience.)

“Justed checking in to tell you that this Newsletter is great 🙂 Just what I needed to update to GAQL today !
AWQL still silently converts to GAQL silently in the background so things continue to work in most cases, but it’s so much better to have everything in GAQL isn’t it :-)”

I love responses like this! It is this kind of replies that make writing my emails all worth the effort 🙂

More importantly, Vincent is right. Google is trying hard to make the new Google Ads environment backward compatible with the old scripts. 

Still, it’s better to migrate your scripts to the new environment and upgrade your code. This includes migrating AWQL to GAQL.

Here’s why:

1. The code that Google uses to provide backward compatibility is (still) buggy. This means not all code from the old environment will work properly in the new environment. (Just head over to the Google Ads Script forum and you will see what I am talking about.)

 2. The code that Google uses to provide backward compatibility is slowing down your scripts. Running legacy scripts in the new environment unnecessarily slows things down. This means you may reach the execution limit of 30 minutes and your script will simply stop.

So, start migrating your scripts!

Any scripts left unmigrated will be automatically migrated and may be paused next week, on October 31, when legacy scripts sunset.

– Nils

PS: Here’s a link to what I wrote in my original email -> https://nilsrooijmans.com/daily/query-migration-tool

“What’s your process for building and testing a script?”

Last week, a PPC Redditor asked a great question:

“What’s your process for building and testing a script?”

The key word here is ‘process.’ You need to have a process first before you can start automating the (sub)tasks.  

So, the first step would be to think deeply about the task you want to automate, and to document every step in the process.  

Let’s say you want to make sure all ad groups have live ads. In this case, ask yourself:  
1. Why do I want this?  
2. What do I need for this?  
3. How can I get the things I need?  

Potential answers (simplified):  
1. I don’t want disapprovals or manual mistakes (e.g., accidentally pausing entities) to stop me from showing ads.
2. I need to continuously make sure all my ad groups have at least one enabled keyword and one enabled ad (that is eligible to run).  
3. For every enabled ad group, I need to check the status of my keywords and the status of my ads, and be in the know when an enabled ad group has zero enabled keywords or zero enabled ads. This check needs to happen all the time.  

The second step would be to start writing functions to automate the parts of the process you have described.  

In our example, you would create a function to check if an ad group has at least one enabled keyword. You would also create a function to check if an ad group has at least one enabled (eligible) ad running.  Then, you would write a function that goes over all enabled ad groups, and uses these functions to check keywords and ads.  You would also have another function to alert you (i.e., via email). That function would get called if one of your checks failed.  

The third step would be to test the different functions and then preview the script. For the testing, I always recommend testing them individually first and then using the Logger.log function to see intermediate results. Then, previewing instead of ‘running’ the script already will make sure the script does not make any changes in your account, so you are sure the script does not F things up.  

After previewing, if you are happy with the results, you can then schedule the script to run hourly.  

Google Ads Scripting all starts with your process.

Think hard about your current PPC tasks that take up most of your time or are error-prone. Write them down. Be very specific in your documentation. Divide tasks into subtasks. Then, start scripting.

– Nils

1,2,3 ad copy

Every now and then I stumble across some old PPC blog posts with amazing evergreen PPC tips. Here’s another beauty that popped up in my browser today. Can you see which ad copy sticks out?

If you can’t spot it immediately, here it is:

As you can see, they have a number at the start of their headline which draws your attention, and gives you a clear expectation of what happens when you click.

Here’s the thing: Few advertisers take the time to experiment with strategies and patterns that the eye is drawn to. If you do, you get the click.

Source: https://davidmelamed.com/2015/02/10/clever-ppc-advertisement-2015-far/

– Nils

[Custom Column] Conversion value per thousand impressions

Custom columns are great! This nifty feature allows you to display non-standard data in the Google Ads interface and Reports.

In the coming months, I will be sharing some of my favorites.

Here is a first: Conversion value per thousand impressions

This metric allows me to rank campaigns, ad groups, and ads on the value per impression.

At the campaign or ad group level: relatively low scores tell me there might be something wrong with the targeting of the campaign or ad group (e.g., not strict enough).

At the level of the ads: relatively low scores tell me the ad and/or lander needs work.

– Nils

Query Migration Tool

Last week, I was in Berlin to attend and present at the SMX Advanced event.

Several people joined my workshop on the Google Ads Query Language.

We discussed many aspects of this new way of getting reports from the new Google Ads script environment. You know, this new environment we all need to migrate to before the end of this month.

One of the more challenging parts of migrating your current scripts to the new environment is the migration of AWQL queries to GAQL.

Here is a tool that might be of help if you get stuck: https://developers.google.com/google-ads/api/docs/migration/query-migration-tool

– Nils

PS: Having trouble migrating your scripts? I’m currently offering 1-hour migration support sessions. Email me at nils@nilsrooijmans.com to get on the list for that.

On performance measurement and improvement

Where performance is measured, performance improves.

Where performance isn’t measured, performance will not improve.

Now read the above sentences again, with machine learning in mind.

Moral of the story: be sure to track all of your conversions.

– Nils

PS: Here are two quick links to help you track more conversions:
https://support.google.com/google-ads/answer/2998031?hl=en
https://support.google.com/google-ads/answer/9888656?hl=en

Teaching AI to scale

Optimizing for conversions doesn’t just increase conversions or revenue. It also increases the total data input volume that machine learning can use to do its job well. The more conversion data, the better the algorithm can optimize for conversions.

This is how you teach the AI to scale.

Ask yourself:

1. Why does this person click this ad?
2. Where does the click go?
3. How can this be improved?

– Nils

[Performance Max] Support in Google Ads Scripts

Some great news came out today: Performance Max campaigns are now finally (partly) supported in Google Ads Scripts!

Here’s Google’s announcement, including some links to more details: https://ads-developers.googleblog.com/2022/09/performance-max-support-in-google-ads.html

Here are some initial “script-automated optimizations for PMax” that came to my mind:

  • Automatically exclude locations that don’t work
  • Automatically pause PMax campaigns when they hit your daily/weekly/monthly budget target
  • Automatically pause underperforming assets/asset groups
  • Automate the stair-step approach to scale PMax performance 

These are the first few ideas that came up for me based on what’s possible according to the documentation.

– Nils

PS: I’m curious, what PMax-related task(s) would you like to automate? You can email me about them at nils@nilsrooijmans.com.

Google’s policy is always changing… here’s the latest

ICYMI: Google Ads is implementing a new policy for the landing pages of your ads. This new policy requires landing pages to meet the “better ads standards” as the Coalition For Better Ads laid out.

Here’s the thing: If an ad leads to a page that doesn’t comply with the better ad standards, Google will disapprove the ad.

Google will begin enforcing the policy update in October 2022.

“In October 2022, the Destination requirements policy will be updated to include a new policy requiring ad experiences on destinations to conform to the Coalition for Better Ads’ Better Ads Standards.

Destinations containing ad experiences that do not conform to the Better Ads Standards will be informed via the Ad Experience Report, and any ads that lead to such destinations will be disapproved.”

SOURCE: https://support.google.com/adspolicy/answer/12406603?hl=en

Note that newsletter pop-ups, or any other pop-ups for that matter, might cause your lander to not meet the “better ads standards.” Here’s a good rule of thumb — if an ad on your landing page interrupts a visitor’s browsing experience, it’s almost certainly against the better ads standards, and your ads will probably get disapproved.

You can check if your website has pages that don’t meet the “better ads standards” via the ‘Ad Experience Report’ in Google Search Console. See details: https://www.google.com/webmasters/tools/ad-experience-unverified

PRO TIP: Prevent getting surprised (and losing tons of revenue) by implementing this script to immediately alert you of any disapproved ads -> https://nilsrooijmans.com/google-ads-script-disapproved-ads-alerts/ 

– Nils

firefighters and fire marshals 

The problem is NOT that you are too busy.

You will always be too busy, and that will never change.

There will always be Google Reps to shut up, negative keywords to add, 404 pages to fix, mobile app placements to exclude, derailed bidding strategies to correct course, disapproved ads to fix, out of stock items to pause, depleted budgets to hide, clients to report to, and managers to tell to go F themselves.

The problem is that you’re acting like a firefighter instead of a fire marshal. You’re constantly rushing from one fire to the next, never slowing down to install smoke detectors. 

The problem is that few fires need to become dangerous, and you’re not taking the time to prevent them from doing so.

Most fires start with an innocent little flame. A flashing spark that brings light and fuels your creativity. But you are not paying attention. And that little flame just gets bigger. And bigger. Until you can show your firefighting skills again, experience the thrill, and feel busy. 

Installing smoke detectors may sound boring, and even require some new skills, but it will make you feel less busy.

Don’t get addicted to fighting fires.

– Nils

PS: Looking for some good smoke detectors? Check out the Alert category in my list of 400+ Google Ads Scripts.

We all love to track conversions, don’t we?

We all love to track conversions, don’t we?

I sure do.

Here’s your PPC Pro tip for today: track your clicks from free product listings in Google Shopping.

Earlier this year, Google enabled auto-tagging for free product listings through Google Merchant Center.

This feature allows for improved tracking of your free clicks from Google Shopping by adding a tracking parameter (‘srsltid’) to your URLs. When enabled, you final URL will look something like this: www.yourwebshop.com/?srsltid=1x2y3z.

In Google Analytics, I use this feature to separate traffic from free product listings from the overall Google organic traffic, and analyse conversion data. Read on to learn how.

NOTE: This feature is not enabled by default. To turn it on, follow these steps:

  1. In your Merchant Center account, click the gear icon and then click on “Conversion Settings” under “Settings”
  2. Toggle the Auto-tagging button to be “ON”

And here’s how you view traffic from free listings in Google Analytics:

  • For Google Analytics 4 properties, the traffic source is “Shopping free listings”. This makes life easy.
  • For Universal Analytics properties, free listing traffic is reported with all other organic traffic sources from Google (with “google” as the traffic source and “organic” as the medium).

This means we have to do some extra work to view the results from this traffic. Follow these steps:

  1. Navigate to Acquisitions > All Traffic > Source/Medium
  2. Choose ‘Landing Page’ as your secondary dimension
  3. Click on the advanced filtering and include landing page containing ‘srsltid’

In the example below, you can see conversions from free shopping listings in the transactions column.

Or, even better, you can create a custom segment with traffic from free shopping listings:

NB: Some websites may break with the tracking parameter. So, first check with your developer if this feature works on your website. Or, check yourself by going to a popular product landing page and appending the tracking parameter to your url: ?srsltid=1x2y3z

Do not enable auto-tagging in Google Merchant Center if you get an error.

– Nils