Engineering Subscriptions

WWDC 2018

Posted by Den on September 16, 2018 · 18 mins read
Engineering Subscriptions

Engineering Subscriptions

WWDC 2018

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 the lastest_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

  1. Observe no renewal transaction appears
  2. Direct user to amend their billing details
  3. 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 on original_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

Involuntary Churn

Billing retry

  • Updated failed payment logic
    - Expanded retry duration
    - New retry strategies
    - Tuning
Performance
Incremental Subscriptions Recovered

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
Grace Period
Subscription

Customer Messaging

Server-to-Server Notifications

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

Example Subscription

Status Polling

Update auto renew status from server

Example Subscription

Auto Renew Preference

Example Subscription
Server-to-Server Notifications

Winback

  • Reengate after subscribers churn
    - Resubscription offers
    - Customer surveys
Server-to-Server Notification

Expiration Intent

Example Subscription

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