Skip to main content
Nippy sends signed webhooks to the webhookUrl configured in your campaign. They are the main channel for knowing what happened — always verify the signature before processing.

Envelope structure

All events share the same envelope:

Headers you receive

Verify the signature

Always verify the signature. If you don’t, anyone can send fake webhooks to your endpoint.
Use express.raw(), not express.json(). The signature is calculated over the raw body — if you parse it before verifying, verification will always fail.

Available events

spin.completed

Fires when a spin completes (manual or automatic).
What to do here: if outcome === 'won_points' and claimRequired === false, credit gift.pointsValue to the user.

claim.completed

Fires when the user claims a prize that required confirmation.
What to do here: initiate the delivery process for the physical or digital prize.

spin_auto_unlocked

Fires when track() evaluated the rules and unlocked an automatic spin, just before spinning.

grant_points_awarded

Fires when a rule with action: 'grant_points' was activated and points were credited directly.
What to do here: credit data.pointsValue to the user in your system.

Retries

If your endpoint returns any status code other than 2xx, Nippy retries delivery automatically: After the fourth failed attempt, the webhook is marked as failed. You can check it in the webhook log.

Idempotency

The envelope id field is unique per delivery. If you receive the same id twice (network retry), process it only once by storing already-processed IDs in your database.