When a buyer disputes a marketplace order or you decide to refund them, the refund passes through Monnify (our payments partner) and lands in the buyer's bank account within minutes to hours. The Orders tab on /admin/marketplace shows each refund's status so you can tell what stage it's at.
The four refund statuses
No refund — the order is paid (or pending), no refund has been initiated yet. This is the default state.
Refund pending — you (or a dispute resolution) triggered a refund and Monnify has accepted the call, but the money hasn't yet landed in the buyer's account. Most refunds clear within 5-60 minutes, but Monnify can take up to T+1 business day in rare cases. You'll see a yellow "Refund pending" pill on the order row.
Refunded — the money has landed in the buyer's account. Confirmed via Monnify webhook (or our hourly reconcile-refunds cron for any webhook that missed). Green "Refunded" pill.
Refund failed — Monnify rejected the refund call (e.g., the original transaction is too old, or the buyer's account is no longer accepting credits). Red "Refund failed" pill with the Monnify reason code. You'll need to take action — typically retry the refund or contact the buyer for an alternative payment method.
When to use the Retry button
Any order in "Refund pending" for more than 24 hours, OR any order in "Refund failed" with a recoverable Monnify error code (most R-series codes), can be retried. Click the "Retry refund" button on the order row.
The retry uses our refund safety guard — if the previous refund was actually accepted by Monnify and is still pending, the retry will be a no-op (we won't double-fire). If the previous refund truly failed, the retry will fire a fresh refund call.
Don't keep mashing Retry — wait at least 5 minutes between attempts. The reconcile cron runs hourly and will catch any pending refund that's been waiting >5 minutes, so most stuck refunds resolve themselves without operator action.
What if a refund stays "Refund failed"?
Look at the Monnify error code on the row. Common codes:
- R2 — "Refunds not permitted for specified transaction" — the original transaction is too old (>180 days), or Monnify's settlement window has closed. Refund manually via bank transfer; record the transfer reference on the dispute note.
- R3 — "Refund amount exceeds original" — almost always means a duplicate-refund attempt where the first one actually went through. Don't retry — verify against Monnify's dashboard before doing anything else.
- R4 — "Buyer's account no longer active" — contact the buyer for a new bank account; refund manually.
For any other error code, contact support@agroyield.africa with the order ID and the Monnify reference.
Why does the Orders tab show "Refund pending" when I just clicked Refund?
Because we don't update the order status to "Refunded" until Monnify confirms via webhook (or our hourly cron polls and confirms). This is intentional — the older behaviour of marking the order "Refunded" the moment the operator clicked the button led to silent failures where Monnify rejected the refund but the UI showed success, and the buyer never got their money back. The "Refund pending" pill is the honest state — money is in flight, not yet landed.
If you've waited 60 minutes and the pill is still pending, click Retry (it's safe — the idempotency guard will not double-fire). If you've waited 24 hours and the pill is still pending, contact support@agroyield.africa with the order ID.
For dispute resolutions
When you resolve a dispute on /admin/marketplace Disputes tab, the resolution can include a refund. If you set the resolution to "Refund buyer" and click Resolve, the same refund flow above fires — same safety guards apply. The Orders tab will show the resulting refund pill on the linked order row.
If you see the Resolve button on a dispute but clicking it does nothing visible, the most likely cause is an admin gate misfire — refresh the page, verify your is_admin flag is true on /admin/members, and try again. If the issue persists, contact support@agroyield.africa.

