For wiring it up (dashboard setup, a runnable signature-verification handler, idempotency, and reconciliation), see the Receive Completion Events guide. For the inbound direction (you forward your own billing’s subscription events into Encore), see Webhook Ingestion: an unrelated flow with different headers and signing.
The request Encore sends
One event type,POSTed to the URL you configure at the moment a transaction is marked verified (driven by the advertiser’s conversion postback, not by the user tapping or claiming).
Headers
Body
That’s the whole body. There is no app id, creative id, or event id, and no nesting: the payload is flat, exactly the seven fields above. A handler written against a nested
req.body.data won’t work; read the fields off the top level. The usr_... shape above is only a placeholder from the test-delivery sample; Encore mints no user ids and adds no prefix.Signature
The signature base string is the timestamp header and the raw request body, joined by a single dot:whsec_... signing secret and hex-encode it. The result must equal X-Webhook-Signature. Verify against the exact bytes Encore sent, not a re-serialization; a runnable handler is in the guide.
The response Encore expects
Return any2xx within 5 seconds. Anything else fails that attempt and Encore retries it.
Delivery is at-least-once
A conversion may arrive more than once, including a delivery your system already processed. A timeout or a missing response tells us nothing about whether your side completed the work, so we retry. Two things protect you, and they cover opposite failures:- Required: deduplicate on
transactionId. Take it from the signed request body. Every retry of a conversion carries the same value. Do not key onX-Webhook-Delivery-IdorX-Webhook-Attempt. Both sit outside the signature base string and are not authenticated. - Recommended: return
2xxonly once the credit is durably committed, not on receipt. If you acknowledge first and credit asynchronously, a failure in that async step is invisible to us: we will not retry, because you already returned2xx, and the user is silently uncredited.
URL requirements
Related
- Receive Completion Events guide: setup, verification handler, idempotency, reconciliation, local testing.
- API Reference overview: why a claim is not a conversion, and where completion fits.
- Webhook Ingestion: the inbound direction, for forwarding your own subscription events into Encore.