Superwall

SuperwallDelegate

An interface that handles Superwall lifecycle events and analytics.

Set the delegate using Superwall.instance.delegate = this to receive these callbacks. For Java, use setJavaDelegate() for better Java interop.

Use handleSuperwallEvent(eventInfo) to track Superwall analytics events in your own analytics platform for a complete view of user behavior.

Purpose

Provides callbacks for Superwall lifecycle events, analytics tracking, and custom paywall interactions.

Signature

interface SuperwallDelegate {
    fun subscriptionStatusDidChange(
        from: SubscriptionStatus,
        to: SubscriptionStatus
    ) {}

    fun customerInfoDidChange(
        from: CustomerInfo,
        to: CustomerInfo
    ) {}

    fun userAttributesDidChange(newAttributes: Map<String, Any>) {}
    
    fun handleSuperwallEvent(eventInfo: SuperwallEventInfo) {}
    
    fun handleCustomPaywallAction(name: String) {}
    
    fun willDismissPaywall(paywallInfo: PaywallInfo) {}
    
    fun willPresentPaywall(paywallInfo: PaywallInfo) {}
    
    fun didDismissPaywall(paywallInfo: PaywallInfo) {}
    
    fun didPresentPaywall(paywallInfo: PaywallInfo) {}
    
    fun paywallWillOpenURL(url: String) {}
    
    fun paywallWillOpenDeepLink(url: String) {}
    
    fun handleLog(
        level: LogLevel,
        scope: LogScope,
        message: String,
        info: Map<String, Any>?,
        error: Throwable?
    ) {}
}
// Java - Use SuperwallDelegateJava for better Java interop
public interface SuperwallDelegateJava {
    default void subscriptionStatusDidChange(
        SubscriptionStatus from, 
        SubscriptionStatus to
    ) {}

    default void customerInfoDidChange(
        CustomerInfo from,
        CustomerInfo to
    ) {}

    default void userAttributesDidChange(Map<String, Object> newAttributes) {}
    
    default void handleSuperwallEvent(SuperwallEventInfo eventInfo) {}
    
    default void handleCustomPaywallAction(String name) {}
    
    default void willDismissPaywall(PaywallInfo paywallInfo) {}

    default void willPresentPaywall(PaywallInfo paywallInfo) {}

    default void didDismissPaywall(PaywallInfo paywallInfo) {}

    default void didPresentPaywall(PaywallInfo paywallInfo) {}

    default void paywallWillOpenURL(String url) {}

    default void paywallWillOpenDeepLink(String url) {}

    default void handleLog(
        LogLevel level,
        LogScope scope,
        String message,
        Map<String, Object> info,
        Throwable error
    ) {}
}

Parameters

All methods are optional to implement. Key methods include:

Prop

Type

Returns / State

All delegate methods return Unit. They provide information about Superwall events and state changes.

Usage

Basic delegate setup:

class MainActivity : AppCompatActivity(), SuperwallDelegate {
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        Superwall.instance.delegate = this
    }
}

Track subscription status changes:

override fun subscriptionStatusDidChange(
    from: SubscriptionStatus,
    to: SubscriptionStatus
) {
    println("Subscription changed from $from to $to")
    updateUI(to)
}

Mirror merged purchase history:

override fun customerInfoDidChange(
    from: CustomerInfo,
    to: CustomerInfo
) {
    if (from.activeSubscriptionProductIds != to.activeSubscriptionProductIds) {
        Analytics.track("customer_info_updated", mapOf(
            "old_products" to from.activeSubscriptionProductIds.joinToString(),
            "new_products" to to.activeSubscriptionProductIds.joinToString()
        ))
    }

    refreshEntitlementBadge(to.entitlements.filter { it.isActive }.map { it.id })
}

Capture remote attribute changes:

override fun userAttributesDidChange(newAttributes: Map<String, Any>) {
    // Paywall forms or surveys can set attributes directly.
    // Forward them to your analytics platform or local cache.
    analytics.identify(newAttributes)
}

Forward analytics events:

override fun handleSuperwallEvent(eventInfo: SuperwallEventInfo) {
    when (val event = eventInfo.event) {
        is SuperwallEvent.PaywallOpen -> {
            Analytics.track("paywall_opened", mapOf(
                "paywall_id" to event.paywallInfo.id,
                "placement" to event.paywallInfo.placement
            ))
        }
        is SuperwallEvent.TransactionComplete -> {
            Analytics.track("subscription_purchased", mapOf(
                "product_id" to event.product.id,
                "paywall_id" to event.paywallInfo.id
            ))
        }
        else -> {
            // Handle other events
        }
    }
}

Handle custom paywall actions:

override fun handleCustomPaywallAction(name: String) {
    when (name) {
        "help" -> presentHelpScreen()
        "contact" -> presentContactForm()
        else -> println("Unknown custom action: $name")
    }
}

Handle paywall lifecycle:

override fun willPresentPaywall(paywallInfo: PaywallInfo) {
    // Pause video, hide UI, etc.
    pauseBackgroundTasks()
}

override fun didDismissPaywall(paywallInfo: PaywallInfo) {
    // Resume video, show UI, etc.
    resumeBackgroundTasks()
}

Java usage:

public class MainActivity extends AppCompatActivity implements SuperwallDelegateJava {
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Superwall.getInstance().setJavaDelegate(this);
    }
    
    @Override
    public void subscriptionStatusDidChange(
        SubscriptionStatus from, 
        SubscriptionStatus to
    ) {
        System.out.println("Subscription changed from " + from + " to " + to);
        updateUI(to);
    }

    @Override
    public void customerInfoDidChange(
        CustomerInfo from,
        CustomerInfo to
    ) {
        Logger.i("Superwall", "Customer info updated: " + to.getActiveSubscriptionProductIds());
        syncUserPurchases(to);
    }

    @Override
    public void userAttributesDidChange(Map<String, Object> newAttributes) {
        analytics.identify(newAttributes);
    }
}

How is this guide?

Edit on GitHub