# PurchaseController

An interface for handling Superwall's subscription-related logic with your own purchase implementation.

> **Info**

**This interface is not required.** By default, Superwall handles all subscription-related logic automatically using Google Play Billing.



> **Warning**

When implementing PurchaseController, you must manually update [`subscriptionStatus`](/docs/android/sdk-reference/subscriptionStatus) whenever the user's entitlements change.



Purpose [#purpose]

Use this interface only if you want complete control over purchase handling, such as when using RevenueCat or other third-party purchase frameworks.

Signature [#signature]

```kotlin
interface PurchaseController {
    suspend fun purchase(
        activity: Activity,
        product: StoreProduct
    ): PurchaseResult
    
    suspend fun restorePurchases(): RestorationResult
}
```

```java
// Java
public interface PurchaseController {
    CompletableFuture<PurchaseResult> purchase(
        Activity activity, 
        StoreProduct product
    );
    
    CompletableFuture<RestorationResult> restorePurchases();
}
```

Parameters [#parameters]

<TypeTable
  type="{
  purchase: {
    type: &#x22;activity: Activity, product: StoreProduct&#x22;,
    description: &#x22;Called when user initiates purchasing. Implement your purchase logic here. Activity is needed for Google Play Billing. Returns `PurchaseResult`.&#x22;,
    required: true,
  },
  restorePurchases: {
    type: &#x22;None&#x22;,
    description: &#x22;Called when user initiates restore. Implement your restore logic here. Returns `RestorationResult`.&#x22;,
    required: true,
  },
}"
/>

Returns / State [#returns--state]

* `purchase()` returns a `PurchaseResult` (`.Purchased`, `.Failed(Throwable)`, `.Cancelled`, or `.Pending`)
* `restorePurchases()` returns a `RestorationResult` (`.Restored` or `.Failed(Throwable?)`)

When using a PurchaseController, you must also manage [`subscriptionStatus`](/docs/android/sdk-reference/subscriptionStatus) yourself.

Usage [#usage]

For implementation examples and detailed guidance, see [Using RevenueCat](/docs/android/guides/using-revenuecat).