Superwall
Advanced

setSubscriptionStatus()

A function that manually sets the subscription status when using a custom PurchaseController.

This function should only be used when implementing a custom PurchaseController. When using Superwall's built-in purchase handling, the subscription status is managed automatically.

You must call this function whenever the user's entitlements change to keep Superwall's subscription status synchronized with your purchase system.

Purpose

Manually updates the subscription status when using a custom PurchaseController to ensure paywall gating and analytics work correctly.

Signature

fun Superwall.setSubscriptionStatus(status: SubscriptionStatus)
// Java
public void setSubscriptionStatus(SubscriptionStatus status)

Parameters

NameTypeDescription
statusSubscriptionStatusThe subscription status to set. Can be SubscriptionStatus.Unknown, SubscriptionStatus.Active(entitlements), or SubscriptionStatus.Inactive.

Returns / State

This function returns Unit. The new status will be reflected in the subscriptionStatus StateFlow and will trigger the SuperwallDelegate.subscriptionStatusDidChange callback.

Usage

Set active subscription with entitlements:

// User purchased premium subscription
Superwall.instance.setSubscriptionStatus(
    SubscriptionStatus.Active(setOf("premium", "pro_features"))
)

Set inactive subscription:

// User's subscription expired or was cancelled
Superwall.instance.setSubscriptionStatus(SubscriptionStatus.Inactive)

Set unknown status during initialization:

// While checking subscription status on app launch
Superwall.instance.setSubscriptionStatus(SubscriptionStatus.Unknown)

Usage with RevenueCat:

class RevenueCatPurchaseController : PurchaseController {
    
    override suspend fun purchase(
        activity: Activity,
        product: StoreProduct
    ): PurchaseResult {
        return try {
            val result = Purchases.sharedInstance.purchase(activity, product.sku)
            
            // Update Superwall subscription status based on RevenueCat result
            if (result.isSuccessful) {
                val entitlements = result.customerInfo.entitlements.active.keys
                Superwall.instance.setSubscriptionStatus(
                    SubscriptionStatus.Active(entitlements)
                )
                PurchaseResult.Purchased
            } else {
                PurchaseResult.Failed(Exception("Purchase failed"))
            }
        } catch (e: Exception) {
            PurchaseResult.Failed(e)
        }
    }
    
    override suspend fun restorePurchases(): RestorationResult {
        return try {
            val customerInfo = Purchases.sharedInstance.restorePurchases()
            val activeEntitlements = customerInfo.entitlements.active.keys
            
            if (activeEntitlements.isNotEmpty()) {
                Superwall.instance.setSubscriptionStatus(
                    SubscriptionStatus.Active(activeEntitlements)
                )
            } else {
                Superwall.instance.setSubscriptionStatus(SubscriptionStatus.Inactive)
            }
            
            RestorationResult.Restored
        } catch (e: Exception) {
            RestorationResult.Failed(e)
        }
    }
}

Listen for external subscription changes:

class SubscriptionManager {
    
    fun onSubscriptionStatusChanged(isActive: Boolean, entitlements: Set<String>) {
        val status = if (isActive) {
            SubscriptionStatus.Active(entitlements)
        } else {
            SubscriptionStatus.Inactive
        }
        
        // Update Superwall whenever subscription status changes externally
        Superwall.instance.setSubscriptionStatus(status)
    }
}

Java usage:

// Set active subscription
Set<String> entitlements = Set.of("premium", "pro_features");
Superwall.getInstance().setSubscriptionStatus(
    new SubscriptionStatus.Active(entitlements)
);

// Set inactive subscription
Superwall.getInstance().setSubscriptionStatus(
    SubscriptionStatus.Inactive.INSTANCE
);

How is this guide?

On this page