Skip to main content
Reward a user with a premium brand offer (a real perk a brand funds to acquire customers) at a moment they just earned, such as a completed purchase, a streak, or a milestone. It costs you nothing to give. One call presents the reward sheet at a named placement:
Contracts: placement() · show(). Pass useCase: 'rewardUsers' on every reward placement. A placement without it is a 'reduceChurn' placement, whose claim waits for redeem() (The Claim Flow). A claimed result carries the offer, the campaign, the advertiser’s name, and, when its write succeeded, the transactionId that carries attribution:

Placement ids and options

The placement id is attributed on the offers request. The second argument carries the per-presentation options:
Full options contract: placement(). Restyling the sheet beyond this is advanced configuration, covered in Advanced UI.

Results are not conversions

A claimed result means the presentation succeeded and the user claimed an offer. Advertiser completion happens later, asynchronously, and is verified on Encore’s side. Never gate real access on a client-side result.

Optional: get notified when the conversion lands

Because the conversion is verified later and on Encore’s side, the browser never learns about it. If your server needs to react (grant a reward, credit a balance, mark a task done), you can have Encore POST an offer_completed event to a URL you own the moment a completion is verified. This is entirely optional. Nothing above depends on it, and a Web SDK integration is complete without it. Add it only when you have server-side work to do on completion.
You configure the URL and copy the signing secret in the dashboard under Settings; the delivery is signed with HMAC-SHA256 so you can verify it. Two things to know before you rely on it: userId is the value you passed to identify(), echoed back verbatim (the usr_… above is just a sample placeholder, not a shape Encore imposes), so call identify() or the id won’t resolve to a user in your database. And delivery is at-least-once: a failed delivery is retried up to five times over roughly nine hours, so credit the user once per transactionId and return 2xx only once the credit is committed. Full contract (headers, payload, signature verification, delivery guarantees): Offer Completed Webhook.
Don’t confuse this with Webhook Ingestion, which runs the opposite direction: there, you POST your own subscription lifecycle events into Encore for incrementality measurement. This section is about Encore calling your server.

Next steps