It’s a massive time-saver. Instead of doing it yourself, it just sort of happens by magic. The magic of code. And now you can take things to the next level: from campaign-level to meta-campaign-level. To a PPC superhero, that’s exciting right?
How does it work?
Set up the audiences (and bid adjustments) you want in one campaign, then the script uses that as a template and copies those audiences to all the other campaigns.
The script won’t remove existing audiences, but if a campaign was already targeting an audience, then the bid modifier may be overwritten. So, when audiences have been copied into a campaign, that campaign is labeled so the script ignores it on future runs — then you can exclude the audiences or change the modifiers however you like. You can rerun the script whenever you feel like it, to make sure any new campaigns have the audiences set up, and it won’t mess up the tweaks you’ve made in the old campaigns.
Sadly, you have to delete any ad group-level audiences before running the script. If there’s a campaign that has ad group audiences, even if they’re paused, then the script can copy campaign-level negative audiences, but not positive ones.
How do I use it?
If you want to give it a go, copy the code below into a new AdWords Script in your account. Then change some of the options:
- campaignNameContains is used to filter the campaigns the script looks at: if you only want the script to look at campaigns which have certain words or phrases in the names, put those words or phrases in the square brackets, in double quotes and separated with commas. For example, if campaignNameContains is [“Brand”, “Generic”], then only campaigns with names containing “brand” or “generic” are included.
- campaignNameDoesNotContain is the same, but for words or phrases in the names of campaigns you want the script to ignore. For example, if campaignNameDoesNotContain is [“Display”, “Competitor”], then any campaigns with names containing “display” or “competitor” are ignored.
- campaignNameContains and campaignNameDoesNotContain are not case-sensitive.
- Leave them blank, , to cover all campaigns.
- If you need to put a double quote into either, put a backslash before it.
- If ignorePausedCampaigns is true, then the script will only look at currently active campaigns. Set this to false if you want to apply audiences to currently paused campaigns.
- If includeShoppingCampaigns is true, the audiences will be copied to Shopping campaigns, as well as Search campaigns.
- campaignToCopy is the name of the template campaign whose audiences will be copied. This is case-sensitive.
- The template campaign can be paused, but it can’t be removed.
- labelName is the name of the label which will be applied to campaigns once they’ve had the audiences added. This means you can see which campaigns have been covered. Campaigns that already have the label will be ignored; if the script doesn’t cover them all in one run, it can go again until it covers them all.
Remember, you need to delete all ad group-level audiences before running the script! Otherwise you’ll get errors where the audiences couldn’t be added. If you have campaigns where you want to keep the ad group audiences, you may want to get the script to skip over them entirely: you can put their names in campaignNameDoesNotContain, or you could label them with the labelName used to show which campaigns already have audiences.
A few things to note
- This doesn’t work on Universal App or Video campaigns.
- Scripts can only run for 30 minutes, which may not be enough time if you’ve got lots of campaigns or lots of audiences. But if the script times out, you can just run it again — it will say in the logs when everything has been covered.