arrow_left_alt

Blog

Contract withdrawal in Sylius Plus: How the RMA module meets the new EU rules

June 16, 2026

If you run an online store in the EU, you probably already know about the new return rules taking effect on June 19, 2026, under EU Directive 2023/2673. In short: customers must be able to withdraw from a purchase just as easily as they completed it - with a clearly visible function, automatic confirmation, and no friction designed to put them off.

What you might not know yet is that Sylius Plus already ships a ready answer to this requirement - built directly into the Return Management (RMA) module, without any custom development needed.

What the directive actually requires

The directive is not just a checkbox exercise. It sets specific expectations about how a withdrawal process has to work:

  • a clearly labeled "withdraw from contract" function, permanently accessible throughout the 14-day statutory window,
  • a simplified, low-step flow with no unnecessary barriers,
  • automatic confirmation sent to the customer on a durable medium (email),
  • a ban on dark patterns - hidden buttons, misleading copy, or anything that makes it harder to submit a request than it needs to be.

A downloadable PDF form or a "contact us" email address will no longer be enough on its own. The new withdrawal function does not replace other withdrawal methods, but it must be available directly through the online interface. The process has to be digital, self-service, and clearly presented in the store itself.

Non-compliance carries real risk: penalties from consumer protection authorities can reach up to 10% of annual turnover, and failure to inform customers about their withdrawal rights can extend the return period by up to 12 months.

https://bitbag.io/blog/eu-directive-2023-2673-new-return-requirements

How Sylius handles it out of the box

The contract withdrawal flow in Sylius Plus runs alongside the existing RMA (returns) process. It has its own two-step form, its own confirmation email, and its own entry in the admin return-requests list - separate from standard returns, tagged clearly by type.

The whole thing is built around the letter of the directive: two deliberate steps, no reason required, automatic acceptance, and a timestamped email as proof of receipt.

For logged-in customers, a "Withdraw from contract here" button appears directly on the order page whenever the order is still within the withdrawal window.

Note: The withdrawal button on the customer's order page. 

The first step asks the customer to tick the items they want to withdraw from. That's it - no reason, no drop-down, no explanation required.

Note: Step one: selecting the items to withdraw from. 

On the second step, they review a withdrawal declaration and click "Confirm withdrawal". The store immediately sends a confirmation email listing the items and the timestamp - the durable medium the directive requires.

Note: Step two: reviewing the declaration and confirming the withdrawal. 

For guests, a permanent "Withdraw from contract" link sits in the shop footer. They enter their order number and the email used at checkout, then receive a secure one-time link that opens the same form. The response is always identical regardless of whether the data matched - so the form can't be used to probe orders.

Note: The guest withdrawal form - order number and email address. 

Store configuration

Setup lives entirely in the standard admin panel and takes a few minutes. Channel settings - withdrawal is enabled per sales channel, with a configurable window (14 days by default). You can turn it off entirely for channels where it doesn't apply.

Note: Enabling withdrawal and setting the withdrawal period on a sales channel. 

  • Product exclusions - certain product types don't qualify for the right of withdrawal under EU law: personalized goods, sealed hygiene products, perishables, digital content that has been accessed. These are marked directly on the product variant as not eligible.
  • Delivery dates - because the withdrawal window runs from delivery (not from order placement), staff or a carrier integration records when each shipment was delivered. This is what determines whether the button appears on an order at all.
  • Refunds - withdrawals appear in the existing return-requests grid in the admin, tagged as "Withdrawal" type alongside standard returns. Staff issues the refund from there once the goods are back.

Note: Withdrawals in the admin panel alongside standard returns, each tagged with its own request type. 

Legal texts and withdrawal information should also be reviewed. The module provides the technical flow, but each store still needs to make sure its terms, withdrawal policy, footer links, emails, and local declaration wording match the applicable market requirements. 

A few things worth knowing

  • Withdrawals are accepted automatically. Once a customer submits a request within the window, it can't be rejected on the store's side - that's by design, because the law doesn't give the merchant a veto here. The customer gets immediate certainty, and the store stays on the right side of the directive without any manual review step.
  • The refund itself stays in staff hands. Automatic acceptance doesn't mean automatic payment. The store decides when to actually issue the refund - typically once the goods are back - and nothing is paid out until that decision is made. That gives the team time to inspect the return before processing it.
  • Every withdrawal generates proof of receipt. As soon as the customer confirms, the store sends a timestamped confirmation email listing the items included in the withdrawal. This is the "durable medium" the directive requires - it's automatic and doesn't need any configuration.
  • Translations are the store's responsibility. The module ships in English. Each market has its own legally prescribed wording for the withdrawal declaration, so the implementing store adds the translations that match local requirements. For most Sylius stores, this is standard localization work, but it's worth factoring in if you're launching in multiple EU markets at once.

What this means for Sylius stores

The directive comes into force on June 19, 2026. For stores running Sylius Plus with the Return module up to date, the core requirement - a clearly labeled, always-available, self-service withdrawal function - is already there. No custom code, no separate plugins, no rebuilding the checkout flow.

For stores that aren't on Sylius Plus yet, or that are still running an older version of the Return module, now is a good time to check where things stand. The window for implementation before the deadline is short, and the risks of being non-compliant from day one are real.

{{cta-technology-sylius-plus="/comp/cta"}}