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

`adapty.activate()` должен завершиться до вызова любого другого метода Adapty SDK. До его завершения у SDK нет состояния. Любой вызов, сделанный до или параллельно с `activate()`, завершится ошибкой [`#2002 notActivated`](capacitor-handle-errors#custom-network-codes).
Если ваше приложение аутентифицирует пользователей и вы получаете customer user ID после запуска, вызовите `adapty.identify()` в этот момент. Не вызывайте методы, зависящие от пользователя, пока `identify` не завершится. Вызовы, которые выполняются параллельно с ним, либо завершатся с ошибкой [`#3006 profileWasChanged`](capacitor-handle-errors#custom-network-codes), либо применятся к анонимному профилю, созданному при активации. В таком случае атрибуция, MMP-идентификаторы вроде `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 при запуске приложения, передайте его прямо в `activate()` (шаг 2a). В этом случае анонимный профиль не создаётся, поэтому шаг 4 не нужен.
| Шаг | Вызов | Когда | Примечания |
|------|---------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------|
| 1 | Инициализируйте MMP или аналитический SDK (AppsFlyer, Adjust, PostHog, Branch) | При запуске приложения, первым делом | Дождитесь колбэка с UID от MMP, например `getAppsFlyerUID`. |
| 2a | `adapty.activate({ apiKey: '...', params: { customerUserId: '...' } })` | При запуске приложения, после шага 1, если у вас есть customer user ID | Рекомендуется. Анонимный профиль не создаётся. |
| 2b | `adapty.activate({ apiKey: '...' })` без `customerUserId` | При запуске приложения, после шага 1, если у вас нет customer user ID (или вы его не собираете) | Adapty создаёт анонимный профиль. |
| 3 | `adapty.setIntegrationIdentifier({ key: '...', value: '...' })` для каждого MMP | После шага 2, до любого вызова, инициированного действием пользователя | Обязательно, чтобы ID MMP привязались к правильному профилю. |
| 4 | `await adapty.identify({ customerUserId: 'YOUR_USER_ID' })` | После шага 3 (или шага 2, если MMP нет), до шага 5 — только на пути 2b с аутентификацией | Всегда используйте `await`. Параллельные вызовы во время `identify` приводят к ошибке `#3006 profileWasChanged`. |
| 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 до запуска приложения (из вашего auth-флоу или install referrer) — передайте его напрямую в `activate()`. В противном случае веб-покупка остаётся невидимой на устройстве, пока вы не вызовете `identify({ customerUserId: 'YOUR_USER_ID' })`, а затем `restorePurchases`.

Какие метаданные передавать с каждым веб-чекаутом, смотрите здесь:
- [Stripe](stripe)
- [Paddle](paddle)