Реалізація Free Trial підписки у мобільному застосунку
Free trial — найконверсійніший інструмент для subscription-застосунків, та одночасно джерело великої кількості чарджбеків та негативних відзивів. «Я не знав, що мене списуть» — типовий отзыв 1 зірка після закінчення trial. Технічно правильна реалізація free trial вирішує цю проблему до того, як користувач скаржиться.
StoreKit 2: Introductory Offer
На iOS trial реалізується через Product.SubscriptionOffer з paymentMode = .freeTrial. Продукт створюється в App Store Connect: Auto-Renewable Subscription → Add Introductory Offer → Free → N днів/тижнів. В коді:
let product = // Product з prefetch кеша
if let intro = product.subscription?.introductoryOffer,
await product.subscription!.isEligibleForIntroOffer {
// показуємо "7 днів безплатно"
showTrialCTA(days: intro.period.value)
} else {
// користувач вже використав trial — стандартна ціна
showStandardCTA(price: product.displayPrice)
}
isEligibleForIntroOffer — async запит до App Store, робимо при prefetch. Користувач, вже використовуючий trial для цієї subscription group — не eligible. Показувати йому «7 днів безплатно» та потім списати одразу — шлях до dispute у банку.
Android: Free Trial у Play Billing Library 6+
val params = BillingFlowParams.newBuilder()
.setProductDetailsParamsList(
listOf(
BillingFlowParams.ProductDetailsParams.newBuilder()
.setProductDetails(productDetails)
.setOfferToken(trialOfferToken) // з productDetails.subscriptionOfferDetails
.build()
)
).build()
billingClient.launchBillingFlow(activity, params)
offerToken потрібно вибирати з subscriptionOfferDetails — беремо той, який містить FREE_TRIAL pricing phase. Якщо trial недоступна для користувача (вже був) — беремо base plan offer token.
Прозорість як обов'язкова вимога
Apple вимагає явного розкриття умов auto-renewal рядом з кнопкою покупки. Стандартна формулювання під CTA кнопкою:
«7 днів безплатно, потім $9.99/мес. Підписка продовжується автоматично. Відмена в будь-час у настройках App Store.»
Розмір шрифту не менше 12pt. Якщо це вимога ігнорувати — не тільки погані отзиви, але й відклинення при ревю або видалення застосунку при скаргах користувачів.
Крім тексту під кнопкою: reminder push за 1–2 дні до закінчення trial — UNNotificationRequest з fireDate = trialEndDate - 2 дня. «Ваш пробний період закінчується послезавтра» з deep link на Manage Subscription. Це зменшує chargeback rate, бо користувач попереджена.
Серверна валідація trial
Клієнт не повинен бути джерелом правди про то, в trial користувач. Після transaction.finish() на iOS — серверна валідація через App Store Server API. Відповідь містить inAppOwnershipType, offerType, offerIdentifier — сервер знає, що це trial транзакція, та встановлює trial_ends_at у БД.
App Store Server Notifications V2 event DID_RENEW з subtype: INITIAL_BUY означає конверсію trial у платну підписку. EXPIRED з subtype: VOLUNTARY — користувач відмінив до конца trial. На кожне событие — оновлення статусу у БД та push-уведомлення користувачеві.
Grace period та billing retry
Підписка не продовжилася через проблеми з картою — це не відмена. StoreKit 2 відправляє GRACE_PERIOD_STARTED notification. Клієнт отримує від сервера subscription_status: grace_period — показуємо баннер «Проблема з оплатою» з deep link на оновлення платіжного методу (openURL → App Store subscription management). Не блокуємо доступ під час grace period (до 16 днів).
Конверсія trial
Середня конверсія trial у платну підписку: 20–40% залежно від категорії та довжини trial. 3-денний trial конвертує гірше 7-денного — користувач не встигає сформувати звичку. 14-денний конвертує приблизно як 7-денний, але оператор платить за нього повищеним періодом без revenue.
A/B тест довжини trial — обов'язковий. Firebase Remote Config керує тим, який offerIdentifier використовувати (3 дня vs 7 днів vs 14 днів). Різні App Store Connect offers → різні offerIdentifier → Remote Config визначає, який показувати сегменту користувачів.
Ориентири по срокам
Реалізація free trial з прозорими умовами, reminder push, серверною валідацією, grace period handling та Remote Config A/B управлінням — 3–5 робочих днів при готовому StoreKit 2 / Play Billing setup.







