Порядок вызовов в Capacitor SDK

adapty.activate() должен завершиться до вызова любого другого метода Adapty SDK. До его завершения у SDK нет состояния. Любой вызов, сделанный до или параллельно с activate(), завершится ошибкой #2002 notActivated.

Если ваше приложение аутентифицирует пользователей и вы получаете customer user ID после запуска, вызовите adapty.identify() в этот момент. Не вызывайте методы, зависящие от пользователя, пока identify не завершится. Вызовы, которые выполняются параллельно с ним, либо завершатся с ошибкой #3006 profileWasChanged, либо применятся к анонимному профилю, созданному при активации. В таком случае атрибуция, MMP-идентификаторы вроде appsflyer_id и принадлежность установки не всегда переносятся на идентифицированный профиль. Если ваше приложение не аутентифицирует пользователей, пропустите identify и продолжайте работу с анонимным профилем.

MMP и аналитические SDK (AppsFlyer, Adjust, Branch, PostHog) следуют тому же правилу. Сначала инициализируйте их и дождитесь коллбэков с UID, и только после этого вызывайте adapty.activate. Иначе MMP ID попадёт на временный анонимный профиль и не всегда переносится на идентифицированный. Подробнее об AppsFlyer см. в разделе AppsFlyer.

Правильный порядок

Ваш путь зависит от двух вещей: когда вы получаете customer user ID и используете ли вы MMP или аналитический SDK.

  • Шаги 2 и 5: Обязательны для каждого приложения. Активируйте SDK, затем вызовите методы SDK.
  • Шаги 1 и 3: Нужны только если вы интегрируете MMP или аналитический SDK (AppsFlyer, Adjust, Branch, PostHog).
  • Шаг 4: Нужен только если ваше приложение аутентифицирует пользователей и получает customer user ID после запуска.

Если вы знаете customer user ID при запуске приложения, передайте его прямо в activate() (шаг 2a). В этом случае анонимный профиль не создаётся, поэтому шаг 4 не нужен.

ШагВызовКогдаПримечания
1Инициализируйте MMP или аналитический SDK (AppsFlyer, Adjust, PostHog, Branch)При запуске приложения, первым деломДождитесь callback с UID от MMP, например getAppsFlyerUID.
2aadapty.activate({ apiKey: '...', params: { customerUserId: '...' } })При запуске приложения, после шага 1, если у вас есть customer user IDРекомендуется. Анонимный профиль не создаётся.
2badapty.activate({ apiKey: '...' }) без customerUserIdПри запуске приложения, после шага 1, если у вас нет customer user ID (или вы его не используете)Adapty создаёт анонимный профиль.
3adapty.setIntegrationIdentifier({ key: '...', value: '...' }) для каждого MMPПосле шага 2, до любых вызовов, связанных с действиями пользователяНеобходимо, чтобы MMP ID привязались к нужному профилю.
4await adapty.identify({ customerUserId: 'YOUR_USER_ID' })После шага 3 (или шага 2, если MMP нет), до шага 5 — только при пути 2b с аутентификациейВсегда используйте await. Параллельные вызовы во время identify возвращают #3006 profileWasChanged.
5getPaywall (getFlow в SDK v4), getPaywallProducts, restorePurchases, makePurchase, updateAttribution (updateExternalAttribution в SDK 4.1), updateProfileПосле шага 4, если вызывается identify; иначе после шага 3 (или шага 2, если MMP нет)Эти вызовы требуют стабильного профиля.
Important

Пропуск этих шагов приведёт к тому, что вернувшиеся пользователи потеряют премиум-доступ, в профилях будет отсутствовать appsflyer_id, а пейволы будут показываться не той аудитории.

Установки через web2app и веб-воронку

Если пользователь совершает покупку через веб-чекаут (Stripe, Paddle) и затем устанавливает нативное приложение, первый вызов activate() на устройстве создаёт новый анонимный профиль. Этот профиль не связан с веб-профилем. Если вам удаётся определить customer user ID до запуска приложения (из вашего auth-флоу или install referrer) — передайте его напрямую в activate(). В противном случае веб-покупка остаётся невидимой на устройстве, пока вы не вызовете identify({ customerUserId: 'YOUR_USER_ID' }), а затем restorePurchases.

Какие метаданные передавать с каждым веб-чекаутом, смотрите здесь: