> ## Documentation Index
> Fetch the complete documentation index at: https://docs.encorekit.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Present Offers

> Show Encore retention offers to users at key moments.

## Show a Placement

```kotlin theme={null}
import com.encorekit.kmp.models.PresentationResult

val result = Encore.placement("cancel_flow").show()

when (result) {
    is PresentationResult.Granted -> {
        // User accepted the offer
    }
    is PresentationResult.NotGranted -> {
        // User dismissed or no offers — proceed with original flow
        proceedWithCancellation()
    }
}
```

<Info>
  The `placement(id).show()` pattern is consistent across all Encore SDKs.
</Info>

***

## Handlers

Register these once at app startup, after `configure()`.

### onPurchaseRequest

Called when a user accepts an offer that requires a purchase:

```kotlin theme={null}
Encore.onPurchaseRequest { request ->
    yourBillingService.purchase(request.productId)
}
```

### onPassthrough

Called when the user dismisses or no offers are available. Resume the original flow:

```kotlin theme={null}
Encore.onPassthrough { placementId ->
    proceedWithCancellation()
}
```

### onPurchaseComplete (Optional)

Fires after a native purchase completes (when no `onPurchaseRequest` handler is set):

```kotlin theme={null}
Encore.onPurchaseComplete { result, productId ->
    // Sync purchase state with your subscription manager
}
```

***

## Claim Control

Disable the claim button while a purchase is in progress:

```kotlin theme={null}
Encore.placements.setClaimEnabled(false)
// ... after purchase completes
Encore.placements.setClaimEnabled(true)
```

***

## Next Steps

* **[Add Subscription Product](./add-subscription-product)** — Connect your billing to Encore
