ReturnKit

Returns

This page covers the whole return flow: how customers ask, how you handle a request, what each status means and how guest links stay secure. EU withdrawals use the same requests and screens, with a few differences explained in EU withdrawal.

Where customers start a return

Where Who What they see
My Account → Returns Logged-in customers The requests made with their account, and a list of orders that can still be returned, each with a Return items button. Requests made as a guest aren't listed, even with the same email; they stay reachable through the links in their emails.
My Account → Orders and the order page Logged-in customers A Return items button on each eligible order. The order page also lists the order's requests and says until when returns are open.
Completed order email Everyone A Return or exchange items link (when Links in order emails is on).
The Returns page ([returnkit_portal]) Guests A look-up form: order number and email. If both match (and the order may be returned online, see Guest returns), ReturnKit emails a secure link to the order's return form.
Order received page Guests, right after checkout The same panel as the order page, through the order key in the URL.

Which orders and items can be returned

An order can be returned when all of these are true:

  • Online returns is on;
  • the order's status is one of Order statuses that can be returned (default: Completed);
  • the return period hasn't ended;
  • at least one item is still returnable;
  • for an order placed without an account, Guest returns is on. With it off, the look-up sends no link and the order-key form says Please contact us.

The period starts when the order is completed (the default, the closest WooCommerce gets to "delivered"), or when it's placed. It ends at 23:59:59 on the last day, in your site's time zone. With When the order is completed, an order that isn't completed yet can't be returned at all.

What's left to return on each line = quantity ordered − quantity already refunded in WooCommerce − quantity in other requests that are pending, approved, received or completed. Declined and cancelled requests free their items again. A completed request that was refunded through ReturnKit doesn't count twice, because WooCommerce already counts its units as refunded.

Items that can't be returned show in the form with a short explanation and no quantity picker:

  • products ticked Not returnable (Product data → Advanced);
  • products in an excluded category;
  • virtual and downloadable products, if Digital and virtual products is on;
  • items bought below the regular price, if Items bought on sale is on. Coupons don't make an item a sale item.

These exclusions apply to returns only. EU withdrawals have their own, narrower rules.

The return form

For each returnable line the customer sees the product, the price they paid per unit, and:

  • a Quantity picker (Keep = 0);
  • a Reason, required when Ask for a reason is on;
  • with Pro, an Exchange for choice (see Pro).

Below the items:

  • Refund or store credit, only with Pro and store credit on;
  • an optional note;
  • the policy in one line, for example You can return items within 30 days of delivery.;
  • if the order can also be withdrawn from, a link to the withdrawal form.

The form lists the order's earlier requests at the top. When the customer submits, ReturnKit re-checks everything under a per-order lock, so a double click or two open tabs can never claim the same item twice. On success the customer lands on the request page with Thank you, your request has been received and gets the Return request received email.

The request page

Customers see their request at My Account → Returns → the request, or through the link in every email. It shows:

  • the request number (R-1042), type and status;
  • the items, quantities and reasons;
  • How to send your items back, while the request is approved: your instructions, Please write R-1042 on the parcel or include it inside, and the return address;
  • with Pro, the return label download, the exchange order or the store credit added;
  • Updates: a timeline of submitted, approved, received, completed, declined or cancelled, and any messages you sent;
  • Cancel this request, while the request is still awaiting review.

Handling requests in wp-admin

ReturnKit's screens are under Returns in the admin menu. Only users who can manage WooCommerce (shop managers and administrators) can see them. The menu shows a count of requests awaiting review.

Dashboard

  • The hero says how many requests need you: awaiting review plus items received and ready to refund. Review requests opens them.
  • Four stat cards:
    • Awaiting review
    • On the way back (approved, waiting for the parcel)
    • Ready to refund (items received)
    • Last 30 days: the number of requests, the value requested and the amount refunded. Declined and cancelled requests are left out of the two amounts.
  • Latest requests.
  • EU withdrawal checklist (see EU withdrawal).
  • Finish setting up returns, until the Returns page is published and the return address is set.
  • A card counting orders that came in through WooCommerce's own withdrawal form, if any.
  • With Pro, the value kept as exchanges or store credit in the last 30 days.

Requests

All requests, newest first, 30 per page. Filter by status, by type (return, exchange, withdrawal) or Flagged, and search by request number (R-1042), order number, name or email. Export CSV downloads the requests matching the status, type and search filters, with these columns: request, type, status, created (UTC), order, customer, email, items, reasons, value, refunded, credited, resolution, flags, source.

One request

The request screen shows the items, the customer, the order, the full history and the actions possible at this stage.

Next step (only while the request is open):

Action What it does
Approve and send return instructions Moves the request to Approved and emails the customer your instructions and return address, with an optional message. Warns you if no return address is set.
Mark items received Records how many of each item arrived (all by default). Enter 0 for a line that didn't arrive. With Put received items back in stock ticked, only the units that arrived go back into stock.
Refund and complete Creates a WooCommerce refund for exactly these items and completes the request. For a withdrawal described in words (no item lines), you enter the amount. See Refunds.
Complete without refunding here For requests settled another way: refunded outside WooCommerce, or replaced by hand.
Decline Needs a reason, which is emailed to the customer. Asks for confirmation.
Pro actions Issue store credit, Create the exchange order, Return label. See Pro.

History lists every step with who did it (the customer, a named staff member or ReturnKit) and when; hover the time for the exact second. It includes every email sent or failed. Under it, Add a note keeps a private note, or emails it to the customer with Email it to the customer ticked.

See what the customer sees opens the customer's request page.

Delete request removes the request, its items and its history for good. It's meant for spam and duplicates. Refunds and stock changes already made stay, and an order note records the deletion. Withdrawals linked to an order can't be deleted: they're the record of the customer's statement. Unmatched withdrawals (often spam) can.

Statuses

Status Shown as Meaning Next
pending Awaiting review (withdrawals: Received) Just submitted. Approve, receive, refund, complete, decline. The customer can cancel.
approved Approved (withdrawals: Accepted) Instructions sent; waiting for the parcel. Receive, refund, complete, decline.
received Items received The parcel arrived. Refund, complete, decline.
completed Completed Refunded, credited, exchanged or settled. Closed.
rejected Declined (withdrawals: Not eligible) Declined with a reason. Closed.
cancelled Cancelled The customer cancelled it while pending. Closed.

Steps can be skipped: you can refund a pending request straight away, or mark items received without approving first. Closed requests only accept notes.

Every status change is written to the request's history, added as a note on the order (ReturnKit: request R-1042 is now "Approved") and emailed to the customer for approved, received, completed and declined. See Emails.

Refunds

Refund and complete suggests the value of the requested items as the customer paid them: the line total after discounts, plus its tax, for the quantity returned. It can never be more than the order still has left to refund.

  • Include delivery costs appears when the order has shipping that hasn't been refunded yet. It's ticked by default after a withdrawal from the whole order. See EU withdrawal.
  • Refund through payment method is ticked by default (setting Refund through the payment gateway) when the gateway supports automatic refunds. Otherwise the refund is only recorded in WooCommerce, and you pay the customer yourself.
  • Put items back in stock is ticked by default (setting Restock returned items) unless the items were already marked received. Once items are marked received, only the units that arrived are restocked; before that, the requested quantity is. Each unit is restocked only once, however many times you tick it.
  • You can lower the amount for a partial refund. The refund is split across the lines in proportion.
  • A withdrawal where the customer described the items in words has no item lines. Check the order, then enter the amount; it can be up to what's left to refund on the order.

The refund appears on the order like any WooCommerce refund, with the reason ReturnKit R-1042 plus your message. If the gateway refuses, nothing changes on the request and the error is shown and logged.

Guests never see order data on screen just for typing an order number and an email. Here's how each link is protected:

Link Carries Who it works for
Return or withdrawal form for an order the order ID and WooCommerce's order key (rtkt_key), the secret WooCommerce already puts in its own order emails Anyone with the link: logged out, on another device, or staff logging a return received by phone.
A request's page the request ID and a request token (rtkt_token) Anyone with the link.
My Account the customer's login Only the customer who placed the order.
  • Guest look-up. The Returns page asks for the order number and billing email. If both match, the Returns portal link email goes to the order's billing address. The screen shows the same message whether or not anything matched, so nobody can probe for orders.
  • Request tokens are an HMAC of the request ID, a random secret saved with the request and the submission time, signed with your site's secret keys. They stay valid when staff later link an unmatched withdrawal to an order. Changing your WordPress salts invalidates every link already emailed. Customers can still reach their requests through My Account, or by looking up the order again.
  • Logged-in forms are protected with WordPress nonces. Guest forms use the spam protection instead (nonces aren't reliable for logged-out visitors on cached pages): the hidden bot trap, the minimum time on the form, the per-IP limit and optional Turnstile.
  • Caching. ReturnKit's pages (the Returns page, the withdrawal page and My Account → Returns) send no-cache headers and set DONOTCACHEPAGE, so caching plugins never store personal data or expired form tokens.

On the order screen

Every order has a Returns box in the sidebar. It lists the order's requests with their status and, while the order can be returned, says until when and offers Open the return form. That opens the customer's form through the order-key link, for example to log a return you received by email or phone. It's recorded as a guest request, and the normal return rules apply.

Product settings

Under Product data → Advanced each product has two checkboxes:

  • Not returnable: excluded from your returns policy.
  • No right of withdrawal: a legal exception to the EU right of withdrawal, for example sealed hygiene goods, made-to-order or perishable items. Make sure your terms say so.

For variations, the parent product's setting applies.