I tested all 11 free WooCommerce EU withdrawal-button plugins

The best free WooCommerce EU withdrawal button plugin, tested against Directive 2023/2673 Article 11a

From 19 June 2026, every shop selling to EU consumers has to put a clearly labelled, one-click "withdraw from contract" function in the storefront. That's Directive (EU) 2023/2673, which adds a new Article 11a to the old Consumer Rights Directive. WooCommerce has no native support for it - there's just an open request (#65443) sitting there with no roadmap.

So you need a plugin. The wp.org repo has a pile of them now, all claiming compliance. I didn't trust the readme screenshots. I installed all 11 I could find, one at a time, on a real WooCommerce site and drove the actual withdrawal flow as a guest. Then I scored each one against what the directive literally asks for.

This is the "I did the tedious testing so you don't have to" post. Here's what I found, including two I'd actively avoid for this job.

What the law actually wants

First, the thing everyone gets wrong: this is not a new right. The 14-day cooling-off period already existed. Refund timelines, return-shipping rules - all unchanged. What changed is the method. If a customer can buy in a few clicks, they have to be able to withdraw with comparable ease, through a clear electronic function. Not by hunting for a PDF or emailing your support inbox.

In practice the directive boils down to a few hard requirements:

One easy-to-miss knock-on: your pre-contractual info under Art. 6 now has to mention the function exists and where it is. So your return-policy and terms pages need a small update too, not just the UI.

How I tested (and scored)

This wasn't a desk review. I spun up a real WooCommerce site on my local wp-test stack - store country Poland, currency PLN, guest checkout on - and installed each plugin on its own, one at a time. Then I placed a real guest order (#13, [email protected]) and drove the withdrawal flow in a real browser as a logged-out guest.

For the durable-medium step I hooked wp_mail and captured what each plugin actually queued, because the test box can't send real mail. So "email verified" here means "the plugin generated a timestamped customer + admin email", not "it landed in an inbox". That's an honest limitation - confirm deliverability on your own staging with real SMTP.

I scored nine criteria, 0-2 each, mapped straight to Art. 11a (max 18):

C1Site-wide visible button, reachable from every page
C2Guest access - usable without login, by order # + email
C3Two-step flow - initiate, then a separate confirm
C4Durable-medium acknowledgement - timestamped email/record
C5Partial withdrawal - select specific items / quantities
C6No extra mandatory fields - IBAN / reason not forced
C7Admin management - request list / status flag / order-note trail
C8Polish i18n - translatable, label editable to "Odstąp od umowy"
C9Doesn't break the store - no fatal, HPOS-compatible

0 = no, 1 = partial or paywalled, 2 = yes, free.

The scoreboard - all 11

PluginC1C2C3C4C5C6C7C8C9Total
EU Order Withdrawal Button (Vendidero) ★22122222217
EU Withdrawal Button (runner-up)22222212217
WWU Withdrawal Button (OSS)12222222217
WPify Woo (module)12222222217
Germanized (bundles the winner)22122222217
EU Withdrawal Compliance12221222216
Easy Return12222222116
WebToffee EU Order Withdrawal22220222216
BuddyPilot Withdrawal *12211222215
Bitron Right of Withdrawal12020112211
WP Desk Flexible Refund0011112129

* BuddyPilot: C4/C5 scored conservatively. The architecture (magic-link, partial, PDF declaration) is clearly there, but it doesn't use wp_mail and the access-link step wouldn't complete in my headless harness, so I couldn't verify the end-to-end email live. It's likely higher on a real-mail staging site.

Horizontal bar chart of all 11 WooCommerce withdrawal-button plugins scored out of 18 against Article 11a: five tie at 17, with the Vendidero winner highlighted, down to WP Desk Flexible Refund at 9
The same scores as a picture. Five plugins tie at 17/18; the two at the bottom (Bitron, WP Desk) are the ones I'd avoid for this job.

Five plugins tie at 17/18. That's not as decisive as it looks - the gaps are in different places, and for a Poland-only store the practical winner is clear.

The winner: EU Order Withdrawal Button (Vendidero)

EU Order Withdrawal Button for WooCommerce - wordpress.org/plugins/eu-order-withdrawal-button-for-woocommerce, v2.2.1, ~1,000 installs, ★5, HPOS-ready. The free core covers everything you need. Pro only adds per-product exclusions and CSV export.

It's the closest fit to the literal Art. 11a checklist with the least fuss. Nice surprise from testing: this is Vendidero's plugin - the same company behind Germanized, and Germanized literally bundles this exact engine. So you get a serious legal-compliance vendor's code, standalone and lightweight.

Guest withdrawal form with only Email required, plus the site-wide sticky Withdraw from contract button at the bottom
Guest form - only Email is required - and the site-wide sticky "Withdraw from contract" button, bottom centre.
WooCommerce Withdrawals admin queue with a Full badge, verified email, Requested status and approve/reject/delete actions
WooCommerce → Withdrawals: a real request queue with full/partial badge, verified email, status and per-row actions.

What I verified on the test site:

Where it loses its one point: the confirm is a single-page "Confirm withdrawal" rather than a distinct review screen (C3=1), and the per-item picker for partials is delivered through the emailed link instead of inline. Two honest cons: site-wide visibility is off by default - flip the toggle - and there's no Polish bundled, though the page title and button label are freely editable to "Odstąp od umowy tutaj".

If you just need to be compliant and move on, this is the one. Most complete free feature set, a real admin queue with an audit trail, the install leader, and a vendor that does compliance for a living.

The runner-up: EU Withdrawal Button

EU Withdrawal Button for WooCommerce - wordpress.org/plugins/eu-withdrawal-button-for-woocommerce, v2.0.1, freemium. This is the one with the nicest customer-facing UX of the lot. A genuine two-step modal (Continue, review, Confirm) and the cleanest inline partial picker I saw - per-item checkboxes and editable quantities with a live total. IBAN and reason are both explicitly optional, with helpful copy.

Two-step withdrawal modal showing order #13 recovered as guest, per-item checkboxes with editable quantity and a live withdrawal total
Step 2: order #13 recovered as a guest, per-item plus quantity partial selection, live total, then Confirm. The cleanest withdrawal UX I tested.

So why not #1? The admin side is weak. There's no dedicated request dashboard, and the selected partial items aren't stored on the order - they only go out in the email. For a merchant who has to act on each request, that's an operational gap the winner doesn't have. It also defaults to "My Account only" and needs a couple of toggles to go truly site-wide.

If you care most about the customer experience and you're fine managing requests from the email, this is a great pick. For most stores, the better admin tooling on the winner wins out.

Three alternatives worth knowing

Most legally rigorous: WWU Withdrawal Button (OSS) - 17/18

If compliance evidence is your priority, nothing beats this open-source one. Every declaration gets a PDF plus an OpenTimestamps cryptographic timestamp, precise legal wording, EU/EEA applicability rules, exclusions and consent-IP capture. The catch: it's off the wp.org repo (GitHub install, no automatic updates), disabled by default, and has more knobs than the leaders. Great for the audit-minded, more upkeep.

WWU withdrawal form step 2 with withdraw from contract here heading, optional reason and per-item partial selection
WWU step 2 - "withdraw from contract here", reason optional, per-item partial.
Easy Return step 2 wizard with per-item partial selection, shipping Polish out of the box
Easy Return step 2 - polished wizard, per-item partial, and it ships Polish out of the box.

The only one with Polish bundled: Easy Return - 16/18

Gorgeous 3-step wizard, good guest order recovery, and the only plugin that ships pl_PL out of the box. But it's SaaS-coupled (easyreturn.eu). In free/unconnected mode the confirmation email is literally labelled "This is a test withdrawal confirmation email", and it doesn't declare HPOS. Lovely UX, but I wouldn't bet compliance-grade email delivery on the free tier.

Most reliable vendor, but no partial: WebToffee - 16/18

Established vendor, clean email verification, and a site-wide footer link on by default. The dealbreaker for Art. 11a: no partial withdrawal, whole order only. The directive explicitly says "whole order or part of it", so this misses a hard requirement.

What I'd avoid for this job

Two plugins came up when I searched but are the wrong tool here:

And a note on the other two 17/18 plugins: WPify Woo and Germanized both do the feature well - Germanized actually bundles the winner's engine. But both are heavy suites (Czech and DACH respectively). Only pick them if you also need the rest of the suite. For a Poland-only store that just wants the button, the standalone winner is a fraction of the weight.

The Poland gotcha

Here's where Poland is different from "just install it before the 19th". Poland missed the 19 December 2025 transposition deadline. The withdrawal-button rules were meant to ride into the ustawa o prawach konsumenta via a consumer-credit vehicle (UC82), steered by UOKiK. In May 2026 the government pulled that and said it would start new work. So there's likely no Polish statute in force on 19 June. Commentators are calling the date "nierealne".

Does that mean you can wait? I wouldn't. A few reasons:

So which plugin for a Polish store?

Same answer as overall - EU Order Withdrawal Button (Vendidero). There's one Poland-specific catch worth knowing: it doesn't ship a Polish translation. But everything is editable, so you just type the labels yourself - the page title and button become "Odstąp od umowy tutaj" and the confirm becomes "Potwierdź odstąpienie od umowy". Two minutes of work, and you get the best admin tooling of the bunch.

The only plugin that ships pl_PL out of the box is Easy Return. If you want zero translation work and a polished Polish wizard, it's tempting. I'd still hesitate on the free tier - its confirmation email is labelled "test", and the durable-medium email is the one part of this you can't get wrong. For a Polish store I'd rather spend two minutes translating the winner than rely on Easy Return's free-tier email. If you're already paying for Easy Return's connected service, that calculus changes.

This is a practitioner write-up, not legal advice. For final shop-policy wording, confirm against the Polish transposition once it's published, and for high-value exposure talk to a consumer-law lawyer.

What it costs if you skip it

The penalties vary by member state, but one consequence is EU-wide and it's the one that actually bites day to day: if a compliant withdrawal function is missing, the 14-day cooling-off window can extend to 12 months and 14 days. Customers can send things back the better part of a year after delivery. That's the real commercial risk, well before any regulator gets involved.

On top of that, fines exist where the rule is enforceable:

What I'd actually do

If this were a client store on Poland/PLN, here's the path. It's a 1-2 hour job on staging, not a fire:

  1. Install EU Order Withdrawal Button for WooCommerce on a clone first.
  2. Turn on site-wide embed. Rename the page and button to "Odstąp od umowy tutaj" and the confirm to "Potwierdź odstąpienie od umowy". Labels are editable, no PL pack ships.
  3. Check only name + order ID + email are required. Leave IBAN and reason off.
  4. Wire real SMTP and confirm the timestamped acknowledgement email actually fires. The durable-medium email is the legal bit, so don't skip it.
  5. Update your return-policy / terms pages to disclose the function and where it lives (Art. 6).
  6. Cache-exclude the withdrawal page so the no-login form isn't served stale. If you're on a full-page cache, this matters - I wrote about the cache-bypass cookie logic in my WooCommerce performance stack post.
  7. Keep refunds manual through your existing gateway. The form only registers the legal declaration.

On step 2: the winner lets you edit the button text in its settings and rename the page, which is the simplest route. If you'd rather pin the labels in code - handy when you manage several stores - a small gettext filter does it without a translation file. This works for any plugin that runs its strings through WordPress translation:

// Force Polish labels without shipping a .po file.
// Drop this in a tiny mu-plugin or your theme's functions.php.
add_filter( 'gettext', function ( $translated, $text ) {
	$pl = [
		'Withdraw from contract' => 'Odstąp od umowy tutaj',
		'Confirm withdrawal'     => 'Potwierdź odstąpienie od umowy',
	];
	return $pl[ $text ] ?? $translated;
}, 20, 2 );

That's it. The good news is the hard part - figuring out which plugin to trust - is already done. WooCommerce will probably ship something native eventually, but #65443 has no roadmap, so I wouldn't wait for core on a deadline.

If you want more WooCommerce config wins while you're in there, my 30 WordPress & WooCommerce performance tips is a decent companion read.

FAQ

Do I need the withdrawal button if I'm a small Polish store?

Yes, in practice. The obligation applies to any business selling to EU consumers from 19 June 2026, regardless of size. Poland's own statute is delayed (see above), but the directive is binding and your cross-border EU sales are already covered. There's no small-shop exemption.

Can I just label the button "Cancel" or "Return"?

No. The directive points to clear wording like "withdraw from contract here" to open the form and "confirm withdrawal" to submit. Ambiguous labels like "Cancel" are likely treated as insufficient. In Polish, use "Odstąp od umowy tutaj" and "Potwierdź odstąpienie od umowy".

Is a footer link to my returns policy enough?

Not anymore. A policy page you have to read, or a "email us for the form" line, no longer satisfies the rule. You need a working digital function - reachable from every page, usable by guests without logging in, with a two-step confirm and a timestamped acknowledgement email.

Does the plugin handle the actual refund?

No, and that's fine. The withdrawal function only registers the legal declaration and timestamps it. The refund still goes through your normal WooCommerce flow and payment gateway, and the physical return and inspection rules are unchanged. Keep refunds manual.

Will WooCommerce add this to core?

Maybe eventually. There's an open enhancement request (#65443) but no roadmap or shipped support as of June 2026. I wouldn't wait for core on a deadline - install a plugin.

WooCommerce is my thing

I dig into WooCommerce internals for a living - performance, compliance, the stuff that breaks at the worst time. If you'd rather hand this off, or your store is slow and you're not sure why, I can help. Hands-on, real fixes, not a report.