Скрипти в Google AdWords: корисне рішення для автоматизації рутинних операцій

Часто при веденні великої кількості рекламних компаній (РК), які мають безліч груп оголошень, ключових слів і "гори" звітів, стикаєшся з деякими рутинними діями, які забирають доволі багато сил і часу. Особливо ця проблема актуальна для Центру клієнтів MMC, що має "на борту" безліч акаунтів.

Здавалося б прості й одноманітні ручні операції з часом можна виконувати по "накатаній", однак це в рази уповільнює ефективність роботи. Проте використовуючи скрипти AdWords можна в кілька разів підвищити продуктивність роботи і спростити собі життя.

Основні плюси скриптів AdWords:

  1. Автоматичне налаштування запуску певних дій за заданим часом (наприклад, щогодини, дня або місяця).
  2. Простота інтеграції з сервісами Google (наприклад, Gmail, Google Docs)
  3. Використання зовнішніх ресурсів для призупинення або відновлення дії об'єктів. Збільшення ставок або додавання нових ключових слів у міру розширення ресурсу.
  4. Виконання дій над кількома об'єктами. Наприклад, якщо якесь ключове слово забирає майже весь ваш денний бюджет, ви можете призупинити його, одночасно збільшивши бюджет для інших кейвордів.
  5. Використання одного скрипта для кількох дочірніх акаунтів ММС, щоб оптимізувати ставки, створювати звіти.
  6. Відображення статистики кампанії у вигляді таблиці, за допомогою якої можна створювати звіти і представляти дані в графічній формі.

Про всі "принади" скриптів AdWords можна говорити довго, однак радимо ознайомитися з офіційною довідкою Google – «скрипти Adwords», там є вся необхідна інформація. Проте для більш наочної картини, представляємо невеликий огляд-інструкцію підключення скрипта "Биті посилання", який дає змогу відстежувати рекламні оголошення на наявність помилок 404, 500. Отже, приступимо...

Щоб підключити потрібний скрипт для кількох акаунтів у ММС, в основному інтерфейсі Центру клієнтів знаходимо основний блок з лівого боку, вкладка "Скрипти". Підключення скрипта для окремого акаунта здійснюється трохи глибше: "Масові операції" - "Скрипти":

MCC+akk

Створюємо для нашого акаунта скрипт, у якому розміщуватиметься програмний код скрипта:

script-aswords2

Пишемо назву, як іменуватиметься наш скрипт (приклад: Звіт за битими посиланнями (404,500), і вносимо в текстовий редактор програмний код (замінивши e-mail - пошту, куди надсилатимуть звіти в разі виявлення помилок):

name-script-adwords

Дозволяємо доступ скрипту до нашого акаунту ("Авторизація"), для обробки даних.dostup-adwords-script

Тестуємо ("Перегляд") і зберігаємо створений скрипт. Далі задаємо частоту запуску скрипта ("Розклад") і зберігаємо:

script-aswords-raspisanie

name-script-adwords-dejstvie

Ось і все, скрипт встановлений і налаштований. Тепер запуск скрипта буде здійснюватися щодня
об 11:00 за Київським часом, створюючи звіт, який заноситиметься в "Журнали" і в разі виявлення помилки надсилатиме сповіщення на пошту, що була вказана в скрипті:

script-aswords-jernal

Підключення інших скриптів здійснюється за схожим принципом, тож проблем не повинно виникнути.

Деякі готові рішення, які ви можете використовувати:

Биті посилання - скрипт парсить посилання оголошень на наявність помилок сервера 404, 500 (часто буває, що сайт недоступний або сторінка помилково була приділена, в цей час оголошення транслюються, а бюджети відлітають у "трубу").

/****************************
* Find Broken Urls In Your Account
* Version 1.1
* ChangeLog v1.1
*  - Updated to only see Text Ads
* Created By: Russ Savage
* FreeAdWordsScripts.com
****************************/
function main()   {  
  // You can add more if you want: http://goo.gl/VhIX
  var BAD_CODES = [404,500];
  var TO = ['ваш-email@example.com'];
  var SUBJECT = 'Broken Url Report - ' + _getDateString();
  var HTTP_OPTIONS =   {  
    muteHttpExceptions:true
    }  ;

  //Let's look at ads and keywords for urls
  var iters = [
    //For Ad Level Urls
    AdWordsApp.ads()
      .withCondition("Status = 'ENABLED'")
      .withCondition("AdGroupStatus = 'ENABLED'")
      .withCondition("CampaignStatus = 'ENABLED'")
      .withCondition("Type = 'TEXT_AD'")
      .get(),
    //For Keyword Level Urls
    AdWordsApp.keywords()
      .withCondition("Status = 'ENABLED'")
      .withCondition("DestinationUrl != ''")
      .withCondition("AdGroupStatus = 'ENABLED'")
      .withCondition("CampaignStatus = 'ENABLED'")
      .get()
    ];

  var already_checked =   {    }  ; 
  var bad_entities = [];
  for(var x in iters)   {  
    var iter = iters[x];
    while(iter.hasNext())   {  
      var entity = iter.next();
      if(entity.getDestinationUrl() == null)   {   continue;   }  
      var url = entity.getDestinationUrl();
      if(url.indexOf('  {  ') >= 0)   {  
        //Let's remove the value track parameters
        url = url.replace(/  {  [0-9a-zA-Z]+  }  /g,'');
        }  
      if(already_checked[url])   {   continue;   }  
      var response_code;
      try   {  
        Logger.log("Testing url: "+url);
        response_code = UrlFetchApp.fetch(url, HTTP_OPTIONS).getResponseCode();
        }   catch(e)   {  
        //Something is wrong here, we should know about it.
        bad_entities.push(  {  e : entity, code : -1  }  );
        }  
      if(BAD_CODES.indexOf(response_code) >= 0)   {  
        //This entity has an issue.  Save it for later. 
        bad_entities.push(  {  e : entity, code : response_code  }  );
        }  
      already_checked[url] = true;
      }  
    }  
  var column_names = ['Type','CampaignName','AdGroupName','Id','Headline/KeywordText','ResponseCode','DestUrl'];
  var attachment = column_names.join(",")+"n";
  for(var i in bad_entities)   {  
    attachment += _formatResults(bad_entities[i],",");
    }  
  if(bad_entities.length > 0)   {  
    var options =   {   attachments: [Utilities.newBlob(attachment, 'text/csv', 'bad_urls_'+_getDateString()+'.csv')]   }  ;
    var email_body = "There are " + bad_entities.length + " urls that are broken. See attachment for details.";

    for(var i in TO)   {  
      MailApp.sendEmail(TO[i], SUBJECT, email_body, options);
      }  
    }    
  }  

//Formats a row of results separated by SEP
function _formatResults(entity,SEP)   {  
  var e = entity.e;
  if(typeof(e['getHeadline']) != "undefined")   {  
    //this is an ad entity
    return ["Ad",
            e.getCampaign().getName(),
            e.getAdGroup().getName(),
            e.getId(),
            e.getHeadline(),
            entity.code,
            e.getDestinationUrl()
           ].join(SEP)+"n";
    }   else   {  
    // and this is a keyword
    return ["Keyword",
       
     e.getCampaign().getName(),
            e.getAdGroup().getName(),
            e.getId(),
            e.getText(),
            entity.code,
            e.getDestinationUrl()
           ].join(SEP)+"n";
    }  
  }  

//Helper function to format todays date
function _getDateString()   {  
  return Utilities.formatDate((new Date()), AdWordsApp.currentAccount().getTimeZone(), "yyyy-MM-dd");
  }  

Показник якості акаунта - скрипт щодня перевіряє акаунт і вивантажує в окремий файл показник якості акаунта (збільшення показника якості акаунта сприяє зменшенню витрат і поліпшенню позиції оголошення).

/***************************************
* Store Account Level Quality Score in Google Spreadsheet.
* Version 1.1
* ChangeLog v1.1
*  - Changed ACCOUNT_NAME to SHEET_NAME and updated the default value.
*  - Removed getSpreadsheet function
*
* Created By: Russ Savage
* Based on script originally found at: http://goo.gl/rTHbF
* FreeAdWordsScripts.com
*********************************/
function main()   {  
  var SPREADSHEET_URL = "Url адрес таблицы Google Docs";
  var SHEET_NAME = 'Название файла';
  var today = new Date();
  var date_str = [today.getFullYear(),(today.getMonth() + 1),today.getDate()].join("-");

  var spreadsheet = SpreadsheetApp.openByUrl(SPREADSHEET_URL);
  var qs_sheet = spreadsheet.getSheetByName(SHEET_NAME);

  var kw_iter = AdWordsApp.keywords()
    .withCondition("Status = ENABLED")
    .forDateRange("LAST_30_DAYS")
    .withCondition("Impressions > 0")
    .orderBy("Impressions DESC")
    .withLimit(50000)
    .get();

  var tot_imps_weighted_qs = 0;
  var tot_imps = 0;

  while(kw_iter.hasNext())   {  
    var kw = kw_iter.next();
    var kw_stats = kw.getStatsFor("LAST_30_DAYS");
    var imps = kw_stats.getImpressions();
    var qs = kw.getQualityScore();
    tot_imps_weighted_qs += (qs * imps);
    tot_imps += imps;
    }  

  var acct_qs = tot_imps_weighted_qs / tot_imps;

  qs_sheet.appendRow([date_str,acct_qs]);
  }  

Товару немає в наявності - скрипт порівнює наявність товару з рекламним оголошенням і в разі відсутності товару призупиняє рекламу.

/************************************
* Item Out Of Stock Checker
* Version 1.1
* ChangeLog v1.1 - Filtered out deleted Campaigns and AdGroups
* Created By: Russ Savage
* FreeAdWordsScripts.com
***********************************/
var URL_LEVEL = 'Ad'; // or Keyword
var ONLY_ACTIVE = true; // 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 = 'The Text That Identifies An Out Of Stock Item Goes Here';

function main()   {  
  var alreadyCheckedUrls =   {    }  ;
  var iter = buildSelector().get();
  while(iter.hasNext())   {  
    var entity = iter.next();
    var url = cleanUrl(entity.getDestinationUrl());
    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]);
    }  
  }  

nfunction cleanUrl(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,'');
    }  
  return url;
  }  

function buildSelector()   {  
  var selector = (URL_LEVEL === 'Ad') ? AdWordsApp.ads() : AdWordsApp.keywords();
  selector = selector.withCondition('CampaignStatus != DELETED').withCondition('AdGroupStatus != DELETED');
  if(ONLY_ACTIVE)   {  
    selector = selector.withCondition('CampaignStatus = ENABLED').withCondition('Status = ENABLED');
    if(URL_LEVEL !== 'Ad')   {  
      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;
  }  

Боїтеся перевищити місячний бюджет? - Тоді цей скрипт для Вас!

Він автоматично відключає кампанії клієнта, якщо було перевищено місячний бюджет. І одна з найпростіших оптимізацій - зіставити суму витрат за акаунтом із місячним бюджетом і в разі перевищення заданої суми призупинити всі активні кампанії до наступного місяця:

var CUTOFF_COST = 10000;
var CUTOFF_LABEL = "Total Spend cutoff";

function main()   {  
var label = AdWordsApp.labels().withCondition("Name='" + CUTOFF_LABEL + "'").get().next();

if (AdWordsApp.currentAccount().getStatsFor("THIS_MONTH").getCost() > CUTOFF_COST)   {  
var campaignIterator = label.campaigns().get();

while (campaignIterator.hasNext())   {  
var campaign = campaignIterator.next();
campaign.pause();
  }  
  }  
  }  

Звісно, замість 10000 Вам необхідно встановити власну допустиму суму.

Увага, Ahtung! Цей скрипт не допоможе у відключенні Відео кампаній, Торгових і експериментальних, і навряд чи підійде для просунутих користувачів

Моніторимо денні витрати

У зв'язку з тим, що Гугл іноді сам вирішує скільки сьогодні Ви повинні витратити, а іноді ця сума може перевищувати 100% від вашого денного бюджету... тоді ловіть наступний скрипт:

function main()   {  
   
  var allowedOverdeliveryPercentage = 0.2; // set percentage as decimal, i.e. 20% should be set as 0.2
  var labelName = "paused by overdelivery checker script";
   
  AdWordsApp.createLabel(labelName, "automatic label needed to reenable campaigns");
   
  var campaigns = AdWordsApp.campaigns()
   .withCondition("Status = ENABLED")
   .withCondition("Cost > 0")
   .forDateRange("TODAY");
   
  var campaignIterator = campaigns.get();
   
  while (campaignIterator.hasNext())   {  
    var campaign = campaignIterator.next();
    var campaignName = campaign.getName();
    var budgetAmount = campaign.getBudget().getAmount();
    var costToday = campaign.getStatsFor("TODAY").getCost();
     
    if(costToday > budgetAmount * (1 + allowedOverdeliveryPercentage))   {  
      Logger.log(campaignName + " has spent " + costToday + " which is more than allowed.");
      campaign.applyLabel(labelName);
      campaign.pause();
      }   else   {  
      Logger.log(campaignName + " has spent " + costToday + " and can continue to run.");
      }  
    }  
 
  }  

Цей скрипт моніторить денні витрати і зіставляє їх із денним бюджетом. Щойно вони перевищать допустимий рівень на певний відсоток, наприклад, 20%, кампанію буде автоматично призупинено до наступного дня.

Увага, Ахтунг! Як ми знаємо, скрипти можуть запускатися щонайбільше щогодини, то нам слід мати на увазі, що перевитрата бюджету може тривати протягом наступних 60 хвилин, тому зазначений у скрипті ліміт має бути трохи меншим, ніж потрібно.

Керування оголошеннями

На наше щастя написання оголошення все ще потребує участі ppc спеціаліста і ми все ще комусь потрібні ) Тому створення оголошень - це зазвичай не те завдання, яке варто автоматизувати.
При цьому вже створені оголошення припускають досить великий обсяг роботи з їхньої підтримки, включно з видаленням неефективних оголошень, оновленням спеціальних пропозицій і перевіркою щодо наявності неробочих цільових сторінок. Усі ці завдання чудово підходять для автоматизації за допомогою скриптів.

Нижче - деякі з наших улюблених скриптів для підтримки добре оптимізованого набору оголошень.
Усі ми стикалися з великими кампаніями де бували випадки масового відхилення оголошень. І з часом ці відхилені оголошення можуть стати дратівливими, оскільки вони генерують попередження і захаращують інтерфейс.
Щоб нормалізувати свою нервову систему від попереджень, що вилітають, існує скрипт, який допомагає їх позбутися:

function main()   {  
  // Let's start by getting all of the ad that are disapproved
  var ad_iter = AdWordsApp.ads()
  .withCondition("ApprovalStatus != APPROVED")
  .get();
 
  // Then we will go through each one
  while (ad_iter.hasNext())   {  
    var ad = ad_iter.next();
    // now we delete the ad
    Logger.log("Deleteing ad: " + ad.getHeadline());
    ad.remove();
    }  
  }  

Скрипт для усунення надмірної кількості великих літер в оголошеннях
Замість видалення відхилених оголошень ви також можете використовувати скрипт, який дає змогу усунути одну з найчастіших причин їх відхилення - зловживання великими літерами. Цей скрипт шукає відхилені оголошення і повторно відправляє їх на перевірку, зменшивши кількість використовуваних великих літер.
Вельми зручно під час роботи з величезним масивом даних:

function main()   {  
  var find_caps = /[A-Z]  {  3,  }  /g;
  var SEP = '~~@~~'; // this needs to be something you would never put in your ads.
  var ad_iter = AdWordsApp.ads().withCondition("ApprovalStatus = 'DISAPPROVED'").get();
   
  while(ad_iter.hasNext())   {  
    var ad = ad_iter.next();
    var old_ad_cnt = get_ad_count(ad.getAdGroup());
    var old_ad_str = [ad.getHeadline(),ad.getDescription1(),ad.getDescription2(),ad.getDisplayUrl()].join(SEP);
    var new_ad_str = old_ad_str;
    Logger.log("Before:"+old_ad_str);
    var m = "";
    while((m = find_caps.exec(new_ad_str)) != null)   {  
      new_ad_str = replace_all(new_ad_str,m[0],init_cap(m[0]),false);
      }  
    Logger.log("After:"+new_ad_str);
    if(old_ad_str != new_ad_str)   {  
      var [new_headline,new_desc1,new_desc2,new_disp_url] = new_ad_str.split(SEP);
      ad.getAdGroup().createTextAd(new_headline, new_desc1, new_desc2, new_disp_url, ad.getDestinationUrl());
      var new_ad_cnt = get_ad_count(ad.getAdGroup());
      if(new_ad_cnt == (old_ad_cnt+1))   {  
        ad.remove();
        }  
      }   else   {  
      Logger.log("Skipping because no changes were made."); 
      }  
    }  
   
  function init_cap(s)   {  
    return s.charAt(0).toUpperCase() + s.slice(1).toLowerCase();
    }  
   
  // This function was adapted from: http://dumpsite.com/forum/index.php?topic=4.msg8#msg8 
  function replace_all(original,str1, str2, ignore)   {  
    return original.replace(new RegExp(str1.replace(/([\/\,\!\\\^\$\  {  \  }  \[\]\(\)\.\*\+\?\|\<\>\-\&])/g,"\\$&"),(ignore?"gi":"g")),(typeof(str2)=="string")?str2.replace(/\$/g,"$$$$"):str2);
    }  
   
  function get_ad_count(ad_group)   {  
    var ad_iter = ad_group.ads().get();
    var new_ad_cnt = 0;
    while(ad_iter.hasNext())   {  
      ad_iter.next();
      new_ad_cnt++;
      }  
    return new_ad_cnt;
    }  
  }  

Керування ставками

Управління ставками тісно пов'язане зі щоденними рутинними завданнями, статистикою та прогнозами. Тому це завдання якнайкраще підходить для автоматизації.
Однак, іноді зробити автоматизацію не виходить через занадто складні налаштування. Оскільки в Скриптах AdWords відсутній дружній до користувачів інтерфейс, не всі рекламодавці можуть впоратися з цим вельми складним завданням.
Але розумні люди придумали, а ми користуємося: представляю вашій увазі низку нескладних, але ефективних скриптів для автоматизації ставок.
Скрипт управління ставками на рівні отриманих показів, а також скрипт утримання позиції

// Copyright 2015, Google Inc. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

/**
 * @name Bid To Impression Share
 *
 * @overview The Bid To Impression Share script adjusts your bids and allows you
 *     to steer ads in an advertiser account into a desired impression share in
 *     the search results. See
 *     https://developers.google.com/adwords/scripts/docs/solutions/bid-to-impression-share
 *     for more details.
 *
 * @author AdWords Scripts Team [adwords-scripts@googlegroups.com]
 *
 * @version 2.0.1
 *
 * @changelog
 * - version 2.0.1
 *   - Fixed logic when determining which keywords to raise and lower.
 * - version 2.0.0
 *   - Refactored to target impression share rather than position.
 * - version 1.0.1
 *   - Refactored to improve readability. Added documentation.
 * - version 1.0
 *   - Released initial version.
 */

// Impression share you are trying to achieve.
var TARGET_IMPRESSION_SHARE = 50;

// Once the keywords fall within TOLERANCE of TARGET_IMPRESSION_SHARE,
// their bids will no longer be adjusted.
var TOLERANCE = 5;

// How much to adjust the bids.
var BID_ADJUSTMENT_COEFFICIENT = 1.05;

/**
 * Main function that lowers and raises keywords' CPC to move closer to
 * target impression share.
 */
function main()   {  
  raiseKeywordBids();
  lowerKeywordBids();
  }  

/**
 * Increases the CPC of keywords that are below the target impression share.
 */
function raiseKeywordBids()   {  
  var keywordsToRaise = getKeywordsToRaise();

  while (keywordsToRaise.hasNext())   {  
    var keyword = keywordsToRaise.next();
    keyword.bidding().setCpc(getIncreasedCpc(keyword.bidding().getCpc()));
    }  
  }  

/**
 * Decreases the CPC of keywords that are above the target impression share.
 */
function lowerKeywordBids()   {  
  var keywordsToLower = getKeywordsToLower();

  while (keywordsToLower.hasNext())   {  
    var keyword = keywordsToLower.next();
    keyword.bidding().setCpc(getDecreasedCpc(keyword.bidding().getCpc()));
    }  
  }  

/**
 * Increases a given CPC using the bid adjustment coefficient.
 * @param   {  number  }   cpc - the CPC to increase
 * @return   {  number  }   the new CPC
 */
function getIncreasedCpc(cpc)   {  
  return cpc * BID_ADJUSTMENT_COEFFICIENT;
  }  

/**
 * Decreases a given CPC using the bid adjustment coefficient.
 * @param   {  number  }   cpc - the CPC to decrease
 * @return   {  number  }   the new CPC
 */
function getDecreasedCpc(cpc)   {  
  return cpc / BID_ADJUSTMENT_COEFFICIENT;
  }  

/**
 * Gets an iterator of the keywords that need to have their CPC raised.
 * @return   {  Iterator  }   an iterator of the keywords
 */
function getKeywordsToRaise()   {  
  // Condition to raise bid: Average impression share is worse (less) than
  // target - tolerance
  return AdWordsApp.keywords()
      .withCondition('Status = ENABLED')
      .withCondition(
          'SearchImpressionShare < ' + (TARGET_IMPRESSION_SHARE - TOLERANCE))
      .orderBy('SearchImpressionShare ASC')
      .forDateRange('LAST_7_DAYS')
      .get();
  }  

/**
 * Gets an iterator of the keywords that need to have their CPC lowered.
 * @return   {  Iterator  }   an iterator of the keywords
 */
function getKeywordsToLower()   {  
  // Conditions to lower bid: Ctr greater than 1% AND
  // average impression share better (greater) than target + tolerance
  return AdWordsApp.keywords()
      .withCondition('Ctr > 0.01')
      .withCondition(
          'SearchImpressionShare > ' + (TARGET_IMPRESSION_SHARE + TOLERANCE))
      .withCondition('Status = ENABLED')
      .orderBy('SearchImpressionShare DESC')
      .forDateRange('LAST_7_DAYS')
      .get();
  }  

Це найпростіший скрипт, який вимагає невеликої кількості даних і часу

скрипт утримання позиції: можна завантажити тут

Скрипт для погодинного коригування ставок тут

Встановити погодинну розбивку можна лише за допомогою автоматизації, оскільки Google обмежує рекламодавців шістьма активними часовими періодами на добу. Завдяки цьому скрипту можна мати різні ставки щогодини.

Скрипт для ставок на позицію при знаходженні в заданому діапазоні СРС можна завантажити тут.

Однією з основних переваг скриптів є те, що завжди можна почати з якоїсь простої задачі, наприклад, з налаштування правила для підвищення ставок у тому разі, якщо оголошення не потрапляють на цільову позицію.

Пам'ятайте при належній практиці ви завжди можете поліпшити або переробити цей так і будь-який інший скрипт під свої потреби.

Погодне таргетування

Ну і для особливих місьє, які розуміються на збоченнях і бажають виї...дитися, є ноухау скрипт по погодному таргетингу.

Скрипти для призначення ставок на основі погодних умов - це класичний приклад широких і практично безмежних можливостей . Навіть якщо для вашого бізнесу не важлива погода, цей приклад ілюструє той факт, що в роботі скриптів можуть використовуватися як власні дані компаній, так і зовнішні дані, взяті зі сторонніх джерел.

Якщо ж погода для вас важлива (наприклад, служба доставки), дослідження показують, що люди вважають за краще замовляти їжу додому за поганої погоди. Тому спробуйте поекспериментувати із запропонованим скриптом.

Скрипт, який повідомляє про перевитрату бюджету за групами товарів і ключовими словами можна завантажити тут.

Цей скрипт шукає групи товарів або ключові слова, витрати за якими перевищують задану суму, а кількість конверсій менша за очікувану протягом заданого періоду часу.

Це завдання також можна виконати за допомогою автоматичних правил, але вони можуть спрацьовувати лише один раз на день, що дуже рідко для акаунтів з високими витратами. Цей скрипт, зі свого боку, здатний виконувати пошук за заданими критеріями 24 рази на день.

Підіб'ємо підсумки

Ми не можемо повністю позбутися рутинної і нудної роботи, яка притаманна кожному ppc-фахівцю, але наше з вами завдання - намагатися і навчатися щодня. І пам'ятайте як було написано вище, оптимізації за допомогою скриптів обмежується виключно Вашою фантазією

Вдалого налаштування і високої конверсії!

(5/5 - голосів 1)

Рекомендовані статті

Читайте також: