> ## 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 the Encore offer carousel with Encore.placement(id).show(), branch on the ShowResult ('claimed' | 'dismissed' | 'unavailable'), and complete the default deferred flow with redeem().

One call presents the offer carousel at a named placement:

```javascript theme={null}
import Encore from '@encorekit/web-sdk';

const result = await Encore.placement('cancel_flow').show();

switch (result.status) {
  case 'claimed':
    // The user claimed an offer. Finish your flow, then redeem() (below).
    break;
  case 'dismissed':
    // Closed without claiming; result.reason says why, including errors,
    // since show() never rejects (no try/catch needed).
    break;
  case 'unavailable':
    // No eligible offers. Show your normal fallback.
    break;
}
```

Full contract: [`show()` reference](/publishers/web/sdk-reference/show).

By default the SDK runs in **deferred** redemption mode: `show()` records the claim
without redirecting, and your code calls `redeem()` after its own conversion step
([Redemption Modes](/publishers/web/concepts/redemption-modes) covers the modes and when
to change them). Complete the flow from a click handler:

```javascript theme={null}
if (result.status === 'claimed') {
  // ... your own conversion / save step ...
  const redeemed = await Encore.placement('cancel_flow').redeem();
  // { status: 'redeemed' } on success: the user was sent to the partner
}
```

Full contract: [`redeem()` reference](/publishers/web/sdk-reference/redeem). The pending
claim survives reloads (local storage, \~7-day TTL); even on a fresh page, just call
`redeem()` when ready, and it resolves `{ status: 'none' }` if nothing is pending.

## Placement ids and options

The placement id records the claim under that surface, so `placement(id).redeem()` later
resolves exactly that claim. The second argument carries per-surface UI options:

```javascript theme={null}
const result = await Encore.placement('cancel_flow', {
  appearance: { accentColor: '#5671FF' },
}).show();
```

Full options contract: [`placement()`](/publishers/web/sdk-reference/placement).

## Results are not conversions

A `claimed` (or `redeemed`) result means the presentation succeeded. Advertiser
conversion happens later, asynchronously, and is verified on Encore's side. Never gate
real access on a client-side result.

## Next steps

* [Reduce Paywall Churn](/publishers/web/guides/intercept-paywall-abandonment): the two-phase flow end to end
* [Post-Purchase Placements](/publishers/web/guides/post-purchase-placements): the payment-success surface
* [Integration Patterns](/publishers/web/guides/integration-patterns): handling results in app code
* [SDK Reference](/publishers/web/sdk-reference/overview): every method's contract
