# zwernemann/module-withdrawal

> Magento 2 EU Withdrawal Button Module - Adds a withdrawal/revocation button for orders in compliance with EU Directive (EU) 2023/2673

`composer require zwernemann/module-withdrawal`

Canonical URL: https://packagento.com/zwernemann/module-withdrawal

## At a glance

- **Vendor**: zwernemann (https://packagento.com/zwernemann.md)
- **Latest version**: v1.8.0 — released 2026-06-18
- **Pricing**: Free
- **Package type**: Magento 2 module
- **Status**: active, accepting new buyers

## Installation

Packagento is licence-gated, so even free packages need a licence on a project before Composer can resolve them.

1. **Sign in or create an account** at https://packagento.com/customer/account/.

2. **Add the package to your account.** Open https://packagento.com/zwernemann/module-withdrawal and complete the free checkout. A licence is minted automatically.

3. **Create or pick a project, then activate the licence on it.**
   - Projects represent the Magento installs you deploy to. Manage them at https://packagento.com/projects/.
   - Activate the new licence on the project you'll deploy this package to. Activation is what generates the Composer credentials scoped to that project.

4. **Add the project credentials to your Magento codebase.**

   Grab the project's public + private key from https://packagento.com/projects/ (open the project, then its Credentials tab), and add them to `auth.json`:

   ```json
   {
     "http-basic": {
       "packagento.com": {
         "username": "ppk_live_...",
         "password": "psk_live_..."
       }
     }
   }
   ```

   Add the Packagento Composer repository to `composer.json`:

   ```json
   {
     "repositories": [
       { "type": "composer", "url": "https://packagento.com" }
     ]
   }
   ```

5. **Install and apply.**

   ```bash
   composer require zwernemann/module-withdrawal:*
   bin/magento setup:upgrade
   bin/magento setup:di:compile
   bin/magento cache:flush
   ```

## What it does

Magento 2 EU Withdrawal Button Module - Adds a withdrawal/revocation button for orders in compliance with EU Directive (EU) 2023/2673

## README

> Magento 2 extension for implementing the EU right of withdrawal via button click.

---

### What is it about?

The EU Directive **(EU) 2023/2673** requires that in the future, consumers must be able to withdraw from online purchase contracts just as easily as they were concluded. **Starting June 19, 2026**, a clearly visible withdrawal button will be mandatory in online shops.

This Magento module provides exactly that: your customers can withdraw orders with just a few clicks – directly from their customer account or via a separate form for guest orders. As a shop operator, you maintain a full overview in the admin area.

---

### What does the module do?

#### For your customers

**Withdrawal button in the order overview**

In the *My Account > My Orders* view, a new column appears for each order. There, the customer can see at a glance:

- A **Withdrawal link**, as long as the period is active
- The note **"Withdrawal submitted"**, if a withdrawal has already been made
- The note **"Withdrawal period expired"**, if the withdrawal period has passed

Additionally, a **"Withdrawal Order"** button is displayed on the order details page.

**Withdrawal detail page**

Before the actual withdrawal, the customer sees a summary of their order:

- Order number, date, status, total amount
- All ordered items with name, SKU, quantity, and price
- The deadline until which withdrawal is possible, calculated from the date of the last shipment
- A button for final submission – with a preceding security confirmation

**Partial withdrawal (optional)**

If the shop operator has activated the partial withdrawal option, the customer can select individual items from the order instead of withdrawing the entire order. Each item has a checkbox (pre-checked) and a quantity input field. Items that have already been withdrawn in a previous request are shown greyed out and cannot be selected again. This means several partial withdrawal requests can be submitted for the same order until all items are covered.

**Guest orders**

Customers who ordered without an account can access the withdrawal via a dedicated search form. Entering the order number and email address is sufficient to find the order and initiate the withdrawal.

Accessible at: `/withdrawal/guest/search`

**Confirmation page**

After submission, the customer is redirected to a success page. This confirms that the withdrawal has been received and that an email is on its way.

#### For you as a shop operator

**Admin overview of all withdrawals**

Under *Sales > Withdrawals*, you will find a tabular overview of all received withdrawals:

- ID, order number, customer name, email
- Status (Pending / Confirmed / Rejected)
- Type (Full / Partial)
- Date of order and date of withdrawal
- Direct link to the respective order view

All columns can be filtered and sorted.

**Withdrawal detail page**

Each row in the grid has a *View Details* action that opens a dedicated detail page. It shows:

- All metadata: customer name and email, order number, withdrawal type, status, order date and withdrawal date
- Quick action buttons to confirm or reject the request directly on the page
- A complete table of the withdrawn items including product name, SKU and quantity – clearly labelled as full or partial withdrawal

This makes it possible to review exactly which items a customer has withdrawn without leaving the admin area.

**Automatic email notification**

Soon as a withdrawal is received, two emails are sent:

1. **To the customer** ₓ Confirmation with order details
2. **To you** – Notification with all relevant data

In addition, you receive a BCC copy of the customer email. The email templates can be customized in the admin panel.

**Note in the order**

Every withdrawal is automatically added as a comment in the order history. This way, it is immediately apparent in the order view that a withdrawal exists.

**Configurable**

In the admin under *Stores > Configuration > Sales > Withdrawal Settings*:

- Enable/Disable the module
- Set recipient address for notifications
- Set withdrawal period in days, counted from the last shipment date (Default: 14)
- Enable/Disable partial withdrawal (Default: No)
- Select email sender and templates

---

### Hyvä Theme Compatibility

If you are using the Hyvä Theme, please install the Hyvä compatibility module:

https://github.com/Zwernemann/magento2-withdrawl-hyva

This module adds the required Hyvä frontend integration for the withdrawal button and ensures compatibility with the Hyvä template system.

The base module remains required.

#### REST API

Withdrawal entries can also be retrieved programmatically:

```
GET /rest/V1/zwernemann/withdrawals`
```

Access is protected by ACL permission (`Zwernemann_Withdrawal::withdrawals`).

#### Multilingualism

Completely translated into all 24 languages of the EU (97 strings). Further languages can be added via custom CSV files.

---

### System Requirements

|Component | Version|
|---|---|
| Magento 2 Open Source | 2.4.6 to 2.4.8-p4 |
| PHP | 7.4 or higher |


---

### Installation

#### Via ZIP file

1. Extract the ZIP file and copy the entire contents to:

   ```
   app/code/Zwernemann/Withdrawal/
   ```

 2. Ensure the structure looks like this:

   ```
   app/code/Zwernemann/Withdrawal/
       Api/
       Block/
       Controller/
       Helper/
       Model/
       Ui/
       etc/
       i18n/
       view/
       composer.json
       registration.php
   ```

3. Run the following commands in the Magento root:

   ```
   php bin/magento setup:upgrade
   php bin/magento setup:di:compile
   php bin/magento setup:static-content:deploy de_DE en_US
   php bin/magento cache:flush
   ```

4. Check if the module is active:

   ```
   php bin/magento module:status zwernemann_Withdrawal
   ```
#### Via Composer

_(README truncated for .md surface. Full README on https://packagento.com/zwernemann/module-withdrawal.)_

## Recent Versions

| Version | Released |
|---|---|
| v1.8.0 | 2026-06-18 |
| v1.7.3 | 2026-06-12 |
| v1.7.2 | 2026-05-21 |
| v1.7.1 | 2026-05-15 |
| v1.6.0 | 2026-04-29 |
| v1.5.0 | 2026-04-23 |
| v1.4.0 | 2026-04-23 |
| 1.1.0 | 2026-02-10 |

## Dependencies

### Require

| Package | Constraint |
|---|---|
| magento/framework | >=103.0.0 |
| magento/module-backend | >=102.0.0 |
| magento/module-config | >=101.0.0 |
| magento/module-customer | >=103.0.0 |
| magento/module-email | >=101.0.0 |
| magento/module-sales | >=103.0.0 |
| magento/module-store | >=101.0.0 |
| magento/module-ui | >=101.0.0 |
| php | >=7.4 |

## Licence and pricing

Free. A licence is still minted on checkout and bound to your project for Composer access — no payment step.

Refundable within 14 days of first purchase via https://packagento.com/account/refunds/.

## Install via Claude Code or any MCP client

The Packagento MCP server can run the licence + project + Composer steps above in one tool call:

```
purchase_and_install_packages(
  composer_names=["zwernemann/module-withdrawal"],
  project_id="proj_xxx"
)
```

This handles cart, checkout, licence minting, project activation, and writes auth.json credentials. Connect a client with `claude mcp add packagento https://mcp.packagento.com`. Full setup at https://packagento.com/docs/mcp-setup.

## Vendor

zwernemann is a Magento 2 vendor on Packagento. See https://packagento.com/zwernemann.md for their full catalogue.

