Webhooks
Overview
Webhooks let you receive event data from Financely at an HTTPS endpoint you control. Configure them in Integrations → Automations → Webhooks.Available events
| Event | Fired when |
|---|---|
widget.submitted | A visitor completes and submits a widget form |
widget.started | A visitor opens the widget and begins filling it in |
Configuring a webhook
- Go to Integrations → Automations tab
- Click Add webhook
- Enter your endpoint URL (must be HTTPS)
- Select the events you want to receive
- Set the number of retries (0–5) for failed deliveries
- Click Save
Request format
All webhook requests are:- Method:
POST - Content-Type:
application/json - Body: JSON payload (see schemas below)
- Headers: include
X-Financely-Signaturefor verification
Payload schemas
widget.submitted
widget.started
Signature verification
Every request includes anX-Financely-Signature header with the format sha256=<hex_digest>. The digest is an HMAC-SHA256 of the raw request body, keyed with your webhook secret.
Node.js
Python
Retry behaviour
If your endpoint does not respond with a2xx HTTP status code within the timeout, Financely retries the delivery. Retries use a short delay between attempts.
| Setting | Detail |
|---|---|
| Retries | 0–5, configurable per webhook |
| Trigger | Any non-2xx response or connection timeout |
| Behaviour | After all retries are exhausted, the event is dropped |
Your endpoint must return a
2xx response as quickly as possible. For long-running processing, return 200 immediately and process the payload asynchronously.Endpoint requirements
- Must be HTTPS (HTTP endpoints are rejected)
- Must return a 2xx status code
- Must respond within the timeout window
- Should be idempotent — retries may deliver the same event more than once
Troubleshooting
Not receiving any events
Not receiving any events
- Confirm your endpoint is publicly accessible over HTTPS
- Use Send test event in the Automations tab to test delivery manually
- Check that the widget generating submissions is Published
- Verify your endpoint returns a 2xx status code
Signature verification is failing
Signature verification is failing
Make sure you are hashing the raw bytes of the request body, not the parsed JSON. In Express, use
express.raw() middleware. In Flask, use request.get_data().Receiving duplicate events
Receiving duplicate events
Retries can deliver the same event more than once. Make your handler idempotent by checking the
leadId or submittedAt field before processing.