Guides

EU right of withdrawal in WooCommerce (withdrawal button)

By Mariusz Szatkowski · Updated: 2026-07-02

Every online store selling to consumers in the European Union operates under one of the oldest and most consequential rules of EU e-commerce: the consumer can change their mind. For fourteen days after receiving the goods, a shopper can withdraw from the purchase without giving any reason, and the store has to refund the money. That much has been true since the Consumer Rights Directive, and most merchants have internalised it, more or less, as “we accept returns.” What is new is how the withdrawal has to be exercised. Directive (EU) 2023/2673 adds a mandatory withdrawal function to contracts concluded through an online interface: not a paragraph buried in the terms, but a visible, working mechanism the consumer can actually click. For WooCommerce stores, which ship with refund tools but no consumer-facing withdrawal flow at all, that is a concrete gap to close. This guide explains what the right of withdrawal requires, what the 2026 withdrawal function adds, how a clean withdrawal flow works in practice, and how to handle the awkward cases: partial withdrawals, guest orders and record keeping.

The 14-day right, in plain terms

The core rule comes from Directive 2011/83/EU, the Consumer Rights Directive, as transposed into the national law of each member state. For distance contracts, which cover essentially every order placed in an online store, the consumer has 14 days to withdraw from the contract without giving any reason and without penalty beyond, at most, the direct cost of sending the goods back.

The mechanics around that headline number matter as much as the number itself:

  • The clock starts at delivery for goods. For a normal product order the 14 days run from the day the consumer, or someone they nominate, takes physical possession of the goods. For an order delivered in several shipments, it runs from the last piece. For services and digital content it runs from the conclusion of the contract.
  • Silence is expensive. If the store fails to inform the consumer about the right of withdrawal before the order, the period extends by up to 12 months. An information failure turns a two-week window into a year-long one.
  • Withdrawal is a declaration, not a negotiation. The consumer exercises the right by making an unambiguous statement. The store must provide the model withdrawal form from Annex I(B) of the directive as one option, but the consumer can just as validly write an email. The store does not “approve” the withdrawal; it receives it and then performs its side.
  • Refunds are on a deadline too. The store must reimburse all payments received, including the cost of standard delivery, within 14 days of being informed of the withdrawal. For goods, it may withhold the refund until it has received the goods back or the consumer has supplied proof of sending them, whichever comes first.
  • The consumer has duties as well. The goods go back within 14 days of the declaration, the consumer bears the direct return cost if they were told they would, and the consumer is liable for any diminished value caused by handling the goods beyond what was needed to establish their nature, characteristics and functioning.

There are exceptions, and they are narrower than merchants tend to hope: goods made to the consumer’s specification or clearly personalised, sealed goods unsealed after delivery that cannot be returned for health or hygiene reasons, goods liable to deteriorate quickly, sealed audio, video or software unsealed after delivery, digital content once performance has begun with the consumer’s prior express consent and acknowledgement, and a handful of others. If a product does not fall squarely into one of the listed exceptions, the right applies.

What changed: the withdrawal function in Directive 2023/2673

Directive (EU) 2023/2673 is mostly known as the update to distance marketing of financial services, but it carries a change that reaches every online shop: it inserts a new Article 11a into the Consumer Rights Directive, the withdrawal function.

The idea is simple and aimed at a real asymmetry. Concluding a contract online takes a couple of clicks; withdrawing from it often meant hunting for a postal address in the terms and drafting a letter. Article 11a requires that where a distance contract is concluded by means of an online interface and the consumer has a right of withdrawal, the trader must provide a function through which the consumer can withdraw online. The function must be labelled in a legible, unambiguous way, along the lines of “withdraw from contract here,” and it must be continuously available and prominently placed on the online interface for the whole withdrawal period. When the consumer uses it, they submit a statement identifying the contract and themselves, and the trader must send an acknowledgement of receipt on a durable medium without undue delay, including the content of the statement and the date and time it was submitted.

Member states had to transpose the directive by 19 December 2025 and apply the measures from 19 June 2026. As of mid-2026, this is not an upcoming obligation; it is a current one. A store whose entire withdrawal process is “email us” no longer matches what the law describes.

Two boundaries are worth stating. First, the function does not replace the other channels: the consumer can still withdraw by any unambiguous statement, and the model form still has to be provided. The button is an additional, mandatory option. Second, the function is a declaration mechanism, not a refund mechanism. Clicking it starts the process; the refund is still performed by the merchant under the existing 14-day reimbursement rule.

What a WooCommerce store must actually do

Put together, the obligations for an EU-facing WooCommerce store look like this:

  1. Inform before the sale. The terms, or a dedicated returns and withdrawal page, must state the right, the 14-day period, how to exercise it, who pays return shipping, and must include the model withdrawal form. Missing information stretches the withdrawal period.
  2. Offer a withdrawal function. A labelled, easy-to-find online mechanism through which a consumer can declare withdrawal for an eligible order, available throughout the withdrawal period.
  3. Acknowledge receipt. When a declaration arrives through the function, confirm it to the consumer on a durable medium, in practice by email, recording what was declared and when.
  4. Act on the declaration. Arrange the return, and refund within 14 days of the declaration, with the option to wait for the goods or proof of their return shipment.
  5. Keep records. Who withdrew, from which order, for which items, when, and what happened next. Disputes about withdrawal are almost always disputes about dates.

WooCommerce provides none of the consumer-facing parts natively. It has a competent refund interface inside the order screen and it stores order data durably, but there is no withdrawal form, no withdrawal-period calculation, no eligibility logic and no request log. The gap between “we can refund” and “a consumer can declare withdrawal online and we can prove how we handled it” is exactly the part the directive now cares about.

How a withdrawal flow works in practice

A withdrawal flow that holds up has a consistent shape, whether it is custom code or a plugin:

Identify the order. The consumer proves a minimal connection to the purchase. For logged-in customers that can be a button on the order in My Account. For everyone else, order number plus billing email is the standard pair: it is data only the purchaser plausibly has, and it works without an account.

Check eligibility. Is the order in a state that can be withdrawn from at all (delivered or being processed, not already refunded or cancelled)? Is the withdrawal period still open? The period should be counted from the best delivery proxy available; in WooCommerce that is usually the completion date, falling back to the order date if the order was never marked completed. If a request is already open for the order, do not accept a duplicate.

Take the declaration. Show the items on the order and let the consumer choose what they are withdrawing from and in what quantity. Ask for a reason, but make it optional; the law grants the right “without giving any reason,” so a mandatory reason field is a compliance smell. Include the statutory framing (the model withdrawal text) and an explicit declaration the consumer confirms.

Confirm and record. Store the request with a timestamp, email the consumer an acknowledgement listing exactly what they declared, and notify the shop. From that moment the merchant’s 14-day refund clock is running.

Process on the merchant side. Someone reviews the request, accepts it, waits for the goods if appropriate, refunds through the normal WooCommerce order screen, and marks the request processed. Keeping the money movement in the standard refund interface is deliberate: it preserves the payment gateway integration, the accounting trail and the order notes.

Partial withdrawals

Real withdrawals are rarely all-or-nothing. A customer orders three items, keeps two, returns one. Legally the directive talks about withdrawing from the contract, but partial withdrawal is universally handled in practice as a partial return with a partial refund, and nothing in the rules forces a consumer to return an entire order to exercise the right for one item.

For the store, the operational requirement is precision. A free-text email saying “I want to return some of my order” produces a support thread. A structured form that captures item and quantity (“2 of 3 units of product X”) produces a request the merchant can act on and a record both sides agree about. Quantity-level selection also maps cleanly onto WooCommerce’s refund screen, which already supports per-line, per-quantity refunds.

Guest orders

Roughly half of e-commerce purchases are made without an account, and the right of withdrawal applies to those consumers identically. Any withdrawal flow gated behind My Account fails them.

The guest-safe pattern is the lookup step described above: order number plus the billing email from checkout. The store matches the pair against the order and reveals nothing when they do not match, which keeps the mechanism from becoming an order-data oracle. It is worth being strict here: match the email exactly against the order’s billing email, case-insensitively, and treat a failed match as “no such order” rather than hinting at which half was wrong.

Record keeping

The quiet half of compliance is being able to prove what happened. Three timestamps decide most withdrawal disputes: when the goods were delivered, when the consumer declared withdrawal, and when the store refunded. The acknowledgement email required by Article 11a covers the consumer’s side; the store’s side needs an internal log.

A sensible log stores each request with the order reference, the customer email, the declared items and quantities, the optional reason, the submission time and a lifecycle status such as pending, accepted, rejected or processed. Keep it minimal: this is personal data, so store what the dispute needs and nothing more. The log should also be the single destination for withdrawals that arrive through other channels; when a customer emails a withdrawal instead of using the form, record it in the same place so the process does not depend on which door the declaration came through.

Doing it with Plogins Withdraw

The free Plogins Withdraw plugin implements this flow for WooCommerce. A [withdraw_form] shortcode renders a two-step, nonce-protected form: the customer first identifies the order by order number and billing email (which works for guest orders, since the match is against the order’s billing email), then selects items and quantities, optionally gives a reason, ticks an explicit withdrawal declaration and submits. The form displays the statutory “within X days without giving any reason” wording and the exact date the window closes, plus a configurable model withdrawal text based on Annex I(B).

Eligibility is enforced before the declaration is accepted: the order must be in one of the statuses you allow (completed and processing by default), the withdrawal period, 14 days by default and configurable, is counted from the order’s completion date with a fallback to the creation date, and duplicate requests for an order that already has an open one are refused. On submission the plugin stores the request, emails the customer a confirmation listing the declared items, and notifies the shop at your chosen address.

For the “prominently available” requirement, the plugin adds a “Withdraw from this order” button under the order details in My Account for orders in an eligible status, linking to your withdrawal page with the order number pre-filled. The button checks status only; the period and duplicate checks run when the form is submitted. In wp-admin, a settings screen under WooCommerce covers the period, the form page, eligible statuses, the notification email and the form texts, and a Withdrawal Requests screen logs every request with items, dates and a per-row status you move through pending, accepted, rejected and processed. The plugin never touches money: refunds stay in the standard WooCommerce order screen, matching the legal model in which the customer declares and the merchant performs.

A sensible rollout

Start with the words, then the mechanism. Get the returns and withdrawal page right first: the 14-day right, who pays return shipping, the model form. Then publish the withdrawal form page, link it from the footer and the returns page so it is continuously reachable, and confirm the My Account button appears on a delivered test order. Run one full test withdrawal as a guest, check both emails arrive, and refund it through the order screen. From there the process is routine: a request comes in, it is already logged and acknowledged, and the only thing left on a deadline is the refund.

Plogins Withdraw