Skip to main content
Webhooks push payment events to your server over HTTPS. Each request is signed with HMAC-SHA256 so you can confirm it came from Payoes.

Events

Pick the events you need per endpoint under Developers → Webhooks.

Create an endpoint

In Developers → Webhooks, add:
  • URL — your HTTPS endpoint (e.g. https://api.example.com/webhooks/payoes)
  • Events — which events to receive
  • Signing secret — generated on creation (whsec_...)
Copy the signing secret when it is shown. After that you only get a masked preview. Use Rotate secret to issue a new one.

Payload

Payoes sends a POST with a JSON body:

Headers

Verify the signature

Payoes signs {timestamp}.{raw_body} with your webhook secret. The digest appears in Payoes-Signature as v1=<hex>.
Verify the signature before you trust the payload. Use the raw request body as received — parsing and re-serializing JSON will break verification.
Reject timestamps more than five minutes old.

Node.js

Next.js App Router

Python (Flask)

Test events

Click Send test event on a webhook in the dashboard. Payoes delivers a webhook.test payload with sample payment data (metadata.payoes_test = "true"). It shows up in delivery logs the same way as live events.

Retries

If your endpoint returns a non-2xx status or times out, Payoes retries up to five times: A failed delivery stays pending until the next attempt. After the fifth failure it moves to failed. You can also hit Retry in the dashboard delivery log. Return 2xx as soon as you’ve accepted the event. Queue any slow work — Payoes will retry if your handler is slow or errors.

Delivery logs

On the webhook detail page you can inspect each delivery:
  • Delivery ID (Payoes-Delivery-ID)
  • Event, status, and HTTP response code
  • Attempt count and next retry time
  • Request payload, response body, and last error

Troubleshooting