In short and in plain language
This is about a button in your shop for withdrawing from a purchase. The article explains what the rules for it require.
The button is more than a text. It consists of several steps in the shop. An update can disrupt these steps.
That is why you check the process at fixed intervals and record the result.
We check the withdrawal steps in your shop. If an update changes something, we let you know.
Since 19 June 2026 (Directive 2023/2673), contracts that consumers conclude through an online interface carry an obligation shop operators previously knew only from cancellation: a control that lets a contract be withdrawn without downloading a form, typing an email or dialling a number. The statutory text is short. Its consequences for day-to-day operations are not. A withdrawal notice is text and gets written once; a withdrawal function is a flow made of a form, a confirmation step, a message dispatch and a timestamp. It depends on the theme, the customer account and the mail template – and therefore on everything an update can move.
Key takeaways
- Section 356a BGB requires a withdrawal function on the online interface, legibly labelled and continuously available while the withdrawal period is running (BGB § 356a).
- The duty hangs on the contract type, not on the sector: it applies where a consumer concludes a distance contract through an online interface and a right of withdrawal exists (BGB § 312g).
- The flow has two stages. The entry is followed by a confirmation function, then an acknowledgement of receipt with date and time on a durable medium (BGB § 356a).
- Everything else stays as it was: a 14-day withdrawal period (BGB § 355), twelve months and 14 days without proper instruction (BGB § 356), reimbursement within 14 days (BGB § 357).
- With the cancellation button, one year after the deadline only 42 percent (vzbv) of the audited provider sites had a compliant solution – implementation takes longer than the statute suggests.
Where the withdrawal button comes from and what it demands
The withdrawal button comes from European law. Directive 2023/2673 amended the Consumer Rights Directive and inserted a new Article 11a (Directive 2023/2673) governing the exercise of the right of withdrawal for distance contracts concluded through an online interface. The occasion was the distance marketing of financial services. The new provision was not placed in a special section, though, but in the general part of the Consumer Rights Directive. Member States apply the rules from 19 June 2026 (Directive 2023/2673). In Germany the transposition sits in section 356a BGB, headed Electronic withdrawal function for distance contracts (BGB § 356a). Anyone deriving the scope from the legislative history therefore ends up wrong: the German text contains no restriction to financial services.
The core of the provision sits in paragraph 1. The trader has to make sure the consumer can submit a withdrawal declaration through a withdrawal function on the online interface. The function has to be legibly labelled Vertrag widerrufen (BGB § 356a) or with another equally clear wording of the same meaning. And while the withdrawal period runs it has to be continuously available (BGB § 356a), placed prominently and easy to reach. Those are three requirements with little in common: a label, a placement and an availability across a span of time. The theme handles the first two. The third is a statement about operations – and therefore the actual maintenance task. The article on legal text maintenance does not help here: that one is about text, this one is about an order flow.
What paragraph 1 demands word for word
Who the duty applies to - and who it does not
The question of who is covered gets answered wrongly in both directions in advice articles. One claim is that the withdrawal button applies to financial services only, because the underlying directive deals with the distance marketing of financial services. The other is that every website needs one now. Neither survives contact with the statute. Section 356a BGB attaches neither to a sector nor to a website, but to a contract type: to distance contracts concluded through an online interface (BGB § 356a). What follows from that breaks down into three questions to be answered in sequence – and the sequence is not arbitrary, because the second and third only count once the first has been answered yes.
First: is this a consumer contract with a right of withdrawal? Under § 312g paragraph 1 (BGB § 312g) the consumer has a right of withdrawal for off-premises contracts and for distance contracts. A shop that sells to businesses only, and secures that in the order process, therefore falls outside the duty. Second: is the contract concluded through an online interface? Orders by telephone, fax or catalogue card are distance selling, but they do not run through an online interface. Third: does an exemption apply? The catalogue in § 312g paragraph 2 (BGB § 312g) excludes, among others, made-to-measure goods, perishable goods, unsealed hygiene articles and services tied to a specific date. Where no right of withdrawal exists in the first place, there is nothing to withdraw.
Consumer contract
The function is aimed at the consumer. If a shop sells to businesses only and that is solidly secured in the order process, no right of withdrawal arises and therefore no withdrawal function.
Concluded via an online interface
What matters is where the contract comes about. A shop, a booking flow or a portal in the customer account are online interfaces; an order taken over the phone is not.
No exemption applies
If the contract falls under the exemption catalogue, there is no right of withdrawal to begin with. The function is not needed there – but it is for every other item in the same range.
Mixed product range
Hardly any shop sells exempt goods exclusively. As soon as a single withdrawable item sits in the catalogue, the duty is difficult to argue away in practice.
The running period as a condition
The function has to be available while the withdrawal period runs. It therefore belongs where a customer finds their contract again: in the customer account and in the order confirmation.
Insurance contracts too
For distance contracts concluded through an online interface, the Insurance Contract Act refers expressly to the same provision. The scope thus reaches beyond the sale of goods.
The cross-reference from insurance law is the best evidence that the provision is not limited to financial services: VVG § 8 (VVG § 8) expressly orders section 356a BGB to be applied to distance contracts concluded through an online interface. Such an order would be pointless if section 356a only covered financial services anyway. Conversely, a look at the cancellation button shows what a genuine sectoral carve-out looks like: § 312k (BGB § 312k) expressly excludes websites concerning financial services and contracts on financial services. The text on the withdrawal function contains no comparable clause. Anyone auditing the order flow is therefore better off asking about the contract than about the sector – just as with checkout monitoring it is not the home page that counts but the completion.
The most common false conclusion
Two stages: withdrawal function and confirmation
The provision describes a flow, not a button. The first stage is the withdrawal function itself. It has to let the consumer transmit a withdrawal declaration and, in doing so, provide or confirm three items (BGB § 356a) without further ado: the name, details identifying the contract or the part of the contract to be withdrawn, and details of the electronic means of communication through which the acknowledgement of receipt is to arrive. The phrase without further ado is the real requirement here. Forcing logged-in customers to copy an order number out of an invoice in PDF format satisfies the wording in form only. Where the details are already known, they belong in the form, pre-filled and confirmable.
The second stage is the confirmation. Once the details are provided or confirmed, the trader has to let the declaration and the details be transmitted through a confirmation function. That function has to be legibly labelled Widerruf bestätigen (BGB § 356a) or with another equally clear wording of the same meaning. Two stages mean two states that can break separately: the first stage can be perfectly reachable while the second fails on an expired form token. That case in particular escapes a superficial glance at the page. The control is visible; whether the dispatch path behind it holds only shows in a full run with a real contract.
Label of the first stage
Vertrag widerrufen or an equally clear wording of the same meaning. A translation that turns it into cancel order describes a different process and is not a wording of the same meaning.
Label of the second stage
Widerruf bestätigen on the confirmation function. The step must not disappear as an incidental safety prompt in the fine print; it carries its own clear label.
Placement
Placed prominently and easy to reach. An entry in the footer among twelve other links meets that as little as a page that can only be found through the search.
Availability
Continuously available while the withdrawal period runs. The object of the audit is therefore a span of time and not a point in time – and that difference decides the audit rhythm.
Pre-filled details
Name, contract reference and return channel should be providable or confirmable without further ado. Mandatory fields imposed without need are the opposite of that.
No additional hurdles
The statute names three items. A forced reason is not among them, and the withdrawal does not have to contain a reason in any case (BGB § 355).
What the function does not have to ask for matters as much for the audit as what it does. The statute names three items, and the withdrawal declaration itself does not have to contain a reason (BGB § 355). Building in a mandatory field for the reason makes it harder to exercise a right whose exercise was meant to be made easier. The same goes for a forced login where the contract was concluded as a guest: there the path runs through an access key in the order confirmation, not through an account that was not created. As a rule of thumb for the audit: anything standing between customer and dispatch that does not come from the statute needs a reason – or goes. Our services start exactly at that point.
#!/usr/bin/env bash
# Daily check of the withdrawal path: reachable, labelled, submittable
set -euo pipefail
BASE="https://shop.example.invalid"
ACCOUNT="$BASE/kundenkonto/bestellungen"
STATUS=$(curl -fsS -b session.txt -w '%{http_code}' -o page.html "$ACCOUNT")
test "$STATUS" = "200"
# Step 1: match the wording literally, do not just count the button
grep -q 'Vertrag widerrufen' page.html
grep -q 'name="widerruf_vertrag"' page.html
# Step 2: submit the form and demand the confirmation step
curl -fsS -b session.txt -d 'vertrag=TEST-1&kanal=mail' \
-o step2.html "$BASE/widerruf/pruefen"
grep -q 'Widerruf bestätigen' step2.htmlText stays put, a flow does not
Acknowledgement, timestamp and deemed receipt
Paragraph 4 adds a third step that is easy to overlook because it leaves the shop. Once the consumer has activated the confirmation function, the trader has to transmit an acknowledgement of receipt on a durable medium without undue delay. It has to contain at least the content of the withdrawal declaration plus the date and time (BGB § 356a) of its receipt. That turns form processing into a dispatch duty with prescribed content. Three things have to come together for it: a template with the required fields, a dispatch path that actually delivers, and a server clock that is right. If one of them fails, the control in the shop stays quietly visible while the duty goes unmet.
| Stage | What the statute demands | Where it fails in practice |
|---|---|---|
| Stage 1: withdrawal function | legible label, prominent placement | a theme update resets the block, the link slides into the footer |
| Stage 1: availability | continuously available while the withdrawal period runs | maintenance mode, access protection or a cache stop serving the page for a while |
| Stage 1: details | name, contract reference and return channel providable without further ado | mandatory fields without pre-fill, order number readable only from the invoice |
| Stage 2: confirmation | confirmation function with the prescribed label | expired form token, blocked script, consent layer sitting over the control |
| Stage 3: acknowledgement | durable medium with content, date and time | template left without a timestamp after the update, delivery lands in the spam filter |
| Evidence | receipt counts from timely dispatch onwards | no log, no check of the server clock, no regulated retention |
Paragraph 5 shifts the risk. The withdrawal declaration is deemed to have been received by the trader within the period if the consumer dispatched it through the withdrawal function before that period expired (BGB § 356a). For operations that means: the moment of dispatch decides, not the moment of processing. A queue that only works messages off hours later changes nothing about timeliness – but plenty about whether it can be evidenced later. That is why the withdrawal flow belongs in the same monitoring as the checkout, with an eye on response time, error rate and queue length. How such signals can be brought together is described in the article on log monitoring.
What still applies alongside: periods and reimbursement
Alongside the new function, the familiar law on periods is unchanged, and that is precisely what gets lost in the excitement about the button. The withdrawal period is 14 days (BGB § 355). In a consumer sale it does not start at conclusion of the contract but once the consumer or a third party named by them, other than the carrier, has received the goods; with separate deliveries the last item counts, with part shipments the last part, and with regular delivery the first item (BGB § 356). For maintenance that is not a legal nicety but the basis of the audit rhythm: the period determines how long the withdrawal function has to stay reachable for a specific order.
Two further periods belong with it. Without proper instruction the right of withdrawal expires only after twelve months and 14 days (BGB § 356) – a span that can hold three shop updates and two theme changes. And the payments received are to be reimbursed no later than 14 days (BGB § 357), whereby in a consumer sale the trader may refuse reimbursement until the goods are back or their dispatch is evidenced. The model withdrawal form on the website remains permissible alongside (BGB § 356); the new function is added to it rather than replacing it. Anyone maintaining their legal texts therefore keeps both paths in view.
- 14-day withdrawal period, starting in a consumer sale when the goods are received
- Right of withdrawal expiring at the latest twelve months and 14 days after that point
- Reimbursement of the payments received no later than 14 days
- Trader's right to withhold until the goods are back or their dispatch is evidenced
- Model withdrawal form on the website remains permissible as an additional path
- Withdrawal without a reason, the period met by timely dispatch alone
The audit rhythm follows from these periods on its own. A function that still has to hold twelve months after an order does not tolerate an annual visual check. What makes sense is a daily automatic run for reachability and label, a monthly run with real dispatch against a test contract, and an additional run after every update touching theme, customer account or dispatch path. The effort for that stays modest as long as it sits inside an existing maintenance routine – and gets unpleasantly high when it is caught up on only after a warning letter.
The cancellation button as a preview of implementation
How long implementing such a duty takes can be read off the cancellation button, in force since July 2022. A year later, in June 2023, the Federation of German Consumer Organisations re-examined 2,946 provider websites: on 1,233 (vzbv) sites a compliant cancellation button was found, while on 1,713 sites none could be identified. Compared with the 2022 survey the share had risen by 14 percentage points to 42 percent (vzbv). Put differently: one year after the deadline had passed, the majority of the audited sites had yet to meet the duty. The withdrawal button is technically more demanding than the cancellation button, because it adds a span of time and an acknowledgement of receipt.
The order of magnitude involved can be quantified. Gross turnover with goods in German e-commerce reached 83.1 bn euros (bevh) in 2025, after 80.6 bn euros the year before. And a good 83 percent (Destatis) of the population aged 16 to 74 stated in 2024 that they had bought or ordered something online at least once, which corresponds to around 52 million people. Every one of those contracts that comes about through an online interface and carries a right of withdrawal is a contract for which the function has to be reachable. This is not a fringe feature for edge cases but a standard path of the order flow.
Auch ein Jahr nach in Kraft treten des Gesetzes lässt sich ein großes Defizit bei der Umsetzung der Regelung feststellen.
What an update breaks and how it shows
The withdrawal function sits at one of the most mobile spots in the shop. It depends on the theme, because the control and its label are rendered there. It depends on the customer account, because the contract reference comes from there. It depends on form processing, because the second stage needs a valid token. And it depends on the dispatch path, because the acknowledgement leaves the shop. An update can loosen any of those connections without producing an error page. Translation gaps are particularly inconspicuous: if the key for the label is missing, the interface shows the technical placeholder in the second language – a control, in other words, that is no longer legibly labelled. How to track down such gaps is covered in the article on translation gaps in the shop.
Theme update removes the block
After deployment the control is missing from the customer account, because the overwritten template no longer contains the custom block. The page still loads with status 200.
Translation key missing
In the second language the technical key appears instead of the prescribed label. For the audit that is the same as a missing label.
Consent layer sits on top
A new consent layer covers the control or blocks the script that submits the second stage. Everything is visible, nothing is clickable.
Cache serves an old state
A cached page shows the version from before the correction. The defect is fixed and still in circulation.
Acknowledgement without a timestamp
The template was replaced during the update, and the date and time of receipt are missing. The message arrives but no longer meets the content the statute prescribes.
Findable only through the search
The link slides out of the customer account into the footer. Placed prominently turns into present, and that is a different state.
These patterns have one thing in common: they arise on a change, not in steady operation. That is why the withdrawal flow belongs in the regression test after every update, and why it belongs on the practice environment beforehand. A run on staging costs minutes; the same run on the production system costs a real contract. How to build regression tests after updates is described in the article on update testing. Two additions matter: the test has to check the label word for word and not merely the existence of a control. And it has to actually submit the second stage, because otherwise precisely the part most likely to break stays out of view.
The audit path for the withdrawal function
Inventory of contract types
First it is established which contracts are concluded through the online interface and for which of them a right of withdrawal exists. The result is a list of contract types, not a statement about the sector.
Visual check of both stages
In the customer account and in the order confirmation it is checked whether the withdrawal function is present, prominently placed and legibly labelled – and whether the confirmation function carries the prescribed label.
Run with a test contract
A test contract is created and withdrawn through both stages. What gets checked is the pre-filling of the details, dispatch without additional mandatory fields, and the arrival of the acknowledgement including date and time.
Fixed rhythm and alert path
The flow is set up as a daily reachability test and a monthly full run, plus a run after every update to theme, customer account or dispatch path. Deviations go into the same alert chain as checkout errors.
First it is established which contracts are concluded through the online interface and for which of them a right of withdrawal exists. The result is a list of contract types, not a statement about the sector.
In the customer account and in the order confirmation it is checked whether the withdrawal function is present, prominently placed and legibly labelled – and whether the confirmation function carries the prescribed label.
A test contract is created and withdrawn through both stages. What gets checked is the pre-filling of the details, dispatch without additional mandatory fields, and the arrival of the acknowledgement including date and time.
The flow is set up as a daily reachability test and a monthly full run, plus a run after every update to theme, customer account or dispatch path. Deviations go into the same alert chain as checkout errors.
The test contract is the delicate part, because it touches real data. It belongs on its own customer account with its own address, it gets cancelled after the run, and it uses an item that does not fall under the exemption catalogue. Using a customer case instead audits the same path but creates a booking someone has to explain later. On the practice environment that problem disappears, but real payment methods and the real dispatch path are missing there. Both are therefore needed: the full run on the practice environment and the narrow reachability test on the production system. For finding the page, incidentally, the same applies as for the shop search: what nobody finds does not exist, in case of doubt.
Logging what counts in a dispute
That leaves the evidence. Because receipt counts from timely dispatch onwards, what decides a dispute is what the operator can say about that moment. A lean log makes sense: contract number, moment of dispatch in server time including the time zone, the three transmitted details, the dispatch time of the acknowledgement and its recipient address. Those entries are personal data and therefore need retention limits and access rules of the kind described in the article on GDPR-compliant backup retention. The withdrawal flow likewise belongs in the regular check of operability: a control that cannot be reached with the keyboard is not easy to reach – a point the article on shop accessibility explores further. In day-to-day operation that is handled by Shopware maintenance, together with monitoring of the order flow.
Sources and Studies
Related Articles
Statutory warranty label 2026: keeping product pages current
From 27 September 2026 product pages need the harmonised warranty notice and, where it applies, the durability label. Three zones, checkpoints, evidence.
WordPress security updates: what old branches still get
WordPress 7.1.2 closed a critical flaw and the fix was backported to 4.7 as a courtesy. What older branches receive, what they do not, and when to move up.
Moving Shop Servers Without Losing Orders: A Runbook
Resolvers may keep serving stale DNS answers for 1 to 3 days. How a shop moves servers without losing orders, cron jobs or payment notifications.