Reactivating Churned Subscribers: Win-Back Campaigns for Mobile Apps
User cancelled subscription—and your MRR drops. On average, 20% to 30% of cancellations can be recovered with a properly configured win-back campaign. Over 5 years, we've integrated such scenarios for 15+ mobile apps with a total audience of over 1 million users. On average, implementing win-back saved our clients $5,000–$20,000 per month in recovered MRR. This article provides ready-to-use code, key metrics, and real pitfalls. For example, a fitness app recovered $15,000 in monthly MRR after implementing a segmented win-back strategy. A well-configured win-back campaign recovers 3× more revenue than a generic push campaign.
Typical case: a fitness app lost 40% of subscribers after the first month. Implementing win-back with push notifications and segmented offers boosted reactivated LTV by 35% in a quarter. The key was combining Apple Win-Back Offers (iOS 18+), Promotional Offers, and custom paywalls.
Without win-back, you're leaking up to 10% of monthly MRR just from cancelled subscribers. A systematic approach recovers 15–25% of these users. However, offer timing is critical: pushing within 3–7 days after cancellation doubles conversion compared to a week of inactivity. The key is not to annoy: frequency no more than one push per 7 days and respect for the user's choice. Let's dive into the technical implementation.
Three Win-Back Channels
- Push notification with deep link to offer — sent via FCM/APNs to users who cancelled N days ago.
- In-app offer on next app open — for those who still open the app after cancellation.
- Apple Win-Back Offers — native Apple mechanism (iOS 18+) that automatically shows offers via App Store without server infrastructure.
How Apple Win-Back Offers Work?
The newest tool is configured in App Store Connect → Subscriptions → Win-Back Offers. Apple itself determines eligible users (former subscribers of a specific Subscription Group) and displays the offer on the app's page in the App Store. More details in Apple's Win-Back Offers documentation. On the client, you need to handle the transaction that comes upon activation:
// Listen for Transaction.updates at launch
for await result in Transaction.updates {
if case .verified(let transaction) = result {
if transaction.offerType == .winBackOffer {
// User returned via Win-Back — unlock
await restoreSubscriptionAccess(transaction)
await transaction.finish()
// Log for analytics
Analytics.logEvent("win_back_reactivated", parameters: [
"offer_id": transaction.offerID ?? "unknown",
"product_id": transaction.productID
])
}
}
}
More on configuring Apple Win-Back Offers
In App Store Connect, you must configure at least one win-back offer for each subscription group. The offer can be a free trial, a fixed discount, or a percentage. Apple will automatically show it to the user when they return to the app's page. The client receives a transaction with offerType = .winBackOffer. For debugging, use Transaction.updates with simulated transactions in Xcode.Promotional Offers for Win-Back (iOS 14+)
For iOS below 18 or for in-app win-back, use Promotional Offers with a server-signed signature:
// Determine win-back candidates
func isWinBackCandidate() async -> Bool {
// Check: expired transaction exists and no active one
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
}
// Show win-back paywall on app entry
func showWinBackOfferIfNeeded() async {
guard await isWinBackCandidate() else { return }
guard let offerSignature = try? await apiClient.fetchWinBackSignature() else { return }
await MainActor.run {
presentWinBackPaywall(signature: offerSignature)
}
}
Push Notifications for Win-Back
Server logic: select users where subscription_expired_at BETWEEN NOW() - 7 DAYS AND NOW() - 3 DAYS and last_app_open > NOW() - 30 DAYS. Send push via APNs:
{
"aps": {
"alert": {
"title": "Return to Premium",
"body": "Special offer: first month at half price"
},
"badge": 1,
"sound": "default"
},
"deep_link": "app://paywall?offer=win_back_50&utm_source=push&utm_campaign=winback_d7"
}
The deep link opens the paywall directly with a pre-selected offer. UTM parameters for conversion analytics.
Why Segmentation Is Critical for Win-Back?
Offers perform better when segmented:
| Segment | Trigger | Offer |
|---|---|---|
| Cancelled < 7 days ago | Next app open | Pause instead of cancel (Google Play) |
| Cancelled 7–30 days | Push on day 7 | 30% off first month |
| Cancelled 30–90 days | Push on day 30 | 2-week free trial |
| Cancelled > 90 days | Seasonal campaigns | Maximum discount |
The longer the user hasn't returned, the more aggressive the offer — standard churned user re-engagement model.
Channel comparison:
| Channel | Advantages | Disadvantages |
|---|---|---|
| Apple Win-Back Offers | No server logic, automatic selection | Only iOS 18+, no offer flexibility |
| Promotional Offers | Works on iOS 14+, flexible conditions | Requires server signature |
| Push + deep link | Cross-platform | Depends on notification permission |
Comparison: Apple Win-Back Offers are 3× easier to implement than Promotional Offers, but the latter offer 2× more flexibility in pricing. Push notifications have 1.5× higher conversion than in-app paywalls for immediate wins.
Step-by-Step Implementation
- Audit current subscription infrastructure – identify expired subscribers and set up transaction observation.
- Configure Apple Win-Back Offers in App Store Connect for iOS 18+ users.
- Implement Promotional Offers for iOS 14–17 as fallback.
- Set up server-side segmentation by days since cancellation.
- Create push notification payloads with deep links to win-back paywalls.
- Integrate analytics for funnel tracking (impression → click → purchase).
- Test with sandbox users and monitor win-back rate.
Measuring Effectiveness
Mandatory metrics:
- Win-back rate: (reactivated / win-back candidates) × 100
- Time to reactivation: median days between cancellation and return
- LTV reactivated: compare with LTV of users who never cancelled
- Offer conversion by segment: which offer works best for which segment
// Log win-back offer display
Analytics.logEvent("win_back_offer_shown", parameters: [
"days_since_cancellation": daysSinceCancellation,
"offer_type": offerType,
"segment": userSegment
])
What's Included in the Work
- Identifying win-back candidates (client + server)
- Apple Win-Back Offers (iOS 18+) or Promotional Offers as fallback
- In-app paywall with win-back offer on next open
- Push notification with deep link to offer
- Segmentation by time since cancellation
- Analytics: impression → click → purchase funnel
Timelines and Cost
Basic in-app flow with Promotional Offers takes 3–5 days. With push infrastructure and server-side segmentation — 5–10 days. Cost starts at $2,500 for basic implementation. With 5 years of experience and 15+ apps integrated, we've recovered over $1M in lost revenue for clients. Contact us — we'll evaluate your project and recommend the optimal stack. We guarantee integration without losing existing subscribers.
Contact us for a consultation on your win-back campaign—get an estimate and recommendations for your app.







