When webhooks fire
| Event | Fired when |
|---|---|
approved | Order completes and points are settled |
authorized | Funds authorised (auth+capture PSPs) |
captured | Previously authorised funds captured |
cancelled | Order cancelled |
completed | Replacing order completed via POST /orders/{uuid}/complete |
refunded | Full or partial refund processed |
auto_refunded | Internal automatic reversal performed by Points |
shipping_status_updated | Shipping status changed via POST /orders/{uuid}/status |
Delivery mechanics
- Transport — HTTPS POST,
Content-Type: application/json. - Timeout — 10 seconds per attempt.
- Retries — up to 3 attempts on transient failure (non-2xx response, network error, timeout).
- Delivery order — not guaranteed. Your handler must be idempotent (see below).
- Headers:
| Header | Value |
|---|---|
Content-Type | application/json |
X-Webhook-Secret | The secret you registered with the webhook (use this to verify authenticity) |
X-Webhook-Event | Event name (e.g. approved). Same value as event in the body. |
Payload shape
Every event has the same envelope:order (e.g. status + status_label for shipping_status_updated). See Webhook events for per-event fields.
Register a webhook
Use the API, or the dashboard (Settings → Webhooks). Example:Multiple endpoints
You can register more than one webhook per merchant. Common reasons:- Separate environments (staging vs production).
- Separate downstream consumers (fulfilment, analytics, CRM).
- A “dead-letter inspector” endpoint that only logs for audit.
Idempotency is non-negotiable
Points may deliver the same(order.id, event) pair more than once — retry loops, backend replays, network blips. Design your handler so repeat deliveries are safe:
Return fast, process later
Your endpoint must respond 2xx within the 10-second timeout budget. Anything slower triggers a retry, which leads to duplicates. The standard pattern:Local development
Webhooks need a publicly reachable HTTPS URL. In local dev, tunnel your laptop to the internet:- ngrok —
ngrok http 3000 - Cloudflare Tunnel —
cloudflared tunnel --url http://localhost:3000 - localtunnel —
lt --port 3000
Next
Webhook events
Per-event payload schemas and sample bodies.
Webhook handling
Verify signatures, acknowledge correctly, handle retries.
Webhook management
CRUD operations via API or dashboard.

