Your Shopify store may be facing a legal deadline you have never heard of. From June 19, 2026, any online store selling to EU buyers must display a visible, functional EU withdrawal button directly on the storefront. Not in your returns policy. Not inside a help article. On the storefront, labeled clearly, working automatically. Stores that miss this deadline risk fines of up to 4% of annual turnover in some EU member states, plus a return window that extends from 14 days to 12 months and 14 days.
That last part is worth reading again. Twelve months and fourteen days. For every EU order you ship without a compliant withdrawal function in place.
At Wavesy, we work with ecommerce brands on conversion rate optimization, and compliance is one of the fastest ways to destroy conversion rate trust overnight. A legal warning or an extended return liability does not just hurt your legal standing. It creates the kind of uncertainty that kills repeat purchase rates. EU Directive 2023/2673 is now enforceable, and the brands that set this up this week will sleep better than the ones that wait.
TL;DR
- EU Directive 2023/2673 requires a visible, electronic withdrawal button on any store selling to EU consumers, effective June 19, 2026
- The button must trigger a two-step confirmation flow and send an automatic email confirmation
- Non-compliance risks fines up to 4% of annual turnover in some member states and a return window extension to 12 months and 14 days
- Correct placement is in the footer, the order confirmation page, and the customer account or help area
- You can implement this via a Shopify app, a native Shopify feature (rolling out June 17, 2026), or a custom page with a snippet (full code in this article)
- The fix takes under 30 minutes for most Shopify stores
What Is the EU Withdrawal Button Requirement?
The EU withdrawal button is a legally mandated, clearly visible function on your online storefront that lets EU consumers cancel an unfulfilled order electronically, within the 14-day statutory withdrawal period, without needing to email support or find a buried contact form.
EU Directive 2023/2673 amended the EU Consumer Rights Directive to require this. Member states were required to transpose it into national law by December 19, 2025, with enforcement beginning June 19, 2026. Germany’s implementation, under § 356a BGB, is among the most specific, with fines up to 4% of EU-market annual turnover for larger traders and up to €2 million.
What makes this different from a returns policy or a contact form:
- It must be labeled as a withdrawal function, not hidden inside general help content
- It must be accessible without login or unnecessary clicks
- It must trigger a two-step flow: button click, then confirmation
- It must automatically send a confirmation on a durable medium, meaning email
TL;DR: This is a new legal UX requirement. It is not a policy update. It is a button that must exist and work.
How Does the EU Withdrawal Button Work?
The compliant flow has four components. Each one is required. Missing any single component puts you out of compliance.
Step 1: The Visible Entry Point
The withdrawal button or link must be clearly labeled, continuously accessible, and not buried behind login walls or policy pages. Shopify’s official compliance guidance confirms it should be “prominently displayed” and “easily found.” In practice, this means a link in your footer labeled “Withdraw from contract here” and a matching link in your order confirmation or customer account area.
Step 2: The Identification Form
When a customer clicks the withdrawal entry point, they must be able to submit their identifying information. Required fields include name, email address, and order number. Optional but useful: a field for specifying which items they are withdrawing from. This step should be as short as possible. Cognitive load at this point is already high, and adding unnecessary fields will push customers toward chargebacks instead of the withdrawal flow.
Step 3: The Confirmation Step
After the customer submits the form, they must take one deliberate confirming action. This is the second of the two required clicks. A simple “Confirm withdrawal” button on a review screen satisfies this. The confirmation screen should show the order number and the name submitted, so the customer can verify before confirming.
Step 4: The Automatic Email Confirmation
Immediately after confirmation, an email must be sent to the customer. This is the “durable medium” requirement. The email should include the order number, name, the items being withdrawn from, the date and time of submission, and a statement confirming receipt of the withdrawal request. This is your audit trail as well as your legal obligation.
Pro tip: Use Shopify Flow to trigger the confirmation email automatically when a withdrawal order tag is applied. This keeps your process consistent and creates a timestamped record you can reference if a dispute arises.
| Component | Required | What it does |
|---|---|---|
| Visible entry point | Yes | Footer link or button, no login required |
| Identification form | Yes | Name, email, order number |
| Confirmation step | Yes | Second click to confirm |
| Email confirmation | Yes | Sent automatically to durable medium |
Where to Add the Withdrawal Button on Your Shopify Store
Placement determines whether you are compliant and whether the button actually gets used. Three locations satisfy the legal requirement for visibility. All three together give you the strongest compliance posture.
Footer. The footer is the first place EU regulators and consumers expect to find withdrawal functions, alongside legal pages like your privacy policy and terms of service. Add a “Withdraw from contract here” link in your footer navigation, pointing to /pages/withdrawal. This is mandatory.
Order confirmation page. Adding the withdrawal link to your order confirmation email and your thank-you page serves customers who want to act immediately after placing an order. It also reduces support contacts, because the withdrawal path is visible at the exact moment a customer might second-guess a purchase.
Customer account or help area. If your store has a customer account section or a help/FAQ page, add a visible link there as well. This is where research-intent customers will look when they decide they want to cancel a few days after ordering.
What the withdrawal button should not be:
- A generic “contact us” form
- A clause inside your returns policy page
- Accessible only after login
- A link labeled anything other than a withdrawal or cancellation function
What Are the Risks of Non-Compliance?
The consequences are not theoretical. The directive is law, and national enforcement agencies across the EU have mechanisms to act on complaints.
- Extended return window: If no compliant withdrawal function exists, the 14-day withdrawal period extends automatically to 12 months and 14 days. Every EU order you ship without the button becomes a 12-month return liability.
- Fines: In Germany, traders with EU annual turnover above €1.25 million face fines of up to 4% of relevant turnover or €2 million. Other member states are implementing their own fine structures.
- Legal warnings: In Germany and several other EU markets, legal warnings from consumer protection organizations or competitors are a standard enforcement mechanism that can result in injunctions and cost recovery claims.
- Reputational damage: A legal action or public enforcement finding against your store is indexable and discoverable. The trust damage to conversion rates can outlast the fine.
According to Shopify’s own compliance documentation, non-compliance can result in all three of the above.
Withdrawal Button Examples: What Compliant Stores Do
Footer Link
A simple text link reading “Withdraw from contract here” placed in the footer legal navigation cluster, next to Privacy Policy and Terms of Service, is the most common implementation. It requires no design work and passes visual compliance checks immediately.
Dedicated Withdrawal Page
A standalone page at /pages/withdrawal with a short embedded form. No navigation, no distractions. Just the form, a clear heading (“Withdraw from your order”), and the confirmation flow. This is the cleanest implementation for stores that want to keep the experience simple.
Shopify App Integration
Apps built specifically for this requirement handle the form, confirmation flow, email automation, and order tagging in one install. Shopify noted it is also releasing a native withdrawal feature on June 17, 2026. The app path is fastest for stores without a developer available.
Order Confirmation Email Link
Adding a withdrawal link to your transactional order confirmation email places the function exactly where customers are most likely to use it immediately after purchase. This does not replace the storefront button but significantly reduces the “I couldn’t find how to cancel” support ticket volume.
How to Add the Withdrawal Button on Shopify: Step-by-Step
This implementation creates a compliant two-step withdrawal form on your Shopify store with an automatic email confirmation trigger. No third-party app required.
Step 1: Create the Withdrawal Page
In Shopify Admin, go to Online Store, then Pages, then Add page.
Set the title to Withdraw from contract and the URL handle to withdrawal. This makes it accessible at /pages/withdrawal.
In the content editor, click the HTML view icon and paste the following code:
html
<style>
.eu-wd { font-family: inherit; color: var(--color-text, #28251d); }
.eu-wd h2 { font-size: 1.5rem; margin-bottom: .5rem; }
.eu-wd p { margin: 0 0 1rem; max-width: 65ch; }
.eu-wd .field { margin-bottom: .75rem; }
.eu-wd label { display: block; font-size: .875rem; margin-bottom: .25rem; }
.eu-wd input, .eu-wd select, .eu-wd textarea {
width: 100%; padding: .5rem .6rem;
border: 1px solid rgba(40,37,29,.12);
border-radius: .375rem; font-size: 1rem;
background: transparent; color: inherit;
}
.eu-wd .btn {
display: inline-flex; align-items: center; gap: .5rem;
padding: .5rem .9rem; border-radius: .375rem;
font-size: .875rem; border: 0; cursor: pointer;
text-decoration: none; transition: background .18s, color .18s;
}
.eu-wd .btn-primary { background: var(--color-primary, #01696f); color: #fff; }
.eu-wd .btn-primary:hover { background: #0c4e54; }
.eu-wd .btn-ghost { background: transparent; color: var(--color-text, #28251d); }
.eu-wd .step { display: none; }
.eu-wd .step.active { display: block; }
.eu-wd .success {
margin-top: 1rem; padding: .75rem .9rem;
border-radius: .375rem; background: rgba(67,122,34,.08);
color: #437a22; font-size: .875rem;
}
</style>
<div class="eu-wd" id="euWithdrawal">
<h2>Withdraw from your order</h2>
<p>By EU law, you can withdraw from an unfulfilled order within 14 days. Complete this form and you will receive an automatic email confirmation.</p>
<form id="euWdForm" novalidate>
<!-- Step 1: Identification -->
<div class="step active" data-step="1">
<div class="field">
<label for="euWdEmail">Email address</label>
<input type="email" id="euWdEmail" name="email" required>
</div>
<div class="field">
<label for="euWdOrder">Order number</label>
<input type="text" id="euWdOrder" name="order_number" placeholder="#1234" required>
</div>
<div class="field">
<label for="euWdName">Full name</label>
<input type="text" id="euWdName" name="full_name" required>
</div>
<div class="field">
<label for="euWdItems">Items to withdraw (optional)</label>
<textarea id="euWdItems" name="items" rows="3" placeholder="e.g. 1x Blue Shirt, 2x Black Shoes"></textarea>
</div>
<button type="button" class="btn btn-primary" id="euWdNext">Continue</button>
</div>
<!-- Step 2: Confirmation -->
<div class="step" data-step="2">
<p><strong>Confirm withdrawal</strong> for order <span id="euWdOrderPreview"></span></p>
<div class="field">
<label>What do you want to do?</label>
<select id="euWdAction" name="action">
<option value="cancel_unfulfilled">Cancel unfulfilled order (not yet shipped)</option>
<option value="return">Return items (already shipped)</option>
</select>
</div>
<div class="field">
<label for="euWdReason">Reason (optional)</label>
<select id="euWdReason" name="reason">
<option value="">No reason selected</option>
<option value="wrong_item">I ordered the wrong item</option>
<option value="changed_mind">I changed my mind</option>
<option value="found_cheaper">I found a better price</option>
<option value="delivery_too_slow">Delivery is too slow</option>
<option value="quality_issue">Quality issue</option>
</select>
</div>
<button type="submit" class="btn btn-primary">Confirm withdrawal</button>
<button type="button" class="btn btn-ghost" id="euWdBack">Back</button>
</div>
</form>
<div id="euWdSuccess" class="success" style="display:none;"></div>
</div>
<script>
(function(){
const form = document.getElementById('euWdForm');
const step1 = form.querySelector('[data-step="1"]');
const step2 = form.querySelector('[data-step="2"]');
const nextBtn = document.getElementById('euWdNext');
const backBtn = document.getElementById('euWdBack');
const orderPreview = document.getElementById('euWdOrderPreview');
const successBox = document.getElementById('euWdSuccess');
function showStep(n) {
step1.classList.toggle('active', n === 1);
step2.classList.toggle('active', n === 2);
}
nextBtn.addEventListener('click', () => {
const email = form.querySelector('#euWdEmail').value.trim();
const order = form.querySelector('#euWdOrder').value.trim();
const name = form.querySelector('#euWdName').value.trim();
if (!email || !order || !name) {
alert('Please fill in your email, order number, and full name.');
return;
}
orderPreview.textContent = order.toUpperCase();
showStep(2);
});
backBtn.addEventListener('click', () => showStep(1));
form.addEventListener('submit', async (e) => {
e.preventDefault();
const data = {
email: form.querySelector('#euWdEmail').value.trim(),
order_number: form.querySelector('#euWdOrder').value.trim().toUpperCase(),
full_name: form.querySelector('#euWdName').value.trim(),
items: form.querySelector('#euWdItems').value.trim(),
action: form.querySelector('#euWdAction').value,
reason: form.querySelector('#euWdReason').value
};
try {
const res = await fetch('/contact.json', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ form: { type: 'eu_withdrawal', ...data } })
});
if (res.ok) {
successBox.style.display = 'block';
successBox.textContent = 'Withdrawal confirmed. You will receive an email confirmation shortly.';
form.reset();
showStep(1);
} else {
alert('Something went wrong. Please try again or contact support.');
}
} catch(err) {
alert('Something went wrong. Please try again or contact support.');
}
});
})();
</script>
Save the page.
Step 2: Add the Footer Link
Go to Online Store, then Themes, then Edit code. Open layout/footer.liquid (or sections/footer.liquid depending on your theme).
Find the block of footer links and add the following inside the existing <ul> list:
html
<li class="footer__item">
<a href="/pages/withdrawal" class="footer__link">Withdraw from contract here</a>
</li>
If you are using a Shopify 2.0 theme with a drag-and-drop footer, you can add a custom link directly from Customize, then Footer, then Add menu item without touching any code. Point it to /pages/withdrawal and label it “Withdraw from contract here.”
Step 3: Set Up the Confirmation Email
The quickest path is Shopify Flow. Go to Apps, then Shopify Flow and create a new flow with these settings:
- Trigger: Order tagged (tag:
eu_withdrawal_requested) - Action: Send email to customer with subject: “Withdrawal confirmed, order [order number]”
- Body: Include order number, customer name, items listed, action selected, and a timestamp
If you do not have Shopify Flow available on your plan, connect Shopify Email to an automation trigger, or use a third-party app that handles the full flow including email confirmation out of the box.
Step 4: Add the Link to Your Order Confirmation Email
In Shopify Admin, go to Settings, then Notifications, then Order confirmation. Add a line near the bottom of the email template:
html
<p>You have the right to withdraw from this order within 14 days.
<a href="https://yourstore.com/pages/withdrawal">Click here to withdraw from contract.</a></p>
This makes the withdrawal function visible at the moment the customer is most likely to use it.
Platforms and Tools for Shopify Withdrawal Button Compliance
Shopify Native Feature: Shopify is releasing a built-in withdrawal button feature on June 17, 2026. If you are on a current Shopify plan, this will likely be the lowest-friction path once it is available. Check your admin for the rollout.
Revoq EU Withdrawal Button: A dedicated Shopify app built specifically for this requirement. Handles the two-step form, automatic email confirmation, order tagging, and an audit log. Suitable for stores without a developer available.
Shopify Flow: Shopify’s native automation tool. Use it to trigger email confirmations when an order receives the eu_withdrawal_requested tag. Free on most Shopify plans.
Klaviyo: If you already use Klaviyo for email, you can build the confirmation email as a transactional flow triggered by an order tag or API event. Gives you more control over email design and deliverability.
Omnisend: Similar to Klaviyo. Connect to Shopify and trigger the withdrawal confirmation via an automation workflow linked to a custom event.
Custom implementation: The code snippet in this article gives you a working withdrawal page without any app. Pair it with Shopify Flow for the email and you have a compliant setup at no additional cost.
Trends in EU Consumer Rights Enforcement
EU consumer protection enforcement has been trending toward active, cross-border coordination. The European Consumer Organisation (BEUC) has consistently pushed for stronger digital consumer rights, and the 2023 directive is part of a broader package that includes the Digital Markets Act and Digital Services Act. The pattern is clear: the EU is not passing these laws to let them sit dormant.
Germany has historically been the most aggressive enforcer of consumer rights violations against online retailers, with competitor-initiated legal warnings being a common first-strike mechanism. UK-based and US-based Shopify stores selling into the EU are not exempt. The directive applies based on where the consumer is located, not where the business is registered.
“Merchants should treat this as infrastructure, not a legal formality,” one EU ecommerce compliance consultant noted in a June 2026 briefing. “The stores that implement this properly and early will have a cleaner support queue and a stronger trust signal. The ones that wait are gambling with their EU revenue.”
The broader trend is toward automated compliance checking. Consumer protection agencies in several member states are building tools to scan storefronts for the presence of required digital functions. Relying on “no one will check” is not a strategy.
How Wavesy Approaches Compliance and CRO
At Wavesy, we treat legal compliance requirements as CRO decisions, not just legal tasks. The withdrawal button is a perfect example: how you implement it determines whether it becomes a trust signal or a conversion liability.
A withdrawal page that is clearly labeled, loads fast, and processes the request in two clicks communicates reliability to every visitor who sees it, not just those who use it. A buried, broken, or missing withdrawal function tells EU consumers that your store is not serious about their rights, and that signal spreads.
We have helped ecommerce brands build compliance infrastructure that also reduces support volume and improves post-purchase satisfaction scores. If you want to know whether your store’s EU compliance setup is hurting or helping your conversion rate, book a call with us today.
FAQ
Does the EU withdrawal button requirement apply to my Shopify store if I am based outside the EU?
Yes. EU Directive 2023/2673 applies based on where your customers are located. If you ship to EU consumers, you must comply, regardless of whether your business is registered in the US, UK, Australia, or anywhere else. Shopify’s compliance guidance confirms this directly.
What happens if my store does not have a withdrawal button by June 19, 2026?
The immediate legal consequence is that the 14-day withdrawal window extends automatically to 12 months and 14 days for every EU order. In member states that have implemented fines, particularly Germany, you also face financial penalties. German enforcement allows fines up to 4% of annual EU-market turnover or €2 million for traders above the €1.25 million threshold.
Does the withdrawal button apply to all products, or just some?
The withdrawal right covers most goods, services, and digital content sold online. Exemptions exist for certain categories: custom-made goods, sealed hygiene products once opened, digital content already downloaded or accessed with consent. You should have EU counsel confirm which of your product categories are exempt before relying on exemptions to limit your compliance scope.
What is the difference between a withdrawal button and a returns policy?
A returns policy is text describing your process. A withdrawal button is a functional UI element that allows the customer to initiate and complete an electronic withdrawal within the legally mandated flow. A returns policy alone does not satisfy the directive. You need both: a compliant withdrawal function and a clear returns/refund policy.
Can I use a Shopify app instead of building a custom page?
Yes. Apps like Revoq handle the full compliant flow including the two-step form, email confirmation, and order tagging. Shopify is also rolling out a native feature on June 17, 2026. If you have a developer available, the custom implementation in this article works without any third-party dependency.
Is the withdrawal button the same as a cancellation button?
Functionally, yes. The directive uses the term “right of withdrawal,” which in practice means the right to cancel an unfulfilled order or return a fulfilled one within 14 days. The button triggers that process. Labeling it “Withdraw from contract here” is the legally recognized phrasing in most member states.
P.S. Wondering whether your store’s post-purchase flow is hurting your repeat purchase rate? Read our breakdown of the highest-impact CRO fixes for ecommerce order confirmation pages.
P.S. Want a full audit of your Shopify store’s conversion funnel? Book a CRO audit with Wavesy and we will identify the highest-impact fixes across your entire funnel.
Sources: