A customer returned an order and you promised them their money back. You opened the order in WooCommerce, clicked Refund, and either got an error, or the order now says “Refunded” and the customer insists nothing has arrived. They are emailing every day, and you are not sure whether the problem is your website, the payment gateway or their bank.
A WooCommerce refund not processing is rarely a mystery once you know where it is stuck, so that is the first job. A refund passes through three separate hands: your store, the payment gateway and the customer’s bank. Each one can hold it up for different reasons, and each leaves different evidence. This post walks through all three, then covers cash on delivery orders, partial refunds and what to tell the customer while you sort it out.
The two refund buttons, and why they matter
On the order screen, after you click Refund and enter the items or amount, WooCommerce can show two buttons:
- Refund via the gateway, with the gateway’s name. This button only appears when the payment plugin used for that order supports automatic refunds. Clicking it asks the gateway to send the money back and records the refund in WooCommerce.
- Refund manually. This records the refund in WooCommerce only. No money moves anywhere. You then have to send the money yourself, through the gateway dashboard, a bank transfer or UPI.
Mixing these up is a common reason a refund looks done in WooCommerce and never reaches the customer. If the order notes show a refund but no message from the gateway confirming it, the refund was probably recorded manually and the money is still with you.
Stage one: the refund never left WooCommerce
Symptoms
There is no “via gateway” button, only “Refund manually”. Or you click the gateway button and get an error, and no refund is added to the order.
Likely causes, in order
- The gateway plugin does not support refunds from WooCommerce. Some do, some do not, and some only support them for certain payment methods. The plugin’s own documentation says which.
- The plugin that took the payment is no longer active. If you switched gateways, or deactivated the old plugin, WooCommerce cannot ask the old gateway to refund older orders. You will need to refund those from the old gateway’s dashboard.
- Test and live keys are mixed up. An order paid in live mode cannot be refunded using test keys, and the other way round. This often follows a site migration or a staging copy being pushed to live.
- The API keys lack permission or have expired. Some gateways let you create keys with limited rights. A key that can take payments may not be allowed to issue refunds. Regenerating keys in the gateway dashboard without updating WooCommerce also breaks refunds.
- The order has no transaction ID. Open the order and look for the gateway’s transaction or payment ID. If it is missing, the gateway has nothing to refund against, usually because the payment was never properly confirmed back to the store.
Where to look
The order notes and WooCommerce > Status > Logs, filtered to your gateway’s log source if it writes one. Gateway plugins often record the exact response from the gateway, which turns a vague failure into something specific like an authentication error.
Stage two: the gateway received it but did not process it
Symptoms
WooCommerce shows the refund and a note from the gateway, but the gateway dashboard shows the refund as pending, failed or not there at all.
What to check
- The refund’s status in the gateway dashboard. Find the original payment there and look at its refund history. The dashboard shows whether the refund was accepted, is queued or was rejected, and usually why.
- Account-level conditions. Gateways can hold refunds because of something about your merchant account rather than this order. Only the gateway can explain these, so raise a ticket quoting the payment ID.
- Refunds started outside WooCommerce. If someone refunded directly in the gateway dashboard, some gateway plugins pass that back to WooCommerce automatically and some do not. The money may have gone back even though WooCommerce still shows the order as paid.
Before trying again, make sure the first attempt has definitely failed. Clicking Refund twice can, in the wrong circumstances, refund twice.
Stage three: the gateway processed it, the customer has not seen it
This is often where things stand when a customer writes to you, and from their side it looks exactly like a WooCommerce refund not processing at all. The gateway has sent the money; their bank has not shown it yet.
Card refunds and UPI refunds each take their own time to appear, and that time is set by the gateway, the card network and the customer’s bank, not by your website. Your gateway’s help pages state the current timelines they expect; quote those rather than guessing. The details of when gateway money moves between accounts are covered in our post on when gateway payments reach your bank.
What helps most here is a reference. Gateway dashboards usually show a refund reference for each processed refund. For card payments this is often a number the customer’s bank can use to trace the refund. Send it to the customer and suggest they quote it to their bank if the money has not appeared after the gateway’s stated timeline.
A different situation: payment failed but money was taken
Sometimes the order never completed, the customer was charged anyway, and they are asking for a refund of an order you cannot see as paid. That is a failed transaction rather than a refund, and it usually reverses through the bank or gateway without you issuing anything. Our guide to payment failed but money deducted explains what happens in that case.
Cash on delivery and bank transfer orders
There is no gateway behind a cash on delivery or direct bank transfer order, so WooCommerce cannot send the money back. Only “Refund manually” is possible. The steps are:
- Agree with the customer how they want the money: UPI, bank transfer or store credit.
- Send it from your bank or UPI app and note the transaction reference.
- Record the refund manually in WooCommerce, and add an order note with the reference and the date.
That last note is what saves you when the customer, or your accountant, asks months later.
One more point on cash on delivery returns: decide in advance whether you refund the delivery charge, and say so on your returns page. Customers who paid in cash at the door often expect the whole amount back, and a refund that arrives short, with no explanation, reads as a mistake. If you deduct anything, tell the customer the amount and the reason before you send the money, not after.
Partial refunds and what they do to the order
A full refund changes the order status to Refunded. A partial refund, such as one item from three, or a shipping charge returned, leaves the status as it was and lists the refund on the order. That is normal. If you expected the order to show as Refunded after a partial refund, nothing is broken.
On the refund form, the “Restock refunded items” option decides whether the returned items go back into stock. Leaving it unticked for a product you have actually received back means your stock will read low. If stock has already drifted for this reason, our post on stock counts that stop matching orders explains how to correct it.
A quick way to tell where your WooCommerce refund is stuck
| WooCommerce shows | Gateway shows | Where it is stuck |
|---|---|---|
| No refund | No refund | Your store: button missing or error |
| Refund, no gateway note | No refund | Recorded manually, money not sent |
| Refund with gateway note | Pending or failed | The gateway |
| Refund with gateway note | Processed | The customer’s bank |
| Still paid | Refunded | Refunded outside WooCommerce, not synced back |
What to tell the customer
Customers waiting for money mostly want to know that someone is on it. A short reply covering three things works well: the refund has been issued, or is being checked, on a stated date; the amount; and the reference number once you have it. Avoid promising a date the bank controls. Say what the gateway’s published timeline is and offer to chase it with them if it passes.
Keeping refunds clean from now on
- Issue refunds from the order screen whenever the gateway supports it, so WooCommerce and the gateway agree.
- When you change gateways, disable the old one at checkout but keep its plugin installed until its orders are past your return window. Test one refund through it first; if that fails, plan to refund those orders from the old gateway’s dashboard.
- After a migration or a key change, refund a small test order to prove refunds still work.
- Note every manual refund’s reference in the order notes.
Checking that refunds still work after updates and key changes is the sort of thing that falls through the cracks unless it is part of regular online store maintenance, because nobody tests a refund until a customer needs one.
If the refund error comes from the gateway connection itself, our page on fixing payment gateway errors covers what to check when the connection between WooCommerce and the gateway is the fault.