The Refunds section lets you manage and send refunds for your transactions. You can start full or partial refunds directly from the payment details view, with built-in rules that keep every refund compliant and protect you from mistakes.
Initiate refund
You can start two kinds of refund from the payment details page (Transactions → Payments, open a successful payment):
- Full refund — sends the entire remaining payment amount back to the customer.
- Partial refund — sends only the amount you choose. Partial refunds can be repeated until the original payment is fully returned.
Click Initiate refund to begin. The refund only proceeds if every refund rule below is met — the same rules are checked again on our servers when you confirm.
Details required for a refund
| Field | Type | Description |
|---|---|---|
Refund amount | required | How much to send back. For a partial refund, enter the exact amount. The system never lets you refund more than the original payment. |
Refund reason | optional | Recorded on the refund and shown on the customer receipt, so keep it clear and customer-friendly. |
Refund rules
- The payment must have been successful and settled. Pending, failed, reversed and corrected payments cannot be refunded.
- Refunds (full or partial) must be started within 30 days of the transaction. After that the refund option closes — contact support for anything older.
- Refunds go back to the original payment method — the exact mobile money wallet the customer paid with. Card or bank-funded payments need a manual refund via support.
- Your available balance must cover the refund plus the refund charge.
- Only the business owner can issue refunds. Team admins see refund history read-only.
If any rule is violated the refund is denied with a specific reason. Reach out to support if you need help with a payment that falls outside these rules.
Refund status
Track each refund through these status indicators:
| Field | Type | Description |
|---|---|---|
succeeded | status | The refund was processed and the customer received the money. |
pending | status | Accepted and about to be sent to the rail. |
processing | status | Handed to the rail. The outcome always comes from a verified status check, never the rail acknowledgement. |
review | status | Held for a quick Web Rabbit review before anything is sent. Possible reasons: risk or compliance check, daily refund count cap (25 by default) or daily value cap (GHS 5,000 by default) exceeded, or refunds on hold for AML/fraud reasons. |
failed | status | The refund could not be processed. Possible reasons: insufficient balance in your wallet, the rail declined the transfer, or a network issue. Nothing left your balance. |
cancelled | status | Cancelled during review or by a concurrency guard when two refunds raced for the same payment. |
Refunds page
The Refunds page (Transactions → Refunds) lists every refund in the mode you are viewing — test and live refunds are never mixed:
- Search by refund ID, associated payment ID, destination number or reason.
- Filter by status (successful, processing, in review, failed).
- The Associated payment column links each refund to its original payment — open it from Transactions → Payments for the full details.
- Each successful refund shows whether the customer receipt was sent by email, SMS, or both.
- Export CSV downloads the visible (filtered) rows for your records or accounting.
Refund receipt
When a refund succeeds, a refund receipt is sent to the customer automatically:
- Email — sent whenever the original payment captured a customer email address (checkout and collections both support this). No setup needed.
- SMS — optional. Turn on SMS refund receipts in Messaging → Settings → Defaults and the customer gets a text on the wallet they paid with. Charged to your messaging balance at the normal destination rate; if the balance is too low the SMS is skipped and the refund is never held up.
The receipt includes:
- Refund ID — the unique reference for the refund.
- Refund amount — the amount returned to the customer.
- Refund date — when the refund was processed.
- Refund method — the original wallet and network.
- Refund status — successful.
- Refund reason — the reason you entered when starting the refund.
Test mode simulates receipts without sending real email or SMS, so you can rehearse the full flow safely.
Fees
The platform commission on the original payment is not returned. A flat refund charge (GHS 2 by default) is taken from your balance per refund. Your balance is reduced by the refund amount plus that charge.
The 30-day window
The window runs for 30 days from the moment the payment settled, counted to the second, and applies in test mode exactly as it does in live mode. A refund that was started inside the window keeps processing even if it completes later, and a refund parked in review can still be released by Web Rabbit after the 30 days. The limit is a per-merchant setting, so if your business needs a longer window, talk to us.
Webhook events
Three signed events are sent, with the refund nested under data.object like every other event:
{
"id": "evt_...",
"type": "refund.succeeded",
"mode": "live",
"data": {
"object": {
"refund_id": "730114552901",
"transaction_id": "521888807466",
"status": "succeeded",
"type": "partial",
"amount": 40,
"amount_minor": 4000,
"fee_amount": 2,
"currency": "GHS",
"destination": "233240000000",
"network": "MTN",
"reason_code": "success"
},
"resource_type": "refund"
}
}refund.created fires the moment a refund is accepted, refund.succeeded and refund.failed only after a verified provider verdict.
Test mode
Refunds in test mode run entirely on the simulator, capped at GHS 10, and never touch a real rail or move real money. Receipts are simulated too.
