S Subster

Свойства покупателя

Вы заберёте с нашего сервера ответы, которые покупатель дал в квизе, и пропустите экраны онбординга с теми же вопросами.

Человек прошёл веб-квиз, заплатил и открыл приложение, а онбординг снова спрашивает его цель и возраст. Ответы уже лежат у нас: квиз сохраняет их на тот же идентификатор, на который потом ложится оплата. Один запрос с вашего сервера, и приложение показывает только то, чего мы ещё не знаем.

Об оплате свойства ничего не говорят: пускать ли в платное, решает проверка права доступа.

Перед началом

Запрос и ответ

curl "https://api.subster.ai/s2s/v1/user/properties?guid=<GUID>" \
  -H "Authorization: Bearer sk_live_…"
{
  "user_id": "abc123def456",
  "guid": "abc123def456",
  "email": "[email protected]",
  "properties": [
    { "property": "country", "value": "DE", "block_id": null },
    { "property": "utm_campaign", "value": "spring_sale", "block_id": null },
    { "property": "Какая у вас цель?", "value": "b7c1e0d2-…", "block_id": "3f9a41c8-…" },
    { "property": "Ваш вес", "value": "70 kg", "block_id": "8d20e6f5-…" }
  ]
}
ПолеТипЧто это
guidстрокаидентификатор покупателя
user_idстрокато же значение, что guid
emailстрока или nullпочта покупателя; null — почты у нас нет. В списке свойств она не повторяется
propertiesмассивсвойства покупателя; пустой, если их нет
propertyстрокаимя свойства
valueстроказначение — всегда строкой, даже у числа
block_idстрока или nullидентификатор вопроса квиза; null у свойств не из квиза

В списке три вида свойств:

Идентификатор неизвестный или из другого проекта — даже вашей же организации — даёт отказ 404. Знакомый покупатель без свойств — успех и пустой список. Отказы из-за формы запроса те же, что у запроса права доступа с ключом. Потолок — 120 запросов в минуту на ключ, у чтения и записи свойств счётчики раздельные («Аутентификация»).

Какой экран пропустить

Показывайте экран онбординга, только если в списке нет ответа с идентификатором его вопроса (block_id). Сверяйте именно block_id: текст вопроса меняется, когда владелец правит формулировку или переводит воронку, а block_id остаётся прежним.

Что лежит в value, зависит от вопроса:

Вопрос в квизеЧто приходит в value
выбор одного вариантаидентификатор варианта, а не его текст
выбор нескольких вариантовидентификаторы через запятую без пробела
оценка или шкалачисло строкой: 4
вес или ростчисло и единица через пробел: 70 kg
текст или числото, что ввёл покупатель

Для пропуска экрана хватит block_id. Чтобы подставить сам ответ — например, выбранную цель, — сопоставьте идентификаторы вариантов со своими значениями:

{
  "3f9a41c8-…": { "b7c1e0d2-…": "lose_weight", "e04a9b31-…": "build_muscle" }
}

Если покупатель прошёл квиз ещё раз с тем же идентификатором, новый ответ на вопрос заменяет прежний.

Собрать block_id и идентификаторы вариантов можно только своим проходом воронки: пройдите её, вернитесь в приложение и запросите свойства — в ответе будет каждый вопрос с выбранным вариантом. Один проход даёт один вариант на вопрос, поэтому для вопроса с тремя вариантами нужно три прохода, и в каждом выбирайте другой вариант. Добавил владелец новый вариант — пройдите воронку ещё раз.

Копия воронки, в том числе для A/B-теста, получает новые идентификаторы вопросов и вариантов. Соберите их для копии тем же проходом и храните соответствие отдельно для каждой воронки.

Почему ответа может не быть

Поэтому онбординг целиком не убирайте: пропускайте только те экраны, ответ на которые пришёл.

Записать своё свойство

Ответ, который человек дал уже в приложении, можно положить рядом с ответами квиза — тогда весь профиль приходит одним запросом.

curl -X POST "https://api.subster.ai/s2s/v1/user/properties?user=<GUID>" \
  -H "Authorization: Bearer sk_live_…" \
  -H "Content-Type: application/json" \
  -d '{ "property": "onboarding_goal", "value": "strength" }'
ГдеПолеЧто передать
адресuserидентификатор покупателя. Именно user: параметр guid здесь даёт отказ 400
телоpropertyимя свойства, строка до 255 символов
телоvalueзначение, строка до 10 000 символов. Число передайте строкой: "5", а не 5

Ответ — { "success": true }. Один запрос записывает одно свойство: несколько свойств — несколько запросов. Повторная запись того же имени заменяет значение; block_id у своего свойства — null.

Семь имён пишем только мы: utm_source, utm_medium, utm_campaign, utm_term, utm_content, country, email. Запись под таким именем получит отказ 400 с кодом reserved_property. Если покупатель явно отказался от отслеживания, запись отклоняется отказом 409 с кодом consent_denied.

Если воронка уводит человека на ваш сайт

Воронка может закончиться не оплатой у нас, а переходом на ваш адрес — кнопкой-ссылкой, блоком «Редирект на URL» или правилом перехода. Тогда те же сведения приезжают параметрами в этом адресе, без запроса к нам.

Владелец проекта вписывает в адрес метки в фигурных скобках, а мы подставляем значения в момент ухода. Список меток он видит под полем адреса, в подсказке «Метки в исходящем адресе».

https://your-site.io/pay?src={utm_source}&cid={click_id}&goal={answer.<question-id>}
МеткаЧто приедет
{utm_source}, {utm_medium}, {utm_campaign}, {utm_content}, {utm_term}метки кампании из адреса, по которому человек пришёл в воронку
{click_id}значение метки клика, с которой человек пришёл: партнёрской (click_id, sub_id или clickid), а если её нет и посетитель согласился на отслеживание — gclid, fbclid или ttclid. Приходит одно значение, без имени метки: какая сеть его дала, из адреса не видно
{visitor_id}постоянный идентификатор посетителя в этом браузере
{answer.<идентификатор вопроса>}идентификатор выбранного варианта; несколько вариантов — через запятую. Идентификатор вопроса — тот же block_id, что в списке свойств

Метки подставляются только в значения параметров. Если значения для метки нет, а параметр состоял только из неё, как cid={click_id}, параметр пропадает из адреса целиком: ваша страница должна переживать его отсутствие.

Пустыми придут:

Почты, телефона, имени и текста, который человек ввёл сам, среди меток нет. Воронку с такой меткой кабинет не сохранит.

Дальше