Внедрение системы VIP/Premium подписки в мобильную игру
Вы выпустили игру с еженедельным контентом, но через месяц пользователи уходят. Решение — внедрить подписку. Но просто добавить кнопку «Купить» недостаточно. Apple и Google требуют строгих правил: автосписание, восстановление, обработка отмены, grace period. Ошибка на этом этапе — блокировка в магазине или шквал негативных отзывов. Мы реализовали более 50 систем подписок для игр разной сложности и гарантируем стабильную работу.
Какую модель подписки выбрать для вашей игры?
Daily VIP — ежедневный бонус пока активна подписка: +20% к дропу монет, +1 бесплатная попытка, эксклюзивный сундук. Низкая цена, высокая конверсия. Premium подписка — снятие рекламы + пакет ресурсов ежемесячно + VIP-значок. Цена выше, но ценность для игрока очевидна. VIP Levels — несколько тиров (Bronze, Silver, Gold) с нарастающими привилегиями. Сложнее в реализации, но позволяет монетизировать разные сегменты. Грамотная реализация подписки увеличивает ARPU на 25-40% в первые месяцы.
Реализация на iOS (StoreKit 2)
import StoreKit
class SubscriptionManager: ObservableObject {
@Published var isVIPActive = false
private var updateTask: Task<Void, Error>?
func startListeningForTransactions() {
updateTask = Task.detached {
for await result in Transaction.updates {
await self.handle(result)
}
}
}
private func handle(_ result: VerificationResult<Transaction>) async {
guard case .verified(let transaction) = result else { return }
if transaction.productType == .autoRenewable {
let isActive = transaction.revocationDate == nil
&& (transaction.expirationDate ?? .distantPast) > Date()
await MainActor.run { self.isVIPActive = isActive }
}
await transaction.finish()
}
func checkCurrentEntitlements() async {
for await result in Transaction.currentEntitlements {
await handle(result)
}
}
}
Критично: слушать Transaction.updates нужно с момента запуска приложения — не только при открытии магазина. Иначе пропустите renewal или revocation, пока приложение работает в фоне. Использование StoreKit 2 сокращает объём кода для обработки подписок в 2 раза по сравнению с StoreKit 1.
Реализация на Android (Google Play Billing Library 6)
class BillingManager(private val context: Context) {
private val billingClient = BillingClient.newBuilder(context)
.setListener { billingResult, purchases ->
if (billingResult.responseCode == BillingClient.BillingResponseCode.OK) {
purchases?.forEach { handlePurchase(it) }
}
}
.enablePendingPurchases()
.build()
private fun handlePurchase(purchase: Purchase) {
if (purchase.purchaseState == Purchase.PurchaseState.PURCHASED) {
if (!purchase.isAcknowledged) {
val params = AcknowledgePurchaseParams.newBuilder()
.setPurchaseToken(purchase.purchaseToken)
.build()
billingClient.acknowledgePurchase(params) { /* handle result */ }
}
updateSubscriptionStatus(purchase.products, isActive = true)
}
}
}
Acknowledge обязателен для subscription! Google автоматически отменяет неподтверждённые покупки через 3 дня. Забытый acknowledge — самая частая причина жалоб «деньги списали, подписка не активировалась».
Почему серверная верификация обязательна?
Статус подписки нельзя хранить только на клиенте. Архитектура под ключ включает:
- Клиент получает receipt/purchaseToken после покупки
- Клиент отправляет его на backend
- Backend верифицирует через App Store Server API (iOS) или Google Play Developer API (Android)
- Backend записывает статус подписки в БД с датой истечения
- При каждом старте приложения клиент получает актуальный статус с сервера
Apple App Store Review Guidelines Section 4.2 требуют уведомлять пользователя при проблемах с оплатой. Серверная верификация — единственный способ гарантировать достоверность данных и защититься от взлома.
Как обрабатывать grace period?
При неудачном автосписании (нет денег на карте) Apple и Google дают игроку льготный период: iOS — 6 дней для monthly, Android — 3 дня. Grace period — время, когда подписка ещё активна, но уже нужно предупредить: «Проблема с оплатой, обновите платёжные данные». Без этого игроки внезапно теряют доступ, что ведёт к чарджбекам и негативным отзывам. Обработка grace period снижает отток на 25% — это доказанный эффект.
Управление тирами
Если у вас несколько тиров подписки (VIP1, VIP2, VIP3), нужно обрабатывать upgrade и downgrade:
- Upgrade (VIP1 → VIP2): на iOS — через
Product.SubscriptionInfo.upgradePolicies, немедленное применение с пропорциональным расчётом - Downgrade (VIP2 → VIP1): применяется с начала следующего периода
Разные продуктовые ID для разных тиров нужно зарегистрировать в одной subscriptionGroupId (iOS) / одном basePlanId (Android) — это позволяет платформе правильно обрабатывать переходы.
Сравнение подходов: StoreKit 2 vs Google Play Billing
| Критерий | iOS (StoreKit 2) | Android (Billing 6) |
|---|---|---|
| Прослушивание обновлений | Transaction.updates |
PurchasesUpdatedListener |
| Grace period | 6 дней | 3 дня |
| Управление тирами | Product.SubscriptionInfo |
BillingFlowParams с oldPurchaseToken |
| Сложность интеграции | Выше, но более декларативен | Проще в освоении |
Сравнение моделей подписок
| Модель | Описание | Сложность реализации |
|---|---|---|
| Daily VIP | Ежедневные бонусы, низкая цена | Низкая |
| Premium ежемесячная | Снятие рекламы + ресурсы | Средняя |
| VIP Levels | Несколько тиров с переходом | Высокая |
Частые ошибки при внедрении подписок
- Не обработан acknowledge — подписка автоматически отменяется через 3 дня.
- Нет прослушивания Transaction.updates с запуска — пропускаются renewal.
- Grace period игнорируется — пользователи теряют доступ без предупреждения.
- Хранение статуса только на клиенте — уязвимо для взлома.
- Неправильная настройка тиров — upgrade/downgrade не работают.
Аналитика подписок
Ключевые события для трекинга: subscription_started, subscription_renewed, subscription_cancelled, subscription_expired, grace_period_entered. Отправляем в Firebase/Amplitude + amplitude Subscription Analytics Dashboard. Метрики: MRR, churn rate, subscriber LTV. Churn выше 10%/мес — сигнал, что подписка не даёт достаточно ценности.
Что входит в работу
- Проектирование архитектуры (дата-модели, диаграммы последовательностей)
- Интеграция StoreKit 2 / Billing 6 на клиенте
- Серверная верификация и обработка webhook-уведомлений
- Grace period и управление тирами
- Аналитика и мониторинг
- Документация и обучение вашей команды
- Поддержка после запуска
Получите консультацию — оценим ваш проект и предложим оптимальное решение под ключ. Наш опыт 50+ проектов гарантирует стабильность и соответствие политикам магазинов. Свяжитесь с нами, чтобы обсудить детали вашей подписки.
Сроки: базовая подписка — 3–5 дней, система с несколькими тирами и grace period — 7–10 дней. Стоимость рассчитывается индивидуально.







