×
Россия +7 (495) 139-20-33

Google AdWords: как отобрать хорошие места размещения при помощи скриптов

Россия +7 (495) 139-20-33
Шрифт:
5 13839

Google Display Network (GDN) – одна из двух рекламных сетей в Google AdWords, позволяющая показывать рекламные объявления на большом количестве различных сайтов. Хоть этот инструмент и более «пассивен», чем реклама Google в поиске, он охватывает значительно большую аудиторию.

Проблема GDN

«Темной стороной» контекстной рекламы в Google Display Network является то, что ее настройка требует много времени на отбор качественных площадок. Ведь эффективной реклама будет только в том случае, если объявления будут показываться на подходящих площадках. А фильтрация тысяч площадок – это настоящая проблема для специалиста по контекстной рекламе.

Хорошая новость в том, что Google AdWords дает возможность управлять вашими рекламными кампаниями при помощи скриптов. Так что существует возможность автоматического отбора качественных площадок.

Мы решили разобраться с этим вопросом и разработать эффективное решение. За основу взяли подходы Алексея Ярошенка и Derek Martin и разработали свою методологию работы скрипта для «чистки» площадок в Google Display Network.

Решение

Для понимания, как работает наше решение в целом, разберем вначале его базовые этапы.

Начальные условия

Наш скрипт обращается к отчету по площадкам AdWords за определенный период времени и отбирает места размещения, удовлетворяющие различным условиям:

  • затраты на площадку составляют более X USD и нет конверсий;
  • стоимость конверсии с площадки больше X USD;
  • количество показов площадки больше X, CTR меньше Y и нет конверсий;
  • количество показов площадки больше X, CTR больше Y и нет конверсий.

Перечисленные выше условия могут меняться вручную в конфигурационном файле Google Spreadsheet.

Нежелательные домены

Следующая проверка отсеивает площадки без конверсий, в домене которых присутствуют нежелательные слова, и заносит их в black list.

Рис. 1.png

Рис. 1. Пример Google Spreadsheet со словами, по которым отсеиваются домены

Список исключений

Отобранные скриптом площадки заносятся в лист исключений на уровне «Shared library» в аккаунте AdWords.

Рис. 2.png

Рис. 2. Пример списков исключений в «Shared library»

Рис. 3.png

Рис. 3. Пример отчета работы скрипта в Google Spreadsheet

Уведомления о работе скрипта по email

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

Пошаговое решение

1. Определение рабочего Google Spreadsheet и имя проекта.

var config = { SPREADSHEET_URL:Link to the Google Spreadsheet', PROJECT_NAME:'Name of the project' }

2. Определение списка, в который будут заноситься «плохие», отфильтрованные площадки.

function getConfigData(spreadsheet) { var excludeDomainSheet = spreadsheet.getSheetByName('exclude_domain'), values = exclude DomainSheet.getSheetValues(1,1,excludeDomainSheet.getLastRow(),1); config.exclude = []; if (typeof values == &quot;object&quot;) { for (i=0; i < values.length; i++) { config.exclude.push(values[i][0]); } } Logger.log(config.exclude); }

3. Определение списка для площадок, по которым не будет вноситься статистика.

var except DomainSheet = spreadsheet.getSheetByName('except_domain'), values = except DomainSheet.getSheetValues(1,1,exceptDomainSheet.getLastRow(),1); config.except = []; if(typeof values == &quot;object&quot;) { for (i=0; i < values.length; i++) { config.except.push(values[i][0]); } } Logger.log (config.except)

4. Определение условий отбора площадок:

  • название списка,
  • контактный email,
  • отчетный период,
  • максимальная стоимость клика,
  • максимальная стоимость конверсии,
  • минимальное количество показов,
  • максимальный CTR.
var configSheet = spreadsheet.getSheetByName('config'); config.email = configSheet.getRange(1,2,1,1).getValues(); config.timeperiod = configSheet.getRange(2,2,1,1).getValue(); config.listCost = configSheet.getRange(3,2,1,1).getValue(); config.list2ConversionCost = configSheet.getRange(4,2,1,1).getValue(); config.list3Impressions = configSheet.getRange(5,2,1,1).getValue(); config.list3Ctr = configSheet.getRange(6,2,1,1).getValue(); config.list4Impressions = configSheet.getRange(7,2,1,1).getValue(); config.list4Ctr = configSheet.getRange(8,2,1,1).getValue()

5. Обновление названия документа с учетом даты запуска скрипта.

function main() { var spreadsheet = SpreadsheetApp.openByUrl(config.SPREADSHEET_URL); var curDate = Utilities.formatDate(new Date(), &quot;GMT+3&quot;, &quot;yyyy-MMMM-dd&quot;); getConfigData(spreadsheet); spreadsheet.setName(&quot;GDN Report &quot; + config.PROJECT_NAME + &quot; &quot; + curDate); }

6. Генерация отчета.

var body = &quot;[h2]Google Display Network – Report on underperforming placements[/h2]&quot;; body += &quot;[h3]Placements that spent more than &quot; + config.listCost + &quot; USD and did not bring conversions:[/h3]&quot;; body += &quot;[ul]&quot;; var list = runHightCostAndNoConvertingReport(); varrows = []; for (i=0; i < list.length; i++) { body += &quot[li]&quot; + list[i].placement + ' - ' + list[i].cost + ' USD ' + &quot;[/li]&quot;; } addPlacementList('list1',list,spreadsheet); body += &quot;[/ul]&quot;; body += &quot;[h3]Placements with the conversion cost more than &quot; + config.list2ConversionCost + &quot; USD:[/h3]; body += &quot;[ul]&quot;; var list2 = runHighCostOfConversionsReport(); for (i=0; i < list2.length; i++) { body += &quot;[li]&quot; + list2[i].placement + ' - ' + list2[i].cost + ' USD ' + ' - The cost of conversion - ' + list2[i].costperconversion + ' USD ' + &quot;[/li]&quot;; } addPlacementList('list2',list2,spreadsheet); body += &quot;[/ul]&quot;; body += &quot;[h3]Placements with more than &quot; + config.list3Impressions + &quot; impressions and CTR less than &quot; + config.list3Ctr + &quot;%:[/h3] &quot;; body += &quot;[ul]&quot;; var list3 = runBadCtrNoConversionsReport(); body += &quot;[li]The number of exceptions - &quot; + list3.length + &quot;[/li]&quot;; addPlacementList('list3',list3,spreadsheet); body += &quot;[/ul]&quot;; body += &quot;[h3]Placements with more than &quot; + config.list4Impressions + &quot; impressions and CTR more than &quot; + config.list4Ctr + &quot;%:[/h3] &quot; ; body += &quot;[ul]&quot;; var list4 = runHighCtrReport(); body += &quot;[li]The number of exceptions - &quot; + list4.length + &quot;[/li]&quot;; addPlacementList('list4',list4,spreadsheet); body += &quot;[/ul]&quot;; body += &quot;[h3]The placements, which domain name contains the unwanted word:[/h3] &quot; ; body += &quot;[ul]&quot;; var list5 = gamePlacements(); body += &quot;[li] The number of exceptions - &quot; + list5.length + &quot;[/li]&quot;; addPlacementList('list5',list5,spreadsheet); body += &quot;[/ul]&quot;; body += &quot;[a href='&quot;+spreadsheet.getUrl()+&quot;']Link to the report Google Spreadsheet[/a]&quot;;

7. Отправка email с результатами.

if(config.email.length){ MailApp.sendEmail(config.email,'Display Network Alerts - ' + config.PROJECT_NAME + &quot; - &quot; + curDate, body, {htmlBody: body}); }

8. Использование функций для добавления площадок в исключения.

function addPlacementList(nameList,list,spreadsheet) { var rows = [], sheet, range, listSharedExcludedPlacementIterator; sheet = spreadsheet.getSheetByName(nameList); sheet.clear(); range = sheet.getRange(1, 1, 1, 7).setValues([['Exclusion URL','Impressions','Clicks','CTR','Cost','Conversions','Cost Per Conversion']]); range.setBackground(&quot;yellow&quot;); listSharedExcludedPlacementIterator = AdWordsApp.excludedPlacementLists() .withCondition(&quot;Name CONTAINS '&quot; + nameList + &quot;'&quot;).get(); while (listSharedExcludedPlacementIterator.hasNext()) { listSharedExcludedPlacement = listSharedExcludedPlacementIterator.next(); } for (i=0; i < list.length; i++) { listSharedExcludedPlacement.addExcludedPlacement(list[i].placement); rows.push([list[i].placement, list[i].impressions, list[i].clicks, list[i].clicks / list[i].impressions * 100 + &quot;%&quot;, list[i].cost, list[i].conversions, list[i].costperconversion]) } if(rows.length) sheet.getRange(2, 1, rows.length, 7).setValues(rows).sort({column: 2, ascending: false}); } function runHightCostAndNoConvertingReport() { list = []; var periodString = ''; if(config.timeperiod) { periodString = 'DURING ' + config.timeperiod; Logger.log(periodString); } else { Logger.log('DURING ALL TIME'); } }

9. Определение площадок, которые потратили более X USD и не принесли конверсий.

var report = AdWordsApp.report( 'SELECT Domain, Clicks, Impressions, CostPerConversion, Conversions, Cost ' + 'FROM AUTOMATIC_PLACEMENTS_PERFORMANCE_REPORT ' + 'WHERE Cost > ' + config.listCost * 1000000 + &quot; &quot; + 'AND Conversions < 1 ' + periodString); var rows = report.rows(); while (rows.hasNext()) { var row = rows.next(); var anonymous = row['Domain'].match(new RegExp(config.except.join('|').replace(/\./g,'\\.'),'g')); if (anonymous == null) { var placementDetail = new placementObject(row['Domain'], row['Clicks'], row['Impressions'], row['CostPerConversion'],row['Conversions'], row['Cost']); list.push(placementDetail); } } function runHighCostOfConversionsReport() { list = []; var periodString = ''; if(config.timeperiod) { periodString = 'DURING ' + config.timeperiod; Logger.log(periodString); } else { Logger.log('DURING ALL TIME'); } }

10. Определение площадок с конверсиями, которые стоят более X USD.

var report = AdWordsApp.report( 'SELECT Domain, Clicks, Impressions, CostPerConversion, Conversions, Cost ' + 'FROM AUTOMATIC_PLACEMENTS_PERFORMANCE_REPORT ' + 'WHERE CostPerConversion > ' + config.list2ConversionCost * 1000000 + &quot; &quot; + 'AND Conversions > 1 ' + periodString); var rows = report.rows(); while (rows.hasNext()) { var row = rows.next(); var anonymous = row['Domain'].match(new RegExp(config.except.join('|').replace(/\./g,'\\.'),'g')); if (anonymous == null) { var placementDetail = new placementObject(row['Domain'], row['Clicks'], row['Impressions'], row['CostPerConversion'], row['Conversions'], row['Cost']); list.push(placementDetail); } } function runBadCtrNoConversionsReport() { list = []; var periodString = ''; if(config.timeperiod) { periodString = 'DURING ' + config.timeperiod; Logger.log(periodString); } else { Logger.log('DURING ALL TIME'); } }

11. Определение площадок без конверсий с более чем X показами CTR менее Y %.

var report = AdWordsApp.report( 'SELECT Domain, Clicks, Impressions, CostPerConversion, Conversions, Cost ' + 'FROM AUTOMATIC_PLACEMENTS_PERFORMANCE_REPORT ' + 'WHERE Impressions > ' + config.list3Impressions + &quot; &quot; + 'AND Ctr < ' + config.list3Ctr * 0.01 + &quot; &quot; + 'AND Conversions < 1 ' + periodString); var rows = report.rows(); while (rows.hasNext()) { var row = rows.next(); var anonymous = row['Domain'].match(new RegExp(config.except.join('|').replace(/\./g,'\\.'),'g')); if (anonymous == null) { var placementDetail = new placementObject(row['Domain'], row['Clicks'], row['Impressions'], row['CostPerConversion'], row['Conversions'], row['Cost']); list.push(placementDetail); } } function runHighCtrReport() { list = []; var periodString = ''; if(config.timeperiod) { periodString = 'DURING ' + config.timeperiod; Logger.log(periodString); } else { Logger.log('DURING ALL TIME'); } }

12. Определение площадок без конверсий с более чем X показами и CTR большим, чем Y %.

var report = AdWordsApp.report( 'SELECT Domain, Clicks, Impressions, CostPerConversion, Conversions, Cost ' + 'FROM AUTOMATIC_PLACEMENTS_PERFORMANCE_REPORT ' + 'WHERE Impressions > ' + config.list4Impressions + &quot; &quot; + 'AND Ctr > ' + config.list4Ctr * 0.01 + &quot; &quot; + 'AND Conversions < 1 ' + periodString); var rows = report.rows(); while (rows.hasNext()) { var row = rows.next(); var anonymous = row['Domain'].match(new RegExp(config.except.join('|').replace(/\./g,'\\.'),'g')); if (anonymous == null) { var placementDetail = new placementObject(row['Domain'], row['Clicks'],row['Impressions'], row['CostPerConversion'], row['Conversions'], row['Cost']); list.push(placementDetail); } } function gamePlacements() { list = []; var periodString = ''; if(config.timeperiod) { periodString = 'DURING ' + config.timeperiod; Logger.log(periodString); } else { Logger.log('DURING ALL TIME'); } }

13. Добавление в исключения площадок без конверсий, в домене которых содержатся нежелательные слова.

var report = AdWordsApp.report( 'SELECT Domain, Clicks, Impressions, CostPerConversion, Conversions, Cost ' + 'FROM AUTOMATIC_PLACEMENTS_PERFORMANCE_REPORT ' + 'WHERE Conversions < 1 ' + periodString); var rows = report.rows(); while (rows.hasNext()) { var row = rows.next(); var anonymous = row['Domain'].match(new RegExp(config.except.join('|').replace(/\./g,'\\.'),'g')); if (anonymous == null) { var placement = row['Domain']; var clicks = row['Clicks']; var impressions = row['Impressions']; var costperconversion = row['CostPerConversion'] var conversions = row['Conversions']; var cost = row['Cost']; var placementDetail = new placementObject(placement, clicks, impressions, costperconversion, conversions, cost); if (containsAny(placement.toString(), config.exclude)) { var placementDetail = new placementObject(placement, clicks, impressions, costperconversion, conversions, cost); list.push(placementDetail); } } } function containsAny(str, substrings) { for (var i = 0; i != substrings.length; i++) { var substring = substrings[i]; if (str.indexOf(substring) != - 1) { return substring; } } return null; } function placementObject(placement, clicks, impressions, costperconversion, conversions, cost) { this.placement = placement; this.clicks = clicks; this.impressions = impressions; this.costperconversion = costperconversion; this.conversions = conversions; this.cost = cost; }

Результаты

Мы тестировали работу скрипта, используя следующие критерии отбора площадок:

результаты.png

Содержание письма:

Размещения, которые потратили более 300 USD и не принесли конверсий: 0
Размещения со стоимостью конверсии более чем 500 USD: 0
Размещения с более чем 100 показами и CTR, менее 0.05%: 3
Размещения с более чем 50 показами и CTR более 8%: 7
Размещения, содержащие в домене нежелательные слова: 382

Заключительные комментарии

При использовании нашего решения нужно помнить о следующих моментах:

  • «Отсеивающие» параметры можно и нужно прописывать с учетом особенностей вашего проекта.
  • Вы можете настроить автоматический запуск скрипта, например, еженедельно.
  • Если ваш аккаунт достаточно старый, мы рекомендуем проверить площадки за весь период его работы. Чтобы сделать это, просто оставьте поле с отчетным периодом пустым.
(Голосов: 2, Рейтинг: 5)
Читайте нас в Telegram - digital_bar

Есть о чем рассказать? Тогда присылайте свои материалы Ане Макаровой


Новые 
Новые
Лучшие
Старые
Сообщество
Подписаться 
Подписаться на дискуссию:
E-mail:
ОК
Вы подписаны на комментарии
Ошибка. Пожалуйста, попробуйте ещё раз.
Отправить отзыв
  • Феликс Неботов
    1
    комментарий
    0
    читателей
    Феликс Неботов
    больше года назад
    Вадим, здравствуйте.
    Чем отличается от этого скрипта?
    gist.github.com/derekmartinla/06e51b8a4298b8bbb8ff
    -
    0
    +
    Ответить
  • Гость
    1
    комментарий
    0
    читателей
    Гость
    больше года назад
    Вадим, спасибо за отличный скрипт!
    Скажите, пожалуйста, а можно привязать выполнение скрипта к определенной кампании?
    -
    0
    +
    Ответить
  • Гость
    больше года назад
    Спасибо за полезную информацию. Можете ли поделится шаблоном файла настроек и содержимым скрипта, сложенным в один файл?
    -
    2
    +
    Ответить
    • Vadim Chernik
      1
      комментарий
      0
      читателей
      Vadim Chernik
      Гость
      больше года назад
      Добрый день,

      Ссылка на шаблон таблицы с настройками: goo.gl/oOKdER
      Ссылка на весь скрипт: goo.gl/aIA0FL
      -
      2
      +
      Ответить
  • Гость
    больше года назад
    ого
    -
    1
    +
    Ответить
ПОПУЛЯРНЫЕ ОБСУЖДЕНИЯ НА SEONEWS
Что скрывает «Прогноз бюджета Яндекс.Директ»?
Михаил Мухин
14
комментариев
0
читателей
Полный профиль
Михаил Мухин - Здравствуйте! 1-2. Считает стенд. Ссылка на него дана, но могу повторить: online.p-c-l.ru/competition/task/card/id/106. Нажмите на кнопку "Начать" и заранее приготовьте прогноз бюджета Яндекс. Суть расчета: перебор комбинаций всех ставок на всех фразах, построение бюджетных когорт - бюджетов с одинаковым СРС, отбор в каждой когорте бюджета с максимальным количеством кликов и ..., да упорядочивание этих бюджетов по мере возрастания СРС, причем берем не все, а с фиксированным шагом. 3. Гугл считается через поправочные коэффициенты. Мы перевариваем океан данных и представляем их. На удивление, получается не менее, хотя и не более точно, как и прогноз Яндекс. Конечно, нужно понимать, что это очень примерные прикидки, фактически перевод неточного прогноза Яндекс в удобочитаемую форму, не больше. Самое интересное начинается, когда применяешь метод бюджетных когорт к измерению показателей фраз на реальной рекламной кампании в режиме 48х7. Первые результаты очень хорошие. Если хотите присоединиться к бесплатному тестированию, напишите Эльвире r-support@r-broker.ru. В теме укажите "хочу присоединиться к тестам Умного управления рекламой"
Ссылочное продвижение локальных сайтов: ТОП худших SEO-методов
demimurych
5
комментариев
0
читателей
Полный профиль
demimurych - о господи. это для регионального сайта? в яндексе? где у сайта по региону конкурентов меньше чем выдачи на двух страницах из которых перваш это реклама москвы? потешно ей богу. ктото чего то не понеимает.
«Аудит, чтобы ты заплакала…», или Что делать, когда получил сторонний аудит сайта
Евгений
1
комментарий
0
читателей
Полный профиль
Евгений - Воообще, на самом деле здесь двоякое впечатление от таких аудитов. Конечно, для полного глубокого анализа и подготовки рекомендаций по сайту - нужны доступы к системам аналитики и инструментам вебмастера. Но если оценивать подобные аудиты с точки зрения чистого SEO (которое все больше и больше становится лишь малой частью digital-маркетинга, лишь одним из каналов) - они имеют место быть. Но с оговоркой, что они сделаны с учетом анализа конкурентов/отрасли. Современные инструменты и алгоритмы позволяют делать это маркетологам в автоматическом режиме, и даже давать рекомендации - возможностями машинного обучения уже никого не удивишь. Да, полное перечисление "мифического" списка ошибок, построенного по предикативным правилам, да еще и с учетом устаревших особенностей ПС - это явный признак некачественного аудита. В первую очередь потому, что эти "ошибки" следует рассматривать в качестве рекомендаций от ПС (как и говорится в справочнике вебмастера у Яндекса/Google). Однако если эти данные даются с отсылкой на данные о конкурентах, об отрасли, используются методы ML и Natural language processing для обработки исходных данных, кластеризации запросов, классификации страниц/запросов/сайтов, определения структуры документа - такие отчеты имеют право на существование. Но ключевым моментом является то, что подобные инструменты достаточно сложны в разработке, а значит требуют квалифицированных специалистов для их разработки. Которых просто нет у студий рассылающих подобные "сео отчеты". Подобные отчеты по "ошибках" тоже неплохой источник информации, но лишь на 0 этапе анализа сайта. И в принципе, теоретически, возможно почти полное составление "хороших аудитов" без участия маркетолога, на основе лишь открытых данных сайта/внешних источников, но только при соответствующем применении всех современных возможностей анализа данных и рекомендательных систем. И в любом случае подобный "хороший отчет" требует конечного заключения от эксперта.
От мечты стать юристом к собственному SMM-агентству. Как найти себя в современном цифровом мире
Виктор Брухис
5
комментариев
0
читателей
Полный профиль
Виктор Брухис - Статья выглядит так, как пожелали редакторы и интервьюер) Вопросы к интервью подбирал не я)) Хотя, в целом я согласен с вашим видением. А за пожелание удачи большое спасибо!
Как вывести сайт в ТОП 10 Google в 2019 году
Гость
1
комментарий
0
читателей
Полный профиль
Гость - Интересная статья. Подскажите на каких ресурсах расположить ссылки бесплатно по автобезопасности? Наш сайт bastion-center.ru/
Зачем подменять контент на сайте: разбираем инструмент и развенчиваем мифы
Дмитрий Сульман
4
комментария
0
читателей
Полный профиль
Дмитрий Сульман - Все верно, об этом я и говорю. У крупных компаний есть много данных и они имеют доступ к дорогим технологиям и решениям для персонализации контента. Топовые западные сервисы для персонализации, такие как RichRelevance или Dynamic Yield, стоят от нескольких тысяч до десятков тысяч долларов в месяц. Понятно, что малый бизнес не может себе этого позволить. Да даже если бы чисто теоретически и мог, то это вряд ли бы имело хоть какой-то смысл. Во-первых, у малого бизнеса недостаточно данных, чтобы подобные алгоритмы персонализации начали эффективно работать, а во-вторых, тот профит, который МСБ получит от персонализации, никогда не покроет таких расходов. Мы же предлагаем решение, доступное как раз для малого и среднего бизнеса. При этом наше решение комплексное: МультиЧат - это одновременно и инструмент для персонализации, и для коммуникации.
Как провести анализ содержания страниц товаров и категорий
Никита Седнин
3
комментария
0
читателей
Полный профиль
Никита Седнин - Спасибо!
BDD 2019: Как перестать убивать время на сбор и обработку тонны данных для SEO-аудита
Kosta Bankovski
4
комментария
0
читателей
Полный профиль
Kosta Bankovski - Спасибо за приятные слова! Буду и дальше делиться наработками ;)
10 элементов сайта, которые гарантированно отпугнут посетителей
Андрей
2
комментария
0
читателей
Полный профиль
Андрей - Ну типа потому что клиентское seo больше для коммерции предназначено. Типа контентники и сами знают что делать. В коммерции можно тысячу причин найти чтобы поработать с сайтом, а с контентными такие фокусы уже не прокатят, поэтому и не пишут. Всё продвижение для контентников сеошники описывают в трех словах: скорость, качество, систематичность. А, ну ещё конечно же СЯ, как же я про него забыл (фундамент жеть!).
Как удвоить выручку за счет продвижения в поиске. Кейс coffee-butik.ru
Максим Боровой
2
комментария
0
читателей
Полный профиль
Максим Боровой - Последний вопрос (извиняюсь за количество) - почему на "В корзину" стоит Nofollow. Осознанно для распределение весов?
ТОП КОММЕНТАТОРОВ
Комментариев
910
Комментариев
834
Комментариев
554
Комментариев
540
Комментариев
483
Комментариев
373
Комментариев
362
Комментариев
262
Комментариев
249
Комментариев
171
Комментариев
156
Комментариев
137
Комментариев
121
Комментариев
107
Комментариев
97
Комментариев
97
Комментариев
96
Комментариев
83
Комментариев
80
Комментариев
77
Комментариев
67
Комментариев
60
Комментариев
59
Комментариев
57
Комментариев
55

Отправьте отзыв!
Отправьте отзыв!