Total Webhooks
Total number of webhook endpoints configured.
The Webhooks page (/webhooks) lets you configure HTTP endpoints that receive real-time notifications when events occur in your merchant network. Instead of polling the API for changes, webhooks push data to your systems as events happen.
When you have at least one webhook, three summary cards appear at the top of the page:
Total Webhooks
Total number of webhook endpoints configured.
Active
Webhooks currently operating normally (shown in green).
Failing
Webhooks that have experienced recent delivery failures (shown in amber).
Each configured webhook is displayed as a card showing:
| Element | Description |
|---|---|
| URL | The endpoint URL where events are sent |
| Status | Current status: ACTIVE, FAILING, or DISABLED |
| Events | The event types this webhook is subscribed to |
| Last Success | Timestamp of the most recent successful delivery |
| Last Failure | Timestamp of the most recent failed delivery (if any) |
| Failure Count | Number of consecutive failures |
| Actions | Test, View History, and Delete buttons |
Open the creation dialog. Click the Add Webhook button in the top-right corner.
Enter the endpoint URL. Provide the HTTPS URL where you want to receive webhook events. This should be a publicly accessible endpoint on your server that can accept POST requests.
Example: https://your-server.com/webhooks/sabibooks
Test the endpoint (recommended). Click the Test Endpoint button to verify that your server is reachable and responding correctly. The test sends a lightweight HTTP request to the URL and reports:
Select events to subscribe to. Choose which events should trigger notifications to this webhook (see Available Events below). You must select at least one event. Subscribe only to the events your system needs to process to minimize unnecessary traffic.
Create. Click Create Webhook to save the configuration. A success message confirms creation.
| Event | Label | When It Fires |
|---|---|---|
merchant.created | Merchant Created | A new merchant registers under your partner account |
merchant.updated | Merchant Updated | A merchant updates their profile or settings |
merchant.suspended | Merchant Suspended | A merchant account is suspended |
sale.completed | Sale Completed | A merchant completes a sale transaction |
sale.voided | Sale Voided | A sale transaction is voided or reversed |
payment.received | Payment Received | A payment is received from a customer |
subscription.changed | Subscription Changed | A merchant changes their subscription plan |
subscription.expired | Subscription Expired | A merchant’s subscription expires |
When an event fires, SabiBooks sends a POST request to your endpoint with a JSON payload:
{ "id": "evt_a1b2c3d4-e5f6-7890-abcd-ef1234567890", "type": "sale.completed", "created_at": "2026-02-20T14:30:00Z", "data": { "sale_id": "sale_f8e7d6c5-b4a3-2190-fedc-ba0987654321", "merchant_id": "mer_1a2b3c4d-5e6f-7890-abcd-ef1234567890", "business_name": "Mama Chidi Provisions", "amount": 150000.00, "currency": "NGN", "payment_method": "pos_terminal", "customer_phone": "+2348012345678", "items_count": 5 }}Each delivery includes a signature header for verification. See Webhook Best Practices for details on signature verification.
After a webhook has been created, you can send a test ping to verify it is still working:
Test pings are useful for:
To see the history of event deliveries for a specific webhook:
Each delivery entry shows:
| Field | Description |
|---|---|
| Event Type | The type of event that was sent (e.g., sale.completed) |
| Status | Delivery result: SUCCESS, FAILED, or PENDING |
| HTTP Status | The HTTP response code returned by your server (e.g., 200, 500, timeout) |
| Latency | How long it took your server to respond (in milliseconds) |
| Error Message | Description of the failure (for failed deliveries only) |
| Timestamp | When the delivery attempt occurred |
If a delivery failed, you can retry it:
Retries are useful when failures were caused by temporary issues (e.g., server maintenance, brief network outages).
| Status | Meaning | Action Needed |
|---|---|---|
| ACTIVE | Operating normally. Recent deliveries have succeeded. | No action needed. |
| FAILING | Recent deliveries have failed. The endpoint may be unreachable or returning errors. | Investigate your endpoint. Check server logs, verify the URL is correct, and use the Test button to diagnose. |
| DISABLED | Disabled either manually or after repeated failures. | Review and fix the underlying issue, then re-enable or recreate the webhook. |
Use HTTPS endpoints. Always use HTTPS (not HTTP) for your webhook URLs to ensure event data is encrypted in transit.
Respond quickly. Your endpoint should return a 2xx response within a few seconds. Do any heavy processing asynchronously after acknowledging receipt.
Handle duplicates. In rare cases, the same event may be delivered more than once. Design your handler to be idempotent — processing the same event twice should produce the same result.
Verify webhook signatures. Each webhook delivery includes a signature header. Verify this signature using your webhook secret to ensure the request genuinely came from SabiBooks.
Subscribe selectively. Only subscribe to the events you actually need. High-volume events like sale.completed can generate significant traffic for large merchant networks.
Monitor the Failing count. If a webhook enters FAILING status, investigate promptly. Persistent failures may indicate infrastructure issues on your end.
Test after deployments. When you update your webhook handler code, use the Test button to verify the endpoint still works correctly.
Log webhook payloads. Store received webhook data for debugging and auditing purposes.
| Problem | Possible Cause | Solution |
|---|---|---|
| Webhook status is FAILING | Endpoint is unreachable or returning errors | Use the Test button to diagnose. Check server logs, firewall rules, and URL accuracy. |
| Events not being received | Wrong events selected or webhook is disabled | Verify the event subscriptions on the webhook card. Check that the webhook status is ACTIVE. |
| Test endpoint fails | Endpoint requires authentication or has CORS issues | Ensure your endpoint accepts unauthenticated POST requests (use webhook signature verification instead). |
| Duplicate events received | Retry caused re-delivery | Design your handler to be idempotent using the event ID as a deduplication key. |
| Cannot create webhook | Insufficient permissions | Only users with the PARTNER_ADMIN role can manage webhooks. See Roles and Permissions. |
| High latency warnings | Server processing too slow | Return a 2xx response immediately and process the payload asynchronously. |