Марат-блог
Услуги по продвижению и разработке сайта
Отправить заявку
Заказать обратный звонок

Спасибо, Ваша заявка принята.

В ближайшее время менеджер свяжется с Вами.

Главная » Контекст » Инструкция по работе с методом альфа-бета кампаний в Google AdWords
Инструкция по работе с методом альфа-бета кампаний в Google AdWords
Контекстная реклама
1412
07 июля 2017

Инструкция по работе с методом альфа-бета кампаний в Google AdWords

Поисковый запрос в контекстной рекламе является фундаментом, на котором будет базироваться показ вашей рекламы.

А для достижения максимально релевантного итога, нужно собирать много ключевиков, что описывают товар или услуги. Сегодня мы поговорим о том, каким образом подбираются наиболее эффективные ключевые слова при помощи альфа-бета кампаний в Google AdWords.

Типы соответствия ключевых слов

В  Google Adwords можно работать с пятью типами ключевых слов. Это помогает рекламодателю использовать релевантность поисковых запросов.


Типы соответствия ключевиков

Наибольшей релевантностью располагают слова с точным соответствием. Но есть подвох: таким образом вам не будет известно о способе поиска товаров пользователями. И не сможете полностью оценить эффективность рекламы.

Если в вашем аккаунте есть рекламная кампания с широким соответствием, тогда можно будет узнать, каким образом и по каким запросам люди покупают то, что ищут. Подобные знания также могут стоит немало. По той причине, что широкое соответствие подобно магниту притягивает к себе всё, что угодно. Широкое соответствие может способствовать получению нецелевого трафика.

Нужно комбинировать таким образом: покупать идеи недорого, а в «работающие» слова вкладывать по максимуму. В этом и состоит суть метода альфа-бета кампаний.

Структура альфа-бета аккаунта

Для начала необходимо определиться с тем, какие показатели хорошие, а какие – плохие. Известными метриками, с которыми можно работать в контекстной рекламе, являются ERS, ROI, ROAS, CPA.

«Хорошо» и «плохо»: что это

К примеру, для вашей рекламы хорошо, когда запрос принес сотню переходов и 4 конверсии.

А плохая ситуация – когда на 100 переходов до одной конверсии.

Бета-кампания

Можете приступать к бета-кампании. Она будет вбирать в себя статистику и вбирать все сложности семантической схожести поисковых слов к запросу. Бюджет должен быть «по-умному» ограничен, а ставки должны позволять показываться на позициях ниже четвертой. Ключевики должны находиться в широком соответствии. Для экономии средств выбирайте широкое соответствие с уточнением.

Альфа-кампания

Спустя некоторое время все «хорошие» запросы переходят в a/b кампанию на «боевой» бюджет. Группы и тексты аналогичные, а вот ставки – можно повышать. При помощи накопленной статистики и принятому решению, поисковый запрос, что принес рентабельные конверсии в бета-версии, принесет гораздо больше в альфе, что расположена на первых позициях.

Ключевики в альфа-кампании должны находиться в точном соответствии.

Такое соответствие имеет значительный минус – по нему не могут демонстрироваться слова с опечатками и числительные. Во избежание таких ситуаций, следует относить к минусу всё, что без точного соответствия.

Что означает «не знаю»

В бета-кампании вы будете иметь поисковые запросы, что не являются однозначно хорошими или плохими. За подобными словами необходимо следить.

Поддержка альфа-бета аккаунта

В бета-кампании необходимо сортировать слова на плохие и хорошие, а потом – отправлять их в списки минус слов с точным соответствием.

  • Хорошие— в список минус-фраз, что применяются на уровне аккаунта, кроме альфа-кампании, чтобы годный трафик точно попадал в альфу.
  • Плохие— в список минус-фраз, которые применяются для бета-кампаний, чтобы не сливать бюджет впустую.
  • «Неопределенные» ключевики добавляем в ключевые фразы бета-кампании.  


Работа альфа-бета кампаний

Фильтр на плохие фразы работает на уровне альфа-кампании для поиска ключевых слов, которые выгорели и нуждаются в постоянном контроле. К примеру, вы увеличили ставку ключевика в альфе, и оно начало демонстрировать отрицательную эффективность. И если после возврата к предыдущей ставке работа не приходит в норму – то ключевик лучше убрать из альфа-кампании и списка минус-фраз. А также перенести его в качестве широкого с уточнением в бета-кампанию.

Автоматизация работы

В случае с альфа-кампанией лучше работать вручную. Но вот с бетой – необходима автоматизация процесса. Предлагаем скрипты для автоматического поиска хороших фраз и автоматической кросс-минусации.

Автоматический поиск ключевиков по заранее выделенным критериям

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

 * Find the Winners and Losers from the

 * Search Query Performance report for

 * Alpha Beta Campaign Strategy.

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


// The list of email addresses to send the report to.
// We will also give editor access to the Google Spreadsheet.

var NOTIFY = ['your_email@example.com'];


// The name of the report in your Google drive

var SPREADSHEET_PREFIX ='AlphaBetaResults - ';


// This string is used to identify your Beta campaigns.
// Make sure this string is found in all your Beta campaign names

var BETA_SUFFIX ='| Beta';


// This is the timeframe used to calculate the statistics.

var REPORT_TIMEFRAME ='YESTERDAY';


// This is the list of columns that will be displayed in the
// Winners and Losers report. Make sure that any columns used in
// the Criteria below are listed here as well.

var REPORT_COLUMNS = [

  'CampaignName','AdGroupName',

  'KeywordTextMatchingQuery','MatchType','Query',

  'Impressions','Clicks','Cost','ConvertedClicks'];


// This is the set of criteria that will be used to
// determine the winners. Any of the numerical columns
// should work here. These are just samples, find what
// works for you.

var WINNING_CRITERIA = [

  'Clicks > 100',

 
// If using money columns, be sure to represent them in micros
// https://developers.google.com/adwords/api/docs/guides/reporting-concepts#money'Cost < 1000000',   'ConvertedClicks >= 5'

];

var LOSING_CRITERIA = [

  'Impressions > 100',

  'Clicks < 5',  

  'ConvertedClicks = 0' ];

 

function main() {

   generateWinnersLosersReport();

}

 

function generateWinnersLosersReport() {

 
// This string will be appended to the report to create a unique  
// name each day. If you run this intra-day, you can add hours (HH) to  
// to the format string.

  var dateString = Utilities.formatDate(newDate(),

                                        AdWordsApp.currentAccount().getTimeZone(),

                                        'yyyy-MM-dd HH');

  var crits = [WINNING_CRITERIA,LOSING_CRITERIA];

  var sheets = [

    getSheet(SPREADSHEET_PREFIX+dateString,'Winners'),

    getSheet(SPREADSHEET_PREFIX+dateString,'Losers')

  ];

 
// Grab all the results first. That way we can remove the winners and losers  
// to keep the ones with "not enough data".

  var allResults = pullSearchQueryPerfReport(REPORT_TIMEFRAME,REPORT_COLUMNS,[]);

  for(var i in crits) {

    var results = pullSearchQueryPerfReport(

      REPORT_TIMEFRAME,

      REPORT_COLUMNS,

      crits[i]

    );

    writeResultsToSheet(results,sheets[i]);

    removeFromAllResults(allResults,results);

  }

 
//Handle the 'Not Enough Data' case

  var notEnoughDataSheet = getSheet(SPREADSHEET_PREFIX+dateString,'Not Enough Data');

  writeResultsToSheet(allResults,notEnoughDataSheet);

  sendEmail(sheets,dateString);

}

 


// This function pulls the search query report and
// formats it to be easy to insert into a Google Sheet.

function pullSearchQueryPerfReport(timeframe,columns,crit) {

  var reportName ='SEARCH_QUERY_PERFORMANCE_REPORT';

  var reportQueryTemplate ='SELECT %s FROM %s WHERE %s DURING %s';

 
// Add a criteria so that we only look at data from Beta campaigns.

  crit.push("CampaignName CONTAINS '"+BETA_SUFFIX+"'");

  var reportQuery = Utilities.formatString(reportQueryTemplate,

                                           columns.join(','),

                                           reportName,

                                           crit.join(' AND '),

                                           timeframe);

  var reportIter = AdWordsApp.report(reportQuery,{

      includeZeroImpressions: true

    }).rows();

  var results = [];

  while(reportIter.hasNext()) {

    var row = reportIter.next();

    var rowArray = [];

    for(var i in columns) {

      rowArray.push(row[columns[i]]);

    }

    results.push(rowArray);

  }

  return results;

}

 


// This function writes the results to a given spreadsheet

function writeResultsToSheet(results,sheet) {

  if(results.length>0) {

    var keywordIndex = REPORT_COLUMNS.indexOf('KeywordTextMatchingQuery');

    sheet.appendRow(REPORT_COLUMNS)

    for(var i in results) {

     
// if the keyword starts with a plus sign,
// we need to add an apostrophe so google sheets
// doesn't get annoyed.if(results[i][keywordIndex].indexOf('+') ===0) {

        results[i][keywordIndex] ="'"+results[i][keywordIndex];

      }

      sheet.appendRow(results[i]);

    }

  }

}

 


// This function removes the results in toRemove from the results
// in the allResults array. Used to remove winners and losers so
// that all we have left are the "not enough data" queries.

function removeFromAllResults(allResults,toRemove) {

  var allResultsRowHash = {};

  for(var i in allResults) {

    var rowHash = Utilities.base64Encode(JSON.stringify(allResults[i]));

    allResultsRowHash[rowHash] =1;

  }

  for(var i in toRemove) {

    var rowHash = Utilities.base64Encode(JSON.stringify(toRemove[i]));

    if(allResultsRowHash[rowHash]) {

      allResults.splice(i,1);

    }

  }

}

 


// Sends the spreadsheet in an email to the people in the
// NOTIFY list.

function sendEmail(sheets,dateString) {

  var subjectLineTemplate ='Alpha Beta Results - %s - %s';

  var subjectLine = Utilities.formatString(subjectLineTemplate,

                                           AdWordsApp.currentAccount().getName(),

                                           dateString);

  var bodyTemplate ='Here is a spreadsheet with the '+'winners and losers for account: %s: \n\n %s';

  var body = Utilities.formatString(bodyTemplate,

                                    AdWordsApp.currentAccount().getName(),

                                    sheets[0].getParent().getUrl());

  for(var i in NOTIFY) {

    MailApp.sendEmail(NOTIFY[i], subjectLine, body);

  }

}

 


// Helper function to get or create a given sheet in
// a spreadsheet. When creating a new spreadsheet, it also
// adds the emails in the NOTIFY list as editors.

function getSheet(spreadsheetName,sheetName) {

  var fileIter = DriveApp.getFilesByName(spreadsheetName);

  if(fileIter.hasNext()) {

    var ss = SpreadsheetApp.openByUrl(fileIter.next().getUrl());

    var sheets = ss.getSheets();

    for(var i in sheets) {

      if(sheets[i].getName() == sheetName) {

        sheets[i].clear();

        return sheets[i];

      }

    }

    return ss.insertSheet(sheetName);

  } else {

    var ss = SpreadsheetApp.create(spreadsheetName);

    ss.addEditors(NOTIFY);

    var sheet = ss.insertSheet(sheetName);

    ss.deleteSheet(ss.getSheetByName('Sheet1'));

    return sheet;

  }

}

 


// Replace the main from above with this one.
// We create the report from before but then
// also add the losers to the beta group.

function main() {

  generateWinnersLosersReport();

  addLosersToBetaGroup();

}

 


// This code pulls the losers from from the
// Beta campaign using the same criteria as before.

function addLosersToBetaGroup() {

  var loserResults = pullSearchQueryPerfReport(

    REPORT_TIMEFRAME,

    REPORT_COLUMNS,

    LOSING_CRITERIA

  );

  if(loserResults.length>0) {

    var campKwHash = transformSearchQueryResults(loserResults);

    var campaignNames =Object.keys(campKwHash);

   
// Find all the Beta campaigns

    var campIter = AdWordsApp.campaigns().withCondition("Name CONTAINS '"+BETA_SUFFIX+"'").get();

    while(campIter.hasNext()) {

      var camp = campIter.next();

      var campName = camp.getName();

     
// If the campaign is in the list of Beta campaigns we need
// to add negative toif(campaignNames.indexOf(camp.getName()) >=0) {

        var negativesList = campKwHash[campName];

        for(var i in negativesList) {

         
// Add the negatives.

          camp.createNegativeKeyword(negativesList[i]);

        }

      }

    }

  }

}

 


// This function transforms the data from the Search Query report
// into a map of { campaignName : [ "[query1]","[query2]", ... ] }

function transformSearchQueryResults(results) {

  var campKwHash = {};

  var campColumn = REPORT_COLUMNS.indexOf('CampaignName');

  var queryColumn = REPORT_COLUMNS.indexOf('Query');

  for(var i in loserResults) {

    var row = loserResults[i];

    var campName = row[campColumn];

    var query = row[queryColumn];

    if(!campKwHash[campName]) {

      campKwHash[campName] = [];

    }

    campKwHash[campName].push('['+query+']');

  }

  return campKwHash;

}

Автоматическая кросс-минусация

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

 * Automatically add any new keywords in your

 * Alpha campaigns as exact match negatives in

 * the corresponding Beta campaign.

 *******************************/
// Just as before, these strings will be
// used to identify your Alpha and Beta campaigns.
// This script assumes that your Alpha campaigns are
// named "Campaign Name | Alpha" with the corresponding
// Beta campaign named "Campaign Name | Beta"

var ALPHA_SUFFIX ='| Alpha';

var BETA_SUFFIX ='| Beta';

 

function main() {

  var results = getKeywordReport();

  var toUpdate = {};

  for(var key in results) {

    var campData = results[key];

    for(var i in campData.alpha.keywords) {

      var kw = campData.alpha.keywords[i];

      if(campData.beta.negatives.indexOf(kw) ==-1) {

        if(!toUpdate[campData.beta.campName]) {

          toUpdate[campData.beta.campName] = [];

        }

        toUpdate[campData.beta.campName].push(kw);

      }

    }

  }

  var campIter = AdWordsApp.campaigns().withCondition("Name CONTAINS '"+BETA_SUFFIX+"'").get();

  while(campIter.hasNext()) {

    var betaCamp = campIter.next();

    var betaCampName = betaCamp.getName();

    if(toUpdate[betaCampName]) {

      var negativesToAdd = toUpdate[betaCampName];

      for(var i in negativesToAdd) {

        betaCamp.createNegativeKeyword('['+negativesToAdd[i]+']');

      }

    }

  }

}

 


// This function uses the Keywords report and
// the campaign negatives report to build a list
// of the keywords and negatives in each campaign.

function getKeywordReport() {

  var columns = ['CampaignName','Criteria','IsNegative'];

  var reportQueryTemplate ="SELECT %s FROM %s "+"WHERE IsNegative IN [true,false] "+"AND CampaignName CONTAINS '%s' ";

  var alphaReportQuery = Utilities.formatString(reportQueryTemplate,

                                                columns.join(','),

                                                'KEYWORDS_PERFORMANCE_REPORT',

                                                ALPHA_SUFFIX);

  var betaReportQuery = Utilities.formatString(reportQueryTemplate,

                                               columns.join(','),

                                               'CAMPAIGN_NEGATIVE_KEYWORDS_PERFORMANCE_REPORT',

                                               BETA_SUFFIX);

  var queries = [alphaReportQuery,betaReportQuery];

  var results = {};

  for(var i in queries) {

    var reportIter = AdWordsApp.report(queries[i],{

      includeZeroImpressions: true

    }).rows();

    while(reportIter.hasNext()) {

      var row = reportIter.next();

      if(row.CampaignName.indexOf(ALPHA_SUFFIX) ==-1&&

         row.CampaignName.indexOf(BETA_SUFFIX) ==-1) {

        continue;

      }

      var campType = (row.CampaignName.indexOf(ALPHA_SUFFIX) >=0) ? 'alpha' : 'beta';

     

      var cleanCampName = row.CampaignName.split(ALPHA_SUFFIX)[0];

      cleanCampName = cleanCampName.split(BETA_SUFFIX)[0];

     

      if(!results[cleanCampName]) {

        results[cleanCampName] = {

          alpha: { keywords: [], negatives: [], campName: '' },

          beta:  { keywords: [], negatives: [], campName: '' }

        };

      }

      results[cleanCampName][campType].campName = row.CampaignName;

      if(row.IsNegative =='true') {

        results[cleanCampName][campType].negatives.push(row.Criteria);

      } else {

        results[cleanCampName][campType].keywords.push(row.Criteria);

      }

    }

  }

  return results;

}

Можно утверждать, что метод альфа-бета кампаний – неплохой. Он дает увеличение ROI за короткое время, но зависит от многих факторов. Любая работа требует внимания и кропотливой работы. Знание о ряде методов не должно превращаться в инструкцию без возможности изменения. Создавайте что-то свое и опирайтесь на опыт своих предшественников – вот лучший совет в данном вопросе.