When a customer paid you via a gateway (Paystack bank transfer, Paystack QR, card on file, etc.), you can now push a refund back to that same card as part of the Customer Journal entry — no manual cash handover, no separate transfer, no phone call to the bank. The accounting entry + credit note printout you're used to still happens. The refund and the accounting stay in lockstep.
Before you start
- The original payment must have gone through a supported gateway (today: Paystack). Card-on-terminal charges (Moniepoint / Opay / Squad) can only be refunded at the physical terminal by the customer re-presenting their card — the option won't appear for those.
- You must have both Journal Entries and Returns Processing permission. Users with only Journal Entries can post the accounting side but won't see the gateway-refund toggle.
- The refund is applied to the same card the customer originally paid with. Paystack settles the refund automatically — no bank details are needed from the customer.
Steps
-
Open Sales → Customer Journal and click New entry (or open the Refund flow from a folio in credit — same form).
-
Pick the customer + set Action = Debit Customer. This tells the system money is leaving the till toward the customer.
-
Enter the Amount to refund + the Contra Account (typically the bank the gateway settles into).
-
If the customer has any refundable gateway charges on file, a green banner appears:
✅ Also refund via the original card This customer has 1 refundable gateway charge on file (Paystack · ₦40,000.00 available). When checked, we'll push the refund back to the original card via the provider BEFORE posting this journal.
-
Tick the Also refund via the original card checkbox.
- If the customer has ONE refundable charge, it's auto-picked.
- If they have MULTIPLE, pick which one to refund from (usually the most recent).
-
Click Save.
- System calls the gateway's refund API with your amount + reason (from the Note field).
- On success, the intent's remaining refundable balance is updated + the journal entry is posted, linked to that intent for audit.
- On failure (network glitch, gateway rejection), you get a clear error — the journal is NOT posted, so accounting and gateway stay in sync. Try again or uncheck the box to fall back to manual refund.
Tips
- Partial refunds are supported. Amount can be less than the original charge; the intent tracks a running total.
- Refunds take time to reach the customer's bank. Paystack accepts the refund immediately (you'll see a "success" or "pending" status), but the customer's card issuer typically settles within 3–7 business days. The green toast tells you which state Paystack returned.
- The credit note PDF print you're used to still generates from the journal entry — nothing changes there. Auditors can trace back to the specific gateway charge via
ModuleName='PosPaymentIntent'+ModuleIDon the journal row. - The Ref Document field auto-fills with the provider's refund reference (e.g. Paystack
REF_...) if you didn't type one yourself.
Common problems
- No green banner appears → the customer has no Confirmed gateway charges on file OR their prior charges are already fully refunded. You can still post a manual (accounting-only) Customer Journal entry.
- "Provider doesn't support API refunds" → the source charge was via Moniepoint / Opay / Squad (terminal). Those need the customer to re-present their card at the physical terminal — record the manual refund via this form WITHOUT the toggle checked.
- "Refund amount exceeds available" → you're trying to refund more than the picked charge has left. Either pick a different (larger) charge from the list, or reduce Amount, or split into multiple journal entries against multiple charges.
- "Gateway rejected the refund" → the provider said no (very rare — usually because the original charge is too old or has already been settled from their side). Journal was NOT posted. Fall back to manual refund by unchecking the toggle.
- Refund succeeded but journal failed to save → the provider has already taken money from your bank; the accounting is out of sync. Contact support with the intent ID + refund reference shown in the toast — they'll help you post the journal by hand.