# Refunds

Pro Feature

Issuing refunds from the POS requires [WCPOS Pro](/getting-started/pro-license.md). Without Pro, you can still process refunds from `WP Admin → WooCommerce → Orders` using WooCommerce's built‑in refund interface.

WCPOS lets you refund a WooCommerce order without leaving the register. You can issue a full or partial refund, send the funds back to the original payment method (when the gateway supports it), or record a cash refund from the till — and the refund is tagged with the cashier and store that processed it for reporting.

<!-- -->

## Starting a Refund[​](#starting-a-refund "Direct link to Starting a Refund")

There are two ways to open the refund form:

1. **From the Orders list** — find the order, click the three‑dot menu () in the actions column, and select **Refund**.
2. **From the order view modal** — open the order, then click the **Refund** button in the footer next to **Print Receipt** and **Cancel**.

Both routes open the same **Refund Order #<!-- -->{number}** modal.

### When the Refund Action Appears[​](#when-the-refund-action-appears "Direct link to When the Refund Action Appears")

**Refund** is only offered for orders with the following statuses:

* **Completed**
* **Processing**
* **On hold**

It does **not** appear on `Pending`, `Cancelled`, `Failed`, `POS – Open`, or already fully‑`Refunded` orders. To refund an already fully‑refunded order, or to refund an order in a status not listed above, use `WP Admin → WooCommerce → Orders`.

## The Refund Form[​](#the-refund-form "Direct link to The Refund Form")

At the top of the modal you'll see two figures:

* **Total** — the order total.
* **Previously Refunded** — the sum of any refunds already issued against this order (shown as a negative amount). Only appears when there is at least one prior refund.

Below that is the line items table:

| Column            | What it shows                                                                       |
| ----------------- | ----------------------------------------------------------------------------------- |
| **Product**       | The line item name                                                                  |
| **Price**         | Unit price (tax‑inclusive or tax‑exclusive, depending on your store setting)        |
| **Qty**           | The remaining refundable quantity (purchased qty minus any previously refunded qty) |
| **Refund Qty**    | Editable — how many units of this line you want to refund now                       |
| **Refund Amount** | Auto‑calculated from Refund Qty × unit price, including the line's prorated tax     |

Below the table:

* **Custom Amount** — an optional extra amount to add to the refund (for example, refunding a fee that isn't tied to a specific line item). Leave it blank if you don't need it.
* **Reason** — an optional note that's saved on the refund record and appears in WooCommerce's order notes.
* **Refund destination** — a radio group (see below).
* **Refund Total** — the grand total of the refund, recalculated live as you type.

### Refunding Whole vs. Partial Quantities[​](#refunding-whole-vs-partial-quantities "Direct link to Refunding Whole vs. Partial Quantities")

There's no separate "full refund" mode — set the Refund Qty for every line to its full remaining quantity to refund the whole order, or set it on just one or two lines for a partial refund. The **Process Refund** button is disabled until **Refund Total** is greater than zero and within the remaining refundable amount.

## Refund Destination[​](#refund-destination "Direct link to Refund Destination")

For orders paid with anything other than the built‑in **POS Cash** gateway, the form asks where the refund should go:

* **Refund to *(gateway name)*** — the gateway processes the refund through its own provider API. For Stripe Terminal this returns the funds to the original card; for Vipps MobilePay it issues a Vipps refund; and so on. This option only appears for gateways that advertise refund support to the POS — if your gateway doesn't, the option is disabled with the message *"Original payment method refunds are unavailable for this order."*
* **Refund via cash** — record the refund as cash returned from the till, regardless of how the order was originally paid. The cashier physically hands the money over; WooCommerce records the refund but does not call any gateway.

For orders paid with **POS Cash**, the radio group is hidden — cash is the only sensible destination, so it's used automatically.

If WCPOS can't reach the gateway to check refund support, you'll see *"Couldn't verify original payment method refunds. Cash refunds are still available."* — you can still issue a cash refund.

### When to Use Cash vs. Original Method[​](#when-to-use-cash-vs-original-method "Direct link to When to Use Cash vs. Original Method")

| Situation                                                                                                | Recommended destination                                               |
| -------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------- |
| Card payment via Stripe Terminal / Vipps / etc., customer present and wants the money back on their card | **Refund to *(gateway)***                                             |
| Card payment but customer prefers cash back (and you're allowed to do that)                              | **Refund via cash**                                                   |
| Cash sale                                                                                                | **Refund via cash** (automatic; no choice shown)                      |
| Manual card terminal (the gateway can't refund automatically)                                            | **Refund via cash**, then refund manually on your standalone terminal |

## Confirming and Submitting[​](#confirming-and-submitting "Direct link to Confirming and Submitting")

When you press **Process Refund**, a confirmation dialog asks *"Refund *(amount)* for Order #*(number)*?"*. Confirming triggers the refund:

1. WCPOS sends the refund to your WooCommerce store.
2. For gateway refunds, WooCommerce hands off to the gateway plugin to process the refund against the provider (Stripe, Vipps, etc.).
3. The order is refreshed locally so the new refund appears immediately.
4. A success toast confirms *"Refund of *(amount)* processed"*.

If the gateway rejects the refund (declined card, expired authorization, network error, etc.), an error toast shows the gateway's message. The refund won't be recorded in WooCommerce in that case — you can adjust the form and try again, or fall back to a cash refund.

## After the Refund[​](#after-the-refund "Direct link to After the Refund")

* **Partial refund** — the order keeps its existing status (Completed, etc.), and the order view modal shows a **Partially refunded** pill plus a `−(amount) refund` line in the hero subtitle.
* **Full refund** — WooCommerce sets the order status to **Refunded**.
* **Receipts** — when viewing the receipt for a refunded order, switching to **Live** mode shows the refund reflected in the totals (`Refunded -X` and `Net Total Y` rows on detailed receipts). **Fiscal** mode still shows the original payment‑complete snapshot, untouched — that's what fiscal mode is for.
* **Cashier and store audit** — every POS refund is tagged with the cashier (`_pos_user`) and store (`_pos_store`) that issued it, so refunds appear under the right cashier and store in reporting.

## Things to Know[​](#things-to-know "Direct link to Things to Know")

* **Coupons + refunds:** orders that used a coupon can still be refunded from the POS, but if you need to adjust how the coupon is recalculated against the refund, use `WP Admin → WooCommerce → Orders`.
* **Negative quantities are not supported.** Older versions (v0.4.x) let you add a line with a negative quantity to record a return — this no longer works in v1.x. Use the Refund flow instead.
* **Refunds require a server connection.** Unlike checkout, you can't queue a refund offline — the gateway and your store both need to be reachable.
* **Issuing additional refunds on a fully‑refunded order** must be done from `WP Admin → WooCommerce → Orders`.

## Related Documentation[​](#related-documentation "Direct link to Related Documentation")

[OrdersFind, filter, and manage your POS orders](/orders/.md)

[Payment GatewaysWhich gateways support refunds back to the original method](/payment/.md)

[ReceiptsFiscal vs. live receipts on refunded orders](/receipts/at-checkout.md)
