> ## 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.

# PresentationResult

> Outcome of presenting an Encore offer

The value returned by `try await Encore.shared.placement(_:).show()`. It tells you whether the user earned an entitlement or not, and why.

<Note>
  `PresentationResult` is the supported way to observe an offer's outcome. The older `EncorePresentationResult` typename is a **deprecated** alias for this type, and the fluent `.onGranted { }` / `.onNotGranted { }` callbacks are deprecated too — prefer branching on the returned `PresentationResult`.
</Note>

## Definition

```swift theme={null}
public enum PresentationResult: Sendable {
    case granted(Entitlement)
    case notGranted(NotGrantedReason)
}
```

The associated values are **unlabeled** — match them positionally:

```swift theme={null}
switch result {
case .granted(let entitlement):   // not .granted(entitlement: ...)
    applyEntitlement(entitlement)
case .notGranted(let reason):     // not .notGranted(reason: ...)
    proceedWithOriginalAction(reason)
}
```

## Cases

| Case          | Associated value                           | Description                                                                                      |
| ------------- | ------------------------------------------ | ------------------------------------------------------------------------------------------------ |
| `.granted`    | [`Entitlement`](./entitlements)            | The user completed an offer and earned an entitlement (trial, discount, or credit).              |
| `.notGranted` | [`NotGrantedReason`](./not-granted-reason) | The user did not earn an entitlement (dismissed, no offers, experiment control, unsupported OS). |

## Usage

```swift theme={null}
let result = try await Encore.shared.placement("paywall").show()

switch result {
case .granted(let entitlement):
    // The SDK has already recorded the grant; reflect it in your UI.
    unlockPremiumContent(for: entitlement)
case .notGranted(let reason):
    // Resume the user's original flow.
    proceedWithCancellation(reason: reason)
}
```

<Warning>
  `show()` only **throws** for genuine failures (transport, protocol, integration). A user dismissal is `.notGranted(...)`, not a thrown error — see [Errors](./errors) and [NotGrantedReason](./not-granted-reason).
</Warning>
