Битва за взрослых: как исключать детские каналы из рекламы на Youtube 24-7?

в 10:17, , рубрики: adwords, adwords скрипт, growth hacking, youtube api, интернет-маркетинг, контекстная реклама, медийная реклама, метки:

Предыстория

Многие помнят недавний скандал об отказе крупных рекламодателей размещаться на YouTube из-за того, что их прероллы (платные ролики перед видео, которые можно пропустить после 5 секунд) показывались в видео с нежелательным контентом. Однако в нашей статье речь пойдет о другой проблеме – детском контенте. Дело в том, что даже при корректных настройках таргетинга на взрослую аудиторию, огромное количество (вплоть до 90%) показов получают детские каналы. Связано это с тем, что родители со своих «взрослых» аккаунтов на своих устройствах, как мобильных, так и десктопах, ставят детям мультики. 
Разумеется, рекламодателям не хочется тратить рекламный бюджет на детей, которые просто просматривают прероллы, т.к. это не имеет практически никакого эффекта. Такие видео и каналы можно исключать при помощи минус-слов или исключения целых тематик, но это долго, сложно и исключит далеко не все каналы и видео – детский контент довольно разнообразен. Многие малоизвестные детские каналы и видео продолжают показывать в них рекламу из-за того, что у них общие, не характерно детские названия или недостаточное описание, но их все равно смотрят дети в большом количестве. Я решил найти способ автоматизировать поиск и исключение подобных каналов с помощью скриптов AdWords.

image

Решение 1

Итак, я приступил к созданию своего первого скрипта для поиска детских каналов. AdWords позволяет создавать свои скрипты на JS для управления рекламным аккаунтом. Они созданы на базе Google Apps Scripts и их главным преимуществом является интеграция с другими сервисами Google, такими, как Google Drive, Spreadsheets, YouTube, Analytics, BigQuery и т.д., а также возможность подключать сторонние API. До этого мне уже приходилось работать с YouTube Data API v3 для поиска видео в качестве места размещения. Постараюсь рассказать об этом в другой статье. 
Так вот, опытным путем получилось установить, что детские видео объединяют не названия, а их теги. Немного модифицировав скрипт для поиска YouTube видео, нашел по разным запросам детских мультиков подобные теги и сохранил их в Google Spreadsheet для дальнейшего использования в новом скрипте. Файл публичный, но рекомендую перед настройкой скрипта скопировать его к себе в Google Drive и заменить id файла в скрипте на новый.

Основные моменты для понимания работы скрипта:

  1. Из URL_PERFORMANCE_REPORT получаем все ссылки с местами размещения YouTubе и достаем videoId за вчера.
     var report = AdWordsApp.report(
         'SELECT Url ' +
         'FROM   URL_PERFORMANCE_REPORT ' +
         'WHERE CampaignName CONTAINS "Video" ' +
         'DURING YESTERDAY');
    
      var rows = report.rows();
    
      while (rows.hasNext()) {
        var row = rows.next();
        var videoId = row['Url'].toString().replace('www.youtube.com/video/','');
        videoIdList.push([videoId]);
      }

  2. В цикле отправляем запросы к YouTubе с каждым id видео. Из ответа получаем теги и ID видеоканала и проверяем все теги на пересечение с нашей библиотекой детских тегов.
    for (var i = 0; i < videoList.length; i++) {
        
        var results = YouTube.Videos.list('snippet', {id: videoList[i]});
        try {
          if (results.items[0].snippet !== undefined) {
            
            var channelId = results.items[0].snippet.channelId;
            var tags = results.items[0].snippet.tags;
            if (uniqueChannel[channelId] !== true){
              for (var k = 0; k < tags.length; k++) {
                if (tagsObj[tags[k]] !== undefined) {
                  channels.push([channelId]);
                  uniqueChannel[channelId] = true;
                  Logger.log("Добавить в библиотеку исключений - " + channelId);
                  break;
                } else {
                  continue;
                };
              }
            }
          }
        } catch (e) {
          Logger.log(e);
        }
      }

    Если какой-либо из тегов видео совпадает с тегами из библиотеки, то id видеоканала отправляется в массив для исключения, если уже не был добавлен через другое видео с этого же канала.

  3. После того как все видео были проверены, запускаем цикл на добавление всех каналов в список исключенных площадок в аккаунте AdWords. Список с названием, идентичным тому, что в скрипте (у меня просто “Видеоканалы”) нужно создать заранее. Лимит для списка исключенных площадок в списке составляет 65000, проблем с его переполнением возникнуть не должно.
    var excludedPlacementList = AdWordsApp.excludedPlacementLists().withCondition('Name = "Видеоканалы"').get().next();
      for (var d = 0; d < channels.length; d++) {
        excludedPlacementList.addExcludedPlacement("youtube.com/channel/"+channels[d].toString());
      };

Проблемы с использованием первого варианта скрипта

Достаточно простое и эффективное решение, но, как оказалось, не все так просто. При использовании данного скрипта у меня возникла следующая проблема: при запуске охватных видеокампаний скрипт не успевал обработать все видео за вчерашний день — упирался во временной лимит 30 минут (внутреннее ограничение AdWords), и не добавлял новые исключения. К тому же, лучше добавлять видео как можно чаще и быстрее, чтобы сэкономить максимум средств. К сожалению, даже после добавления видео в список исключений они, по опыту, начинают действовать не сразу. Техподдержка Google говорит о сроке вплоть до 2 дней (по наблюдениям, обычно раньше).

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


Решение 2

После тестирования первой версии скрипта со знакомым, фанатом автоматизации я понял, что нужно делать проверку каждый час и не проверять видео, которые уже были проверены ранее, иначе скрипт начинал упираться в лимит 30 минут уже к полудню. 
Решение было взято из другого скрипта для изменения ставок от часа к часу, кому интересно, вот ссылка на такое решение. Все получилось немного сложнее, по сравнению с первой версией, но результат получился отличным. Дополнили функционалом сохранения в txt-файл уже проверенных видео в Google Drive, туда записываются все id за сегодня, для того чтобы сравнивать их с новым отчетом каждый час. Сравнение происходит при помощи метода difference из свободной библиотеки Underscore.js.

var videoList = _.difference(videoIdList, data);

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

Настройка скрипта

  1. Укажите название создаваемого файла в Google Drive
    var dataFile = "videoIds.txt";

    Если такого файла еще нет, то он создастся автоматически.

  2. Выберите кампании, которые нужно проверить
    'WHERE CampaignName CONTAINS "(Video)"

    Синтаксис AWQL есть в справке AdWords.

  3. Замените id файла Google Spreadsheet на свой
    var spreadsheet = SpreadsheetApp.openById('11PMGc70yLE88Npi47Hwb6W36Y8yjw2N2CdXXLgdK12o');

  4. В интерфейсе AdWords создайте общий список исключаемых мест размещения
    var excludedPlacementList = AdWordsApp.excludedPlacementLists().withCondition('Name = "Видеоканалы"').get().next();

    и вставьте его название вместо «Видеоканалы».

  5. Включите в расширенных API YouTube.
  6. После первых просмотров включите YouTube API в Google Developers Console. Ссылка будет в журнале ошибок.
  7. Настройте расписание срабатывания скрипта «Каждый час».

Готово!

Финал

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

Иногда в исключения попадают и взрослые каналы, но это происходит достаточно редко. Причины могут быть две – или владелец канала размещает в нем не только взрослые, но и детские видео, или умышленно использует детские теги для накрутки и расширения аудитории. 
По наблюдениям, после того, как вы начнете использовать скрипт, существенно снизится коэффициент просмотров (VTR, View-through rate), так как взрослые жмут кнопку «пропустить» гораздо чаще детей.

Пользуйтесь и размещайтесь на правильных каналах!

Автор: dmitrytonkikh

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js