Skip to content

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

Убедитесь, что предыдущие шаги выполнены успешно
  • SDK добавлено в ваше мобильное приложение (в проекте появилась зависимость CarrotSDK)
  • Ключи взяты из раздела для разработчика (не из webApi): ключи для SDK
  • Инициализация выполнена успешно и приложение запустилось без ошибок
  • В консоли появилась надпись “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).

Пример:

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

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

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

Другой пример - вы хотите узнать, какой раздел пользователь посетил первым. Здесь свойство нужно записать только в том случае, если оно еще не установлено (операция set_once).

Сложный формат для установки свойств представляет собой массив из объектов. Каждый объект — атомарная операция над свойством. В объекте три поля: op — операция, key — имя свойства, value — значение Поддерживаются следующие операции:

  • update_or_create — наиболее часто используемый вариант. Если свойство уже существует, перезаписать
  • set_once — записать только если свойства не существует
  • add — добавить заданное значение к свойству (если свойства не существует, перед записью значения оно будет создано со значением 0)
  • delete — удалить свойство
  • append — добавить в список
  • union — добавить в список, если еще не добавлен
  • exclude — удалить из списка

Примеры:

[
    // Установить значение (если уже существует - обновить)
    {"op": "update_or_create", "key": "my_property", "value": "Hello"},

    // Установить только если свойство не задано
    {"op": "set_once", "key": "my_property", "value": "Hello"},

    // Инкремент, декремент, добавление и вычитание
    {"op": "add", "key": "my_property", "value": "1"},
    {"op": "add", "key": "my_property", "value": "-1"},
    {"op": "add", "key": "my_property", "value": "15"},
    {"op": "add", "key": "my_property", "value": "-53"},

    // Удалить свойство
    {"op": "delete", "key": "my_property", "value": "0"},

    // Добавить элемент в список
    {"op": "append", "key": "my_list_property", "value": "super-element"},

    // Добавить элемент в список только если его там еще нет ("добавить в множество")
    {"op": "union", "key": "my_list_property", "value": "super-element"},

    // Удалить элемент из списка
    {"op": "exclude", "key": "my_list_property", "value": "super-element"},
]

На данный момент максимальное количество элементов в списке — 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Категории просмотренных товаров (список из названий категорий товаров)

Метод

Можно установить необходимые свойства с помощью следующего кода:

swift
import CarrotSDK

let prop = UserProperty(key: "Key", value: "Value")
Carrot.shared.setUserProperty([prop])
objective-c
#import "CarrotSDK/CarrotSDK.h"

Carrot *carrot = [Carrot shared];
UserProperty *userProp = [[UserProperty alloc] initWithKey:@"Key" value:@"Value"];
[carrot setUserProperty:@[userProp]];

В данном примере prop это какое-то свойство, которое необходимо установить, однако, стоит обратить внимание, что функция setUserProperty принимает массив свойств. Поэтому в данном примере на Swift, prop обернут в [].

Класс UserProperty

swift
import CarrotSDK

let prop = UserProperty(key: "Key", value: "Value")
objective-c
#import "CarrotSDK/CarrotSDK.h"

UserProperty *userProp = [[UserProperty alloc] initWithKey:@"Key" value:@"Value"];

Обратите внимание, что любое значение свойства, описано в SDK как строка.

И не стоит забывать, о том что ключ, так же известный, как имя свойства не может начинаться со знака $ (это привилегия системных свойств)

swift
let prop = UserProperty(
        key: "Key",
        value: "Value",
        operation: .updateOrCreate
)
objective-c
UserProperty *userProp = [[UserProperty alloc] initWithKey:@"Key"
                                                     value:@"Value"
                                                 operation:UserPropertyOperationUpdateOrCreate];

Класс UserProperty имеет необязательное поле при инициализации: operation

Возможные варианты:

updateOrCreateЕсли свойство уже существует, перезаписать, если нет - создать
setOnceЗаписать только если свойства не существует
addдобавить заданное значение к свойству (если свойства не существует, перед записью значения, оно будет создано со значением 0)
deleteудалить свойство
appendдобавить в список
unionдобавить в список, если еще не добавлен
excludeудалить из списка

Если не указывать этот параметр, то будет выбран параметр по умолчанию: updateOrCreate

Так же, стоит отметить, что operation имеет тип Enum, а значит Xcode подскажет синтаксис и возможные варианты, а так же это исключает возможность написать что-то свое в поле operation

Классы CarrotUserProperty и EcommerceUserProperty

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

swift
import CarrotSDK

let systemProp = CarrotUserProperty(
        key: .name,
        value: "userName"
)
objective-c
#import "CarrotSDK/CarrotSDK.h"

CarrotUserProperty *systemProp = [[CarrotUserProperty alloc] initWithKey:CarrotUserPropertyKeyName
                                                                   value:@"userName"];
swift
import CarrotSDK

let storeProp = EcommerceUserProperty(
        key: .profit,
        value: "very much"
)
objective-c
#import "CarrotSDK/CarrotSDK.h"

EcommerceUserProperty *storeProp = [[EcommerceUserProperty alloc] initWithKey:EcommerceUserPropertyKeyProfit
                                                                         value:@"very much"];

По аналогии с классом UserProperty, можно передать поле operation

Кейсы

Запись email
swift
import CarrotSDK

let email = "a@b.c"
let systemProp = CarrotUserProperty(key: .email, value: email)
Carrot.shared.setUserProperty([systemProp])
objective-c
#import "CarrotSDK/CarrotSDK.h"

NSString *email = @"a@b.c";
CarrotUserProperty *systemProp = [[CarrotUserProperty alloc] initWithKey:CarrotUserPropertyKeyEmail
                                                                   value:email];
[[Carrot shared] setUserProperty:@[systemProp]];
Удаление времени входа в апп:
swift
import CarrotSDK

let timestampString = "2015-09-13T13:25:05"
let prop = UserProperty(
        key: "startTime",
        value: timestampString,
        operation: .delete
)
Carrot.shared.setUserProperty([prop])
objective-c
#import "CarrotSDK/CarrotSDK.h"

NSString *timestampString = @"2015-09-13T13:25:05";
UserProperty *prop = [[UserProperty alloc] initWithKey:@"startTime"
                                                 value:timestampString
                                             operation:UserPropertyOperationDelete];
[[Carrot shared] setUserProperty:@[prop]];
Одноразовая запись свойства о наличии установленного аппа у пользователя:
swift
import CarrotSDK

let prop = UserProperty(
        key: "isOpenedApp",
        value: "true",
        operation: .setOnce
)
Carrot.shared.setUserProperty([prop])
objective-c
#import "CarrotSDK/CarrotSDK.h"

UserProperty *prop = [[UserProperty alloc] initWithKey:@"isOpenedApp"
                                                 value:@"true"
                                             operation:UserPropertyOperationSetOnce];
[[Carrot shared] setUserProperty:@[prop]];

Методы WebAPI

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

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

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

swift
import CarrotSDK

let prop = UserProperty(key: "$name", value: "userName")
Carrot.shared.setUserProperty([prop])
objective-c
#import "CarrotSDK/CarrotSDK.h"

UserProperty *prop = [[UserProperty alloc] initWithKey:@"$name" value:@"userName"];
[[Carrot shared] setUserProperty:@[prop]];
Как передать другие типы свойств, такие же как на WEB версии?

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

swift
import CarrotSDK

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

Carrot.shared.setUserProperty([
        propInt,
        propStr,
        propBool,
        propDate,
        propList
])
objective-c
#import "CarrotSDK/CarrotSDK.h"

UserProperty *propInt = [[UserProperty alloc] initWithKey:@"propInt" value:@"145"];
UserProperty *propStr = [[UserProperty alloc] initWithKey:@"propStr" value:@"Hello, world!"];
UserProperty *propBool = [[UserProperty alloc] initWithKey:@"propBool" value:@"true"];
UserProperty *propDate = [[UserProperty alloc] initWithKey:@"propDate" value:@"2015-09-13T13:25:05"];
UserProperty *propList = [[UserProperty alloc] initWithKey:@"propList" value:@"["element1", "element2", "element3"]"];

[[Carrot shared] setUserProperty:@[
    propInt,
    propStr,
    propBool,
    propDate,
    propList
]];

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

swift
import CarrotSDK

let number: Int = 64
let propInt = UserProperty(key: "propInt", value: String(number))
Carrot.shared.setUserProperty([propInt])
objective-c
#import "CarrotSDK/CarrotSDK.h"

NSInteger number = 64;
UserProperty *propInt = [[UserProperty alloc] initWithKey:@"propInt"
                                                    value:[NSString stringWithFormat:@"%ld", (long)number]];
[[Carrot shared] setUserProperty:@[propInt]];