
How to add the mandatory EU withdrawal button to your standard Shopify private area without installing paid apps and keeping your site super fast on mobile.
Are you trying to figure out how to add the withdrawal button to your store without slowing down loading times with heavy third-party applications? You have two concrete options: the quickest is to install IFG Returns & Withdrawals, which displays the withdrawal widget even in the customer area with zero lines of code, a dashboard, and automatic order matching. The second option, which I'll show you in this guide, is to directly modify your Dawn theme's code to insert a conditional link that dynamically calculates if less than 14 days have passed since the order was fulfilled and redirects the user to a pre-filled native form. This second approach protects your e-commerce loading speed on mobile and supports compliance with the withdrawal button requirement without additional monthly costs, but at the price of having to maintain the code yourself over time.
As a freelance engineer who works on my clients' store code every day, I know how frustrating it is to have to install yet another generic subscription application just to meet a regulatory obligation. The obligation, in effect since June 19, 2026, to introduce the EU 2026 withdrawal button now applies to every store, and small merchants on standard plans (Basic, Shopify, Advanced) risk filling their store with junk code for fear of penalties. In this technical guide, I'll show you how to create a clean, high-performance solution integrated directly into your theme using only native Liquid, HTML, and CSS — and where the app can save you time if you prefer not to touch code.
Technical Compliance of EU Directive 2023/2673 on Standard Shopify
Compliance with EU Directive 2023/2673 requires that the withdrawal button be accessible without forced login if the purchase was made as a guest, but for registered users, the ideal placement is in the order history. Many believe that simply inserting a generic static link to the returns policy page is sufficient for compliance, but the law requires a clear path where the consumer can identify the specific order and unequivocally express the desire to withdraw with a two-step procedure.
Why generic withdrawal apps can slow down the mobile reserved area
When a user accesses their reserved area from a smartphone, every millisecond of loading delay can cause them to abandon the page. Poorly built third-party apps load heavy external scripts that block page rendering, worsening your store's Core Web Vitals parameters. This is one of the reasons why, when I designed IFG Returns & Withdrawals, I kept the storefront widget as light as possible; if you choose the code route, leveraging Shopify's Liquid engine allows you to perform eligibility calculations directly on the server, serving the user ready-made, instant HTML code.
The concept of a two-click path in the Dawn architecture
European regulations explicitly require that the withdrawal process is not a UX trap, but a linear two-click flow: the first click initiates the request from the personal area and the second confirms it definitively. In the Dawn theme, the best logical architecture is to display a clearly visible button next to the order details which, when clicked, directs the user to a dedicated withdrawal form where the order data is automatically pre-filled.
Preparing the Liquid environment: where to place the withdrawal button
In Shopify's Dawn theme, the file that manages the order details layout within the classic customer area is called templates/customers/order.liquid. Before making any code changes, I always recommend creating a duplicate of your active theme to work in complete safety.
Locating the order details file in the classic customer area
To find the correct file, log in to your Shopify control panel, go to "Online Store," click on "Themes," and select "Edit code" from the three-dot menu on your Dawn theme. Inside the "Templates" or "Sections" folder, locate the main-order.liquid file (or order.liquid depending on your theme version).
How to manage Shopify's New Customer Accounts limitations
If you have activated "New customer accounts" on your store (extensible checkout, which does not allow direct modifications to classic Liquid template files), you cannot directly insert the code into the classic order file. In this scenario, IFG Returns & Withdrawals is the simplest solution because it integrates at the storefront widget level regardless of the type of customer account active; the alternative via code is to insert the button on the thank you page and in the order status through checkout extensions.
Native Liquid code to show the button only on eligible orders
The calculation of the 14-day right of withdrawal on Shopify must be based on the actual fulfillment date of the order, not the cart creation date. If an order takes 5 days to ship, the customer still has the right to 14 full days from the moment they physically receive the goods, as required by the Consumer Code.
Setting the 14-day time condition from fulfillment
Using Liquid's date filters, we can calculate the difference in seconds between the current moment and the date the order was fulfilled. If this difference is less than 1,209,600 seconds (14 days), the theme will show the withdrawal button; otherwise, the button will automatically disappear.
The HTML and inline CSS code block ready for the Dawn theme
Here is the native code block you can insert into your main-order.liquid file, placing it immediately below the order status information:
{% assign limit_seconds = 14 | times: 24 | times: 60 | times: 60 %}
{% if order.fulfillment_status == 'fulfilled' %}
{% for fulfillment in order.fulfillments %}
{% assign fulfilled_date_seconds = fulfillment.created_at | date: '%s' | plus: 0 %}
{% assign now_seconds = 'now' | date: '%s' | plus: 0 %}
{% assign diff_seconds = now_seconds | minus: fulfilled_date_seconds %}
{% if diff_seconds < limit_seconds %}
<div class="recesso-container" style="margin-top: 20px; padding: 15px; border: 1px solid #e8e8e8; background-color: #fcfcfc; border-radius: 4px;">
<p style="margin: 0 0 10px 0; font-size: 1.4rem;">You have the right to withdraw from this order until {{ fulfillment.created_at | date: '%s' | plus: limit_seconds | date: '%d/%m/%Y' }}.</p>
<a href="/en/blogs/articoli-shopify/modulo-recesso-nativo-shopify-liquid?order_id={{ order.name | url_encode }}&email={{ customer.email | url_encode }}" class="button button--secondary" style="width: 100%; text-align: center;">
Initiate Withdrawal Request
</a>
</div>
{% endif %}
{% endfor %}
{% endif %}
Connecting the button to the withdrawal form without external databases
Passing dynamic parameters via query string like ?order_id={{ order.id }} allows the withdrawal form to be pre-filled without storing data on third-party servers. If you use IFG Returns & Withdrawals, this matching happens automatically within the app, without you having to write this logic.
Receiving data on the contact form and automatic notification
Shopify's contact form will send an automatic email directly to your customer service inbox with the subject "Withdrawal Request Order #XXXX". From that moment, you can manage the return process directly from your Shopify control panel. With the app, however, the request already appears organized in the dashboard with a color-coded status, ready for approval.
Usability tests to avoid penalties from June 19, 2026
Penalties for non-compliance with the withdrawal button directive can reach 4% of the merchant's annual turnover in the EU countries involved. Ignoring it or implementing a hastily put-together solution at the last minute is not a wise strategy.
Responsive behavior verification on iOS and Android devices
Once the code is inserted, access your reserved test area simulating access from both an iPhone and an Android device. The button must be easily clickable with the thumb (minimum click area size 44x44 pixels) and the texts must be perfectly legible without forcing the user to zoom.
Withdrawal simulation on a partially fulfilled order
A particular case that causes problems for many DIY solutions is the partially fulfilled order. The native Liquid code we wrote loops through individual shipments (order.fulfillments), allowing the button to be displayed based on the date of each specific shipment. The IFG Returns & Withdrawals dashboard handles this case automatically thanks to partial approvals.
Strategies for reducing returns through an optimized customer area
Offering an immediate incentive in the form of a discount code or free size exchange directly above the withdrawal button reduces the percentage of monetary refunds by up to 22%. Withdrawal should not only be seen as a passive cost but as a critical touchpoint to recover the relationship with the customer.
Inserting useful alternatives before the final withdrawal click
Inside the box containing the withdrawal button, you can insert a short, friendly informative note. For example: "Is the size not right? Before withdrawing, contact us in chat to receive an immediate free size exchange!" This small psychological trick encourages the user to consider an alternative to a monetary refund, saving the transaction margin.
Synchronization of withdrawal data with your Italian management system
If you use an Italian ERP (such as Danea Easyfatt, Zucchetti, or TeamSystem) connected to your standard Shopify, the submission of the withdrawal request can be intercepted to automatically update the status of the tax document or electronic invoice, eliminating manual data entry steps.
If you want to implement something similar — a withdrawal form or a self-service customer area — in your store, it's the type of development I cover in my Shopify strategic consulting.

