The free way to add an EU withdrawal button to Shopify
If you sell to people in the EU, you need a withdrawal button on the store. Not a sentence inside your refund policy. A real, easy-to-spot button that starts a withdrawal, then a second step that confirms it, then an email that proves you got the request. The deadline was 19 June 2026. That is Directive (EU) 2023/2673, which added Article 11a to the old consumer rights rules.
Long story short: you can do this with Shopify Forms, a normal page, Shopify Flow and one free email app. No paid returns app. The customer fills the form without logging in. You still process the return by hand, the same way you already do.
This is a practical Shopify setup for a small store on Dawn or any Online Store 2.0 theme. I am not a lawyer. If you need to know whether this is enough for your country, ask someone who does compliance for a living. Shopify's own summary is here: EU right of withdrawal.
You do not need to edit theme code. You work in admin, then Customize. Last checked in August 2026.
Who actually needs this
You need it if you sell goods, services or digital content online to consumers in the EU. Where your company is registered does not matter. A store in Brazil selling to Germany still has to offer the function.
You do not need it if you only sell B2B, or if the sale never happens on a website (phone or email only). Guest checkout stores should keep this public. Hiding it behind a customer account is a bad idea, because the rule is supposed to be at least as easy as buying.
Shopify can help with self-serve returns in customer accounts. That still asks people to log in. A public form is the cleaner path for a small store that lets guests check out.
What the button has to do
Three things, in plain words:
- A labelled control people can find without hunting. Typical wording is "Withdraw from this contract" or the local equivalent. It should look like a button, not a quiet footer link that matches the rest of the nav.
- A second step that confirms. The customer gives a name, an order number and an email. Then they hit a submit label like "Confirm withdrawal".
- An automatic confirmation on a durable medium. Email is the usual one. That email is a receipt of the request. It does not decide if the withdrawal is valid. You still review the order.
If you skip this, the risk is not theoretical. Some member states can fine up to 4% of turnover. The 14-day cooling-off window can also stretch to a year plus 14 days if the customer was not given a proper way to withdraw. I would not wait for a warning letter.
What you will use
Shopify Forms (free). A page in Online Store. Shopify Flow (free). Flow Transactional Email for the customer email. That last one is a free App Store app. Native Flow can email you. It is weaker at sending a branded transactional email to the customer without treating it like marketing. The free plan on that app is 500 emails a month, which is plenty for a small store's withdrawal requests.
This needs a real Online Store so you can make a page template and drop a Form block on it. That is Basic and up. Starter cannot create extra page templates. If you are still on Starter and you sell to the EU, this is one of the reasons people upgrade. I would not promise a custom template on Starter.
Step 1. Find or install Shopify Forms
Do not look for Content > Forms. A lot of stores do not have that menu. Use admin search instead.
- Click the search bar at the top of Shopify admin (or press Ctrl + K).
- Type forms.
- Under Apps, click Forms (the Shopify one, free).

- If you already have it, that opens the app. If you do not, Shopify opens the App Store listing. Click Install. It is free.

- After install, search forms again and open the app.
Step 2. Create the withdrawal form
- Click Create form.

- Pick Inline form (embedded in a page), not popup. Type the form name EU withdrawal, then click Create.

- Shopify fills the editor with newsletter defaults. Change those first. They are marketing copy and they do not belong on a withdrawal form.
Title:
Declare withdrawalContent:
Use this form to withdraw from an order. We will email you a receipt of this request.Button label:
Confirm withdrawalConsent disclaimer (replace the marketing line completely):
By clicking Confirm withdrawal you declare that you want to withdraw from this order. We will email you a receipt. Whether the withdrawal is valid is reviewed after that.If you see Email marketing consent, turn it off. This is a legal request, not a signup.
- The form already has First name and Email. Click Add new field and add Last name. Keep it required.

- Click Add new field again. Choose Single-line text. That is the type for the order number.

- Set the field label to Order number. Tick Required field. Leave metafield storage off. Click Done.

- Optional: add another single-line text field called Items to return. Do not make it required.
- Click Save, then click Turn on form.

- After it is on, look under the form name. You will see Form ID and a number. Copy that number. You will paste it in the theme editor in a minute. Yours will be different from the one in this screenshot.

Do not turn this into a survey. The rule wants the minimum: who they are, which order, how to reach them. Shopify may still create a customer record from the submission. That is normal. It does not mean they opted into marketing, as long as marketing consent is off.
When you save, Shopify creates a metaobject definition for that form. You will pick that definition later in Flow.
Step 3. Put the form on a page
- Open admin search and type online store, then open it. You can also use the left menu.

- Open Pages, then click Add page.

- Title the page Declare withdrawal. Leave the body empty. Check the URL is
declare-withdrawal. Click Save.
- Go back to Online Store. On the live theme, click Customize (some stores label this Edit theme).

- At the top of the editor, open the page dropdown. Click Pages.

- Click Create template.

- Name it withdrawal. Based on can be Default page or any existing page template you already have. Then click Create template.

- In the template, click Add section, open the Apps tab, and add Forms.

- Click the Forms section. Paste the Form ID you copied. The section stays empty until you do. Click Save in Customize.

- Back in Pages, open Declare withdrawal and set the template to withdrawal. Save.
- Open the page on the storefront and send a test. Use a fake order number you will recognise.
- In the Forms app, click the 3 dots next to EU withdrawal, then View submissions. You should see the test row.


If the form does not show on the page, the Form ID is wrong or the template is not assigned. If the test does not appear under submissions, the form is still off.
Step 4. Set up Workflow Transactional Email
Shopify Flow cannot send the customer a branded receipt by itself. You need one extra free app: Workflow Transactional Email. Install it from the App Store. Use the free plan (500 emails a month).
- Open the app after install.
- Connect a mailbox. Microsoft 365, Google, or SMTP. If you skip this, Flow will look fine and no email will leave.
- Create a template.
Subject:
We received your withdrawal requestBody:
Hi {{first_name}}, we received your withdrawal request for order {{order_number}}. This email is a receipt of the request. It does not decide if the withdrawal is valid. We will review the order and follow up.
That last sentence matters. The email is a receipt. It is not a refund approval.
Step 5. Automate it with Shopify Flow
This is Shopify's own Flow app, the green one. It is not the Forms app. Do not turn the workflow on yet. Native Flow can email you. It cannot send the customer a branded receipt. For that you install Flow Transactional Email first, then come back and add it as the action.
- If Shopify Flow is not installed, install it from apps.shopify.com/flow, then come back to this workflow window.
- On the Flow home, click Create workflow in the top right.

- Click Select a trigger. Ignore the AI box.

- Search for metaobject. Click Metaobject entry created.

- Open Metaobject definition and pick EU withdrawal (it says Added by Forms).

- Click the + under Metaobject entry created. Do not turn the workflow on yet.

- Do not pick Send internal email. That email goes to you. The customer never sees it.
- Open Workflow Transactional Email, then click Send transactional email.

- Under To email(s), click Add variable. Do not type an address by hand.

- In the picker, open Metaobject, then click Email. That is the address the customer typed on the form. That is the only required recipient. Do not put only your own address here.
- Cc and Bcc are optional. Put your support inbox there if you want a copy of every request.
-
Variables (JSON) is optional. You do not need it to send the email. Leave it empty if the template has no placeholders. Only fill it if the subject or body uses things like
{{ variables.first_name }}or{{ variables.order_number }}. Then click Add variable next to that box and paste the matching form fields. Email delivery does not depend on this box. - Scroll to Send Email. Click Configure Email. Pick the mailbox and the template from step 4, or write the subject and body there. This step is required. Flow will error until a template is selected.
A generic body is enough if you skipped JSON:
We received your withdrawal request. This email is a receipt of the request. It does not decide if the withdrawal is valid. We will review the order and follow up.If you want the receipt to name the order, add JSON first, then use the placeholders in the template.

- Name the workflow EU withdrawal confirmation. Click Turn on workflow. Flow is done.
- Submit one more test on the page. Check the customer inbox, not only your staff email.
If EU withdrawal is missing from the definition list, the form was not saved. Save it in Forms, then reload Flow.
Step 6. Add the actual button
- In Customize, open the footer.
- Add a button (or a block that renders as a button) that links to your Declare withdrawal page.
- Give it a contrasting colour or a clear border. Do not style it like the rest of the footer links. The point of the rule is that people can see it.
- Use a label like Withdraw from this contract, or the wording required in the language of the store. "Returns" is weaker. "Contact us" is not this.
That footer button is step one. The form's Confirm withdrawal is step two. Together they are the two-step flow. Do not hide the page only inside Policies. A policy link is how this used to be done. That is the thing the directive is trying to stop.
If you need to change a label later and you cannot find the string, I wrote how to change any text on a Shopify store.
What this does not do
It does not refund the order. It does not print a shipping label. It does not talk to your returns app. You still open the order and process it. That is fine. The law wants an easy way to declare the withdrawal and a receipt. The warehouse work stays yours.
It also does not replace a returns policy. Keep the policy. Just stop using the policy as the only door.
If something fails
No email: the workflow is off, the metaobject does not match the form, or the email field is not mapped. Submit one test and read the Flow run log.
Form missing on the page: wrong template, or you added the Form block on the homepage instead of the page template.
Button looks like a normal link: change the colour in Customize. If the footer cannot hold a button on your theme, add a small custom liquid block with a link that uses your theme's button class. Still no theme-file surgery required on most OS 2.0 themes.
If you get stuck, tell me which theme you are on and whether you are on Starter or Basic. That is usually enough to know which of these steps you cannot click.
Subscribe for Shopify researches, tips & guides
Get high quality posts about Shopify insights. No spam, unsubscribe anytime.