EU withdrawal button requirement
Hi everyone,
I wanted to ask whether there are already concrete plans to support the new EU withdrawal button requirement in FluentCart.
As far as I understand it, from 19 June 2026, online businesses selling to consumers in the EU will need to provide an electronic withdrawal function for distance contracts concluded online. This seems to apply not only to physical products, but also to digital products and services where consumers have a statutory right of withdrawal.
This is not just about adding a generic contact form somewhere. The process needs to allow customers to withdraw from a contract online in a clear and simple way, without being forced to log in and without having to provide a reason. After submitting the withdrawal, the customer also needs to receive an electronic confirmation without undue delay, including the date and time of receipt.
So my question to the FluentCart team is:
Are you planning to implement a legally compliant withdrawal function for EU sellers?
And if yes, is there already a concrete timeline for when this will be available?
I think this is a pretty important topic for everyone using FluentCart to sell to consumers in the EU, because once the requirement applies, sellers may not be able to operate safely without such a feature.
Thanks in advance for any update on this.
Marc Meese how this should really work? Just reading this, I think you can just create a form with any Form Plugin (Fluent Forms) and give a super simple fields_ like, name, email, order id etc and process the refund manually to make your store compliant?
Our team is exploring a feature for adding refund request and show as group but in that case, the user must need to be logged in; otherwise that will be as the same as a request a refund form.
Shahjahan Jewel Yes, technically this could be implemented with a form-like flow. But I think the important point is that this should be a native FluentCart feature and not something store owners have to build manually or solve by buying/using another form plugin.
From my understanding, the minimum compliant setup would be something like this:
A public “Withdraw from contract” page or button that is clearly accessible without login, where the customer can enter their name, email address and order ID. Then there should be a final “Confirm withdrawal” step, followed by an automatic confirmation email to the customer including the submitted withdrawal, date and time.
The refund itself does not need to be processed automatically. That can still be reviewed and handled manually by the store owner afterwards. But the withdrawal submission and confirmation flow should be handled properly.
For EU sellers, this will become a core compliance requirement from 19 June 2026, so I personally think FluentCart should provide this natively instead of relying on Fluent Forms or any other external form plugin.
Shahjahan Jewel I think there is another important aspect to consider here.
The withdrawal right is primarily a B2C concept. In many jurisdictions, including across the EU, business customers do not benefit from the statutory withdrawal right in the same way consumers do.
On top of that, even for B2C sales, the withdrawal right is not universal. There are numerous exceptions depending on the nature of the product or service. Digital content, digital services, and services that have already started with the consumer's prior consent are common examples where the withdrawal right may be limited or excluded.
Because of that, if FluentCart eventually implements a dedicated withdrawal function, I think it would need much more granularity than a global store setting.
Ideally, merchants should be able to configure it per product (or at least per product type / category), define whether a withdrawal right exists, and manage the applicable exceptions. Otherwise, stores selling a mix of physical products, digital products, services, memberships, courses, consultations, and B2B offers could quickly run into compliance and UX issues.
A one-size-fits-all approach would likely create more problems than it solves.
Also, please take this into account: one additional consideration is that a withdrawal request and a refund request are not always the same thing.
A refund can be part of a merchant's commercial policy, whereas a withdrawal right is a statutory consumer right. Depending on the jurisdiction, product type, and circumstances of the sale, the underlying legal requirements may differ significantly.
This article explains the required flow quite clearly:
https://www.datenschutz-notizen.de/one-click-withdrawal-new-obligations-for-online-shops-0859443/
Marc Meese Thanks Marc, that article is very helpful.
I think it reinforces the key point: this should not be treated merely as a generic refund request flow.
A refund request can be part of a merchant's commercial policy, but the withdrawal function is about enabling the exercise of a statutory consumer right where that right exists. That means the flow should probably cover at least:
- a clearly accessible withdrawal function, ideally not hidden behind login;
- identification of the relevant contract/order;
- a final "confirm withdrawal" step;
- an automatic acknowledgement including the submitted content, date and time;
- evidence/logging for the merchant;
- and configuration per product, product type, customer type or category, because B2C, B2B, physical goods, digital content, services, memberships and courses may not all follow the same withdrawal regime.
The article also makes another good and shared point: this affects not only the checkout or refund workflow, but also the withdrawal policy and potentially the privacy policy, since the withdrawal form itself processes personal data.
So from a FluentCart perspective, I still think the safest long-term approach would be a native withdrawal function, separate from a generic refund request feature, with enough granularity for EU merchants to configure it correctly (per product and/or category - which will allow to separate flows from B2C and B2B).
cc: Sarkar Ripon Tagging you here Sarkar, because this could be in the same area of product level customization :)
Jorge de los Reyes One question: if user is not logged in, how do you process these things? So service withdraw of the subscription or other things as well? If it's subscription, we already have cancel subscription feature.
I am trying to understand more about it, can you solve this with Fluent Forms and manual work (it definately needs manual workflow as your ecom does not know the contract).
Shahjahan Jewel Thanks Jewel, I think the key point is that “withdrawal” and “cancel subscription” are legally different things.
A cancel subscription feature normally stops future renewals or future access.
A withdrawal request is the exercise of a statutory consumer right during the withdrawal period, where that right exists. This is key.
It may apply to more than subscriptions: physical goods, services, digital services, courses, memberships or other distance contracts.
And in some cases it may not apply because of B2B status or legal exceptions that may be applicable to the specific product or service.
Also, this is not entirely new from a consumer law perspective. Under the EU Consumer Rights Directive, traders already had to inform consumers about the conditions, time limit and procedure for exercising the right of withdrawal, and provide the model withdrawal form where the right exists. Consumers could use that model form or any other unequivocal statement.
What Directive (EU) 2023/2673 adds is more specific: where the distance contract is concluded through an online interface, the trader must also provide an online withdrawal function that is prominently displayed, easily accessible and continuously available during the withdrawal period. It must allow the consumer to submit the withdrawal statement, then confirm it through a second confirmation function, and the trader must send an acknowledgement on a durable medium including the content, date and time of submission.
For non-logged-in users, I don’t think the system needs to automatically execute the withdrawal or refund immediately. Legally, the important first step is that the consumer can submit the withdrawal statement through an easily accessible withdrawal function.
A practical flow could be:
- Public withdrawal function, not only inside the logged-in account (for example: guest purchases, blocked users, users with different emails, existing transaction but no active account, etc.).
- Fields for name, email, order/contract identifier and the electronic channel for confirmation.
- No obligation to give a reason.
- A second confirmation step labelled “confirm withdrawal” or equivalent.
- Automatic acknowledgement by email including the submitted content, date and time.
- Then the merchant manually verifies whether the withdrawal right actually exists for that contract and processes refund, cancellation, denial because of an exception, etc.
So yes, a Fluent Forms + manual workflow could probably cover a minimal version if it is implemented carefully: public access, correct labels, confirmation step, automatic acknowledgement, evidence/logging and privacy notice.
But tbh, I would still separate this from a generic refund request or cancel subscription feature, because legally they are not the same workflow.
A native FluentCart feature would be safer long term because it could connect the request to the order/product/customer type and allow product-level rules for B2C, B2B, digital content, services, memberships and exceptions.
As a reference example, a Spanish developer, Fernando Tellado, has published an open source WooCommerce plugin for this. I have not tested or audited it myself, but at first glance it seems to address several of the right building blocks: public withdrawal page, WooCommerce order integration, acknowledgement emails, logs/evidence and account-area links.
Blog post explaining the approach:
https://ayudawp.com/desistimiento-ue-woocommerce/
GitHub repository:
https://github.com/fernandotellado/eu-withdrawal-compliance
Just a side note: Germany seems to be one of the first countries to move ahead with national implementation, while other Member States may still be in different stages of transposition. In any case, the EU-level requirement is already set and applies from 19 June 2026, so EU merchants should not treat this as a speculative feature request.
National implementations may clarify details and enforcement, but the direction of travel is clear. Online traders will be expected to provide a proper withdrawal function where the right of withdrawal applies.
And in my opinion, the “refund” path and the “withdrawal” path should be clearly named and separated.
A refund may come from a private commercial policy, warranty, goodwill decision or the merchant’s own terms. A withdrawal request is different: it is the exercise of a statutory consumer right, with its own legal effects and procedural requirements.
Of course, once the withdrawal is accepted, FluentCart could still use the existing refund/payment logic to return the money. But the legal workflow before that point should be distinguishable from a generic refund request, because the consumer should not be treated as merely asking for a discretionary refund. In many cases withdrawal leads to reimbursement under statutory rules, while a commercial refund may be partial, conditional or purely discretionary.
Also, one more implementation detail: the withdrawal option should probably be time-window based.
For ordinary online B2C distance sales, the standard withdrawal period is usually 14 days. So, as a product default, it would make sense for FluentCart to show the withdrawal option only during the 14-day withdrawal window and then remove it from the customer-facing flow once that period has expired.
That said, I would not hardcode it forever. If there is demand later, the period should ideally be configurable, because some cases may require a longer period depending on the type of contract or national implementation. For example, some off-premises situations may have longer periods, and if the trader failed to provide the required withdrawal information, the withdrawal period can be extended significantly (up to 12 months in some cases). But that last case is already a “merchant did not do their legal homework” scenario, so I would not design the first version around it. 14 days should fit most online sellers for the cases in which the withdrawal right is applicable.
For a first practical implementation, I would probably start with a 14-day default window. The withdrawal option would be visible to the customer while that window is active, and after that it could disappear from the customer-facing flow or be marked as no longer available. Manual/admin handling could remain available for exceptional cases.
Hope it helps to better understand the approach. Just let me know if you need to clarify any point.
Jorge de los Reyes , it seems that the plugin that you mentioned in the post is even more suitable than the one I mentioned. It is more comprehensive. Thanks.
Juraj Hudák happy to share Juraj! 😄
Do you mean the German implementation of the EU Directive? The title of "Withdrawal Button" or "Button Requirement" is misleading. That is just common wording, the law requires a withdrawal function which can be a form, or it can even be a function within the user account to withdraw only a subset of contracts. However, I would always go with the form. Withdrawal is not the same as cancel. Adding that to FluentCart can become very tricky. Using a simple Fluent Form with the consumer’s name,
details identifying the contract the consumer wishes to cancel,
and details of the electronic means of communication should do everything you need.
For those questions I prefer talking to a lawyer rather than a privacy council. See this for a pretty detailed description (German only): https://www.it-recht-kanzlei.de/widerrufsbutton-faq-leitfaden-online-handel.html
EDIT: Found this article including examples just after posting the comment: https://datenschutz-generator.de/widerrufsbutton/
And what about B2B payments with PEPPOL, already implemented in several countries. I'm afraid Fluentcart unfortunately won't be usable in Europe for a long time. Our legislations are crazy.
DAVID MOUSSEBOIS it's already available since November 2025:
https://community.wpmanageninja.com/portal/space/fluent-cart/post/our-fluentcart-integration-is-launched
Shahjahan Jewel A simple form like you suggested for guest sales is sufficient, so the feature being requested is redundant. However, an official returns function in the admin and possibly for logged-in customers would indeed be fantastic. Shopify has this too, and it works great (screenshot 1: return & 3: refund). As you can see, there is an option to upload return labels and track the shipment yourself. There is also a function to deduct costs, such as the cost of the return label or processing fees. By the way, a built-in function in FluentCart for tracking orders for users who do not use a shipping platform (screenshot 2). And the ability for 3rd party services to hook into this via API would also be fantastic.
*I used AI to convert the Dutch text in the screenshots to English.



Shahjahan Jewel according to the directive as far as I understand it, people need to be able to basically do ctrl+z on purchases and other as quickly as possible. Making someone wait for an admin to take care of this actually causes issues with compliance. So it would be useful and necessary to make a withdrawal button available on the FluentCart shop page as well as the 'thank you for your order' page.
Shahjahan Jewel , I agree with Jorge de los Reyes .
In the long term, it will be necessary for the return functionality to be implemented natively in FluentCart and a "workaround" solution via FluentForms will not be sufficient, because this type of functionality may tend to develop and this will be one of the decisive signals whether an EU seller chooses FluentCart as a solution.
We have this solution deployed on one of our Woo e-shops https://wordpress.org/plugins/eu-withdrawal-button-for-woocommerce/ and it currently provides the minimum that is needed. This means the ability to enter mandatory order and customer data via a publicly available form, where even an unregistered consumer will be answered by the system whether they are still within the 14-day period and can submit a return request, or if they have already exceeded it.
However, if he logs in, it is of course easier, because either the data can be pre-filled for him, or he should see a button in the order list for that order, where it still falls within the defined withdrawal time. If it is exceeded, he no longer has that option.
About 2 weeks ago I also filed a ticket with support, but what is described in this thread is even more valuable.
If a merchant/seller has hundreds or thousands of products, it is essential to have this functionality available, because otherwise it can be madness if even 100 customers return the ordered goods at different times.
Sander W., Shahjahan Jewel there's so much conflicting information so I thought I'd do a deep dive. The German government didn't make it easy, though!
Here's what I was able to understand after my research:
- The customer should not have to take additional steps for withdrawing compared to originally making the order. So, sites with guest purchases enabled must provide a way for guests to withdraw without logging in.
- For cancellations, you need to provide a reason and the seller can take a reasonable amount of time to respond for you. For withdrawals, they need to be able to do it immediately and with no reason. The only thing you can ask them to provide is security information to ensure someone isn't maliciously withdrawing their purchase.
- You can still provide a withdrawal button on their account page if they are automatically logged in upon purchase, since they wouldn't need to take any additional steps or provide any additional information to get there. This is one step to being compliant.
- It is ok to offer an optional login form that customers can choose to log in with if they want to, but it musn't be mandatory to log in for the purpose of a withdrawal.
- The withdrawal button needs to cancel the transaction and make it as if it didn't happen at all. That's different from a cancellation.
- If a client forgot their username and password and accidentally gets logged out, they should still be able to withdraw without having to go through any other steps. That means it's not compliant for you to force them to reset their password in order to access the withdrawal.
- The withdrawal needs to give them confirmation immediately.
- If you make them wait for approval, the system is not compliant. We cannot have it so that the consumer waits for us to manually approve the withdrawal, but we also can't make it so that people have the power and ability to maliciously withdraw someone else's orders.
- You can ask customers for identifiers like their name, order number and password in order to ensure security. However, it comes with a few caveats:
- If the customer is already logged in, you can't ask for those things again.
- It cannot send or redirect the customer to a login page. Those identifiers need to be part of the form they fill out for withdrawal.
- The process for withdrawing can't be longer, be more involved, require more infromation or require more steps than the process of signing up did in the first place.
However, this does introduce a security issue that I think is important for us to talk about: if people are able to withdraw without friction or login, then hypothetically they could maliciously withdraw someone else from a purchase with no way to stop that. This would also be a legal nightmare, not only because of the GDPR issues of trying to figure out if the person who withdrew was correct.
So I thought a good solution was double opt-in of some sort, although doesn't that introduce an extra step, which goes against the compliance? It turns out that it would probably not be compliant because it requires extra steps. They ask you to provide email confirmation of the withdrawal, but not email verification that you want to withdraw. It needs to happen after the withdrawal has already taken place.
This put me in a stressful situation, because I know there are many people online who would be able to find a way to exploit this: either maliciously withdrawing other people's orders or withdrawing their own when it's not appropriate to do so.
My next consideration was this: if you cannot require extra steps for them to withdraw, would it be ok to put a magic withdrawal link into all confirmation emails and invoices that bypasses the need to log in? But the problem with this is that it could still be considered to be an extra step that they're engaging with.
I did find this though:
On the confirmation page, a business required its customers to provide their password as an identifier for the termination (i.e. this was no login request, but a password request). The court found this additional information request on the cancellation confirmation page to be acceptable since it solely served for the clear identification of the consumer and did not redirect them to a login or customer account area. This practice does not constitute an inadmissible hurdle under §312k BGB.
From the page I found it on (if it's got good legal information), it seems to me that the problem that many companies were running into is that you cannot require login or redirect a customer to a login page that is not related to the form.
However, you can require identification during the form process for security purposes, as long as the place where you're requiring this information is in the actual withdrawal or cancellation form. Of course, these are talking about legal battles for cancellation rather than withdrawal (which aren't the same thing), but given the relative lack of information about the withdrawal button, I am forced to treat the two as if they have the same requirements.
But since the withdrawal needs to be immediate, there still needs to be automation and integration with FluentCart. There also needs to be an automated way for us to check user authenticity without requiring them to log in, either through providing a password or some other identification that's more than just the order number and email.
There would then need to be an automated, immediate process to check the details that the customer provided and cancel if the details match a real purchase that is within the mandatory withdrawal period. Then, the contract needs to be automatically cancelled, and an email confirmation needs to be sent immediately.
But it also needs to account for the fact that once the customer has accessed the product they terminate their right to the withdrawal period immediately. So if they open a course that they paid for on FluentCommunity and go to a lesson, for example, then they no longer get right to withdraw.
With that in mind, a simple form is not enough.
But please do let me know if you're an actual German speaker, any of you! I'm just piecing things together with some help from friends, a dictionary and Google Translate.
Sources in another comment.
What to do?
It seems to me that the best way for FluentCart, FluentForms and FluentCommunity etc to be compliant is going to take a lot of thought. The things we would need to be undeniably following the law are:
-
Turn off guest checkout if you don't want people to have to provide no identifying information. I think guest checkouts that don't mandate account creation during the process are a bad idea, anyway.
-
Provide a withdrawal button in the confirmation screen/page that customers see after an order is placed.
-
A section of the shop account that allows people to cancel and withdraw that's clearly visible from their account page.
-
Shortcodes for us to be able to visibly place the withdrawal/cancellation form button in footers/headers/sidebars.
-
A way for the FluentForm to check pre-existing information for customers that will confirm if their password is correct without them having to be forced into a login page. It should natively be part of the withdrawal form.
-
A way for the identification sections to be already filled in if the person is logged in.
-
A section in order confirmation emails that redirects them to the withdrawal page, with possible magic links to reduce friction (for a time, anyway. I understand the security risks of having a magic link that's accessible for 14 days).
-
FluentCart, FluentCommunity, FluentSMTP, FluentBooking and FluentForms will need to talk to one another more clearly:
- Immediately check credentials and grant the withdrawal if they match and the customer is still within their withdrawal period.
- Immediately send a confirmation email if the withdrawal is successful.
- If the details do not match, immediately send an email notification to inform the consumer, perhaps alongside automatically a FluentSupport ticket to query if the customer was the person asking for the withdrawal.
- Set custom withdrawal periods in line with EU law that also let us account for things like services that are already complete (for example, completing a booking on FluentBooking should automatically cancel the withdrawal period).
- Check if the user has downloaded any digital material on FluentCart or if they have accessed a lesson or downloaded a resource in the Community, or if they accessed the space that they paid for. This should then automatically cancel their withdrawal.
- We might also need to be able to set product-based withdrawals for FluentCart and meeting date-based withdrawals for Bookings.
This would need to be comprehensive and include all the things I listed.
The reason I'm adding all these complex things isn't because I think it's easy to do. It's because if we need to automatically give them their withdrawal, then we need to still have a way to protect ourselves.
Otherwise, we might run into situations where someone is outside of their withdrawal period, or they have already used the product/service and then get an automatic withdrawal or refund immediately. That could be very dangerous for us sellers in the long run as it's an easy system to exploit.
On the other hand, if we try to do it that we respond to forms, we will not be compliant. It's supposed to be like a Ctrl+Z like I said earlier, so you cannot require them to wait until business hours or anything like that. It has to be immediate.
Sources
- https://www.gesetze-im-internet.de/bgb/__356a.html
- https://www.bmjv.de/SharedDocs/Gesetzgebungsverfahren/DE/2025_GAendVVVR.html?nn=110490
- https://www.hoganlovells.com/en/publications/eu-consumer-protection-law-update-new-mandatory-withdrawal-button-what-online-traders-need-to-know
- https://www.bmjv.de/SharedDocs/Downloads/DE/Gesetzgebung/RefE/RefE_GAendVVVR.pdf?__blob=publicationFile&v=3
- https://www.recht.bund.de/bgbl/1/2026/28/VO.html
- https://www.twobirds.com/en/insights/2025/germany/germany-the-obligation-to-provide-consumers-with-an-online-cancellation-button--update-on-recent-rul#:~:text=Higher%20Regional%20Court%20N%C3%BCrnberg%2C%2030,the%20law%20to%20simplify%20cancellations.
- https://dserver.bundestag.de/btd/19/308/1930840.pdf
- https://datenschutz-generator.de/widerrufsbutton/#:~:text=Fazit-,Zusammenfassung,und%20ein%20gesetzliches%20Widerrufsrecht%20besteht.
Also I think this covers what Jorge de los Reyes was saying about granularity
Shani Cipro the government is not making it any easier for us 🙄. Looks to me they need to discuss this further, because this can be a potential disaster. in the meantime a form will do for me. If I (or my clients) get a warning, I will go into discussion on what is possible or not
Any news about the integration?
According to the regulations, this would be required by June 26 at the latest.
Ideally, once logged in, users should be able to directly access orders placed within the last 14 days and cancel them. If not logged in, there should simply be a form field for the email address, first and last name, and order number.
This is how Germanized handles it for WooCommerce,
