MageMe EU Withdrawal | How It Works
This page walks through the end-to-end workflow the module implements — what the customer sees, what the merchant sees, and what happens between them. Read this before tuning settings: it fixes the vocabulary used throughout the rest of the guide.
What the module does
A logged-in customer (or a guest with order number + email) navigates to /withdraw-contract/, selects which items from an eligible order they want to withdraw, confirms in a two-step ceremony required by Article 11a(3), and receives a durable-medium email receipt with a content-hash fingerprint. The admin sees the request in Sales → Withdrawals, approves or denies it, and the customer is notified. Every state change is recorded in an append-only audit log.
The customer enters the flow from the footer link, the Withdraw from contract link in My Account, or from a CTA in an order or shipment email. Everything below happens under /withdraw-contract/ on your storefront (you can change the URL prefix in admin if needed).
Customer journey
Step 1: Landing page

A logged-in customer sees their eligible orders with deadlines: You can return this order until May 11, 2027 (Art. 11a Directive 2011/83/EU). Ineligible items show the reason inline — Already returned, Outside the 14-day period, or Excluded under Art. 16(c) (custom-made).
A guest sees a lookup form: order number + email. If the order exists and the email matches, the same orders list renders.
Step 2: Item selection

For each eligible item the customer chooses a quantity (full or partial) and a reason from the merchant-configured dropdown. The default reasons are Changed my mind, Wrong size or fit, Defective or damaged, and Not as described; merchants can add or remove reasons in Stores → Configuration → MageMe Extensions → EU Withdrawal → Frontend → Return Reasons. If Enable "Other" is on, customers get a free-text field (max 500 characters).
A live-updating sidebar shows the refund estimate — item subtotal, tax, plus shipping when every eligible item is fully returned.
Step 3: Review and confirm

The Review step shows the items, reasons, refund breakdown, and return shipping instructions configured by the merchant. The final button label defaults to Confirm withdrawal — Art. 11a(2) requires unambiguous wording. The two-step structure (Step 2 selection → Step 3 confirmation) is the legal two-step ceremony required by Art. 11a(3); a single-page popup confirmation would not be compliant.
Step 4: Success

After the customer clicks Confirm withdrawal, the request is persisted, the receipt email is queued, and the success page shows the request number (e.g. RR000000022 with the configurable prefix). The customer can copy the number, view the linked order, or open the receipt PDF if one was attached.
Step 5: Receipt email

The receipt email is the durable-medium acknowledgement required by Article 11a(4). It is sent immediately after confirmation, retried up to three times if delivery fails (configurable), and contains a content-hash fingerprint that proves the text the customer received has not been altered.
Real receipt email content (excerpt)
Subject: Your withdrawal request RR000000022 — receipt
──────────────────────────────────────────────
Withdrawal receipt
──────────────────────────────────────────────
Request RR000000022
Submitted: 2026-05-12 14:38:02 UTC
Order: #000000004 (placed 2026-04-28)
Items withdrawn:
1 × Hero Hoodie (M, blue) — 49.00 EUR
1 × Strive Shoulder Pack — 32.00 EUR
Refund estimate:
Items 81.00 EUR
Shipping 5.00 EUR
Tax 6.95 EUR
Total refund 92.95 EUR
Reason: Changed my mind
What happens next:
• You will receive return shipping instructions within 2 business days.
• Once we receive the items, your refund is processed within 14 days
via the original payment method (Art. 13).
Right of withdrawal: Article 11a of Directive 2011/83/EU
Content hash (SHA-256): a9b3c7e1...8f2d1e6c
──────────────────────────────────────────────
Acme Store · contact@acmestore.example · acmestore.example
The hash footer is the integrity proof. If the merchant later disputes what was disclosed to the customer, the customer can present the email and the hash can be re-computed from the stored receipt body. Pro tier extends this with a public verification URL (/withdraw-contract/verify/...) that recomputes the hash server-side.
After submission
Request status
A request moves through a small set of states. Terminal states cannot transition further.

| Status | Meaning | Can transition to |
|---|---|---|
pending | Customer confirmed; awaiting merchant decision (shown in admin as Pending) | approved, denied, cancelled |
approved | Merchant approved the withdrawal | — terminal — |
denied | Merchant denied the withdrawal (reason required, min. 10 characters) | — terminal — |
cancelled | Cancelled by the customer or admin | — terminal — |
anonymised | Reserved terminal status for PII-retention (not auto-applied in this release) | — terminal — |
pending is the only state a request can move out of. The customer is emailed on every transition — approval, denial, and cancellation each send their own notification (see Email Templates).
Customer self-cancel
A customer can cancel their own request while it is pending (not yet decided by the merchant). The cancel button appears in the customer's "Withdrawal requests" section of the order view. After cancel, the customer receives the cancellation email (Email #5 in Email Templates). Once the merchant has approved or denied, the customer can no longer self-cancel — the case is closed.
My Account integration
When Frontend → Placements → Show in My Account is enabled (default), three things appear in the customer's account:
- Sidebar link —
Withdraw from contract, routing to the landing page. - My Orders badges —
Eligible for X daysorNot eligible — reasonnext to each order. - Order view widget — a card on the order detail page with a
Start withdrawalbutton and the deadline.
Admin journey

Admin navigation: Sales → Withdrawals → Withdrawal Requests (requires the MageMe_EUWithdrawal::request_view ACL).
The grid is filterable by status, date range, customer email, and order number. Mass actions are limited to safe transitions — you can mass-approve pending requests but you cannot mass-edit terminal states.
Clicking a row opens the Request detail page with three tabs:
- Information — customer details, order items withdrawn, status timeline, refund estimate.
- Audit — append-only log of every state change with timestamp and admin user.
- Pre-Contract Proof — what version of the Annex I withdrawal-right text was displayed to the customer at checkout. Live in the free tier; the Pro
annex-iadd-on extends this with immutable per-request snapshots.
From the detail page the admin can transition status (Approve, Deny, Cancel), add internal notes (audit-logged), and resend the receipt email if it failed delivery.
Continue with the Setup Checklist for what to configure before going live, or Configuration for the full admin reference.