FAQ and troubleshooting
Frequently asked questions
Do I need the EU withdrawal function?
If you sell online to consumers in the EU, the law asks for it from 19 June 2026 (Article 11a of the Consumer Rights Directive, added by Directive (EU) 2023/2673). If you don't, you can switch it off under Settings → EU withdrawal function → Withdrawal function and use ReturnKit for returns only. ReturnKit is a tool, not legal advice. See EU withdrawal.
What's the difference between a return and a withdrawal?
A return follows your own policy: your period, your exclusions, your reasons, and you can decline it. A withdrawal is the consumer's legal right: at least 14 days, no reason needed, and only legal exceptions can be excluded. ReturnKit keeps two separate rule sets, and both end up as requests on the same screens.
WooCommerce has its own withdrawal form. Do I need both?
No. WooCommerce 11.1 added a basic form (WooCommerce → Settings → Advanced → Features → Order withdrawal). ReturnKit covers the same requirements and adds order and item selection, spam protection, statuses and an audit log. Keep one switched on so customers don't find two different forms. ReturnKit warns you while both are on.
Can a guest see someone else's order?
No. The Returns page never shows an order for an order number and email alone. It emails a secure link to the order's billing address, and the screen says the same thing whether or not the details matched. Order and request links carry a secret (WooCommerce's order key, or a signed request token). The general withdrawal form doesn't reveal anything either: after confirming, everyone sees the same message, and the link goes to the email address given. See Guest links and security.
Do refunds go back through the payment gateway?
Yes, when the gateway supports automatic refunds (Stripe, PayPal Payments, WooPayments and most others). Refund and complete creates a normal WooCommerce refund for exactly the returned items. If the gateway can't refund automatically, the refund is recorded in WooCommerce and you pay the customer yourself.
Do refunds include shipping?
The suggested refund covers the items as paid, after discounts and with tax. After a withdrawal from the whole order, delivery costs are ticked too, as the law requires. For other requests, tick Include delivery costs if you want to. You can always change the amount before refunding.
Does it restock items?
Yes, by default, when you mark items received or refund. Untick Put items back in stock on the request for damaged items. Only products that manage stock change, and each unit is restocked once.
Can customers return part of an order, or the same order twice?
Yes. They choose items and quantities. Later requests can include whatever is left: quantities already refunded or in another open or completed request are taken off.
Does it work with the block checkout, HPOS and block themes?
Yes. Requests reference orders by ID, so both order storage types work. My Account, the order emails and the shortcodes work with classic and block themes.
Does it slow down my store?
No. Its small front-end stylesheet and script only load on My Account, the order-received page and pages with a ReturnKit shortcode. Other pages get no extra files; the optional footer link is a single line of HTML.
Will it work with page caching?
Yes. ReturnKit's pages (the Returns page, the withdrawal page and My Account → Returns) send no-cache headers and set DONOTCACHEPAGE, because they show personal data or carry form tokens that expire after 12 hours. The public forms don't rely on WordPress nonces; they use the spam protection instead.
Can it crash my site?
It's built not to. Every hook ReturnKit registers is wrapped in an error guard. If something goes wrong inside it, the page loads normally, the error is written to your PHP error log, and store managers see one notice with the details to send to support. If the withdrawal page itself fails, it tells the customer to email their withdrawal instead, which is just as valid.
What happens if I uninstall it?
Deleting the plugin removes its tables (requests, items, history and the Pro credit ledger), its settings and email settings, its transients, the product settings it added, its order and order-item meta, and the uploaded return labels. On a multisite network this happens on every site. Order notes and WooCommerce refunds stay with the orders. The Returns and withdrawal pages stay, so you can decide what to do with them. Deactivating keeps everything.
Before deleting, export what you need: Returns → Requests → Export CSV. Withdrawal records are evidence you may need to keep.
Troubleshooting
Customers don't see "Return items" on an order
Check, in order:
- Settings → Returns → Online returns is on.
- The order's status is ticked under Order statuses that can be returned (default: Completed only).
- The period hasn't ended: open the order in wp-admin; the Returns box says until when it's returnable.
- The items aren't excluded (virtual, on sale, category, or Not returnable on the product) and aren't already refunded or in another request.
My Account → Returns gives a 404
WooCommerce's permalinks need refreshing. Go to Settings → Permalinks and click Save Changes. ReturnKit does this itself after activation and when you change My Account address, but some caching or security plugins block it.
The withdrawal checklist says the footer link is missing
ReturnKit can't see every place a link can be. It recognizes the Link in the site footer setting, the withdrawal page in a navigation menu, and [returnkit_withdrawal_button] in a navigation block. If you placed the shortcode in a footer widget or template part, the line stays neutral: open your shop in a private window and check that the link shows.
A customer says they never got the acknowledgement or another email
Open the request and check History. Every customer email is logged as sent, failed or switched off.
- Turned off in WooCommerce: switch it back on in WooCommerce → Settings → Emails.
- Could not be sent: WordPress can't send email. Test with a password reset; many hosts need an SMTP plugin. Then send the customer a message from the request (Add a note → Email it to the customer).
- Sent: ask the customer to check spam, and the email address in the statement.
A withdrawal came in with "No matching order"
The order number or email the customer typed didn't match, or they matched an order that can't be withdrawn from online (wrong status, period ended with Don't accept, or already withdrawn from in full). The statement is still valid and was acknowledged. Find the order (search by the customer's name or email under WooCommerce → Orders) and use Link order on the request. See Unmatched withdrawals.
"Refund and complete" is missing on a request
It's only shown while the request is open, has an order and has no exchange order yet. An unmatched withdrawal needs Link order first. For withdrawals where the customer described the items in words, there are no item lines to calculate from: check the order and enter the amount to refund.
A guest's requests don't show in their new account
My Account → Returns only lists requests made while logged in to that account. Requests made as a guest stay reachable through the links in the customer's emails. Store credit from a guest request is different: the customer claims it on their account with the Claim your store credit link (Pro).
The refund failed
The history shows the gateway's error (Refund failed: …). Nothing changed on the request. Common causes: the gateway's API keys, a payment that can't be refunded any more, or a refund already made in the gateway's own dashboard. Fix it, or untick Refund through gateway to record a manual refund.
A customer gets "Too many submissions from your connection"
They, or others on the same network, sent more forms than Settings → Spam protection → Submissions per IP address allows in an hour (default 5 per form). Wait an hour, or raise the limit.
If many unrelated customers hit it, your site is probably behind a proxy or CDN and every visitor looks like the proxy's address. Set Visitor IP address from to match (Cloudflare, Proxy / load balancer, or Nginx proxy).
A customer gets "That was quick!"
The form was submitted within Minimum time on the form (default 3 seconds) of loading. The time counts from when the first form loaded, so a quick Confirm withdrawal on the review step is fine. Lower the setting if real customers run into it.
A customer gets "The form expired"
Forms carry a signed token that's valid for 12 hours. The customer left the page open longer; reloading it fixes it.
Old links in emails say "This link isn't valid"
Request links are signed with your WordPress secret keys. If the salts in wp-config.php changed, earlier links stop working. Customers can still use My Account, or look up their order again on the Returns page.
Pro features don't appear after buying
Install the Pro zip from your purchase email, not the free version, and activate your license when asked. The badge next to ReturnKit in the header must say Pro. See Licensing.
Still stuck?
Contact support via warcal.dev/contact. Include:
- your WordPress, WooCommerce and PHP versions;
- the request number and a screenshot of its History;
- any notice ReturnKit showed in wp-admin.