show() resolves to. Either nothing ever appeared, or the interaction ran and the record carries two independent funnels plus how the sheet went away.
show() never rejects. Presentation-level failures arrive here as values.
Structure
not_attempted is a real value, meaning “the funnel was open and nothing entered it”, never a missing one.
There is no
unlocked boolean, on purpose. What a claim means is a property of the variant flow that served it, so an SDK-computed verdict over app-global config could contradict the flow that actually ran. The record is facts; the policy is yours.Reading it
PublisherOutcome
Your funnel: what your purchase controller reported back.AdvertiserOutcome
Encore’s funnel: how far the offer claim got.result.claim is shorthand for the offer behind a claimed or verified outcome, and null otherwise. Read result.advertiser directly when you need to tell the two apart.
ClaimedOffer
offerId equals campaignId there. transactionId joins this record to a later strict_unlock_verified outcome and to the server-side completion event that can land days afterwards; it is nullable, because the transaction write can fail while the claim still happened.
DismissReason
How a presented sheet went away. These strings are the frozen cross-platform vocabulary, and the same values land indecline_reason on sdk_offer_sheet_dismissed.
NotPresentedReason
Why no sheet ever appeared.use_case_unavailable is a correct no-op, not an error. It never falls back to the churn-intervention sheet, because putting an in-app-purchase screen in front of a user who was meant to be rewarded is worse than presenting nothing.Related
- placement(), which returns this record.
- PurchaseController, whose answer becomes
publisher. - outcomes, which carries this record for passive observers.
- Errors for the
EncoreErrorInfoshape.