Подключение MyTracker Personalize Премиум план
Чтобы подключить MyTracker Personalize к мобильному приложению
и запустить персональные рекомендации для пользователей, нужно выполнить три шага:
- Подключить MyTracker SDK
- Задать настройки рекомендаций
- Настроить интеграцию с Personalize API
1. Подключение MyTracker SDK
MyTracker SDK соберёт статистику по каждому пользователю приложения и сформирует базу данных необходимую для построения рекомендаций.
-
Подключите SDK к приложениям,
с которыми будет взаимодействовать пользователь.
Подробнее см. разделы iOS,
Android,
Unity.
- Убедитесь, что вы настроили трекинг покупок и верификацию платежей.
Подробнее см. раздел Трекинг покупок.
- Выберите способ идентификации пользователей:
- Если ваше приложение предусматривает регистрацию,
и каждый пользователь получает уникальный идентификатор,
то настройте трекинг пользователей через параметр
customUserId
(см. документацию на iOS,
Android,
Unity).
customUserId
не должен меняться с момента первого запуска приложения
- Если в приложении нет системы регистрации или
уникальный идентификатор присваивается не с самого начала использования приложения,
то настройте получение
instanceId
(см. документацию на iOS,
Android,
Unity)
и отправляйте instanceId
в параметре customUserId
.
instanceId
идентифицирует физическое устройство,
но не пользователя, поэтому рекомендация для одного и того же пользователя может отличаться на разных платформах
- Согласно инструкции по передаче произвольных событий
(для iOS,
Android,
Unity),
настройте отправку следующих событий:
- Триггер товара
offer_trigger
- Покупка товара
purchase_offer
- Открытие/закрытие карточки товара
offer_card
- Состояние аккаунта пользователя
account_status
Все события должны отправляться с устройства (не с сервера).
При отправке событий, рекомендуем указывать параметр flush
,
чтобы события не скапливались в буфере,
(см. инструкцию по принудительной отправке событий для
iOS,
Android,
Unity).
Все параметры событий должны быть переданы в строковом виде,
в качестве разделителя для вещественных чисел используйте точку.
Ниже дано подробное описание перечисленных событий и их параметров.
Триггер товара
Событие offer_trigger
должно отправляться в тот момент,
когда пользователь попадает под условие показа товара или выпадает из этого условия
(например, начинает/заканчивает действовать акция в приложении).
Параметры события должны быть переданы в виде строки:
Название параметра |
Описание |
Пример |
action* |
Если пользователь начал попадать под условия показа товара,
то значение параметра — "start". Если перестал попадать — "end".
|
"start" |
placement_id* |
ID места размещения товара |
"A" |
sku** |
Название бандла в сторе
(может быть не уникальным для предмета в сторе) |
"com.app.10dollars" |
payload** |
Уникальное название предмета внутри приложения |
"offer.for.unpaid" |
timestamp* |
Дата и время события в timestamp (UTC+3 в секундах) |
"1597316958" |
* — обязательный параметр.
** — обязательный параметр для рекомендации item и необязательный для рекомендации set.
Пример кода:
let eventCustomParams = [
"action": "start",
"placement_id": "A",
"payload": "offer.for.unpaid",
"timestamp": "1597316958"
]
MRMyTracker.trackEvent(withName: "offer_trigger", eventParams:eventCustomParams)
val eventCustomParams = HashMap<String, String>()
eventCustomParams["action"] = "start";
eventCustomParams["placement_id"] = "A";
eventCustomParams["payload"] = "offer.for.unpaid";
eventCustomParams["timestamp"] = "1597316958";
MyTracker.trackCustomEvent("offer_trigger", eventCustomParams);
var IDictionary<String, String> eventCustomParams = new Dictionary<String, String>();
eventCustomParams["action"] = "start";
eventCustomParams["placement_id"] = "A";
eventCustomParams["payload"] = "offer.for.unpaid";
eventCustomParams["timestamp"] = "1597316958";
MyTracker.TrackEvent("offer_trigger", eventCustomParams));
Покупка товара
Событие purchase_offer
должно отправляться непосредственно после покупки/попытки покупки товара,
участвующего в рекомендации.
Если в покупке несколько товаров, то каждый из них должен быть отправлен отдельным событием.
Параметры события должны быть переданы в виде строки:
Название параметра |
Описание |
Пример |
placement_id* |
ID места размещения товара |
"A" |
placement_type |
Тип места размещения предмета
(поскольку карточка с товаром может быть доступна
с разных экранов приложения).
Значение по умолчанию: "any"
|
"main"
"store"
"pop-up" |
sku* |
Название бандла в сторе
(может быть не уникальным для предмета в сторе) |
"com.app.10dollars" |
payload* |
Уникальное название предмета внутри приложения |
"offer.for.unpaid" |
result* |
Успех покупки (списание денег) |
"true"
"false" |
offer_id* |
Идентификатор товара |
"42" |
timestamp* |
Дата и время покупки в timestamp (UTC+3 в секундах) |
"1597316958" |
* — обязательный параметр.
let eventCustomParams = [
"placement_id":"A",
"placement_type":"store",
"sku": "com.app.10dollars",
"payload": "offer.for.unpaid",
"result": "true",
"offer_id": "42",
"timestamp":"1597316958"
]
MRMyTracker.trackEvent(withName: "purchase_offer", eventParams:eventCustomParams)
val eventCustomParams = HashMap<String, String>()
eventCustomParams["placement_id"] = "A";
eventCustomParams["placement_type"] = "store";
eventCustomParams["sku"] = "com.app.10dollars";
eventCustomParams["payload"] = "offer.for.unpaid";
eventCustomParams["result"] = "true";
eventCustomParams["offer_id"] = "42";
eventCustomParams["timestamp"] = "1597316958";
MyTracker.trackCustomEvent("purchase_offer", eventCustomParams);
var IDictionary<String, String> eventCustomParams = new Dictionary<String, String>();
eventCustomParams["placement_id"] = "A";
eventCustomParams["placement_type"] = "store";
eventCustomParams["sku"] = "com.app.10dollars";
eventCustomParams["payload"] = "offer.for.unpaid";
eventCustomParams["result"] = "true";
eventCustomParams["offer_id"] = "42";
eventCustomParams["timestamp"] = "1597316958";
MyTracker.TrackEvent("purchase_offer", eventCustomParams));
Открытие/закрытие карточки товара
Событие offer_card
должно отправляться при каждом открытии/закрытии карточки/экрана с товаром,
участвующего в рекомендации.
Параметры события должны быть переданы в виде строки:
Название параметра |
Описание |
Пример |
action* |
Действие с карточкой товара:
открытие "open" или закрытие "close".
Если пользователь открыл и закрыл карточку,
то нужно отправить 2 события с разным action |
"open" |
placement_id* |
ID места размещения товара |
"A" |
placement_type |
Тип места размещения предмета
(поскольку карточка с товаром может быть доступна
с разных экранов приложения).
Значение по умолчанию "any"
|
"main"
"store"
"pop-up" |
sku** |
Название бандла в сторе
(не уникально для предмета) |
"com.app.10dollars" |
payload** |
Уникальное название предмета внутри приложения |
"offer.for.unpaid" |
offer_id* |
Идентификатор предмета |
"42" |
timestamp* |
Дата и время открытия/закрытия карточки в timestamp (UTC+3 в секундах) |
"1597316958" |
* — обязательный параметр.
** — обязательный параметр для рекомендации item и необязательный для рекомендации set.
let eventCustomParams = [
"action": "open",
"placement_id": "A",
"placement_type": "store",
"sku": "com.app.10dollars",
"payload": "offer.for.unpaid",
"offer_id": "42",
"timestamp":"1597316958"
]
MRMyTracker.trackEvent(withName: "offer_card", eventParams:eventCustomParams)
val eventCustomParams = HashMap<String, String>()
eventCustomParams["action"] = "open";
eventCustomParams["placement_id"] = "A";
eventCustomParams["placement_type"] = "store";
eventCustomParams["sku"] = "com.app.10dollars";
eventCustomParams["payload"] = "offer.for.unpaid";
eventCustomParams["offer_id"] = "42";
eventCustomParams["timestamp"] = "1597316958";
MyTracker.trackCustomEvent("offer_card", eventCustomParams);
var IDictionary<String, String> eventCustomParams = new Dictionary<String, String>();
eventCustomParams["action"] = "open";
eventCustomParams["placement_id"] = "A";
eventCustomParams["placement_type"] = "store";
eventCustomParams["sku"] = "com.app.10dollars";
eventCustomParams["payload"] = "offer.for.unpaid";
eventCustomParams["offer_id"] = "42";
eventCustomParams["timestamp"] = "1597316958";
MyTracker.TrackEvent("offer_card", eventCustomParams));
Состояние аккаунта пользователя
Событие account_status
должно отправляться не реже,
чем при каждом запуске приложения.
В таблице ниже приведены общие параметры,
которые могут охарактеризовать состояние аккаунта.
Попробуйте найти аналог в своём приложении для максимального числа перечисленных параметров.
Чтобы добавить дополнительные параметры,
свяжитесь со службой поддержки MyTracker.
Параметры события должны быть переданы в виде строки:
Название параметра |
Описание |
Пример |
in_game_currency_<name> |
Любые балансы внутриигровых ресурсов, где name — название ресурса |
"444" |
in_game_currency_diamonds |
Любые балансы внутриигровых ресурсов, например кристаллы |
"5" |
in_game_currency_food |
Любые балансы внутриигровых ресурсов, например еда |
"5" |
in_game_currency_gold |
Любые балансы внутриигровых ресурсов, например золото |
"5" |
account_level |
Уровень аккаунта |
"5" |
clan |
ID клана |
"123123123",
"0" — если не состоит в клане |
achievements_count |
Количество достижений |
"12" |
ranking |
Рейтинг аккаунта |
"99" |
power |
Ценность аккаунта |
"12312312" |
friends_count |
Количество друзей |
"56" |
matches_count |
Количество матчей |
"21312" |
wins_count |
Количество побед |
"12121" |
timestamp* |
Дата и время события в timestamp (UTC+3 в секундах) |
"1597316958" |
* — обязательный параметр.
let eventCustomParams = [
"in_game_currency_diamonds": "5",
"in_game_currency_food": "10001",
"in_game_currency_gold": "356",
"account_level": "5",
"clan": "123123123",
"achievements_count": "12",
"ranking": "99",
"power": "12312312",
"friends_count": "56",
"matches_count": "21312",
"wins_count": "12121",
"timestamp": "1597316958"
]
MRMyTracker.trackEvent(withName: "account_status", eventParams:eventCustomParams)
val eventCustomParams = HashMap<String, String>()
eventCustomParams["in_game_currency_diamonds"] = "5";
eventCustomParams["in_game_currency_food"] = "10001";
eventCustomParams["in_game_currency_gold"] = "356";
eventCustomParams["account_level"] = "5";
eventCustomParams["clan"] = "123123123";
eventCustomParams["achievements_count"] = "12";
eventCustomParams["power"] = "12312312";
eventCustomParams["friends_count"] = "56";
eventCustomParams["matches_count"] = "21312";
eventCustomParams["wins_count"] = "12121";
eventCustomParams["timestamp"] = "1597316958";
MyTracker.trackCustomEvent("account_status", eventCustomParams);
var IDictionary<String, String> eventCustomParams = new Dictionary<String, String>();
eventCustomParams["in_game_currency_diamonds"] = "5";
eventCustomParams["in_game_currency_food"] = "10001";
eventCustomParams["in_game_currency_gold"] = "356";
eventCustomParams["account_level"] = "5";
eventCustomParams["clan"] = "123123123";
eventCustomParams["achievements_count"] = "12";
eventCustomParams["power"] = "12312312";
eventCustomParams["friends_count"] = "56";
eventCustomParams["matches_count"] = "21312";
eventCustomParams["wins_count"] = "12121";
eventCustomParams["timestamp"] = "1597316958";
MyTracker.TrackEvent("account_status", eventCustomParams));
2. Настройка рекомендаций
Свяжитесь с командой MyTracker для настройки персональных рекомендаций:
Для связи вы можете использовать любой удобный вам способ
-
Выберите показатель, который вы хотите улучшить,
например APRU или CR.
По выбранной метрике вы сможете оценить
эффективность использования рекомендаций.
-
Выберите товар, который будет участвовать в рекомендации:
один предмет или набор предметов (item или set).
- Определите целевую аудиторию, для которой будет строится рекомендация:
- вся аудитория приложения
- сегмент аудитории, который можно задать по нескольким параметрам (подробнее см. раздел Сегменты)
- аудитория, которую нельзя определить с помощью сегмента
(в этом случае вы можете предоставить словесное описание целевой аудитории)
- Определите все возможные предложения по товару,
среди которых MyTracker Personalize будет подбирать рекомендации.
Каждое предложение должно быть описано следующими полями:
offer_id
— идентификатор товара,
который соответствует паре sku+payload
(должен совпадать с тем,
который отправляется в кастомных событиях).
sku
— идентификатор товара в магазине приложений
(sku соответствует цене предмета в магазине).
payload
— уникальное внутреннее имя товара в приложении.
Вместе со всеми возможными вариантами товара,
необходимо передать резервный вариант,
параметры которого
должны быть идентичны контрольному
Например, три варианта товара для получения рекомендации item:
offer_id |
sku |
payload |
Является контрольным вариантом,
который показывается по умолчанию |
"0" |
"com.app.id.1" |
"offer.for.unpaid" |
да (резервный) |
"1" |
"com.app.id.1" |
"offer.for.unpaid" |
да |
"2" |
"com.app.id.2" |
"offer.for.unpaid" |
нет |
"3" |
"com.app.id.3" |
"offer.for.unpaid" |
нет |
Например, три варианта товара для получения рекомендации set:
offer_id |
sku |
payload |
Является контрольным вариантом,
который показывается по умолчанию |
"0" |
subscription_month |
"month" |
да (резервный) |
"0" |
subscription_year |
"year" |
да (резервный) |
"0" |
subscription_forever |
"forever" |
да (резервный) |
"1" |
subscription_month |
"month" |
да |
"1" |
subscription_year |
"year" |
да |
"1" |
subscription_forever |
"forever" |
да |
"2" |
subscription_month |
"month" |
нет |
"2" |
subscription_year |
"year" |
нет |
"2" |
subscription_forever |
"forever" |
нет |
"3" |
subscription_month |
"month" |
нет |
"3" |
subscription_year |
"year" |
нет |
"3" |
subscription_forever |
"forever" |
нет |
- Определите параметры A/B тестирования:
-
Перечислите платформы,
на которых будет проведено тестирование: iOS, Android.
- Определите размер контрольной и тестируемой групп.
Например, в сегменте Игроки с 10 уровнем
для 30% игроков показывать стандартную цену,
а для 70% игроков —
предложение от Personalize.
-
Выберите дефолтный товар (item или set),
который попадёт в контрольную группу.
-
Задайте идентификаторы мест,
где будут крутиться предложения —
placement_id
.
Для каждого теста должен быть задан свой placement_id
.
-
Определите характер показа рекомендаций:
- Как часто можно менять цену на товар.
- Какая периодичность и продолжительность показов товара
(например, предложение показывается по таймеру, по выходным каждую неделю и т.д.).
3. Интеграция с Personalize API
Настройте интеграцию с Personalize API, чтобы в режиме реального времени
отправлять запросы на рекомендацию на сервер MyTracker
и показывать персонализированные предложения внутри приложения.
-
Ознакомьтесь с особенностями отправки запросов:
-
Запросы с разных платформ (iOS, Android, Unity, Flutter)
должны приходить отдельно, каждый со своим
sdk_key
.
Чтобы получить sdk_key
нужно подключить SDK к приложению.
-
Выберите один из вариантов отправки запросов:
- С мобильного устройства.
В этом случае оптимальным будет
асинхронный запрос на получение рекомендаций
сразу после загрузки приложения.
- С бэкенда мобильного приложения.
Рекомендуем отправлять запросы не раньше,
чем пользователь получит доступ к рекомендуемым товарам,
чтобы MyTracker успел собрать как можно больше сведений о пользователе.
Повторные запросы необходимо совершать как минимум раз в сутки.
- Предусмотрите следующие возможности:
- Кэширование последних рекомендаций на стороне клиента.
Это нужно для того, чтобы при неполадках в сети,
задержке в получении рекомендации или ошибке со стороны сервера,
отдать самую актуальную рекомендацию для пользователя.
- Асинхронная отправка запроса.
- Использование параметра reset в запросах к API (опционально).
Если reset=True, то сервис отдает самую свежую рекомендацию для пользователя
(цена товара может измениться).
Если reset=False, то будет возвращена последняя выданная ранее рекомендация
(цена товара останется прежней).
Документацию на API смотрите в разделе Personalize API.
Результаты
После подключения MyTracker Personalize, пользователи приложения
будут получать индивидуальные предложения. В зависимости от заданных вами условий,
рекомендуемые цены могут быть отображены как скидка или как цена по умолчанию:
Автоматические отчёты по результатам A/B теста и сведения о прибыли, полученной в результате
персональных рекомендаций,
будут приходить вам на почту, в Telegram-канал или другим удобным для вас способом.