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

# Encore.outcomes

> Passive stream of every placement outcome

A `SharedFlow` that multicasts every placement outcome: each `show()` resolution (including `NotPresented`) and cross-launch strict-unlock verifications. Use it for cross-cutting observation (analytics, logging, entitlement sync) that shouldn't repeat at every call site; control flow belongs at the call site, off the returned [`PresentationResult`](./presentation-result).

## Definition

```kotlin theme={null}
// On the Encore companion; exists before configure()
val outcomes: SharedFlow<PlacementOutcome>

sealed class PlacementOutcome {
    data class Presentation(
        val placementId: String,
        val result: PresentationResult,
    ) : PlacementOutcome()

    data class StrictUnlockVerified(val transactionId: String) : PlacementOutcome()
}
```

## Events

| Event                  | When it fires                                                                                                                                                                                          |
| ---------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `Presentation`         | A presentation ran (or was declined) and its record sealed. Emitted the moment the record seals, before any direct `onResult` delivery                                                                 |
| `StrictUnlockVerified` | A previously claimed offer verified server-side after its presentation ended (strict-mode cross-launch reconciliation). `transactionId` joins back to the sealed record's `ClaimedOffer.transactionId` |

<Warning>
  There is no replay: late subscribers miss earlier outcomes by design (results can carry user-scoped claim data). Subscribe at app startup, right after `configure()`.
</Warning>

## Usage

```kotlin theme={null}
// Application.onCreate, right after configure. There is no replay, so
// subscribe at startup.
appScope.launch {
    Encore.outcomes.collect { outcome ->
        when (outcome) {
            is PlacementOutcome.Presentation ->
                analytics.log("encore_outcome", outcome.placementId, outcome.result)
            is PlacementOutcome.StrictUnlockVerified ->
                grantEntitlement(outcome.transactionId) // strict-mode cross-launch settlement
        }
    }
}
```

## Behavior

* **Exists before `configure()`**: the flow lives on the `Encore` companion, so subscribing first and configuring second is safe.
* **Non-suspending emission**: a slow collector can never stall the SDK; under backpressure the oldest buffered outcome is dropped.
* **`StrictUnlockVerified` only occurs under `UnlockMode.Strict`**: a claim that ends unverified in-session re-verifies on later launches until the server settles it; see [unlock modes](./configure#unlock-modes) for the persistence rules.

## Related

* [PresentationResult](./presentation-result): the record carried by `Presentation`
* [configure()](./configure): `UnlockMode` selection
