Sales and invoicing

Refund a customer via the original card (gateway refund)

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

  1. Open Sales → Customer Journal and click New entry (or open the Refund flow from a folio in credit — same form).

  2. Pick the customer + set Action = Debit Customer. This tells the system money is leaving the till toward the customer.

  3. Enter the Amount to refund + the Contra Account (typically the bank the gateway settles into).

  4. 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.

  5. 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).
  6. 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' + ModuleID on 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.

See it working on your own business

Start a 45-day free trial — no card needed — and follow this guide in your own practice company.