Динамический ремаркетинг для калькуляторов

Каждый мужчина в жизни должен сделать 3 вещи: посадить дерево, построить дом и настроить автоматическую генерацию фида для динамического ремаркетинга через диспетчер тегов от Google.

Pourquoi?

В Google Adwords есть классный инструмент, позволяющий после посещения всяких e-shop’ов догонять вас рекламой продуктов, которые вы посмотрели или «забыли» в корзине. Но! Это вполне конкретные продукты с конкретными ценами. А как быть, если клиент у вас считает стоимость ремонта, путевки на троих, пиццу на тонком тесте с колбасками по кругу, ежемесячный платеж по ипотеке или и того хуже — страховку?! Хочется же тоже догнать его и чисто по-человечески:

«Эй, 1000167059.1490858211, дарагой, скидку дам, дагаваримся!»

Более того! Если у вас достаточно информации о клиенте, вы можете заранее делать расчет и показывать ему персональную рекламу.

Смотрите, общая идея такова: при каждом расчете будем создавать фиктивные продукты в фиде и периодически заносим их в Adwords.

Для реализации подготовьте в браузере следующие вкладки: Google Tag Manager, Google SpreadsheetsGoogle Apps Script и Google Adwords.

Теперь, когда самое сложное позади, распишу план действий:

  1. Готовим шаблон фида под разные продукты в Spreadsheets
  2. Пишем приложение в Apps Script, которое принимает данные из url и закидывает в фид
  3. Подключаем скрипт к Tag Manager
  4. Подключаем скрипт к Adwords
  5. Ставим код динамического ремаркетинга через Tag Manager

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

Шаблон фида в Spreadsheets

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

Правда, у меня есть еще вкладка Легенда для всего, что вставляется «по умолчанию».

Шаблон специального фида

Вот вам сам документ, пользуйтесь, пожалуйста.

 

Генерация фида через Apps Script

Следующим этапом направляемся в Инструменты — Редактор скриптов...

Постарался подробно закомментить код, тем не менее готов ответить на вопросы в конце статьи.

doGet() — стандартная функция в Apps Script, обрабатывающая параметры, переданные GET-запросом, которые мы суем в url

var SHEET_KEY = "15qsZmsnCkTFuoMIfetb8qgXEi8POyjQ3ndhPliA6c8f8"; // идентификатор таблицы, берется из url
var SHEET_NAME = 'Продукт1'; //лист по умолчанию
var LEGEND_NAME = "Легенда"; //лист с предустановками 
var DISCOUNT_NAME = "Скидка"; //имя поля с размером скидки
var AMOUNT = 2000; //количество сохраняемых расчетов

function doGet(e){
  SHEET_NAME = e.parameter.product; // параметр product из url определяет лист
  var lock = LockService.getPublicLock();
  try {
    var doc = SpreadsheetApp.openById(SHEET_KEY);
    var sheet = doc.getSheetByName(SHEET_NAME);
    var legend = doc.getSheetByName(LEGEND_NAME);
    var headRow = e.parameter.header || 1; //параметр header определяет ряд заголовков, по умолчанию первая строка
    var headers = sheet.getRange(headRow, 1, 1, sheet.getLastColumn()).getValues()[0];
    var row = [];
    var priceID, ID; //id цены для простановки скидки
    // переменные в запросе должны соответствовать заголовкам в колонках, иначе берем из легенды
    for (i in headers){
      var l = getLegend(headers[i], SHEET_NAME, legend) || e.parameter[headers[i]];
      //особые варианты
      switch(headers[i]) {
        case 'ID' :
          ID = i;
          break;
        case 'Price' :
          priceID = i;
          break;      
        case 'Sale price' :
          l = parseFloat(row[priceID]) * ( 1 - parseFloat(getLegend(DISCOUNT_NAME, SHEET_NAME, legend))); //скидка
          break;
      }
      row.push(l);
    }
    var old = getId(row[ID], sheet); // проверяем повторный ID и удаляем
    if(old) sheet.deleteRow(old);
    if (row[priceID]) sheet.getRange(sheet.getLastRow() + 1, 1, 1, row.length).setValues([row]); // чекаем нормальную цену на всякий случай и записываем ряд
    if(sheet.getLastRow() > AMOUNT) sheet.deleteRow(2); // проверяем лимит и удаляем самый старый ряд.
  } catch(e){
    return ContentService
          .createTextOutput(JSON.stringify({"result":"error", "error": e}))
          .setMimeType(ContentService.MimeType.JSON);
  } finally {
    lock.releaseLock();
  }
}
// поиск предустановки по листу, названиям ряда и столбца
function getLegend (rowName, colName, legend) {
  var data = legend.getSheetValues(1, 1, -1, -1);
  for (var col in data) {
    if (data[0][col] == colName) break;
  }
  for (var row in data) {
    if (data[row][0] == rowName) break;
  }
  return data[row][col];
}
// поиск ID
function getId(id, sheet) {
  //var data = sheet.getDataRange();
  var data = sheet.getSheetValues(1, 1, -1, 1);
  for (var row in data) {
    if(data[row][0] == id) return parseInt(row) + 1;
  }
  return 0;
}

 

Не забудьте зарелизить приложение через Публикация — Развернуть как веб-приложение.... В этом случае бонусом получите ссылку, чтобы его использовать.

Динамический ремаркетинг Adwords - генерация фида в Apps Script

 

Передача данных в Spreadsheets через Tag Manager

Создаем новый тег с типом Пользовательское изображение, вставляем ссылку на скрипт, добавив в конце параметры, должно получиться что-то вроде этого:

 https://script.google.com/macros/s/AKfycbw8VT4b0kn5oDRWKA2sMvgv49uBvPjWpgFMn2YrxdtC2HA9uvx_G/exec?product=Продукт1&ID={{idGoogleClient}}&Price={{valueCost}} 

 

где {{valueCost}} содержит то, что насчитал клиент, а {{idGoogleClient}} — его cid.

Триггерить надо по событию расчета, но на этот момент все переменные должны быть определены.

Динамический ремаркетинг Adwords - генерация фида в Spreadsheets через Tag Manager

 

Ну и на всякий случай:

Никакого изображения конечно не появится

 

Автоматическое обновление аудитории в Adwords

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

Динамический ремаркетинг Adwords - публикация фида

 

Переходим в Google Adwords, держим путь в Общую библиотекуКоммерческие данные.

Чтобы добавить фид жамкаем + Данные

Закачали csv‘шку, заходим в появившийся фид, вкладка Запланированные загрузки

Здесь ни в чем себе не отказывайте, надо только качестве источника выбрать HTTPS и вставить ссылку на опубликованный лист.

 

Динамический ремаркетинг через Tag Manager

Статья длинная, так что ловите еще гифку.

 

Пришло время заставить это все работать, в чем нам снова поможет диспетчер тегов от Google.

Заводим новый тег с типом Ремаркетинг Adwords, проставляем Идентификатор конверсии (где взять, написано там же), пользовательские параметры проставляем вручную. Триггером — событие расчета.

Динамический ремаркетинг Adwords - настройка Tag Manager

 

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