Webhooks Overview
A55 sends an HTTP POST webhook to your webhook_url whenever a charge status changes, giving you real-time visibility into payments.
Why webhooks
| Aspect | Webhooks (push) | Polling (pull) |
|---|---|---|
| Latency | Seconds | Minutes (depends on poll interval) |
| Reliability | Guaranteed delivery with retries | Events missed between intervals |
| Server load | Event-driven, minimal | Constant requests regardless of activity |
Configuration
Set webhook_url on each charge request, or configure a default URL in the A55 dashboard.
| Setting | Description |
|---|---|
Per-charge webhook_url | Set on each charge request — receives events only for that charge |
| Default URL | Configured in the A55 dashboard — used when webhook_url is omitted |
| Property | Value |
|---|---|
| Method | POST |
| Content-Type | application/json |
| Timeout | 30 seconds |
| TLS | HTTPS required |
Retry policy
Failed deliveries are retried with exponential backoff over 24 hours:
| Attempt | Delay | Cumulative time |
|---|---|---|
| 1 | Immediate | T+0 |
| 2 | 1 minute | T+1m |
| 3 | 5 minutes | T+6m |
| 4 | 30 minutes | T+36m |
| 5 | 2 hours | T+2h 36m |
| 6 | 6 hours | T+8h 36m |
| 7 | 24 hours | T+32h 36m |
After 7 failed attempts, the event is marked as failed in the dashboard.
| Response | Retried? |
|---|---|
2xx | No — delivered successfully |
4xx | No — permanent client error |
5xx | Yes — transient server error |
| Timeout (>30 s) | Yes |
| Connection refused | Yes |
Idempotency
Webhooks use at-least-once delivery. The same event may arrive more than once. Your handler must be idempotent — deduplicate by charge_uuid.
Respond quickly
Return 200 OK immediately after receiving the webhook. Process the event in a background job to avoid timeouts and duplicate deliveries.
Testing
| Tool | Usage |
|---|---|
| webhook.site | Inspect payloads without running a server |
| ngrok | Expose local server for live sandbox webhooks |
| A55 sandbox | Send real test events from the sandbox environment |