---
title: "Порядок вызовов в Kotlin Multiplatform SDK"
description: "Избегайте потери премиального доступа, отсутствия атрибуции и случайных ошибок активации, вызывая методы Adapty SDK в правильном порядке."
---

`Adapty.activate()` должен завершиться до того, как вы вызовете любой другой метод Adapty SDK. Пока он не выполнен, SDK не имеет состояния. Любой вызов, сделанный до или параллельно с `activate()`, завершится ошибкой активации. См. [Обработка ошибок в Kotlin Multiplatform SDK](kmp-handle-errors).
Если ваше приложение аутентифицирует пользователей и вы получаете customer user ID после запуска, вызовите `Adapty.identify()` в этот момент. Не вызывайте методы, зависящие от действий пользователя, до завершения `identify`. Вызовы, конкурирующие с ним, либо вернут ошибку, либо попадут в анонимный профиль, созданный при активации. В этом случае атрибуция, MMP ID вроде `appsflyer_id` и принадлежность установки не всегда переносятся в идентифицированный профиль. Если ваше приложение не аутентифицирует пользователей, пропустите `identify` и продолжайте работать с анонимным профилем.
MMP и аналитические SDK (AppsFlyer, Adjust, Branch, PostHog) подчиняются тому же правилу. Инициализируйте их первыми и дождитесь колбэков с UID, прежде чем вызывать `Adapty.activate`. Иначе MMP ID привяжется к короткоживущему анонимному профилю и не всегда перенесётся на идентифицированный. Подробнее об особенностях AppsFlyer — в разделе [AppsFlyer](appsflyer).
## Правильный порядок \{#the-correct-order\}

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

- **Шаги 2 и 5**: Обязательны для каждого приложения. Активируйте SDK, затем вызовите методы SDK.
- **Шаги 1 и 3**: Нужны только если вы интегрируете MMP или аналитический SDK (AppsFlyer, Adjust, Branch, PostHog).
- **Шаг 4**: Нужен только если ваше приложение аутентифицирует пользователей и получает customer user ID после запуска.
Если у вас есть customer user ID в момент запуска приложения, передайте его в `AdaptyConfig.Builder` до вызова `activate()` (шаг 2a). В этом случае анонимный профиль никогда не создаётся, поэтому шаг 4 не нужен.
| Шаг | Вызов | Когда | Примечания |
|------|---------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------|
| 1    | Инициализируйте MMP или аналитический SDK (AppsFlyer, Adjust, PostHog, Branch)                                | При запуске приложения, первым делом                                                   | Дождитесь колбэка UID от MMP, например `getAppsFlyerUID`.                                      |
| 2a   | `Adapty.activate(configuration = AdaptyConfig.Builder("KEY").withCustomerUserId(...).build())`                | При запуске приложения, после шага 1, если у вас есть customer user ID                 | Рекомендуется. Анонимный профиль не создаётся.                                                 |
| 2b   | `Adapty.activate(configuration = AdaptyConfig.Builder("KEY").build())` без `withCustomerUserId`               | При запуске приложения, после шага 1, если у вас нет customer user ID (или он вам не нужен) | Adapty создаёт анонимный профиль.                                                              |
| 3    | `Adapty.setIntegrationIdentifier("appsflyer_id", uid)` для каждого MMP                                        | После шага 2, до любых пользовательских вызовов                                        | Обязательно — чтобы ID MMP попали в нужный профиль.                                            |
| 4    | `Adapty.identify("YOUR_USER_ID").onSuccess { ... }.onError { ... }`                                           | После шага 3 (или шага 2, если MMP нет), до шага 5 — только при пути 2b с аутентификацией | Дождитесь `onSuccess` перед любыми пользовательскими вызовами. Параллельные вызовы во время `identify` могут попасть на анонимный профиль. |
| 5    | `getPaywall`, `getPaywallProducts`, `restorePurchases`, `makePurchase`, `updateAttribution`, `updateProfile`  | После шага 4, если вызываете `identify`; иначе после шага 3 (или шага 2, если MMP нет) | Этим вызовам нужен стабильный профиль.                                                         |
:::important
Пропуск этих шагов приведёт к тому, что вернувшиеся пользователи потеряют премиум-доступ, в профилях не будет `appsflyer_id`, а пейволы будут отображаться не той аудитории.
:::
## Установки через web2app и веб-воронки \{#web2app-and-web-funnel-installs\}

Если пользователи совершают покупку на веб-чекауте (Stripe, Paddle) и затем устанавливают нативное приложение, первый вызов `activate()` на устройстве создаёт новый анонимный профиль. Этот профиль не связан с веб-профилем. Если вы можете определить customer user ID до запуска приложения (из потока авторизации или install referrer), передайте его напрямую в `AdaptyConfig.Builder`. В противном случае веб-покупка остаётся невидимой на устройстве, пока вы не вызовете `identify("YOUR_USER_ID")`, а затем `restorePurchases`.

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

- [Stripe](stripe)
- [Paddle](paddle)