Engineering Subscriptions
Engineering Subscriptions
WWDC 2018
What is a subscription ?
1. Receive Transaction
2. Verify Authenticity
App Store Receipt
- Trusted record of App and In-App Purchases
- Stored on device
- Issued by the App Store
- Signed and verifiable
- For your app, on that device only
Receipt Validation
Don’t let you app be fooled !
- On-device validation
- Update subscription state within the app - Server-to-Server validation
- Online validation through a request to the App Store
- Update subscriptions state on your server - Do Not Use online validation directly from the device❗️
Comparing Validation Approaches
3. Update Subscription Status
Verifying Transactions
4. Subscription Period
Verifying a Transaction
Update Subscription State
Does the User Have an Active Subscription ? ⚠️
- Filter transactions by
original_transaction_id
- Find transaction with the lastest
expires_date
- Date in past shows user is not subscribed
- Date in future shows user is subscribed
Update Subscription State
Finish All Transactions on Device
Including all renewal transactions
Renewal Transactions
Multi Platforms
Status Polling
Discover new transactions directly from your server
- Save latest version of encoded receipt data on your server
- Treat receipt data like a token
/verifyReceipt
response also includes new transactions
- Located in thelastest_receipt_info
field
- Unlock new subscription periods without waiting for app to launch- New transactions will still appear in StoreKit on next app launch
- Must verify and finish these transactions
- Event if your server already knows about them
- Opportunity to update latest receipt data on server
Reating to Billing Issues
- Observe no renewal transaction appears
- Direct user to amend their billing details
- Unblock user immediately when transaction occurs
Server-to-Server Notifications
- Status URL in App Store Connect
- HTTPS POST to your server for status changes
- Include
latest_transaction_info
for the transaction in question
Creating User Accounts
- Offer in-app purchase before account creation
- Better user experience
- Higher conversion - Use anonymous account
- Rely onoriginal_transaction_id
to associate multiple devices
- Optionally take user through account “creation” later
Introductory Pricing
Determining user eligibility
- Need to show correct price to your user
- Check transactions to see if discount has been used
Upgrade / Downgrade Subscriptions
Inside your app
- Just like selling an initial subscription
- Must be a subscription in the same subscription group
- StoreKit handles the upgrade / downgrade
Subscription Management
In App Store account settings
- Provide a link to “Manage Your Subscription”
- Upgrade / downgrades
- Cancellation - https://apps.apple.com/account/subscriptions
- Link on the In-App Purchase Programming Guide
Involuntary Churn
Billing retry
- Updated failed payment logic
- Expanded retry duration
- New retry strategies
- Tuning
Minimizing Involuntary Churn
- Leverage subscription receipt fields
- Implement a grace period
- Customer messaging
Billing Retry
Optimization strategies
Grace Period
- Free subscription access
- While in a billing retry state
- Before a subscriber has churned - Improve recovery
Customer Messaging
- Messaging
- Update payment method
- Restate the value proposition - Offer limited service
- Edit billing information (new) 👍
- https://apps.apple.com/account/billing - Manage subscriptions (new) 👍
- https://apps.apple.com/account/subscriptions
Voluntary Churn
Minimizing Voluntary Churn
- Implement status poliing
- Offer attractive alternative subscriptions
Status Polling
- Will my subscriber churn ?
- Has my subscriber renewed ?
When to Status Poll
Additional Receipt Fields
Storing subscriber status fields
- Save decoded JSON from
/verifyReceipt
- Or parse out specific fields
Auto Review Status
Voluntary churn
Status Polling
Update auto renew status from server
Auto Renew Preference
Winback
- Reengate after subscribers churn
- Resubscription offers
- Customer surveys
Expiration Intent
Winback Lapsed Subscribers
Voluntary churn
- Survey lapsed subscribers
- Show alternative subscription products
Involuntary churn
- Show alternative subscription products
- Persistent messaging in-app
- Limited subscription experience
Reducing Subscriber Churn ⚠️
Summary
- Leverage subscription specific receipt fields
- Implement status polling
- Implement custom messaging
- Present contextual subscription offers
App Store Connect Reports (new)
- Available through the new App Store Connect API
- Report data available daily
- Can be imported for further analysis