Автоматизация товаров Google AdWords в зависимости от наличия

Часто, при работе с рекламными кампаниями по контекстной рекламе, приходится сталкиваться с ситуацией включения/выключения групп объявлений (ключевых слов, объявлений) по наличию товара на сайте. Конечно, если у Вас на ведении небольшой интернет-магазин (до 50 товаров), то этот момент можно отслеживать и вручную производить указанные действия. Но что делать, когда у Вас на сайте 1000 или 10000 товаров? На проверку наличия каждого из них будет тратиться огромное количество времени и, по-сути, вся работа ppc-шника будет сводится к круглосуточному отслеживанию наличия. Это время можно потратить на выполнение более интересных, важных и нужных задач.

Выход из этой ситуации был предложен на сайте FreeAdWordsScripts.com (пример скрипта, описание функций и изменений — по ссылке). Для частных случаев можно использовать скрипты, которые включают/отключают объявления, паузят группы объявлений по наличию товаров на сайте. Суть в том, что данный скрипт парсит страницы сайта по указанным ссылкам в объявлениях на наличие указанных Вами в скрипте кусков html отображающих наличие/отсутствие товара.

товар в наличии
            Рис.1 — товар в наличии

товара нет в наличии

                 Рис.2 — товара нет в наличии

А что делать в ситуациях, когда ссылки установлены на уровне ключевых слов и нет возможности отслеживать наличия товаров по каждому из них?

Для этого случая за основу использовался скрипт с FreeAdWordsScripts.com переделанный для проверки ссылок на уровне ключевых слов и включению/остановке непосредственно самих ключевых по наличию/отсутствию товаров на сайте.

/************************************

* Item Out Of Stock Checker

***********************************/

var URL_LEVEL = ‘Keyword’;

var ONLY_ACTIVE = false; // set to false for all ads or keywords

var CAMPAIGN_LABEL = ‘указываем_установленный_на кампании_ярлык; // set this if you want to only check campaigns with this label

var STRIP_QUERY_STRING = true; // set this to false if the stuff that comes after the question mark is important

var WRAPPED_URLS = true; // set this to true if you use a 3rd party like Marin or Kenshoo for managing you account

// This is the specific text to search for

// on the page that indicates the item

// is out of stock.

var OUT_OF_STOCK_TEXT = ‘текст_нет_в_наличииt’;

function main() {

 var alreadyCheckedUrls = {};

 var iter = buildSelector().get();

 while(iter.hasNext()) {

   var entity = iter.next();

                if(entity.urls().getFinalUrl()){

                                var url = cleanUrl(entity.urls().getFinalUrl(), entity);

                                if(alreadyCheckedUrls[url]) {

                                 if(alreadyCheckedUrls[url] === ‘out of stock’) {

                                                entity.pause();

                                 } else {

                                                entity.enable();

                                 }

                                } else {

                                 var htmlCode;

                                 try {

                                                htmlCode = UrlFetchApp.fetch(url).getContentText();

                                 } catch(e) {

                                                Logger.log(‘There was an issue checking:’+url+’, Skipping.’);

                                                continue;

                                 }

                                 if(htmlCode.indexOf(OUT_OF_STOCK_TEXT) >= 0) {

                                                alreadyCheckedUrls[url] = ‘out of stock’;

                                                entity.pause();

                                 } else {

                                                alreadyCheckedUrls[url] = ‘in stock’;

                                                entity.enable();

                                 }

                                }

                                Logger.log(‘Url: ‘+url+’ is ‘+alreadyCheckedUrls[url]);

                }

 }

}

function cleanUrl(url, entity) {

 if (url) {

                 if(WRAPPED_URLS) {

                                url = url.substr(url.lastIndexOf(‘http’));

                                if(decodeURIComponent(url) !== url) {

                                 url = decodeURIComponent(url);

                                }

                 }

                 if(STRIP_QUERY_STRING) {

                                if(url.indexOf(‘?’)>=0) {

                                 url = url.split(‘?’)[0];

                                }

                 }

                 if(url.indexOf(‘{‘) >= 0) {

                                //Let’s remove the value track parameters

                                url = url.replace(/\{[0-9a-zA-Z]+\}/g,»);

                 }

                }

                else Logger.log(‘Что-то пошло не так, в урле нулл: ‘+url+’ ‘+ entity.getCampaign.getName+ ‘ -> ‘ +entity.getAdGroup.getName);

 return url;

}

function buildSelector() {

 //var selector = (URL_LEVEL === ‘Keyword’) ? AdWordsApp.ads() : AdWordsApp.keywords();

 var selector = (URL_LEVEL === ‘Keyword’) ? AdWordsApp.keywords() : AdWordsApp.ads();

 selector = selector.withCondition(‘CampaignStatus != DELETED’).withCondition(‘AdGroupStatus != DELETED’);

 if(ONLY_ACTIVE) {

   selector = selector.withCondition(‘CampaignStatus = ENABLED’).withCondition(‘Status = ENABLED’);

   if(URL_LEVEL !== ‘Keyword’) {

     selector = selector.withCondition(‘AdGroupStatus = ENABLED’);

   }

 }

 if(CAMPAIGN_LABEL) {

   var label = AdWordsApp.labels().withCondition(«Name = ‘»+CAMPAIGN_LABEL+»‘»).get().next();

   var campIter = label.campaigns().get();

   var campaignNames = [];

   while(campIter.hasNext()) {

     campaignNames.push(campIter.next().getName());

   }

   selector = selector.withCondition(«CampaignName IN [‘»+campaignNames.join(«‘,'»)+»‘]»);

 }

 return selector;

}

Важно для работы скрипта:

  1. Обязательно ставим ярлык на кампанию и прописываем его в скрипте, чтобы указать, какую именно кампанию скрипт должен проверять.
  2. Обязательно прописываем html-параметр наличия товара, а не текст «нет в наличии».
  3. Количество ключевых слов, содержащих ссылку, необходимо ограничивать опытным путем, т.к. время работы скрипта, установленное AdWords, не должно превышать 30 минут (на практике удалось получить не более 3500 ключевых слов с ссылками).
  4. Все ссылки должны быть рабочими. Наличие битых ссылок в разы повышает время работы скрипта, и Вы можете не уложится в отведенное время.
  5. Обязательно задаем расписание работы скрипта, чтоб нам не пришлось каждый раз запускать его вручную.