offer_completed it sends carries payout: 0. When Encore later books the conversion at a USD figure, it can send you offer_payout_booked: that figure, for the same transactionId and paying action. The same event reports a booking for any other paying action Encore already sent an offer_completed for. A paying action Encore never sent an offer_completed for gets no offer_payout_booked: its first offer_completed carries the booked figure instead.
Turning it on
Encore sends it only to a webhook subscribed to it. Every webhook starts subscribed tooffer_completed only. To subscribe, confirm to Encore support that your handler switches on event and never credits on offer_payout_booked, and ask for payout updates on your app. Without the subscription, Encore still books the figure; only the notice to your server is skipped.
To unsubscribe, ask Encore support. Payout updates still waiting for a retry are then dropped. An offer_completed is never dropped this way.
Deleting and re-creating your webhook also unsubscribes it: the new webhook starts at offer_completed only, and queued payout updates are dropped until you ask to subscribe again.
When Encore sends it
When Encore books a USD figure for a conversion priced in another currency, what your webhook receives depends on which conversion it is:
The conversion the transaction verified on always counts as already sent, so Encore never sends a late first
offer_completed for it, even if your webhook did not exist or was turned off when it verified. If your app has no webhook, or it is turned off, when the figure is booked, Encore sends nothing.
The request Encore sends
Same URL, headers, signature and delivery guarantees asoffer_completed: an HMAC-SHA256 signature over <X-Webhook-Timestamp>.<raw_body>, and the same 2xx deadline and retry schedule.
There is no
reward field: this event never carries one.
What to do with it
- Switch on
event. Routeoffer_payout_bookedto your payout records, never to your credit logic. - Update the payout for
transactionIdplusactionId. If you hold nooffer_completedwith thisactionId, but hold one for thistransactionIdwithout anactionId, update that one. Use(transactionId, actionId, event)from the signed body to deduplicate. Do not key onX-Webhook-Delivery-Id, which sits outside the signature. - The booked payout wins. Ordering is not guaranteed: the earlier
offer_completedfor the same action can still be retrying when this arrives. For onetransactionIdplusactionId, keep this event’spayoutwhichever arrives first, and never overwrite it with thepayoutof anoffer_completedthat arrives later. This event only reaches you for an action Encore already sent anoffer_completedfor, or the one the transaction verified on. For any other paying action, the booked figure arrives as that action’s firstoffer_completed, so do not wait for anoffer_payout_bookedthere. - A transaction you have no completion for: this happens when the
offer_completednever reached you, for example because your webhook did not exist or was turned off when the transaction verified, or your endpoint was down for the whole retry window. Record the payout and reconcile from your dashboard. Still never credit a reward.
Related
- offer_completed webhook reference: the completion event, its signature, and its guarantees.
- Receive Completion Events guide: verification handler, idempotency, reconciliation.