Skip to main content

Overview

Encore lets you present a premium brand offer (a real perk a brand funds to acquire customers, such as a free trial, discount, or credit) at critical moments like cancellation flows or feature paywalls. show() resolves with the complete factual record of what happened. There are no global callbacks to register: control flow lives at the call site.

Present an offer

show() never rejects. Every failure, including “nothing was presented”, arrives as a value on the result, so there is no catch block to forget and no silent hang when you do.

Read the result

A presented record carries two independent funnels plus how the sheet went away: A single presentation can claim an offer and run a purchase, so the two funnels are recorded side by side rather than competing for one winning value.
There is deliberately no unlocked boolean. What a claim means is a property of the variant flow that served it, so an SDK-computed verdict could contradict the flow that actually ran. Branch on the raw axes, as above. See PresentationResult.

Purchases

A user who accepts an offer that carries an in-app purchase triggers your purchase controller. Pass it to configure(); see Configure the SDK.
Return 'pending' for deferred purchases. Ask to Buy on iOS, or SCA or a pending Play transaction on Android, means the user has neither bought nor abandoned; the store’s webhook settles it later. Returning 'cancelled' for these silently misreports revenue, recording a live sale as a decline.

Observe outcomes globally

For analytics forwarding, app-owned state, or a debug overlay, subscribe to the outcomes stream. It appends rather than replacing, so several observers can listen at once.
There is no replay, so subscribe at startup. See onOutcome().

Full example


Next Steps