AdWords
4.6K members online now
4.6K members online now
Dive into advanced features like Remarketing, Flexible Bid Strategies, AdWords Editor, and AdWords Scripts
Guide Me
star_border
Reply

Can I schedule different ads at different times of the day without creating duplicate keywords

[ Edited ]
Visitor ✭ ✭ ✭
# 1
Visitor ✭ ✭ ✭

I have a client who requires different ads for specific times of the day across the entire account. They need one set of ads to run 7am-9pm, then 9pm to midnight each day through out the week, then a set of ads to run 7am-6pm, then 6pm-midnight for the weekend. All these ads need to have different message for suit the client needs.

We know we can create different campaigns with these schedules however this would mean quadrupling the current 800 active keywords in the account, which we don't want to do due to negative effect on quality score, CPC, CPA etc.

Is there a way around this through using scripts or the Google drive? Any help would be much appreciated.

3 Expert replyverified_user

Can I schedule different ads at different times of the day without creating duplicate keywords

Top Contributor
# 2
Top Contributor

Interesting.... You could run a script that pauses specific ads  and reactivate them based on scheduling. 

Moshe, AdWords Top Contributor , Twitter | Linkedin | Community Profile | Ad-Globe
Did you find any helpful responses or answers to your query? If yes, please mark it as the ‘Best Answer’

Can I schedule different ads at different times of the day without creating duplicate keywords

Rising Star
# 3
Rising Star

You might be able to use customisers, however it could prove to be quite complicated:

https://support.google.com/adwords/answer/6093368?hl=en-AU&ref_topic=6031980

 

Personally, I'd go for multiple campaigns:

 

Overall quality score won't be affected, but will be real for each time slot. If a time slot is performing poorly, the QS will reflect it. With one campaign the overall QS will be the same, just averaged out.

 

Results will be immediately obvious for each time slot. No need to go deeper into reporting or using pivot tables.

 

I have successfully split campaigns into business hours and other, where business hours converts better. It helps when making decisions about whether to run ads outside of business hours, and easier for the client to understand.

 

 

 

Can I schedule different ads at different times of the day without creating duplicate keywords

Visitor ✭ ✭ ✭
# 4
Visitor ✭ ✭ ✭

Thank you. I will look into the ad customisers. Want to stay away from duplicate campaigns, as don't want it to be become unmanageable. 

Can I schedule different ads at different times of the day without creating duplicate keywords

Top Contributor
# 5
Top Contributor

You are right in thinking that it would become more difficult to manage, but you could ease the pain by using labels so as to be able to filter one timeset at a time. Trying to manage multiple customisers and/or scripts for this could become far more complicated in the medium to long term.

 

Running the duplication and config in AdWords Editor would also help immensely.

Can I schedule different ads at different times of the day without creating duplicate keywords

[ Edited ]
Visitor ✭ ✭ ✭
# 6
Visitor ✭ ✭ ✭

Heres a script to pause and enable ads by hour.

1. Add two sets of ads into every ad group.

2. Add labels to the ads that should run 7am to 9pm (time.on.07, time.off.21), for 9pm to midnight (time.on.21, time.off.00).

3. Repeat same process for weekend ads.

4. Schedule the script to run every hour. Youll need to either duplicate the script to handle the weekend differently with seperate label prefix or rewrite the script slightly to handle weekends according to your specs.

 

ps. if you need more granular control minute by minute you will need to either use ad customizers or the api.

 

/**************************************************
Pause and enable campaigns, ad groups and ads by hour
**************************************************/
var ENTITY = 'Ad'; // Keyword | Ad | Campaign
var ENABLE_TIME_PREFIX = "time.on."; //look for labels "time.on.01"
var PAUSE_TIME_PREFIX = "time.off."; //look for labels "time.off.16"

function main() {

var timeStr = Utilities.formatDate(new Date(), AdWordsApp.currentAccount().getTimeZone(), "HH"); // get current hour
Logger.log("timeStr = "+timeStr);
var enableTimeStr = ENABLE_TIME_PREFIX+timeStr; // current hour -> label name 
var pauseTimeStr = PAUSE_TIME_PREFIX+timeStr;
Logger.log("");
Logger.log("enableTimeStr = "+enableTimeStr);
Logger.log("pauseTimeStr = "+pauseTimeStr);
Logger.log("");
Logger.log("Looking for labels for Time: " + [pauseTimeStr,enableTimeStr].join(' and '));

var labelsArray = buildLabelArray(pauseTimeStr,enableTimeStr); // get all labels
if(labelsArray.length > 0) { 
var labelsStr = "['" + labelsArray.join("','") + "']";
var entityIter;

// create entity array with select labels
if(ENTITY === 'Keyword') {
entityIter = AdWordsApp.keywords().withCondition("LabelNames CONTAINS_ANY "+labelsStr).get();
} else if(ENTITY === 'Ad') {
entityIter = AdWordsApp.ads().withCondition("LabelNames CONTAINS_ANY "+labelsStr).get();
} else if(ENTITY === 'Campaign') {
entityIter = AdWordsApp.campaigns().withCondition("LabelNames CONTAINS_ANY "+labelsStr).get();
} else {
throw 'Invaid ENTITY type. Should be Campaign, Keyword or Ad. ENTITY:'+ENTITY;
}

// pause and resume
while(entityIter.hasNext()) {
var entity = entityIter.next();
enableEntity(entity, enableTimeStr); 
pauseEntity(entity, pauseTimeStr);
}
}
}

// build a list of labels in the account
function buildLabelArray(pauseStr,enableStr) {
var labelsArray = [];
try {
var labelIter = AdWordsApp.labels().withCondition("Name IN ['"+pauseStr+"','"+enableStr+"']").get();
while(labelIter.hasNext()) {
labelsArray.push(labelIter.next().getName());
}
return labelsArray;
} catch(e) {
Logger.log(e);
}
return [];
}

// enable entities
function enableEntity(entity, enableStr) {
var labelIter = entity.labels().withCondition("Name = '"+enableStr+"'").get();
if(labelIter.hasNext()) {
entity.enable();
}
}
// pause entities
function pauseEntity(entity, pauseStr) {
var labelIter = entity.labels().withCondition("Name = '"+pauseStr+"'").get();
if(labelIter.hasNext()) {
entity.pause();
}
}