Каждый мужчина в жизни должен сделать 3 вещи: посадить дерево, построить дом и настроить автоматическую генерацию фида для динамического ремаркетинга через диспетчер тегов от Google.
Pourquoi?
В Google Adwords
есть классный инструмент, позволяющий после посещения всяких e-shop'ов догонять вас рекламой продуктов, которые вы посмотрели или "забыли" в корзине. Но! Это вполне конкретные продукты с конкретными ценами. А как быть, если клиент у вас считает стоимость ремонта, путевки на троих, пиццу на тонком тесте с колбасками по кругу, ежемесячный платеж по ипотеке или и того хуже - страховку?! Хочется же тоже догнать его и чисто по-человечески:
Эй, 1000167059.1490858211, дарагой, скидку дам, дагаваримся!
Более того! Если у вас достаточно информации о клиенте, вы можете заранее делать расчет и показывать ему персональную рекламу.
Содержание
Смотрите, общая идея такова: при каждом расчете будем создавать фиктивные продукты в фиде и периодически заносим их в Adwords
.
Для реализации подготовьте в браузере следующие вкладки: Google Tag Manager, Google Spreadsheets, Google Apps Script и Google Adwords. Теперь, когда самое сложное позади, распишу план действий:
- Готовим шаблон фида под разные продукты в
Spreadsheets
- Пишем приложение в
Apps Script
, которое принимает данные изurl
и закидывает в фид - Подключаем скрипт к
Tag Manager
- Подключаем скрипт к
Adwords
- Ставим код динамического ремаркетинга через
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
}
Не забудьте зарелизить приложение через Публикация
- Развернуть как веб-приложение...
. В этом случае бонусом получите ссылку, чтобы его использовать.
Передача данных в Spreadsheets через Tag Manager
Создаем новый тег с типом Пользовательское изображение
, вставляем ссылку на скрипт, добавив в конце параметры, должно получиться что-то вроде этого:
https://script.google.com/macros/s/AKfycbw8VT4b0kn5oDRWKA2sMvgv49uBvPjWpgFMn2YrxdtC2HA9uvxG/exec?product=Продукт1&ID=idGoogleClient&Price=valueCost где
valueCost
содержит то, что насчитал клиент, аidGoogleClient
- егоcid
. Триггерить надо по событию расчета, но на этот момент все переменные должны быть определены.
Ну и на всякий случай:
Никакого изображения конечно не появится
Автоматическое обновление аудитории в Adwords
Прежде чем научить этого рекламного левиафана автоматически забирать наш фид, придется сперва создать его вручную. Поэтому выгружаем csv
через Файл
- Скачать как
и сразу же создаем прямую ссылку через Файл
- Опубликовать в интернете...
Переходим в
Google Adwords, держим путь в Общую библиотеку
- Коммерческие данные
. Чтобы добавить фид жамкаем
Закачали csv
'шку, заходим в появившийся фид, вкладка Запланированные загрузки
.
Здесь ни в чем себе не отказывайте, надо только качестве источника выбрать HTTPS
и вставить ссылку на опубликованный лист.
Динамический ремаркетинг через Tag Manager
Статья длинная, так что ловите еще гифку.
Пришло время заставить это все работать, в чем нам снова поможет диспетчер тегов от Google. Заводим новый тег с типом Ремаркетинг Adwords
, проставляем Идентификатор конверсии
(где взять, написано там же), пользовательские параметры проставляем вручную. Триггером - событие расчета.
Автор (бишь я) осознает, что все описанное выше можно бесконечно улучшать и допиливать под разные ситуации. Меня интересовала сама возможность автоматически подстраивать объявления под конкретного человека, используя только продукты Google. Если дерзнете воспользоваться - отпишитесь в комментариях, как оно у вас, переживаю ж.