PrintАртем Акулов

Адвордс скрипт для чистки площадок в КМС по Тайтлам

Артем Акулов

Требования к качеству площадок в Яндекс Директе выше чем в Гугл Адвордс ниже, модерация жестче. Поэтому в адвордс большое количество некачественных площадок, часть из них преднамеренно размещает рекламные блоки Адсенс так, чтобы увеличить количество случайных кликов по рекламным объявлениям, другие напрямую занимаются скликиванием рекламы (Гугл возвращает часть денег за такие переходы, но не все).

К тому же в КМС много площадок про игры, развлечения, рецепты, приколы, «сделай сам и своими руками» и т.д. Пользователи явно попадают на такие площадки не в том настроении (не с тем интентом), который нам нужен. Проще: люди пришли развлекаться или убить время, а тут наша реклама, часто еще и так, что люди нажимают на нее непреднамеренно.

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

Поэтому необходимо регулярно чистить площадки КМС. Обычно процесс выглядит так:

  1. Открыть отчет по местам размещения в КМС
  2. Прокликать площадки, которые дают переходы и показы
  3. Просмотреть площадки глазами (если там что-то про игры, форекс, «своими руками», вакансии, развлечения и т.д.) добавляем площадку в общий список исключенных площадок в Общей библиотеке.

Не сложно, но отнимает много времени.

Поэтому мы решили сделать Адвордс скрипт, который выполняет аналогичный процесс. Подробности ниже.

 

Основная идея

Есть готовые Адвордс скрипты чистки площадок, которые удаляют площадки, анализируя домены площадок, но много площадок используют или домены без вхождения маркерных слов (game, forex и т.д.) или домены очень «размыты», и вместе с площадками большая вероятность убрать качественные.

Поэтому только доменного имени площадки мало. «Надо просто больше данных» ©

Основной источник трафика для «плохих» площадок — органический поиск. Вебмастера оптимизируют сайты, чтобы привлекать пользователей с поиска Яндекса и Гугла, а за тем они уже кликали на рекламные объявления.

Один из ключевых элементов поискового продвижения тег Тайтл (title) сайта. Поэтому если сайт про одну из наших нецелевых тематик, вебместера обязательно включают в тайтлы слова-маски: game, игр, рецепты, развлеч, forex и т.д.

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

Механизм работы скрипта

Тайтлы парсим с помощью функций Гугл Таблиц. Эти функции работают достаточно медленно (50-100 площадок в час). Поэтому нам необходимы 2 Адвордс скрипта:

Первый → выгружает с заданной периодичностью площадки из отчета по местам размещений

Второй → после парсинга, сравнивает собранные  тайтлов с масками

Еще один момент. Какие площадки необходимо выгружать из Адвордс.

Если выгружать только площадки, по которым были клики, то да, мы будем исключать нецелевые, но только после того, как потратим на них деньги (переход по объявлению уже состоялся). Если же выгружать все площадки, где были показы рекламы, то будет слишком много площадок, и Гугл Таблицы не справятся с таким количеством парсинга.

Поэтому мы сделали 2 варианта скрипта чистки площадок в КМС по тайтлам:

  1. Чистка по показам. Скрипт анализирует все площадки, по которым было больше 3 показов за вчерашний день, но не было кликов и конверсий. Должен запускаться ежедневно.
  2. Чистка площадок по кликам. Скрипт анализирует площадки за последние 7 дней, по которым были клики. Должен запускаться еженедельно.

Итоговая схема работы скрипта:

Запускаем скрипт выгрузки отчетов в Гугл Таблицы → Гугл Таблицы парсят тайтлы → Запускаем скрипт чистки (сопоставляются собранные тайтлы и маски нецелевых площадок).

И версия чистки по показам, и версия сркипта чистки по кликам работают по этой схеме, отличается только расписание работы.

Расписание работы скрипта

Я уже написал, что Тайтлы мы парсим через Гугл Таблицы, делают они это достаточно медленно. Поэтому необходимо задавать следующее расписание работы скриптов.

Версия скрипта чистки КМС площадок по показам

  • Первый запуск скрипта выгрузки чистки отчетов. Запускаем скрипт в любое время до 3-4 часов дня.
  • Задаем скрипту чистки (который итоговый) расписание: ежедневно в 2 часа утра
  • Задаем скрипту выгрузки отчетов расписание: ежедневно в 3 часа утра

Тогда между выгрузкой отчетов в Гугл Таблицу и окончательной чисткой всегда будет временной интервал в 23 часа. Этого достаточно, чтобы Гугл Таблицы успел собрать тайтлы.

Версия скрипта чистки КМС площадок по кликам

  • Задаем скрипту выгрузки отчетов расписание: еженедельно в 2 часа утра по понедельникам
  • Задаем скрипту чистки (который итоговый) расписание: еженедельно в 2 часа утра по вторникам

Пример рабочего расписания обоих версий скриптов

Расписание запуска Адвордс скриптов

Расписание запуска Адвордс скриптов

Гугл Таблица для скрипта

В Таблица парсит тайтлы. В Таблице же содержатся маски для поиска нецелевых площадок. В Таблицы 3 листа.

  • Source
  • BadWords
  • RawDataReport
Гугл Таблица для Адвордс скрипта

Гугл Таблица для Адвордс скрипта

Лист “Source”

Столбец А — домены мест размещений

Столбец В — собранные тайтлы мест размещений

Лист “BadWords”

Маски для поиска нецелевых площадок

Маски для поиска нецелевых площадок

Шаблонный файл Гугл Таблиц содержит распространенные маски. Чтобы добавить новую маску, просто дополните столбец А. Если какая-то маска не нужна, удалите ее с листа (например, по-умолчанию, мы убираем кулинарные сайты, но если у вас женская целевая аудитория, возможно, следует их оставить работать).

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

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

  • игр
  • игра
  • игры
  • играть
  • поиграть и т.д.

Лист “RawDataReport”

В этот лист первый скрипт выгрузки отчетов складывает данные из отчета по местам размещения Гугл Адвордс.

Важно. Не меняйте названия и формулы на листах Source и RawDataReport

Еще важней. Скопируйте сначала образцы Гугл Таблиц из статьи к себе на Гугл Диск, а потом уже используйте в Адвордс скриптах. Готовые образцы в конце статьи.

Скрипт отчета по показам

// Copyright 2017, Lira ltd. 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 AdWords GDN Placement Cleaner For Impressions (Report) script
*
* @overview The script allows you to manage Google Display Network
* GDN placements and remove common non effective placements about
* games, recipes, films, etc
* See
* https://lira.agency/
* for more details.
*
* @author Artem Akulov [help@lira.agency]
*
* @version 1.0
*
* @changelog
* – version 1.0
* – Released initial version.
*/

// The spreadsheet for parse GDN titles. This should be a copy of
// https://docs.google.com/spreadsheets/d/1IawBXlLeBsYBi9A45HQadTlACEgtMhY4jG7nw773hII/edit?usp=sharing

//Set link to your copy of Google Spreadsheet above
var SPREADSHEET_URL = ‘https://docs.google.com/spreadsheets/d/1r0WMGA-vJaa8iH7gEd9IjPiKOwovepyQ7QI5fSItNM4/edit?usp=sharing’;

var RawDataReport_Name = “RawDataReport”; //Don’t change the name of the sheet if you use standart docs template
var RawDataReportSheet = SpreadsheetApp.openByUrl(SPREADSHEET_URL).getSheetByName(RawDataReport_Name);

function main() {
createReports();
}
//Get placements with 4 and more impressions without clicks for yesterday.
//For Clicks its recommended to set a copy of current script.
//Second script works on weekly basis
function createReports() {
var RawDataReport = AdWordsApp.report("SELECT Domain, Clicks, Impressions " + "FROM AUTOMATIC_PLACEMENTS_PERFORMANCE_REPORT " + "WHERE Impressions > 3 " + "AND Clicks < 1 " +"AND Conversions < 1 " + "DURING YESTERDAY");
RawDataReport.exportToSheet(RawDataReportSheet);
}

Исходник скрипта на ГитХабе

Скрипт отчета по кликам

// Copyright 2017, Lira ltd. 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 AdWords GDN Placement Cleaner For Impressions (Report) script
*
* @overview The script allows you to manage Google Display Network
* GDN placements and remove common non effective placements about
* games, recipes, films, etc
* See
* https://lira.agency/
* for more details.
*
* @author Artem Akulov [help@lira.agency]
*
* @version 1.0
*
* @changelog
* - version 1.0
* - Released initial version.
*/

// The spreadsheet for parse GDN titles. This should be a copy of
// https://docs.google.com/spreadsheets/d/1gECAF4iatFWDEnwKaZdnLLBCoW2-O6uOuZMOpQ94JaI/edit?usp=sharing

//Set link to your copy of Google Spreadsheet above
var SPREADSHEET_URL = 'https://docs.google.com/spreadsheets/d/14zZoMrMV1K41zMqRjla9jfIBOOUX7IRawYGIqlp3mwY/edit?usp=sharing';

var RawDataReport_Name = "RawDataReport"; //Don't change the name of the sheet if you use standart docs template
var RawDataReportSheet = SpreadsheetApp.openByUrl(SPREADSHEET_URL).getSheetByName(RawDataReport_Name);

function main() {
createReports();
}
//Get placements with 1 and more clicks over last 7 days.
//It
s recommended to schedule script weekly
function createReports() {
var RawDataReport = AdWordsApp.report(“SELECT Domain, Clicks ” + “FROM AUTOMATIC_PLACEMENTS_PERFORMANCE_REPORT ” + “WHERE Clicks > 0 ” + “AND Conversions < 1 ” + “DURING LAST_7_DAYS”);
RawDataReport.exportToSheet(RawDataReportSheet);
}

Исходник скрипта на ГитХабе

Скрипт чистки (итоговой) площадок

// Copyright 2017, Lira ltd. 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 AdWords GDN Placement Cleaner For Impressions (Report) script
*
* @overview The script allows you to manage Google Display Network
* GDN placements and remove common non effective placements about
* games, recipes, films, etc
* See
* https://lira.agency/
* for more details.
*
* @author Artem Akulov [help@lira.agency]
*
* @version 1.0
*
* @changelog
* – version 1.0
* – Released initial version.
*/

//Set Negative Placement list in Shared library for scripts results.
//If list in not exist script create a list with that name
var EXCLUDED_PLACEMENT_LIST_NAME = 'PlacementCleanerByTitleList';

// The spreadsheet for parse GDN titles. This should be a copy of
// https://docs.google.com/spreadsheets/d/1IawBXlLeBsYBi9A45HQadTlACEgtMhY4jG7nw773hII/edit?usp=sharing

var SPREADSHEET_URL = 'https://docs.google.com/spreadsheets/d/1r0WMGA-vJaa8iH7gEd9IjPiKOwovepyQ7QI5fSItNM4/edit?usp=sharing';
//Get Data with Placement
s Titles
var ss = SpreadsheetApp.openByUrl(SPREADSHEET_URL);
var urlTitles = getSheetData(ss, 0);
//Massive on negative templates which will be compared with parsed GDN placement`s Titles.
var badWords = getSheetData(ss, 1);

function main() {
var excludePlacementArray = [];
for (var i = 0; i < urlTitles.length; i++) {
if (containsAny(urlTitles[i][1].toLowerCase(), badWords)) {
excludePlacementArray[excludePlacementArray.length] = urlTitles[i][0].toString();
}
}
Logger.log(excludePlacementArray);//In Log you will see a result list of new excluded placements
addNegativeKeywordToList(excludePlacementArray);
}
function getSheetData(ss, sheetIndex) {
var sheet = ss.getSheets()[sheetIndex];
var range = sheet.getRange(1, 1, sheet.getLastRow(), sheet.getLastColumn());
return range.getValues();
}
function containsAny(str, substrings) {
for (var i = 0; i != substrings.length; i++) {
var substring = substrings[i];
if (str.indexOf(substring) != – 1 && str.indexOf(‘mobileapp::’) == -1) {
return substring;
}
}
return null;
}
function addNegativeKeywordToList(negativePlacements) {
var excludedPlacementListIterator =
AdWordsApp.excludedPlacementLists().withCondition(“Name = ‘” + EXCLUDED_PLACEMENT_LIST_NAME + “‘”).get();

if (excludedPlacementListIterator.totalNumEntities() == 1) {
var excludedPlacementList = excludedPlacementListIterator.next().addExcludedPlacements(negativePlacements);
} else {
AdWordsApp.newExcludedPlacementListBuilder()
.withName(EXCLUDED_PLACEMENT_LIST_NAME)
.build().getResult().addExcludedPlacements(negativePlacements);
}
}

Исходник скрипта на ГитХабе

Дополнительные ссылки

Заключение

Инструкция по установке Адвордс есть в в справке Гугла. Итоговый список минус-площадок из общей библиотеки примените к рекламным кампаниям.

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

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

  • alexsoup

    Спасибо, ребята. Потестим.

  • chervach

    Спасибо. Прекрасная идея с тайтлами. Пробуем.

  • Ростислав Чипчар

    Подскажите: можно ли в 1 таблицу парсить данные из нескольких аккаунтов?
    Или не стоит этого делать?

    • В текущей версии скриптов и таблиц — нет.

      Как вариант, чтобы не плодить таблицы, добавить дубли листов (sheet) в текущих таблицах, и скорректировать скрипты, чтобы складывали данные в разные листы одной Гугл Таблицы.

      • Ростислав Чипчар

        да, хорошая идея. Попробую.
        Еще вопрос: после того как Cleaner выполнит свою работу где-то видно какие площадки были добавлены в черный список? (кроме историй изменений аккаунта).

        • Все добавленные площадки пишутся в лог работы скрипта (под списком скриптов в общей библиотеке)

          • Ростислав Чипчар

            Да. После вопроса увидел.
            Спасибо за скрипт и инструкцию все работает!
            Советую дописать в статье что получпемые списки нужно применить к кампаниям. Просто так после отработки скрипта площадки не исключаются.
            Еще вопрос: с чем может быть связано расхождение в кол-ве площадок? По отчету Эдалрдс за вчера получено 170 площадок, в гугл докс подтянулрсь только 150. Обратил внимание, т.к. площадки с наибольшим кол-вом показов не оказалось в гуглтаблице.

          • Скрипт по показам выгружает только площадки, по которым были показы, но не было кликов и конверсий.

            Площадки, которые не были выгружены в Гугл Таблицу, по ним были переходы?

          • Ростислав Чипчар

            Всего за вчера 172 площадки
            с кликами: 34
            в гугл докс выгружено 151.
            Если нужно могу все файлы, скрипты и доступы к гугл таблицы тоже открыть.
            У меня такая версия: что может быть время у скрипта и отчетов гугла не совпадает.

          • Может и время, а 172 площадки, по которым было больше 3-х показов?

          • Ростислав Чипчар

            больше 3 было 162, всего было 172

  • Dimitry Kalinin

    Для буржа скрипт можно использовать?

  • Asher Meir

    “Тайтлы парсим с помощью функций Гугл Таблиц” а что это за функция, как её использовать?