Знаете ли вы, сколько стоят ваши ставки?

eeaa990880a87a347e6145f6c52577ce

Журналист Фредерик Вэлэйс поделился скриптом для  AdWords, который создаёт таблицу на основе ставок с минимальным и максимальным значениями.

Ранее мы публиковали историю о самых дорогих ключевых словах в AdWords. Многих впечатлили эти цифры, но думаю, мало кто подозревал, что они настолько высоки.

Как это возможно, вы спросите? С годами назначать ставки стало сложнее, очень легко можно запутаться с окончательной ценой за клик.

Эволюция управления ставками в контекстной рекламе

И хотя я не говорю, что раньше было легко управлять ставками, но сейчас всё стало немного сложнее. Во времена GoTo и Overture, ставки были прозрачными, компании делали ставку на пенни ниже максимального бида (ставки) их конкурентов, чтобы заставить их платить по максимуму.

Затем появился Google AdWords, где финальная цена за клик зависела от Показателя качества. И хотя вы всё ещё видели максимальную цену за клик, узнать цену ставки стало практически невозможно.

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

Когда ввели корректировки ставок всё стало ещё сложнее. Если использовать модификаторы ставок, максимальная цена за клик — это лишь первоначальная цена. Реальная цена ставки может быть больше в несколько раз.

Так как в AdWords не показаны модификаторы на странице, когда мы смотрим на ставки по ключевым словам. А значит, не понятно, как много мы тратим за определённое ключевое слово.

Мне бы хотелось поделиться скриптом AdWords, которым поможет узнать диапазон цен на ставки.  Используя его, вы сможете посмотреть на самую высокую и самую низкую цену модификатора ставок в зависимости от местоположения и времени проведения каждой кампании. Также можно посмотреть ставки для мобильного поиска.

К сожалению, у скриптов нет доступа к модификаторам ставок по аудитории.

Скрипт для AdWords, который показывает цену за клик

Сделайте копию скрипта отсюда, и вставьте в свой аккаунт в AdWords:

var DEBUG = 0;

function main() {

var spreadsheetName = «Bid Ranges»;
var spreadsheetUrl = «»;
var accountManagers = «»;
var overWriteOldData = 1;
var sheetNames = [«Campaigns», «Keywords»];
var folderNames = «»;

var destinationSpreadsheet = setUpReportInGoogleSheets(spreadsheetUrl, spreadsheetName, accountManagers, overWriteOldData, sheetNames, folderNames);
var spreadsheet = destinationSpreadsheet.spreadsheet;
var keywordSheet = spreadsheet.getSheetByName(«Keywords»);
var campaignSheet = spreadsheet.getSheetByName(«Campaigns»);

keywordSheet.appendRow([«Campaign», «Ad Group», «Keyword», «Cpc Bid», «Lowest Possible Cpc», «Highest Possible Cpc», «First Page Cpc», «First Position Cpc», «Top Of PageCpc»]);
campaignSheet.appendRow([«Campaign», «Lowest Mobile Modifier», «Highest Mobile Modifier», «Lowest Dayparting Modifier», «Highest Dayparting Modifier», «Lowest Geo Modifier», «Highest Geo Modifier», «Lowest Aggregate Modifier», «Highest Aggregate Modifier»]);

var bidAdjustmentMap = buildMapOfBidAdjustments(campaignSheet);

var report = AdWordsApp.report(
‘SELECT CampaignName, CampaignId, AdGroupName, AdGroupId, CpcBid, FirstPageCpc, FirstPositionCpc, TopOfPageCpc, Criteria ‘ +
‘FROM KEYWORDS_PERFORMANCE_REPORT ‘ +
‘WHERE Cost > 0 ‘ +
‘AND CampaignId IN ‘ + JSON.stringify(bidAdjustmentMap.campaignIdList) + ‘ ‘ +
‘AND AdGroupStatus = ENABLED ‘ +
‘DURING LAST_30_DAYS ‘);
var rows = report.rows();

while(rows.hasNext()) {
var row = rows.next();
var criteria = row[‘Criteria’];
var adGroupId = row[‘AdGroupId’];
var campaignId = row[‘CampaignId’];
var adGroupName = row[‘AdGroupName’];
var campaignName = row[‘CampaignName’];
var cpcBid = row[‘CpcBid’];
var firstPageCpc = row[‘FirstPageCpc’];
var firstPositionCpc = row[‘FirstPositionCpc’];
var topOfPageCpc = row[‘TopOfPageCpc’];

var lowestLocationModifier = bidAdjustmentMap.campaigns[campaignId].lowestLocationModifier;
var highestLocationModifier = bidAdjustmentMap.campaigns[campaignId].highestLocationModifier;
var lowestAdScheduleModifier = bidAdjustmentMap.campaigns[campaignId].lowestAdScheduleModifier;
var highestAdScheduleModifier = bidAdjustmentMap.campaigns[campaignId].highestAdScheduleModifier;

if(bidAdjustmentMap.campaigns[campaignId].adGroups[adGroupId]) {
var lowestMobileModifier = bidAdjustmentMap.campaigns[campaignId].adGroups[adGroupId].lowestAdGroupMobileModifier;
var highestMobileModifier = bidAdjustmentMap.campaigns[campaignId].adGroups[adGroupId].highestAdGroupMobileModifier;
}
else {
var lowestMobileModifier = bidAdjustmentMap.campaigns[campaignId].lowestMobileModifier;
var highestMobileModifier = bidAdjustmentMap.campaigns[campaignId].highestMobileModifier;
}

var highestBidAdjustment = highestLocationModifier * highestAdScheduleModifier * highestMobileModifier;
var lowestBidAdjustment = lowestLocationModifier * lowestAdScheduleModifier * lowestMobileModifier;

//Logger.log(highestLocationModifier + » » + highestAdScheduleModifier + » » + highestMobileModifier)

var highestPossibleCpc = highestBidAdjustment * cpcBid;
var lowestPossibleCpc = lowestBidAdjustment * cpcBid;
//Logger.log(criteria + » bid: » + cpcBid + » (» + lowestPossibleCpc + » — » + highestPossibleCpc + «)» + » (» + highestBidAdjustment + » — » + lowestBidAdjustment + «)»);
keywordSheet.appendRow([campaignName, adGroupName, «‘» + criteria, cpcBid, lowestPossibleCpc.toFixed(2), highestPossibleCpc.toFixed(2), firstPageCpc, firstPositionCpc, topOfPageCpc]);
}
Logger.log(«Results are ready at » + destinationSpreadsheet.url);
}

function buildMapOfBidAdjustments(campaignSheet) {

var bidAdjustmentMap = new Object();
bidAdjustmentMap.campaignIdList = new Array();
bidAdjustmentMap.campaigns = new Array();

var campaignIterator = AdWordsApp.campaigns().get();
//Logger.log(‘Total campaigns found : ‘ + campaignIterator.totalNumEntities());
while (campaignIterator.hasNext()) {
var lowestLocationModifier = 1;
var highestLocationModifier = 1;

var lowestAdScheduleModifier = 1;
var highestAdScheduleModifier = 1;

var lowestMobileModifier = 1;
var highestMobileModifier = 1;

var campaign = campaignIterator.next();
var campaignName = campaign.getName();
var campaignId = campaign.getId();
var targeting = campaign.targeting();

bidAdjustmentMap.campaignIdList.push(campaignId);

bidAdjustmentMap.campaigns[campaignId] = new Object();
bidAdjustmentMap.campaigns[campaignId].adGroups = new Array();
bidAdjustmentMap.campaigns[campaignId].campaignId = campaignId;
bidAdjustmentMap.campaigns[campaignId].campaignName = campaignName;

var locationIterator = targeting.targetedLocations().get();
while(locationIterator.hasNext()) {
var location = locationIterator.next();
var modifier = location.getBidModifier();
if(modifier < lowestLocationModifier) lowestLocationModifier = modifier;
if(modifier > highestLocationModifier) highestLocationModifier = modifier;
}

var mobile = targeting.platforms().mobile().get();
while(mobile.hasNext()) {
var modifier = mobile.next().getBidModifier();
if(modifier < lowestMobileModifier) lowestMobileModifier = modifier;
if(modifier > highestMobileModifier) highestMobileModifier = modifier;
}

var adScheduleIterator = targeting.adSchedules().get();
while(adScheduleIterator.hasNext()) {
var adSchedule = adScheduleIterator.next();
var modifier = adSchedule.getBidModifier();
//Logger.log(» Ad Schedule modifier: » + modifier);
if(modifier < lowestAdScheduleModifier) lowestAdScheduleModifier = modifier;
if(modifier > highestAdScheduleModifier) highestAdScheduleModifier = modifier;
}

/*
Logger.log(«Campaign: » + campaignName);
Logger.log(» lowestLocationModifier: » + lowestLocationModifier);
Logger.log(» highestLocationModifier: » + highestLocationModifier);

Logger.log(» lowestAdScheduleModifier: » + lowestAdScheduleModifier);
Logger.log(» highestAdScheduleModifier: » + highestAdScheduleModifier);

Logger.log(» lowestMobileModifier: » + lowestMobileModifier);
Logger.log(» highestMobileModifier: » + highestMobileModifier);
*/
var lowestTotalModifier = lowestLocationModifier * lowestAdScheduleModifier * lowestMobileModifier;
var highestTotalModifier = highestLocationModifier * highestAdScheduleModifier * highestMobileModifier;
campaignSheet.appendRow([campaignName, lowestMobileModifier, highestMobileModifier, lowestAdScheduleModifier, highestAdScheduleModifier, lowestLocationModifier, highestLocationModifier, lowestTotalModifier, highestTotalModifier]);

bidAdjustmentMap.campaigns[campaignId].lowestLocationModifier = lowestLocationModifier;
bidAdjustmentMap.campaigns[campaignId].highestLocationModifier = highestLocationModifier;
bidAdjustmentMap.campaigns[campaignId].lowestAdScheduleModifier = lowestAdScheduleModifier;
bidAdjustmentMap.campaigns[campaignId].highestAdScheduleModifier = highestAdScheduleModifier;
bidAdjustmentMap.campaigns[campaignId].lowestMobileModifier = lowestMobileModifier;
bidAdjustmentMap.campaigns[campaignId].highestMobileModifier = highestMobileModifier;

var adGroups = campaign.adGroups().withCondition(«Status = ENABLED»).get();
while(adGroups.hasNext()) {
var lowestAdGroupMobileModifier = lowestMobileModifier;
var highestAdGroupMobileModifier = highestMobileModifier;

var adGroup = adGroups.next();

var adGroupName = adGroup.getName();
var adGroupId = adGroup.getId();

bidAdjustmentMap.campaigns[campaignId].adGroups[adGroupId] = new Object();
bidAdjustmentMap.campaigns[campaignId].adGroups[adGroupId].adGroupId = adGroupId;
bidAdjustmentMap.campaigns[campaignId].adGroups[adGroupId].adGroupName = adGroupName;

bidAdjustmentMap.campaigns[campaignId].adGroups[adGroupId].highestAdGroupMobileModifier = highestMobileModifier;
bidAdjustmentMap.campaigns[campaignId].adGroups[adGroupId].lowestAdGroupMobileModifier = lowestMobileModifier;

var modifier = adGroup.getMobileBidModifier();
//Logger.log(«ag mobile mod: » + modifier);

if(modifier < lowestAdGroupMobileModifier) {
lowestAdGroupMobileModifier = modifier;
//Logger.log(» AG: » + adGroupName + » lowest Mobile Modifier: » + lowestAdGroupMobileModifier);
bidAdjustmentMap.campaigns[campaignId].adGroups[adGroupId].lowestAdGroupMobileModifier = lowestAdGroupMobileModifier;
}
else if(modifier > highestAdGroupMobileModifier) {
highestAdGroupMobileModifier = modifier;
//Logger.log(» AG: » + adGroupName + » highest Mobile Modifier: » + highestAdGroupMobileModifier);
bidAdjustmentMap.campaigns[campaignId].adGroups[adGroupId].highestAdGroupMobileModifier = highestAdGroupMobileModifier;
}

}

}
return bidAdjustmentMap;
}

/*
// function setUpReportInGoogleSheets(spreadsheetUrl, spreadsheetName, accountManagers, overWriteOldData, sheetNames, targetFolder)
//—————————————
// handles all the details of setting up the Google Spreadsheet to receive the report data
//
// output is an object
// destinationSpreadsheet.overwrite
// destinationSpreadsheet.isNew
// destinationSpreadsheet.spreadsheet (the Google spreadsheet object)
// destinationSpreadsheet.url
*/
function setUpReportInGoogleSheets(spreadsheetUrl, spreadsheetName, accountManagers, overWriteOldData, sheetNames, folderNames) {

var destinationSpreadsheet = new Object();
if(folderNames) {
var folderStructure = folderNames.split(«,»);
} else {
var folderStructure = new Array();
}

var targetFolder = DriveApp.getRootFolder();
for(var i = 0; i < folderStructure.length; i++) {
var folderName = folderStructure[i];
if(folderName.toLowerCase().indexOf(«[account id]») != -1) {
folderName = AdWordsApp.currentAccount().getCustomerId();
} else if(folderName.toLowerCase().indexOf(«[account name]») != -1) {
folderName = AdWordsApp.currentAccount().getName();
}
Logger.log(«folderName: » + folderName);
var foldersIterator = targetFolder.getFoldersByName(folderName);
if (foldersIterator.hasNext()) {

targetFolder = foldersIterator.next();
Logger.log(«Selected target folder: » + folderName);
} else {
if(DEBUG==1) Logger.log(«Creating a new folder: » + folderName);
targetFolder = targetFolder.createFolder(folderName);
}
}

destinationSpreadsheet.overWrite = overWriteOldData;

if(!spreadsheetUrl || spreadsheetUrl == «» || spreadsheetUrl == » » || spreadsheetUrl.toLowerCase().indexOf(«new») != -1) var isNew = 1;
destinationSpreadsheet.isNew = isNew;

if(!sheetNames || !sheetNames[0]) {
var sheetNames = new Array();
sheetNames[0] = «Sheet 1»;
}

if(isNew)
{
var spreadsheet = SpreadsheetApp.create(spreadsheetName);
var id = spreadsheet.getId();
var spreadsheetUrl = spreadsheet.getUrl();
var file = DriveApp.getFileById(id);
targetFolder.addFile(file);
if(folderName) DriveApp.getRootFolder().removeFile(file);
}
var spreadsheet = SpreadsheetApp.openByUrl(spreadsheetUrl);
destinationSpreadsheet.spreadsheet = spreadsheet;
destinationSpreadsheet.url = spreadsheet.getUrl();

// IF NEW -> REMOVE ALL SHEETS, THEN CREATE ALL SHEETS
if(isNew){
var allSheets = spreadsheet.getSheets();

// remove
for(var i=1,len=allSheets.length;i<len;i++){
spreadsheet.deleteSheet(allSheets[i]);
}

// create
allSheets[0].setName(sheetNames[0]);
for(var sheetCounter = 1; sheetCounter < sheetNames.length; sheetCounter++) {
var sheetName = sheetNames[sheetCounter];
if(DEBUG == 1) Logger.log(«sheet name: » + sheetName);
spreadsheet.insertSheet(sheetName);
}
} else {
// IF NOT NEW, MAKE SURE RIGHT SHEETS EXIST
for(var sheetCounter = 0; sheetCounter < sheetNames.length; sheetCounter++) {
var sheetName = sheetNames[sheetCounter];
if(DEBUG == 1) Logger.log(«checking if sheet with name exists: » + sheetName);
try {
var thisSheet = spreadsheet.getSheetByName(sheetName);
if(!thisSheet) spreadsheet.insertSheet(sheetName);
} catch (e) {
Logger.log(e);
}
}
}

// ADD ACCOUNT MANAGERS
if(accountManagers && accountManagers!=»»){
var accountManagersArray = accountManagers.replace(/\s/g, «»).split(«,»);
spreadsheet.addEditors(accountManagersArray);
}

// IF OVERWRITE, CLEAR SHEETS
if(overWriteOldData) {
for(var sheetCounter = 0; sheetCounter < sheetNames.length; sheetCounter++) {
var sheetName = sheetNames[sheetCounter];
if(DEBUG == 1) Logger.log(«sheet name: » + sheetName);
try {
var thisSheet = spreadsheet.getSheetByName(sheetName);
if(thisSheet) thisSheet.clear();
} catch (e) {
Logger.log(e);
}
}
}
return(destinationSpreadsheet);
}

На выходе вы получите документ с таблицей с двумя вкладками. Первая вкладка называется “Кампании” с самой высокой и самой низкой ценой модификатора ставки для мобильных, мест размещения и дней недели каждой активной кампании. (На заметку: сюда не входят кампании в YouTube и объявления с товарами)

Самые высокие и самые низкие ставки для вашей AdWords кампании можно увидеть в одном документе. 
Самые высокие и самые низкие ставки для вашей AdWords кампании можно увидеть в одном документе.

Вторая вкладка называется “Ключевые слова”. Показывает каждое ключевое слово в зависимости от его цены за клик, а также максимальное и минимальное значение каждой ставки. Также в таблице можно найти информацию о ставках для первой позиции в поиске.

Keyword_Bid_Ranges_-_Optmyzr_Script-800x315
Максимальная и минимальная цена за клик, формирующаяся на основе главной ставки и всех доступных модификаторов.

Ставка для первой страницы

Теперь вы видите, как отличаются цены для каждого ключевого слова. Давайте сравним эти три столбца “Ставка для первой страницы”, “Ставка для первой позиции” и “Ставка для позиций в ТОПе”.

Теперь вы можете узнать, сколько на самом деле вы платите за рекламу, и понять, почему же ваше объявление не видно по этому ключевому слову. Больше не нужно угадывать цены за ставки, чтобы оказаться в поиске.  

Ставку для первой страницы нужно высчитывать в контексте цены за клик по ключевым словам, к которым применили модификаторы.
Ставку для первой страницы нужно высчитывать в контексте цены за клик по ключевым словам, к которым применили модификаторы.

 

Совсем скоро: корректировка ставок для разных девайсов

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

Когда этот день настанет, этот скрипт нужно будет обновить дополнительными двумя модификаторами.

Убедитесь, что цена за клик посчитана правильно

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

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

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

Как выбрать девайс, к которому привязать цену за клик

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

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

Управление ставками станет ещё сложнее, так как любое изменение в базовой ставке коснётся сразу всех устройств, и нужно будет проверять, актуальна ли 30% корректировка для обновленной кампании.

Нужно ли менять стратегию по управлению ставками?

Мы начали думать о различных способах управления ставками. Что если цена за клик — значение, которое мы почти не можем изменить? Мы можем использовать модификаторы ставок для устройств, подтягивая ставку выше или ниже актуальной цены за клик.

Преимущество модификатора ставок для мобильных в том, что он не влияет на остальные ставки. Конечно, минус модификатора ставок для разных девайсов в том, что, так как модификатор применяется для группы объявлений, то ваша ставка устанавливается сразу для всех ключевых слов в одной группе объявлений. И это не очень хорошо. Только если у вас не одна группа объявлений.

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

Заключение

Сейчас управлять ставками в контекстной рекламе очень сложно. Поэтому я  надеюсь, что мои скрипты оказались полезными для вас.

Оставьте ответ

Ваш e-mail не будет опубликован. Обязательные поля помечены *