Автоматизація товарів 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. Обов’язково задаємо розклад роботи скрипта, щоб нам не довелося кожен раз запускати його вручну.