1
Set your webhook URL and copy your signing secret
In your Soap Dashboard, go to Developers and set the URL where Soap should send webhook events. Then copy your webhook signing secret (format
wss_...) — you’ll need it to verify signatures.2
Enable the events you need
4 events are always sent and require no action:
checkout.succeeded, checkout.hold, checkout.release_hold, and checkout.returned.The other 8 events are off by default and must be explicitly enabled in Dashboard → Developers before Soap will ever deliver them:checkout.pendingcheckout.failedcheckout.voidedcheckout.expiredcheckout.terminally_failedcheckout.review.createdcheckout.review.approvedcheckout.review.declined
3
Expose localhost for local development
Soap’s servers can’t reach Point your dashboard webhook URL at the resulting
localhost directly. Use a tunneling tool such as ngrok to expose your local dev server:https://*.ngrok.io (or ngrok-free.app) URL plus your webhook path, e.g. https://abcd1234.ngrok.io/webhooks/soap. Update it again if the tunnel URL changes.4
Build an endpoint that reads the raw body, verifies, and responds quickly
Your endpoint must:
- Read the raw request body — not a body that’s already been parsed into an object and would need to be re-serialized. See the raw body warning in the Webhooks Overview.
- Verify the
SOAP-WEBHOOK-SIGNATUREheader against that raw body. - Return a
2xxstatus quickly — before doing slow work like calling other APIs or waiting on a database transaction. - Do any slow processing asynchronously, after responding, e.g. by enqueueing a background job.
event_id as an idempotency key.5
Handle checkout.hold specially
checkout.hold is the one event where your response status changes what Soap does next:- Respond
2xxto indicate the customer has sufficient available funds — the withdrawal proceeds. - Respond non-
2xxto indicate the customer has insufficient funds — the withdrawal does not proceed.
checkout.hold is delivered synchronously and is not retried, so this check needs to complete within the 10 second timeout. See checkout.hold for details.Minimal Express Handler
Testing Your Handler
There is currently no “send test webhook” button in the dashboard. To exercise your handler end-to-end, complete a real checkout against the sandbox:- Point your webhook URL at your local tunnel (see above).
- Create a sandbox checkout and complete it with the test card
4111-1111-1111-1111and CVV999(see Testing for other sandbox test methods). - Watch your endpoint receive the resulting
checkout.succeeded(and, for withdrawals,checkout.hold) delivery.
checkout.failed.
