Delivery Format
Each webhook delivery is an HTTP POST request with the following headers:Payload Structure
Success Criteria
A delivery is considered successful when your endpoint returns any HTTP status code in the 2xx range (200–299).Timeouts
paywise waits up to 30 seconds for a response. If your endpoint does not respond within this window, the delivery is marked as failed and may be retried. Redirects are not followed — your endpoint must return a 2xx response directly.Retry Logic
Failed deliveries are automatically retried with exponential backoff:
After 3 failed retry attempts, the delivery is permanently marked as
failed.
Delivery Statuses
Auto-Disable
Webhook endpoints track the number of consecutive failures across all deliveries. When the failure count reaches the configured threshold (default: 50), the endpoint is automatically disabled.- Disabled endpoints stop receiving events entirely
- Re-enabling an endpoint (via API or dashboard) resets the failure counter to 0
- You can configure the threshold via the
max_consecutive_failuresfield (1–1000)
A single successful delivery resets the consecutive failure counter to 0. The auto-disable only triggers after an unbroken streak of failures.
Idempotency
Each delivery includes a uniqueidempotency_key derived from the webhook endpoint, event type, and timestamp. If you receive a delivery with the same idempotency key twice (which should be rare), you can safely skip the duplicate.
The delivery ID is also sent in the X-Paywise-Delivery-ID header for tracking purposes.
Best Practices
- Respond quickly — Return HTTP 200 immediately and process events asynchronously
- Verify signatures — Always validate the
X-Paywise-Signatureheader before processing - Handle duplicates — Use the delivery ID or idempotency key to detect and skip duplicates
- Monitor failures — Check your endpoint’s failure count regularly via the API or dashboard
- Use test mode — Verify your integration using test events before subscribing to production events
