unPLUGDevelopers

App API

Webhook event types

Every event type unPLUG sends, when it fires and what the payload looks like. Write the handler for each type you subscribe to from the payloads below.

Available at launch

The examples follow one guest, Maya Lopez, through the order on Checkout and orders. She has 420 Beans and 1,880 lifetime Beans on the Green tier, uses the Fall pastry from her wallet on app order app-30417, earns 90 Beans on the $9.00 left after the discount, and later gets a full refund.

Envelope#

Every webhook body is an event object:

Event
{
  "id": "7f3a9c2e-4b8d-4e16-a0c5-1d6b8e2f9a47",
  "type": "points.changed",
  "created_at": "2026-11-05T14:08:52Z",
  "api_version": "v1",
  "livemode": true,
  "brand_id": "e5a1c7d9-2f4b-4c8e-a3d6-8b0f1e9c2a57",
  "data": {
    "object": { },
    "previous_attributes": { }
  }
}
FieldDescription
idstring (uuid)Unique per event. Same as the webhook-id header. Dedupe on it.
typestringOne of the types below. The list may grow; return 200 for types you don't handle.
created_atstringWhen the change happened, not when it was delivered. Use it to order events.
api_versionstringv1.
livemodebooleantrue in production, false in the sandbox.
brand_idstring (uuid)Your brand.
data.objectobjectA snapshot of the resource at created_at. Each type below says which resource.
data.previous_attributesobjectOn update events, the old values of the fields that changed. Empty on other events.

Snapshots can be stale by the time you process them. When you need the current state, read the resource from the API.

Headers#

Webhooks follow the Standard Webhooks spec.

HeaderExampleMeaning
webhook-id7f3a9c2e-4b8d-4e16-a0c5-1d6b8e2f9a47The event id. The same on every retry and redelivery.
webhook-timestamp1793887732Unix seconds when this attempt was sent. New on every attempt.
webhook-signaturev1,h040RAsmDKEcqk4Lh13vuOrVBK9yBovp0Tduidp9DrE=Base64 HMAC-SHA256 of {webhook-id}.{webhook-timestamp}.{raw body}. Space-separated list of entries during a secret rotation.
Content-Typeapplication/jsonThe body is UTF-8 JSON.

How to check the signature, with code: Verify the signature.

All event types#

TypeFires whenStatus
member.createdA member is enrolledAvailable at launch
member.updatedProfile fields or status changeAvailable at launch
member.deletedA deletion completesAvailable at launch
points.changedAny activity entry is writtenAvailable at launch
points.expiringPoints are about to expireComing soon
tier.changedA member moves up or down a tierAvailable at launch
reward.issuedA reward lands in a walletAvailable at launch
reward.redeemedA redemption is captured by an orderAvailable at launch
reward.expiring3 days before a wallet item expiresAvailable at launch
order.creditedAn order earns pointsAvailable at launch
order.refundedAn order is refunded, in part or in fullAvailable at launch
communication_preferences.updatedA marketing opt-in changesAvailable at launch
challenge.joinedA member joins a challengeComing soon
challenge.progressedChallenge progress movesComing soon
challenge.completedA member completes a challengeComing soon
referral.completedA referred guest qualifiesComing soon
webhook.testYou ask for a test eventAvailable at launch

Offers granted to a member fire reward.issued with "source": "offer". There is no separate offer event.