---
title: "Настройка плана с 12-месячным обязательством"
description: "Настройте ежемесячную подписку Apple с 12-месячным обязательством в App Store Connect и Adapty, добавьте её на кастомный пейвол и протестируйте в песочнице."
---

> **AI agents**: to search Adapty docs faster and with fewer tokens, install the Adapty skills: `npx adapty skills install --yes`

:::important
Для предложения плана с обязательством нужна годовая подписка в App Store, [кастомный пейвол](paywalls) и Adapty SDK версии 4.3 или выше. Флоу не поддерживают отображение такого плана.
:::

Чтобы подписчики оформляли годовую подписку с ежемесячной оплатой, добавьте [план с обязательством на 12 месяцев](app-store-12-month-commitment) к вашему годовому продукту в App Store Connect и в Adapty.

## Прежде чем начать \{#before-you-begin\}

Прежде чем внедрять планы с обязательством, убедитесь, что вы:

- **Выбирайте правильный рынок**: Планы с обязательством недоступны в Соединённых Штатах. В Германии, Израиле, Южной Африке и Турции подписчики могут отменить подписку с немедленным эффектом через поддержку Apple.
- **Выбирайте правильную версию ОС**: Подписчикам нужна iOS 26.4 или новее, либо такая же версия iPadOS, macOS, tvOS или visionOS. Собирайте приложение с Xcode 26.5 или новее.
- **Выбирайте правильный ценовой диапазон**: Сумма 12 ежемесячных платежей должна составлять от 1x до 1,5x стоимости годовой подписки с единовременной оплатой.
- **Используйте Adapty SDK v4.3 или новее**: В версиях приложения с более ранним SDK пользователи смогут купить только план с единовременной оплатой.
- **Обновите код, который читает ID продуктов**: Вебхуки, интеграции, экспорт данных и серверный API передают покупки плана с обязательством как `<product_id>:monthly`. Если ваш код обрабатывает ID продуктов, обновите логику до первой такой покупки.

## 1. Настройка App Store Connect \{#1-app-store-connect-configuration\}

1. Откройте годовую подписку в App Store Connect или [создайте новую подписку](app-store-products) с длительностью **1 Year**.
2. В разделе **Availability** добавьте одни и те же страны в разделах **1 Year Upfront** и **Monthly with 12-Month Commitment**. Apple предлагает тарификацию с обязательным сроком только там, где доступна авансовая тарификация. Обратное не обязательно: вы можете предлагать план с единовременной оплатой в странах без плана с обязательным сроком.
3. В разделе **Subscription Prices** установите авансовую цену для базовой территории, если у подписки её ещё нет. Apple требует авансовую цену, даже если пользователям отображается только план с обязательным сроком.
4. Установите ежемесячную цену для базовой территории. Ежемесячная цена должна составлять от 1/12 до 1/8 авансовой цены. Например, при авансовой цене €59,99 ежемесячная цена может быть от €5,00 до €7,49.

App Store Connect рассчитывает цены для других стран на основе цен базовой территории.

Подробные инструкции можно найти в гайде Apple по [предложению ежемесячных подписок с обязательством на 12 месяцев](https://developer.apple.com/help/app-store-connect/manage-subscriptions/set-availability-for-an-auto-renewable-subscription#offer-monthly-subscriptions-with-12-month-commitment).

## 2. Настройка Adapty \{#2-adapty-configuration\}

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

1. Откройте годовой продукт. Если его ещё нет, [создайте его и подключите](create-product#create-product-and-connect-existing-store-products) подписку, настроенную в App Store Connect. Не создавайте новый продукт через Adapty: это создаст отдельную подписку без плана с обязательством.
2. Откройте вкладку **App Store** и выберите **Offer monthly payments with a 12-month commitment**.

3. Во всплывающем окне из списка **Monthly price, USD** выберите цену рассрочки, соответствующую значению в App Store Connect. Список содержит только ценовые точки App Store в допустимом диапазоне. Эта цена является справочным значением: Adapty не отправляет её в App Store Connect.

## 3. Настройте офферы \{#3-set-up-offers\}

В App Store Connect у каждого тарифного плана есть собственные introductory offer, promotional offer, win-back offer и коды офферов. Оффер для авансового плана не применяется к плану с обязательством.

- **Бесплатные пробные периоды и другие introductory offers**: В App Store Connect настройте предложение для тарифного плана с обязательством. Adapty автоматически применяет [introductory offers](app-store-offers#introductory-offers). Когда introductory offer заканчивается, начинается 12-месячный срок обязательства подписчика.
- **Promotional и win-back offers**: Настройте [promotional](app-store-offers#promotional-offers) или [win-back offers](app-store-offers#win-back-offers) для тарифного плана с обязательством в App Store Connect. Затем [добавьте предложения в Adapty](create-offer) и установите для них **App Store plan** значение **Monthly with 12-month commitment**. В строке пейвола отображаются только предложения для соответствующего тарифного плана. Если вы не используете кастомные пейволы, добавлять предложения в Adapty не нужно.
- **Промокоды (Offer codes)**: Настройте промокоды для тарифного плана с обязательством в App Store Connect.

## 4. Добавить на кастомный пейвол \{#add-to-a-custom-paywall\}

:::warning
Apple требует показывать как цену в рассрочку, так и общую годовую сумму до совершения покупки.
:::

1. В кастомном пейволе [добавьте годовой продукт](add-product-to-paywall) и установите для него **Billing plan** в значение **Monthly**. Чтобы продавать на том же пейволе тариф с единовременной оплатой, добавьте годовой продукт ещё раз с **Upfront** billing plan.
   - Чтобы предложить пользователям, которые покупают тариф с единовременной оплатой, upfront offer вместо него — на более ранней версии SDK или там, где commitment plan не применяется — выберите его в разделе **Fallback offer**.
2. В приложении отображайте цену из `product.subscriptionPricingTerms`. Для пользователей, которые могут купить commitment plan, Adapty SDK возвращает его цены. Для всех остальных SDK возвращает цены тарифа с единовременной оплатой:
   - Чтобы определить, какой тариф вернул SDK, проверьте `product.subscriptionPricingTerms?.billingPlan`. Значение `.monthly` соответствует commitment plan, `.upFront` — тарифу с единовременной оплатой.
   - Для отображения цены за отдельный платёж используйте `subscriptionPricingTerms.localizedBillingPrice` и `subscriptionPricingTerms.billingPeriod`.
   - Для отображения годовой суммы используйте `subscriptionPricingTerms.commitmentInfo.localizedPrice` и `subscriptionPricingTerms.commitmentInfo.period`. Для commitment plan `product.localizedPrice` и `product.subscriptionPeriod` возвращают те же годовые значения.

Пользователи не могут приобрести план с обязательным сроком в следующих случаях:

- **Неподдерживаемая версия ОС или страна**: Устройство Apple пользователя работает на версии системы ниже 26.4, либо план недоступен в App Store их страны. SDK Adapty в этом случае возвращает цену авансового плана.
- **Существующая авансовая подписка**: StoreKit сообщает, что пользователь уже подписан. Чтобы сменить план, подписчики используют настройки подписки Apple.
- **[Продвигаемая встроенная покупка](making-purchases#in-app-purchases-from-the-app-store)**: Пользователь выбирает продукт в App Store, после чего SDK Adapty инициирует покупку в вашем приложении. Для таких покупок SDK поддерживает только авансовый план.

Чтобы прекратить предлагать план с обязательствами, в своих кастомных пейволах установите для годового продукта **Billing plan** на **Upfront** или удалите строку **Monthly**. Снять флажок **Offer monthly payments with a 12-month commitment** в Adapty невозможно. Текущие подписчики продолжают обновляться на новый период обязательств каждый год — если только вы не нажмёте **Remove Monthly Billing** для годовой подписки в App Store Connect. Подписчики, уже взявшие на себя обязательства, продолжают платить до истечения срока действия своего периода.

## 5. Протестируйте план в песочнице \{#5-test-the-plan-in-a-sandbox\}

Следуйте [гайду по тестированию в песочнице](test-purchases-in-sandbox), используя два аккаунта песочницы:

- **Аккаунт из страны, где доступен план с рассрочкой**: пейвол должен отображать план с рассрочкой с ежемесячной ценой и общей суммой. После покупки в профиле пользователя песочницы должен появиться уровень доступа годового продукта.
- **Аккаунт из США**: пейвол должен отображать только план с единовременной оплатой.

Если ваш код обрабатывает идентификаторы продуктов из вебхуков или Server-side API, убедитесь, что он получает покупки commitment-plan как `<product_id>:monthly`.

Для локального тестирования логики покупок используйте [StoreKit Testing в Xcode](local-sk-files) версии 26.5 или новее. Покупки в StoreKit Testing не попадают в Adapty.

## Устранение неполадок \{#troubleshooting\}

- **Флажок ежемесячных платежей отсутствует**: флажок **Offer monthly payments with a 12-month commitment** появляется только для продукта типа **Annual** с App Store product ID. Он остаётся неактивным, пока у продукта не задан **Price (USD)**.
- **Пользователи не видят бесплатный пробный период или другое предложение для плана с обязательством**: в App Store Connect каждое предложение относится к одному тарифному плану. [Настройте предложение](#3-set-up-offers) для плана с обязательством. Для promotional offer или win-back offer также укажите **App Store plan** предложения в Adapty как **Monthly with 12-month commitment**.
- **Все пользователи видят полную стоимость**: убедитесь в следующем:
  - Приложение собрано в Xcode 26.5 или новее. При использовании более ранней версии Xcode SDK Adapty всегда возвращает цены плана с единовременной оплатой.
  - В кастомном пейволе для годового продукта **Billing plan** установлен как **Monthly**.
- **Некоторые пользователи видят полную стоимость**: эти пользователи [не могут купить план с обязательством](#4-add-to-a-custom-paywall).
- **На пейволе отображается годовая сумма вместо стоимости рассрочки**: для плана с обязательством `product.localizedPrice` возвращает годовую сумму. Чтобы показать стоимость одного платежа, используйте `subscriptionPricingTerms.localizedBillingPrice`.