Skip to main content
Webhooks are how your server learns that money arrived. They’re the only signal you should fulfil orders from.
Browser callbacks fire only if the customer’s tab is still open. Webhooks arrive regardless. Fulfil from webhooks.

Set up

Build an endpoint

A public HTTPS URL that accepts POST and responds 2xx quickly.

Register it

Settings → Webhooks in the dashboard. Add the URL and copy the signing secret.

Verify every delivery

Reject anything that fails. Signatures.

Test it

Use Send test event, then make a real testnet payment.
Localhost, private IP ranges, and cloud metadata addresses are rejected. Use a tunnel like ngrok for local development.

The payload

Every webhook has the same envelope:
string
Stable per transition. Use it as your idempotency key.
string
The event type. Full list.
string
ISO 8601 timestamp.
object
Event-specific payload.

Headers

A correct handler

Three rules in that snippet, all of which matter:

Raw body

Parsing and re-serialising changes the bytes and breaks the signature.

Verify first

Before parsing, before touching your database.

Acknowledge fast

We time out at 10 seconds. Do slow work in a queue.

Signature verification in detail

With replay protection and language examples.