POST request that Whop sends to your server when an event occurs. Examples of events: a payment succeeds, a membership activates, a dispute opens. You register a public URL. Whop sends a signed JSON event to this URL each time one of your subscribed events occurs.
What a webhook looks like
Each event is onePOST request:
api_version_date pin, the same way data does. Webhooks pinned before 2026-08-14 — and webhooks without a pin — receive the account field as company_id instead of account_id.
The HTTP request headers version the same way: any future header change ships as a dated API version, and your pin keeps the headers you integrated against. Four headers are contractually frozen and never change on any version: webhook-id, webhook-signature, webhook-timestamp, and content-type — signature verification works identically on every pin.
One optional envelope field describes what changed:
previous_attributes— present on.updatedevents that capture changes (account.updated,product.updated,plan.updated, andshipment.updated): an object with the old values of thedatafields that changed, keyed by field name. Renaming the account to “Shine Time Auto Detailing” delivers{"title": "Webb's Mobile Detailing"}— the value each changed field had before the write. When the field is absent, no change capture was available for the event. Values follow your webhook’sapi_version_datepin, the same waydatadoes.
Create a webhook
- API
- Dashboard
webhook_secret. The API shows this value only one time. Store it immediately. See the Webhooks API reference for all fields, including resource_id (the company or app that owns the webhook) and child_resource_events.Verify and handle events
Always verify the signature before you use a payload.1
Set up your SDK client
Give the secret to the SDK client when you construct it:
2
Handle events on your server
One call verifies the signature and parses the event. If the signature isn’t correct, the call throws an error. Your handler doesn’t receive payloads that failed verification.
Verify without an SDK
Verify without an SDK
Whop signs the string
{webhook-id}.{webhook-timestamp}.{raw body} with HMAC-SHA256. The key is your ws_... secret. The webhook-signature header contains the result in base64: v1,<signature>.To verify a request: compute the HMAC over the raw request body, encode the result in base64, and compare it to the header value with a constant-time comparison. Reject a request if its webhook-timestamp is more than 5 minutes from the current time. This prevents replay attacks. The SDK verifiers apply this limit automatically.Test your endpoint
- Send a test event. In the dashboard, open the menu of the webhook and select a test event. Or call
POST /api/v1/webhooks/{id}/test. Whop sends a sample payload to your URL and returns the response status and body from your server. - Examine deliveries. Whop keeps each delivery for 30 days: the request, the response code, the response body, and the timing. See the deliveries in the dashboard or with
GET /api/v1/webhooks/{id}/deliveries.
A webhook URL must be reachable from the public internet. Whop rejects
localhost and private-network addresses. For local development, use ngrok or Cloudflare Tunnel to forward a public URL to your machine. Register the tunnel URL.Delivery
Respond with a 2xx status in less than 5 seconds. All other results are failed attempts: a timeout, an error status, or a redirect. Whop doesn’t follow redirects. Whop delivers each event at least one time. The same event can arrive more than one time. Make your handler idempotent. Each retry of a delivery has the samewebhook-id. Store the webhook-id and ignore duplicates.
Whop retries failed deliveries for approximately 3 days. After the first attempt, Whop retries 12 times with increased delays: 30 seconds, 2 minutes, 8 minutes, 30 minutes, 1 hour, 3 hours, 6 hours, and then each 12 hours. The full schedule is approximately 71 hours.
The sequence of deliveries isn’t guaranteed. A newer event can arrive before an older event. Process each event independently. If the sequence is important, read the current state from the API.
Whop disables endpoints that continue to fail. If all deliveries to your endpoint fail for 24 hours, Whop sends a warning email to your company. If the failures continue for 72 hours and 10 or more deliveries failed, Whop disables the webhook and sends a second email. To enable the webhook again, use the dashboard or send PATCH /api/v1/webhooks/{id} with "enabled": true. This resets the failure history. Whop doesn’t send the events that occurred while the webhook was turned off. Read the API to find the data that you missed.
Troubleshoot webhook delivery
Fix signature failures, retries, duplicate events, and local tunnel issues.
Events and versions
Two version fields control the data that your endpoint receives:api_version— the envelope format. Usev1. This page describes onlyv1. The legacy formatsv2andv5exist for old integrations and don’t use Standard Webhooks signatures. Don’t use them for new integrations.api_version_date— the dated API version that sets the shape ofdataand of the envelope itself (for example, pins from2026-08-14carryaccount_idwhere older pins carrycompany_id). It operates the same as theApi-Version-Dateheader on REST reads. Set it when you create a webhook with the API. Then the payload shape stays stable when the API changes. Webhooks without a pin keep their initial payload and envelope shape. Exception: resources that exist only on the current API (cards, plans, transfers, swaps, deposits, exports) always receive the latestdatashape — the envelope still follows the pin.
resource.action. Each event in the table links to a reference page with the payload schema:
Next steps
Accept payments
Use
payment.succeeded webhooks with checkout to fulfill orders.Save payment methods
Use setup intents and webhooks to charge customers later.
API walkthrough
See how webhooks operate with checkout, transfers, and KYC.
Webhooks API reference
All endpoints and fields: create, update, test, deliveries.

