FDesign Withdrawal Button For WooCommerce Wordpress Plugin - Rating, Reviews, Demo & Download
Plugin Description
Since 19 June 2026, shops selling to consumers in the EU have had to offer an electronic withdrawal function under Article 11a of the Consumer Rights Directive, added by Directive (EU) 2023/2673. The principle is that withdrawing should be no harder than buying: if a customer can order in a few clicks, they must be able to withdraw in a few clicks.
This plugin builds that function into WooCommerce. It is a technical tool, not legal advice, and installing it does not by itself make a shop compliant — the wording on your terms and returns pages, and how your team handles returns when they arrive, are yours. Confirm both against the law as transposed in your country.
What it does
- Adds a clearly labelled withdrawal link to every page of the shop, on by default.
- Lets guests withdraw without an account, by order number and email, verified through a one-time link sent to the address on the order.
- Puts the same link on each order in My Account, where the customer is already looking, and only on orders that can still be withdrawn from.
- Runs a genuine two-step flow: the customer reviews exactly what they are declaring, then confirms as a separate action.
- Supports withdrawing from part of an order, per item and per quantity.
- Sends a timestamped acknowledgement of receipt on a durable medium, carrying an integrity code, then tells the customer what you decided.
- Gives the shop a request queue with status filters, a full audit trail, and accept or reject with a note that goes to the customer.
- Lets you reword every email: the closing paragraph of each decision email is a setting, and all five carry WooCommerce’s standard Additional content block.
- Writes the declared items onto the order as an order note, so the merchant sees the request where the money is.
- Asks for nothing beyond a name, an order number and a contact email. No IBAN, no mandatory reason.
- Translation-ready. Greek, German, French, Italian, Spanish, Polish, Romanian and Czech translations are being contributed to translate.wordpress.org, from where WordPress installs them automatically.
- Works with Loco Translate, WPML and Polylang, including per-language withdrawal pages.
Built to survive a real shop
The parts nobody sees until they go wrong:
- Access links are stored as one-way hashes, never in readable form, are single purpose, and expire in thirty minutes. A leaked database backup hands over nothing usable.
- The lookup form is rate limited per address and per visitor, with a honeypot field and a timing check, so it cannot be used to fish for other people’s orders. A wrong order number and a wrong email produce exactly the same message as a correct pair.
- Refunds you have already issued reduce what is left to withdraw. Withdraw one of three, refund another through WooCommerce, and the customer is offered one — not two.
- The withdrawal page excludes itself from caching, using the signal WP Rocket, LiteSpeed Cache, W3 Total Cache, WP Super Cache and WP Fastest Cache all respect. A cached withdrawal page would hand one customer another customer’s session.
- A double click cannot file two declarations. The session is claimed before anything is written, so one submission wins and the other lands on the same confirmation.
- Nothing is stored that would be wrong later. No monetary amount, because what you owe depends on delivery costs, apportioned discounts and the condition of the goods.
Privacy and GDPR
The plugin registers a personal data exporter and eraser, so withdrawal declarations appear in the tools under Tools, Export Personal Data and Tools, Erase Personal Data, and it contributes suggested wording to your privacy policy draft.
Erasure is off by default, and says so in the report rather than failing quietly. A withdrawal declaration is the record of a legal act and your evidence that you honoured it, which is a recognised ground for keeping it — WooCommerce treats orders the same way. Switch it on under Withdrawal, Advanced and the name, address and free text are replaced while the declaration itself survives, so you keep the proof without keeping the person.
What it deliberately does not do
The plugin records the legal declaration and timestamps it. It does not issue refunds. Refunds stay in your normal WooCommerce flow, through your existing gateway, decided by you after you have inspected the returned goods. The rules on return shipping, inspection and refund deadlines are unchanged by the directive and unchanged by this plugin.
It also stores no monetary amount against a request. What a shop owes depends on delivery costs, apportioned discounts and the condition of the goods. A figure stored at declaration time would look authoritative and be wrong.
A note on sealed goods
Sealed health, hygiene and cosmetic products lose the right of withdrawal only once the customer has opened them. An unopened item is still fully withdrawable. The plugin therefore does not let you exclude such products automatically, because no software can tell whether a package has been opened. That check belongs to your team when the return arrives.
What is stored
The name, email address and order reference a customer submits, the items declared, the time of receipt, and anything the customer chose to write. Visitor IP addresses are used for rate limiting and are never stored against a declaration.
The plugin contacts no external server. Nothing is sent anywhere, no usage is tracked, and no data leaves your site.
Screenshots
The withdrawal form as a guest sees it: an order number and the email used for the order, nothing more.
Choosing what to withdraw, item by item and quantity by quantity, capped at what the order still holds.
The request queue, with status filters and the pending count in the menu.
A single request, showing the declaration, the integrity code and the full audit trail.
The settings tab, where the withdrawal window and the exclusions live.

