The free way to add an EU withdrawal button to Shopify

Shopify EU withdrawal button, no apps, no theme code, works with any theme
Reading Time

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:

  1. 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.
  2. 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".
  3. 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.

  1. Click the search bar at the top of Shopify admin (or press Ctrl + K).
  2. Type forms.
  3. Under Apps, click Forms (the Shopify one, free).

    Shopify admin search for forms, Forms app result highlighted

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

    Shopify Forms App Store listing with the Install button highlighted

  5. After install, search forms again and open the app.

Step 2. Create the withdrawal form

  1. Click Create form.

    Shopify Forms app with the Create form button highlighted

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

    Create form dialog with Inline form selected and name EU withdrawal

  3. 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 withdrawal

    Content:

    Use this form to withdraw from an order. We will email you a receipt of this request.

    Button label:

    Confirm withdrawal

    Consent 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.

  4. The form already has First name and Email. Click Add new field and add Last name. Keep it required.

    Forms editor with Add new field highlighted under First name and Email

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

    New field menu with Single-line text selected

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

    Single-line text settings for Order number with Required field checked

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

    Forms editor with Save then Turn on form highlighted

  9. 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.

    EU withdrawal form in the Forms app with Form ID highlighted

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

  1. Open admin search and type online store, then open it. You can also use the left menu.

    Admin search for online store

  2. Open Pages, then click Add page.

    Online Store Pages with Add page highlighted

  3. Title the page Declare withdrawal. Leave the body empty. Check the URL is declare-withdrawal. Click Save.

    Add page titled Declare withdrawal with Save highlighted

  4. Go back to Online Store. On the live theme, click Customize (some stores label this Edit theme).

    Online Store themes page with Customize or Edit theme highlighted

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

    Theme editor page dropdown with Pages highlighted

  6. Click Create template.

    Pages list in the theme editor with Create template highlighted

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

    Create a template dialog named withdrawal

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

    Add section Apps tab with the Forms app highlighted

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

    Forms section in Customize with Form ID pasted and Save highlighted

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

    Forms list with the 3 dots menu and View submissions highlighted

    Form submissions list showing a received EU withdrawal entry

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).

  1. Open the app after install.
  2. Connect a mailbox. Microsoft 365, Google, or SMTP. If you skip this, Flow will look fine and no email will leave.
  3. Create a template.

    Subject:

    We received your withdrawal request

    Body:

    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.

  1. If Shopify Flow is not installed, install it from apps.shopify.com/flow, then come back to this workflow window.
  2. On the Flow home, click Create workflow in the top right.

    Flow workflows page with Create workflow highlighted

  3. Click Select a trigger. Ignore the AI box.

    New workflow screen with Select a trigger highlighted

  4. Search for metaobject. Click Metaobject entry created.

    Select trigger search for metaobject with Metaobject entry created highlighted

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

    Metaobject definition dropdown with EU withdrawal selected

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

    Flow canvas with plus under Metaobject entry created highlighted

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

    Select action with Send transactional email highlighted

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

    Send transactional email with Add variable under To email highlighted

  10. 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.
  11. Cc and Bcc are optional. Put your support inbox there if you want a copy of every request.
  12. 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.
  13. 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.

    Send transactional email with Configure Email highlighted

  14. Name the workflow EU withdrawal confirmation. Click Turn on workflow. Flow is done.
  15. 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

  1. In Customize, open the footer.
  2. Add a button (or a block that renders as a button) that links to your Declare withdrawal page.
  3. 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.
  4. 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.

Back to blog

Leave a comment