Skip to content

Передача Свойств

Убедитесь, что предыдущие шаги выполнены успешно
  • SDK подключено к проекту: добавлена зависимость io.carrotquest:android-sdk (см. Установка)
  • Ключи взяты из раздела для разработчика (не из webApi): Ключи для SDK
  • Инициализация выполнена успешно и в Logcat появилась надпись “SDK init success”
Результат шага
  • Свойства добавляются в карточку пользователя и отображаются корректно

Свойства пользователя

Полный список свойств можно посмотреть здесь

Здесь собрана различная информация о свойствах пользователя.

Не стоит путать свойства пользователя и свойства события. Свойства события отражают дополнительную информацию о событии (например, у события «Сделал заказ» могут быть свойства «Сумма», «Товары» и т.д.). Свойства пользователя отражают информацию о пользователе. Например, имя, email, количество заказов, сумма всех заказов и т.д.

Типы данных

Поддерживается пять типов данных:

  • число
  • строка
  • дата/время
  • логический (булев)
  • список

Числа могут быть только целыми в диапазоне -2^53 .. +2^53, или -9007199254740992 .. +9007199254740992.

Максимальная длина строки 255 символов.

Элементами списка могут быть только строки длиной до 255 символов (максимум 30 элементов в списке).

Дата/время в формате ISO 8601: YYYY-MM-DDTHH:MM:SS. Допускается сокращённый вариант: YYYY-MM-DD (в этом случае будет подставлено время 00:00:00).

Пример:

json
{
    value1: 145,
    value2: "Hello, world!",
    value3: true,
    value4: "2015-09-13T13:25:05",
    value5: ["element1", "element2", "element3"]
}

Формат установки свойств

Иногда простой установки свойств недостаточно. Например, если вы отслеживаете количество нажатий на кнопку, было бы удобно каждый раз увеличивать значение свойства на единицу (операция add). Другой пример — вы хотите узнать, какой раздел пользователь посетил первым: свойство нужно записать только в том случае, если оно ещё не установлено (операция set_once).

В Carrot quest SDK для Android операция выбирается через enum UserProperty.Operation. Поддерживаются:

  • UPDATE_OR_CREATE — наиболее часто используемый вариант. Если свойство уже существует — перезаписать, иначе создать. Используется по умолчанию.
  • SET_ONCE — записать только если свойства ещё не существует.
  • ADD — добавить заданное значение к свойству (если свойства не существует, перед записью оно будет создано со значением 0).
  • DELETE — удалить свойство.
  • APPEND — добавить элемент в список.
  • UNION — добавить элемент в список, если его там ещё нет («добавить в множество»).
  • EXCLUDE — удалить элемент из списка.

Особенности списков:

  • максимум 30 элементов, элементами могут быть только строки;
  • при APPEND порядок добавления сохраняется; при добавлении 31-го элемента не гарантируется, какой из старых будет вытеснен;
  • при UNION порядок не сохраняется, но повторяющихся элементов не будет; если в списке уже 30 элементов, добавление не гарантируется.

См. также:

Системные свойства пользователя

Все названия свойств, начинающиеся с символа $, считаются системными. Ваши собственные свойства не должны начинаться с $.

Разрешено изменять только 3 свойства: $name, $phone, $email. Все остальные системные свойства можно только читать.

ИмяОписание
$nameИмя
$emailEmail
$phoneТелефон
$last_seenПоследняя активность, дата совершения последнего события
$last_contactedПоследний контакт, дата последнего ответа от пользователя или последней отправки сообщения пользователю (в том числе автосообщения)
$last_replyДата последнего ответа от пользователя
$conversations_emailsКоличество диалогов по email
$conversations_chatsКоличество диалогов с типом чат
$conversations_popupsКоличество диалогов с типом поп-ап
$sessionsКоличество сессий
$user_idUser ID
$scoreКоличество баллов (рейтинг)
$initial_referrerПервый источник (реферрер)
$initial_referrer_domainПервый источник (реферрер), но только домен
$initial_utm_campaignПервая метка UTM Campaign
$initial_utm_sourceПервая метка UTM Source
$initial_utm_mediumПервая метка UTM Medium
$initial_utm_contentПервая метка UTM Content
$initial_utm_termПервая метка UTM Term
$last_utm_campaignПоследняя метка UTM Campaign
$last_utm_sourceПоследняя метка UTM Source
$last_utm_mediumПоследняя метка UTM Medium
$last_utm_contentПоследняя метка UTM Content
$last_utm_termПоследняя метка UTM Term
$countryСтрана
$regionРегион
$cityГород
$latitudeГеографическая широта
$longitudeГеографическая долгота
$email_unsubscribedОтписался от email
$avatarИмя файла с аватаром. Аватарки пользователей лежат по адресу: https://files.carrotquest.io/avatars-users/
$social_vkURL страницы ВКонтакте
$social_facebookURL страницы Facebook
$social_fourqsuareURL страницы Foursquare
$social_googleplusURL страницы Google+
$social_pinterestURL страницы Pinterest
$social_twitterURL страницы Twitter
$social_skypeSkype

Устаревшие deprecated свойства: $comment, $last_active_user, $online, $idle, $cluster_id, $app_uid, $uid, $identity.

После первого совершения события у пользователя появляются три свойства, связанные с этим событием. Например, если событие имеет ID=123, появятся свойства:

ИмяОписание
$event_123_countСколько раз было совершено событие
$event_123_firstДата, когда событие было совершено первый раз
$event_123_lastДата, когда событие было совершено последний раз

Свойства для интернет-магазинов

Свойства, специфичные для интернет-магазинов. Эти свойства можно записывать через API.

ИмяОписание
$cart_amountСумма в корзине (целое число)
$viewed_productsПросмотренные товары (список из названий товаров)
$cart_itemsКорзина (список из названий товаров)
$last_order_statusСтатус последнего заказа
$last_paymentСумма последнего заказа (целое число)
$revenueСумма всех заказов (целое число)
$profitДоход с пользователя (целое число)
$groupГруппа
$discountСкидка (целое число)
$orders_countКоличество заказов (целое число)
$ordered_itemsЗаказанные товары (список из названий товаров)
$ordered_categoriesКатегории заказанных товаров (список из названий категорий товаров)
$viewed_categoriesКатегории просмотренных товаров (список из названий категорий товаров)

Метод

Установить свойство можно через Carrot.setUserProperty. Метод имеет несколько перегрузок: для одного свойства и для списка свойств.

kotlin
import io.carrotquest_sdk.android.Carrot
import io.carrotquest_sdk.android.models.UserProperty

val prop = UserProperty("Key", "Value")
Carrot.setUserProperty(prop)
// или сразу несколько:
Carrot.setUserProperty(listOf(prop1, prop2))
java
import io.carrotquest_sdk.android.Carrot;
import io.carrotquest_sdk.android.models.UserProperty;

UserProperty prop = new UserProperty("Key", "Value");
Carrot.setUserProperty(prop);
// или сразу несколько:
Carrot.setUserProperty(Arrays.asList(prop1, prop2));

Класс UserProperty

kotlin
import io.carrotquest_sdk.android.models.UserProperty

val prop = UserProperty("Key", "Value")
java
import io.carrotquest_sdk.android.models.UserProperty;

UserProperty prop = new UserProperty("Key", "Value");

Любое значение свойства в SDK представлено строкой. Ключ свойства не может начинаться с $ — это привилегия системных свойств.

Конструктор UserProperty имеет необязательное поле operation — операция над свойством (см. Формат установки свойств). Если операция не указана, используется UPDATE_OR_CREATE.

kotlin
import io.carrotquest_sdk.android.models.UserProperty

val prop = UserProperty(
    operation = UserProperty.Operation.UPDATE_OR_CREATE,
    key = "Key",
    value = "Value"
)
java
import io.carrotquest_sdk.android.models.UserProperty;

UserProperty prop = new UserProperty(
    UserProperty.Operation.UPDATE_OR_CREATE,
    "Key",
    "Value"
);

Классы CarrotUserProperty и EcommerceUserProperty

Для установки системных свойств можно использовать встроенные классы. В них поле ключа заменено на enum, чтобы выбрать свойство прямо из подсказок IDE — без риска опечататься в имени.

CarrotUserProperty — основные системные свойства ($name, $phone, $email):

kotlin
import io.carrotquest_sdk.android.models.CarrotUserProperty

val systemProp = CarrotUserProperty(
    key = CarrotUserProperty.Property.NAME,
    value = "userName"
)
java
import io.carrotquest_sdk.android.models.CarrotUserProperty;

CarrotUserProperty systemProp = new CarrotUserProperty(
    CarrotUserProperty.Property.NAME,
    "userName"
);

EcommerceUserProperty — свойства для интернет-магазинов ($cart_amount, $revenue, $orders_count и т.д.):

kotlin
import io.carrotquest_sdk.android.models.EcommerceUserProperty

val storeProp = EcommerceUserProperty(
    key = EcommerceUserProperty.Property.PROFIT,
    value = "very much"
)
java
import io.carrotquest_sdk.android.models.EcommerceUserProperty;

EcommerceUserProperty storeProp = new EcommerceUserProperty(
    EcommerceUserProperty.Property.PROFIT,
    "very much"
);

По аналогии с UserProperty, оба класса принимают необязательное поле operation.

Кейсы

Запись email
kotlin
import io.carrotquest_sdk.android.Carrot
import io.carrotquest_sdk.android.models.CarrotUserProperty

val email = "a@b.c"
val systemProp = CarrotUserProperty(
    key = CarrotUserProperty.Property.EMAIL,
    value = email
)
Carrot.setUserProperty(systemProp)
java
import io.carrotquest_sdk.android.Carrot;
import io.carrotquest_sdk.android.models.CarrotUserProperty;

String email = "a@b.c";
CarrotUserProperty systemProp = new CarrotUserProperty(
    CarrotUserProperty.Property.EMAIL,
    email
);
Carrot.setUserProperty(systemProp);
Удаление времени входа в апп
kotlin
import io.carrotquest_sdk.android.Carrot
import io.carrotquest_sdk.android.models.UserProperty

val timestampString = "2015-09-13T13:25:05"
val prop = UserProperty(
    UserProperty.Operation.DELETE,
    "startTime",
    timestampString
)
Carrot.setUserProperty(prop)
java
import io.carrotquest_sdk.android.Carrot;
import io.carrotquest_sdk.android.models.UserProperty;

String timestampString = "2015-09-13T13:25:05";
UserProperty prop = new UserProperty(
    UserProperty.Operation.DELETE,
    "startTime",
    timestampString
);
Carrot.setUserProperty(prop);
Одноразовая запись свойства о наличии установленного аппа у пользователя
kotlin
import io.carrotquest_sdk.android.Carrot
import io.carrotquest_sdk.android.models.UserProperty

val prop = UserProperty(
    UserProperty.Operation.SET_ONCE,
    "isOpenedApp",
    "true"
)
Carrot.setUserProperty(prop)
java
import io.carrotquest_sdk.android.Carrot;
import io.carrotquest_sdk.android.models.UserProperty;

UserProperty prop = new UserProperty(
    UserProperty.Operation.SET_ONCE,
    "isOpenedApp",
    "true"
);
Carrot.setUserProperty(prop);

Методы WebAPI

Если у вас возникли вопросы, вы можете посмотреть, как похожая механика работает в методах WebAPI, можно найти по ссылке: https://developers.carrotquest.io/webapi/endpoints/

FAQ
Что делать, если системного свойства не оказалось в SDK, но в WEB версии он есть?

Его можно передать с помощью обычного UserProperty. Но нужно быть аккуратным, бэк просто не запишет несуществующее системное свойство.

kotlin
import io.carrotquest_sdk.android.Carrot
import io.carrotquest_sdk.android.models.UserProperty

val prop = UserProperty("\$name", "userName")
Carrot.setUserProperty(prop)
java
import io.carrotquest_sdk.android.Carrot;
import io.carrotquest_sdk.android.models.UserProperty;

UserProperty prop = new UserProperty("$name", "userName");
Carrot.setUserProperty(prop);
Как передать другие типы свойств, такие же как на WEB версии?

Просто передав свойства в виде строки.

kotlin
import io.carrotquest_sdk.android.Carrot
import io.carrotquest_sdk.android.models.UserProperty

val propInt = UserProperty("propInt", "145") // Число
val propStr = UserProperty("propStr", "Hello, world!") // Строка
val propBool = UserProperty("propBool", "true") // Логический
val propDate = UserProperty("propDate", "2015-09-13T13:25:05") // Дата или время
val propList = UserProperty("propList", "[\"element1\", \"element2\", \"element3\"]") // Список

Carrot.setUserProperty(
    listOf(propInt, propStr, propBool, propDate, propList)
)
java
import java.util.Arrays;
import io.carrotquest_sdk.android.Carrot;
import io.carrotquest_sdk.android.models.UserProperty;

UserProperty propInt = new UserProperty("propInt", "145");
UserProperty propStr = new UserProperty("propStr", "Hello, world!");
UserProperty propBool = new UserProperty("propBool", "true");
UserProperty propDate = new UserProperty("propDate", "2015-09-13T13:25:05");
UserProperty propList = new UserProperty("propList", "[\"element1\", \"element2\", \"element3\"]");

Carrot.setUserProperty(Arrays.asList(
    propInt, propStr, propBool, propDate, propList
));

Дружеское напоминание: можно использовать встроенные в язык конвертеры. Например:

kotlin
import io.carrotquest_sdk.android.Carrot
import io.carrotquest_sdk.android.models.UserProperty

val number: Int = 64
val propInt = UserProperty("propInt", number.toString())
Carrot.setUserProperty(propInt)
java
import io.carrotquest_sdk.android.Carrot;
import io.carrotquest_sdk.android.models.UserProperty;

int number = 64;
UserProperty propInt = new UserProperty("propInt", String.valueOf(number));
Carrot.setUserProperty(propInt);