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

Receipts vs Reports
