Singular

Singular — это платформа Mobile Measurement Partner (MMP), которая собирает и отображает данные маркетинговых кампаний.

Adapty отправляет в Singular события подписок, которые вы выбираете. В дашборде Singular вы можете видеть, какую выручку приносит каждая кампания, и оценивать эффективность рекламы.

Настройка интеграции

Подключение Adapty к Singular

Чтобы настроить интеграцию с Singular, перейдите в раздел Integrations > Singular дашборда Adapty, включите переключатель и заполните поля.

singular-creds.webp

Доступны следующие учётные данные:

  • Singular SDK Key: Обязательное поле. Продакшн SDK-ключ вашего приложения в Singular.
  • Singular SDK Key (Sandbox): Необязательное поле. SDK-ключ для песочницы вашего приложения в Singular. Если не указан, события из песочницы не будут отправляться в Singular.

Оба ключа можно найти в дашборде Singular в разделе Developer tools -> SDK Keys -> SDK Key (не SDK Secret):

4bc50d1-singular_sdk_key.webp

Настройте события и теги

Ниже учётных данных находятся три группы событий, которые можно отправлять в Singular из Adapty. Полный список событий Adapty см. в разделе События.

e67de0c-singular_events.webp

Рекомендуем использовать названия событий по умолчанию, предоставленные Adapty. При необходимости их можно изменить.

Adapty отправляет события подписок на сервер Singular по схеме server-to-server, поэтому вы можете просматривать все события подписок в дашборде Singular и связывать их с вашими рекламными кампаниями.

Warning

Профили, созданные до настройки интеграции, не смогут передавать свои события в Singular.

Подключите приложение к Singular

По умолчанию Singular включает Singular Device ID (SDID) для аккаунтов, созданных 15 июля 2026 года или позже. Такие аккаунты принимают события только через Event API v2, а Adapty отправляет событие в v2 только при наличии SDID в профиле пользователя. Чтобы события доставлялись в подобный аккаунт, передавайте SDID в Adapty из своего приложения.

Если ваш аккаунт Singular создан до 15 июля 2026 года и SDID на нём не включён, пропустите этот шаг. Adapty отправляет события через Event API v1, и изменения в коде приложения не требуются.

  1. Активируйте Adapty, затем запустите Singular SDK с SDID-коллбэком: sdidReceivedHandler на iOS, SDIDAccessorHandler на Android, sdidReceivedCallback на React Native и Flutter, и SingularSdidAccessorHandler на Unity.
  2. Дождитесь, пока Singular вызовет коллбэк. SDID приходит в ваше приложение асинхронно, после запуска Singular SDK. Singular вызывает коллбэк при каждом запуске, в том числе когда SDID уже сохранён на устройстве.
  3. Внутри коллбэка передайте SDID в Adapty через setIntegrationIdentifier() с ключом singular_sdid. Ни один SDK Adapty не имеет предопределённой константы для этого ключа, поэтому используйте строковый литерал.
  4. Вызывайте Adapty.identify() только после завершения setIntegrationIdentifier(). При активации Adapty создаёт анонимный профиль, а затем переключается на идентифицированный после того, как identify() завершится. SDID, установленный в момент этого переключения, может быть потерян.

Структура события

Adapty выбирает версию Singular Event API для каждого события в зависимости от того, есть ли в профиле пользователя SDID:

  • С SDID: Adapty отправляет POST-запрос на https://s2s.singular.net/api/v2/evt с телом в формате form-urlencoded. Параметр sdid заменяет идентификаторы устройства idfa, idfv, aifa, andi и asid. Булевы значения передаются как true или false.
  • Без SDID: Adapty отправляет GET-запрос на https://s2s.singular.net/api/v1/evt с параметрами запроса.

В остальном оба варианта содержат одинаковые параметры. Событие v1 имеет следующую структуру:

{
  "n": "subscription_renewed",
  "a": "singular_sdk_key_123",
  "p": "iOS",
  "i": "com.example.app",
  "ip": "192.168.100.1",
  "idfa": "00000000-0000-0000-0000-000000000000",
  "idfv": "00000000-0000-0000-0000-000000000000",
  "ve": "17.0.1",
  "att_authorization_status": 3,
  "custom_user_id": "user_12345",
  "utime": 1709294400,
  "partner": "adapty",
  "use_ip": false,
  "is_revenue_event": true,
  "amt": 9.99,
  "cur": "USD",
  "purchase_product_id": "yearly.premium.6999",
  "purchase_transaction_id": "GPA.3383...",
  "e": "{\"is_revenue_event\":true,\"amt\":9.99,\"cur\":\"USD\",\"purchase_product_id\":\"yearly.premium.6999\",\"purchase_transaction_id\":\"GPA.3383...\"}"
}

Где:

ПараметрТипОписание
nStringНазвание события (маппится из события Adapty).
aStringВаш Singular SDK Key.
pStringПлатформа (“iOS” или “Android”).
iStringStore App ID (Bundle ID).
ipStringIP-адрес пользователя.
sdidStringТолько v2. Singular Device ID, из идентификатора интеграции singular_sdid.
idfaStringiOS, только v1. ID for Advertisers (в верхнем регистре).
idfvStringiOS, только v1. ID for Vendors (в верхнем регистре).
aifaStringAndroid, только v1. Google Advertising ID (в нижнем регистре).
andiStringAndroid, только v1. Android ID (в нижнем регистре).
asidStringAndroid, только v1. App Set ID (в нижнем регистре).
veStringВерсия ОС.
att_authorization_statusIntegerТолько iOS. Статус ATT (например, 3 — авторизован).
custom_user_idStringCustomer User ID пользователя.
utimeLongUNIX-временная метка события в секундах.
partnerStringВсегда adapty. Указывает, что событие отправлено Adapty.
use_ipBooleantrue, если у Adapty нет IP-адреса пользователя.
is_revenue_eventBooleantrue, если событие содержит доход. Отправляется только с событиями дохода.
amtFloatСумма дохода.
curStringКод валюты (например, “USD”).
purchase_product_idStringID продукта из стора.
purchase_transaction_idStringОригинальный ID транзакции.
eStringJSON-строка с деталями события (см. ниже).

Параметр e (данные пользовательского события) — это JSON-строка, содержащая:

ПараметрТипОписание
is_revenue_eventBooleantrue, если событие содержит выручку.
amtFloatСумма выручки.
curStringКод валюты.
purchase_product_idStringID продукта в сторе.
purchase_transaction_idStringОригинальный ID транзакции.

Устранение неполадок

События не проходят с ошибкой invalid api version: v1

Ваш аккаунт Singular был создан 15 июля 2026 года или позднее и принимает события только через Event API v2. Adapty отправил событие на v1, потому что в профиле пользователя нет SDID. Чтобы исправить это, передайте SDID в Adapty из своего приложения, как описано в разделе Подключите приложение к Singular. События от пользователей, использующих версию приложения без вызова setIntegrationIdentifier(), будут продолжать завершаться с ошибкой, пока те не обновят приложение.

access_level_updated отображается как «Не выполнено» в Event Feed

access_level_updated — это событие только для вебхуков. Adapty не отправляет его в эту интеграцию. Однако Adapty фиксирует результат для каждой активной интеграции, и неподдерживаемое событие отображается как ошибка.