Purchases and Subscription Status
By default, Superwall handles basic subscription-related logic for you:
- Purchasing: When the user initiates a checkout on a paywall.
- Restoring: When the user restores previously purchased products.
- Subscription Status: When the user’s subscription status changes to active or expired (by checking the local receipt).
However, if you want more control, you can pass in a PurchaseController
when configuring the SDK via configure(apiKey:purchaseController:options:)
and manually set Superwall.shared.subscriptionStatus
to take over this responsibility.
Step 1: Creating a PurchaseController
A PurchaseController
handles purchasing and restoring via protocol methods that you implement. You pass in your purchase controller when configuring the SDK:
Here’s what each method is responsible for:
- Purchasing a given product. In here, enter your code that you use to purchase a product. Then, return the result of the purchase as a
PurchaseResult
. For Flutter, this is separated into purchasing from the App Store and Google Play. This is an enum that contains the following cases, all of which must be handled:.cancelled
: The purchase was cancelled..purchased
: The product was purchased..pending
: The purchase is pending/deferred and requires action from the developer..failed(Error)
: The purchase failed for a reason other than the user cancelling or the payment pending..restored
: The purchase was restored. This happens when the user tries to purchase a product that they’ve already purchased, resulting in a transaction whosetransactionDate
is before the the date you initiated the purchase.
- Restoring purchases. Here, you restore purchases and return a boolean indicating whether the restoration was successful or not.
Step 2: Configuring the SDK With Your PurchaseController
Pass your purchase controller to the configure(apiKey:purchaseController:options:)
method:
Step 3: Keeping subscriptionStatus
Up-To-Date
You must set Superwall.shared.subscriptionStatus
every time the user’s subscription status changes, otherwise the SDK won’t know who to show a paywall to. This is an enum that has three possible cases:
.unknown
: This is the default value. In this state, paywalls will not show and their presentation will be automatically delayed untilsubscriptionStatus
changes to a different value..active
: Indicates that the user has an active subscription. Paywalls will not show in this state unless you remotely set the paywall to ignore subscription status..inactive
: Indicates that the user doesn’t have an active subscription. Paywalls can show in this state.
Here’s how you might do this:
subscriptionStatus
is cached between app launches Listening for subscription status changes
If you need a simple way to observe when a user’s subscription status changes, on iOS you can use the Publisher
for it. Here’s an example:
You can do similar tasks with the SuperwallDelegate
, such as viewing which product was purchased from a paywall.