Реалізація Win-Back кампаній для відмінених підписок у мобільних застосунках
Користувач відмінив підписку. Через 2 тижні він відкриває застосунок знову — либо за звичкою, либо після push-сповіщення. Це вікно повернення. Win-back кампанія — комбінація технічних інструментів: спеціальний оффер через StoreKit, push-сповіщення через APNs, та логіка визначення «правильного моменту» для показу.
Три канали win-back
1. Push-сповіщення з deep link на оффер — відправляється через FCM / APNs на пристрої користувачів, які відмінили підписку N днів назад.
2. In-app оффер при наступному відкритті — для користувачів, які все ще відкривають застосунок після отмены.
3. Apple Win-Back Offers — нативний механізм Apple (iOS 18+), який дозволяє налаштувати автоматичну розсилку офферів через App Store без серверної інфраструктури.
Apple Win-Back Offers (iOS 18+)
Новітній інструмент — налаштовується у App Store Connect → Subscriptions → Win-Back Offers. Apple сама визначає eligible користувачів (колишні абоненти конкретної Subscription Group) та відображає оффер на сторінці застосунку в App Store.
На клієнті потрібно обробити транзакцію, яка надходить коли користувач активує win-back оффер:
// Слухаємо Transaction.updates при запуску
for await result in Transaction.updates {
if case .verified(let transaction) = result {
if transaction.offerType == .winBackOffer {
// Користувач повернувся через Win-Back — розблокуємо доступ
await restoreSubscriptionAccess(transaction)
await transaction.finish()
// Логуємо для аналітики
Analytics.logEvent("win_back_reactivated", parameters: [
"offer_id": transaction.offerID ?? "unknown",
"product_id": transaction.productID
])
}
}
}
Promotional Offers для win-back (iOS 14+)
Для iOS нижче 18 або для in-app win-back використовуємо Promotional Offers з серверним підписом (деталі архітектури — у окремій услузі):
// Визначаємо кандидатів для win-back
func isWinBackCandidate() async -> Bool {
// Перевіряємо: есть ли стершена транзакція та нема активної
var hasExpiredSubscription = false
var hasActiveSubscription = false
for await result in Transaction.all {
if case .verified(let tx) = result,
tx.productType == .autoRenewableSubscription {
if tx.expirationDate ?? Date() < Date() {
hasExpiredSubscription = true
} else {
hasActiveSubscription = true
}
}
}
return hasExpiredSubscription && !hasActiveSubscription
}
// Показуємо win-back paywall при вході в застосунок
func showWinBackOfferIfNeeded() async {
guard await isWinBackCandidate() else { return }
guard let offerSignature = try? await apiClient.fetchWinBackSignature() else { return }
await MainActor.run {
presentWinBackPaywall(signature: offerSignature)
}
}
Push-сповіщення для win-back
Серверна логіка: вибираємо користувачів, у яких subscription_expired_at BETWEEN NOW() - 7 DAYS AND NOW() - 3 DAYS та last_app_open > NOW() - 30 DAYS (все ще активні). Відправляємо push через APNs:
{
"aps": {
"alert": {
"title": "Повертайтесь до Premium",
"body": "Спеціальна пропозиція: перший місяць за половину ціни"
},
"badge": 1,
"sound": "default"
},
"deep_link": "app://paywall?offer=win_back_50&utm_source=push&utm_campaign=winback_d7"
}
Deep link відкриває paywall напрямки с pre-selected win-back оффером. UTM-параметри потрібні для аналітики конверсії по каналу.
Сегментація — не всім однаковий оффер
Win-back офферы работают лучше при сегментації:
| Сегмент | Триггер | Оффер |
|---|---|---|
| Відмінив < 7 днів назад | Наступне відкриття | Пауза замість отмены (Google Play) |
| Відмінив 7–30 днів | Push на 7-й день | Знижка 30% на перший місяць |
| Відмінив 30–90 днів | Push на 30-й день | Безплатний trial на 2 тижні |
| Відмінив > 90 днів | Сезонні кампанії | Максимальна знижка |
Чим дольше користувач не повертається, тим агресивніше оффер — це стандартна модель re-engagement для churned users.
Вимірювання ефективності
Обов'язкові метрики:
- Win-back rate: (реактивовані / кандидати) × 100
- Time to reactivation: медіана днів між отменою та поверненням
- LTV reactivated: порівнюємо з LTV користувачів без отмены
- Offer conversion by segment: який оффер trabalha краще для якого сегменту
// Логуємо показ win-back оффера
Analytics.logEvent("win_back_offer_shown", parameters: [
"days_since_cancellation": daysSinceCancellation,
"offer_type": offerType,
"segment": userSegment
])
Що входить у роботу
- Визначення win-back кандидатів (клієнт + сервер)
- Apple Win-Back Offers (iOS 18+) або Promotional Offers як fallback
- In-app paywall з win-back оффером при наступному відкритті
- Push-сповіщення з deep link на оффер
- Сегментація по часу з моменту отмены
- Аналітика: воронка показ → клік → покупка
Терміни
3–5 днів — in-app flow з Promotional Offers. З push-інфраструктурою та серверною сегментацією — 5–10 днів. Вартість розраховується індивідуально після аналізу вимог.







