Pro Features
This page describes what the Pro edition adds to ReturnDesk. Everything on it is missing from the Lite edition. The carrier integrations have their own page: Labels and carriers.
Every feature on this page needs the Pro edition. The settings that control them are not shown in Lite.
| Feature | Where to find it |
|---|---|
| Store credit | Resolution "Store credit", checkout, Advanced settings |
| Exchanges for other products and with a price difference (Lite has same-price variation exchanges) | Resolution "Exchange for another item", Rules settings |
| Warranty claims | Resolution "Warranty claim", product Returns tab |
| Guest portal | Shortcode or Return portal block |
| Reports | WooCommerce > Returns reports |
| Fees, shipping rule, automatic approval, country windows, keep-below amount | Rules > Fees, shipping and automation |
| Reminders and automatic closing | Emails and Advanced settings |
| Prepaid labels and tracking | Labels settings |
| Condition grade at inspection | Items panel of the return screen |
| REST API and webhooks | REST API |
Store credit
Store credit is a ledger per customer. Credit goes in when a return is resolved with the Store credit resolution, and out when the customer uses it at checkout.
Issuing credit
When you resolve a return as store credit, the customer gets the refundable amount (the accepted items, capped at what the order can still give back, minus fees) plus the Store credit bonus (%). The bonus is not capped and not refunded money, it is extra credit. When an EU withdrawal brings back the whole order, its delivery charge is added to the credit at face value, without the bonus (see EU withdrawal right). The credit expires after Store credit expiry (days) (default 365, 0 for never), and the customer gets the "Store credit added" email with the new balance.
Credit needs a customer account, and it is always in the store currency. A return from an order in another currency cannot be resolved as store credit.
You can also add credit by hand through the REST API. The ledger only supports adding credit: there is no endpoint to remove or edit an entry.
Using credit at checkout
Signed-in customers who have credit see a checkbox under the order review: Use my store credit (... available). It works with the classic checkout and with the Checkout block. When it is ticked:
- The credit is added to the order as a negative, non-taxable fee named Store credit, up to the order total. A full credit brings the total, taxes included, to zero.
- The credit only applies when the cart is in the store's base currency, and never to subscription renewals.
- When the order is placed the amount is written to the ledger. If the balance was spent elsewhere in the meantime, only what is left is taken, the order total is raised by the difference and the order note says so.
The credit goes back to the balance when the order is cancelled, fails, is refunded in full or moves to Refunded. A partial refund you make by hand does not give credit back, because whether to do so is a decision for the merchant.
An unpaid order (Pending payment, On hold, Failed or a checkout draft) that you move to the trash or delete gives its credit back too, and a daily job gives back the credit of orders still Pending payment after 48 hours. Should the customer pay such an order after all, the credit is taken again. Paid orders keep their credit.
Returns of orders paid with credit
A return of an order paid partly or fully with store credit pays the money back the way it came. ReturnDesk refunds through the payment gateway first, as far as the gateway can still refund, and gives the rest back as store credit. For example, an order of two items of 100, paid with 120 of credit and 80 by card: returning one item refunds 80 to the card and gives 20 of credit back, and the other item can still be returned for 100. An order paid fully with credit gets its credit back, with no gateway refund. The resolution panel shows the part given back as credit under Store credit.
When WooCommerce reports such an order as fully refunded after a return, that is not a refund of the whole order: the credit of the items the customer kept stays with the order. A full refund or the Refunded status you set later gives back only the credit the order still holds, never twice. What the order's returns were already given as store credit counts too (its value without the bonus): an order of two items of 50 paid with 50 of credit and 50 by card, where one item was resolved as store credit of 50, gives back no more order credit when you then refund the card part in full. The customer never gets back more than the order was paid.
Expiry
A daily job expires credit entries whose expiry date has passed. An expiry takes away the amount of the entry, but never more than what is left of the balance once the credit that is still valid is set aside. What the customer spent counts against the old credit first, so newer credit is never lost with it: credit of 100 that expires on day 365, spent in full, followed by 50 more on day 300, leaves the 50 untouched on day 365. The 50 expires on its own date.
Credit that comes back from an order has no expiry date, even when the credit the customer spent had one: the credit of a cancelled, failed, refunded, trashed or deleted order, and the credit part a return of an order paid with credit gives back.
Customers see their balance at checkout and in the email. There is no balance page in My Account.
Exchanges
An exchange lets the customer swap the returned item for another one. The Lite edition already exchanges an item for another variation of the same product at exactly the same price, as a free exchange order (see Customer flow). The Pro edition adds other products (the product itself and its up-sells), a price difference, exchange shipping and the tsre_exchange_candidates filter.
- In the wizard the customer picks Exchange for another item and chooses a replacement for each item. See Customer flow.
- You inspect the returned items as usual.
- When you press Resolve, an exchange order is created with the replacement items for the accepted quantities.
The replacement must be one the store offers for the item (the list above, plus what the tsre_exchange_candidates filter adds). A request that names any other product is refused, when it is sent and again when you resolve.
Prices are compared on catalogue prices: the price one unit of the returned item had before coupons, with its tax, against what the replacement costs with tax, both in your store's decimals. The Exchange price rule decides which replacements are allowed. Same price only allows only replacements that cost exactly the same on that basis, in both editions. Allow a price difference allows any replacement. Because the catalogue price counts, a size or colour swap of an item bought with a coupon is still a same-price exchange and moves no money.
What the exchange order looks like:
- The customer pays only the positive difference, tax included: the exchange order asks exactly that amount, with its tax taken out of it, not added on top. If nothing is due, the order goes to Processing straight away and its stock is reduced. If something is due, the order stays Pending, its stock is held, and the customer pays it from a Pay for your exchange link on the return page or from the link in the "Return resolved" email, which gives the amount due. The coupon of the original order is not extended to the new item: an item bought for 50 with a 50% coupon (catalogue price 100) exchanged for an item of 120 asks 20.
- If the replacement costs less, you owe the difference, for the share the customer actually paid: the catalogue difference times what was paid divided by the catalogue price, so the discount carries over. It is refunded with its tax on the returned order lines, never more than the accepted items were paid and than the original order can still refund, the way the order was paid (see Returns of orders paid with credit). For example, an item with a catalogue price of 100 bought for 50 with a 50% coupon and exchanged for an item of 10 refunds 45 (half of the difference of 90).
- When a return exchanges several items, each line counts on its own as above (a cheaper replacement at the share that was paid, a dearer one in full) and the exchange settles the sum: a refund when it is negative, the amount due on the exchange order when it is positive. For example, A (100, bought for 50 with a coupon on A) exchanged for 10 and B (50, no discount) exchanged for 150 asks 55 (100 for B minus 45 for A), not the catalogue difference of 10, so the coupon of A is not handed over to B. The estimate on the review step uses the same rule.
- Exchange shipping sets the shipping on the new order: Free, Same as the original order (copies the shipping lines) or Calculate at current rates. With the last choice the order is flagged and stays Pending, so you can add the shipping yourself and send it to the customer.
- The two orders are linked: the exchange order stores the id of the original order, and the original order stores the ids of its exchange orders. The return timeline records the exchange.
- Restocking fees and return shipping do not apply to exchanges.
A free exchange fires the standard WooCommerce Processing order email to the customer and the New order email to the store. This is intended: the customer gets a confirmation that the replacement is on its way, and you get a pick list.
If a replacement is out of stock at resolution time, the exchange is refused with a message and nothing is created.
Warranty claims
A warranty claim lets a customer return an item after the normal return window has ended, as long as the product or category has Warranty (days) set and the warranty is still running. Within the warranty period the wizard only offers Warranty claim.
A warranty claim is settled as an exchange when every accepted item has a replacement, and otherwise as a refund of the accepted items with no restocking fee and no return shipping withheld.
Guest portal
The guest portal lets customers who checked out without an account (or who are not signed in) start and follow returns. It is offered as a shortcode and as a block.

Set up
Create a page and add the Return portal block (see Blocks), or add the shortcode:
[tsre_return_portal]
ReturnDesk looks for a published page with the slug returns-portal. If there is one, that page is the portal address. If not, the plugin answers /returns-portal/ with a virtual page that contains the portal. With plain permalinks the address is /?tsre_portal=1. If your portal lives on another page, change the address with the tsre_portal_url filter.