Carticy Widerrufsbutton & EU Withdrawal Form for WooCommerce
Carticy Widerrufsbutton & EU Withdrawal Form for WooCommerce
Description
Adding a “withdraw” button is the easy part. The hard part, the part that actually protects you, is being able to show months later that a specific person withdrew from a specific order at a specific time, and that you handed them a durable copy of it.
That record-keeping is what this plugin is built around. Your customers get a clean, guided way to exercise their EU right of withdrawal (Widerruf). You get a complete, defensible paper trail for every request, in one place.
It follows the EU “withdrawal button” model (Article 11a of Directive 2011/83/EU, implemented in Germany as § 356a BGB, mandatory from 19 June 2026) without making the experience feel like a legal form.
This plugin gives you the tooling. It is not legal advice and does not guarantee compliance, so please review your wording, exclusions, retention and refund process with qualified counsel.
The records that matter
- A durable-medium receipt your customer keeps. The moment a request is submitted, the customer is emailed a receipt containing the full declaration (name, order, items, message) and the exact date and time it was received.
- A tamper-evident fingerprint. Every request is signed with a keyed HMAC-SHA256 fingerprint using a secret that never leaves your site. The fingerprint goes in the customer’s receipt and is stored with the record, so a saved request cannot be quietly altered or fabricated and still match.
- The statutory model withdrawal form. A
[carticy_eu_withdrawal_model_form]shortcode renders the official EU model form (Annex I.B; in Germany the Muster-Widerrufsformular), pre-filled with your store’s details, so the document the law expects you to provide is always there and always correct. - 14-day deadline logic. A configurable cooling-off period, calculated from the delivery date, not just the order date.
- Article 16 exclusions. Mark products, categories, or product types that carry no right of withdrawal, such as custom-made goods or sealed hygiene items.
- Recorded consent for digital goods. For downloads and digital content, the right is only lost if the customer agreed up front. The plugin captures that consent at checkout, timestamps it, confirms it in the order email, and only then treats the item as non-withdrawable.
Effortless for the customer
- A guided, mobile-friendly flow: find your order, choose items, confirm, done.
- Logged-in customers get their name and email pre-filled and can pick from their own orders.
- Guests look up an order with just an email and order number. No account is required, the lookup is rate-limited, and it never reveals whether an order exists.
- Works without JavaScript as a normal form, and becomes a smooth multi-step flow when JavaScript is available.
- A separate, clearly labelled confirmation step (“Confirm withdrawal” / “Widerruf bestätigen”), then an instant on-screen receipt.
- Theme-adaptive styling that inherits your fonts and colors. No heavy framework is loaded on your storefront.
One place to handle requests
- A guided setup wizard gets you live in a minute, then a clean dashboard whose totals click straight into a filtered queue, with a small insights card showing your withdrawal rate and the most common reasons.
- Every request in one queue, with a clear lifecycle (Confirm, then mark Received, then Complete) or Reject, buttons that only show the actions a request can actually take, an expandable detail view (declaration, items, reason, return code, tracking, receipt fingerprint), and bulk Confirm/Reject, a search box, and a CSV export when you have a lot of them.
- A “Withdrawal” column on the WooCommerce Orders list and a panel inside each order show its withdrawal state at a glance, while the order keeps its own native status.
- Optional order automation. When a request is confirmed or completed you can set the order status (On hold or Cancelled) or issue a refund automatically. It is off by default, so nothing moves money without your say-so.
- Emails that match your store. Every notification is sent through WooCommerce’s own email template, so it inherits your branding, colors and from-address like the rest of your WooCommerce emails.
- Webhooks for your workflows. Send every withdrawal event to Zapier, Make, n8n, or your own endpoint, optionally signed with HMAC-SHA256.
- One withdrawal per order. A second request for an order that already has an open one is blocked, so you never get duplicate receipts or double refunds.
- Withdrawal links are added to order emails and the My Account orders list, plus a
[carticy_eu_withdrawal_button]shortcode you can place anywhere.
Closing the return loop
A withdrawal is only finished when the goods are back and the money is settled. The plugin handles that whole second half, with defaults that are correct on their own so a merchant who changes nothing still runs a compliant, complete flow.
- An accurate 14-day clock. The cooling-off period is counted from when the order reaches your “delivered” status (Completed by default), not from the order date, and it works alongside shipment-tracking plugins.
- Return code, address, and instructions. The moment you confirm a withdrawal, the customer is emailed a return (RMA) code, your store’s return address, and your return instructions, so they know exactly what to do.
- Withhold the refund until the goods are back. The lifecycle has a “Received” checkpoint, and the refund settles at completion, which keeps the money withheld until the return arrives. You can turn the wait off for a no-questions-asked policy.
- Correct refunds. A full withdrawal refunds the items and the original outbound shipping and restocks the goods, and you can deduct for value lost to handling beyond normal inspection.
- Refund as store credit. Instead of money back you can issue the refund as a single-use, email-locked WooCommerce coupon, which covers most “I would rather exchange” cases without leaving WooCommerce.
- Gentle reminders. A “please ship it back” nudge goes out a few days after you confirm (on by default), with an optional last-chance reminder before the window closes (off by default, so a quiet store never spams).
- Customer transparency. The My Account orders list shows how many days are left to withdraw, and once a request exists it becomes a “track your return” view with the current status, return code, and address.
Built to stay correct
The withdrawal button itself is simple, and one day the platform may ship a basic version. The reason to choose this plugin is everything around it: the proof, the durable receipt, the exclusions, and the consent records, plus the commitment to keep them correct as the law and WooCommerce evolve.
German-ready
Fully translatable, and ships with German included, with the legally exact labels (“Vertrag widerrufen”, “Widerruf bestätigen”) and the Muster-Widerrufsformular wording.
Free, with no catch
It is completely free. There is no paid version, no locked features, and no upsell prompts, and the plugin does not phone home or send your data to us. HPOS (custom order tables) and the block-based cart and checkout are fully supported.
Privacy
The plugin stores withdrawal requests in its own database tables: the contact details and order reference the customer provides, the items and message, a request timestamp, a keyed verification fingerprint, and hashed IP/user-agent values used only for spam and rate-limiting. It integrates with the WordPress personal-data exporter and eraser. On uninstall, data is removed only if you enabled that option. The plugin does not send any data to us. If you enable the optional webhook, each request’s details are also delivered to the URL you configure, and nowhere else.
Installation
- Install and activate the plugin (WooCommerce must be active).
- A published “Withdrawal Request” page is created for you automatically, and a short setup wizard opens.
- Follow the wizard, or open WooCommerce, EU Withdrawal at any time to review settings.
- Optionally place
[carticy_eu_withdrawal_button]in your footer or account area, and[carticy_eu_withdrawal_model_form]on your withdrawal policy page.
Screenshots

Guided setup wizard that gets the store live in a minute, with server-checked steps.

The admin dashboard: setup readiness, request totals you can click straight into, and an insights card with your withdrawal rate and most common reasons.

The review queue: the Confirm, Received, Complete, and Reject lifecycle, with search, bulk actions, and a CSV export.

Settings in one place: returns handling (when the 14-day clock starts, withholding the refund until the goods are back, refunds and store credit), optional order automation, webhooks, and digital-content consent.

The customer flow, step 1: find your order by email and order number, or pre-filled and picked from your own orders when logged in.

Choosing the items to withdraw, with an optional reason and message (a reason is never required).

The separate confirmation step and the instant on-screen receipt that is also emailed.
Faq
The button is the visible part. The value is the record behind it: a durable receipt the customer keeps, a tamper-evident fingerprint stored with each request, the model form, your exclusions, and recorded consent for digital goods. That is what lets you show what happened, later, if anyone asks.
Yes, completely. There is no paid version, no locked features, and no upsell prompts, and it does not collect or send your data to us.
No. It provides the tooling and the records; it is not legal advice. Confirm your wording, exclusions, retention and refunds with qualified counsel.
Yes. The flow follows the withdrawal-button model (Art. 11a Directive 2011/83/EU; § 356a BGB) with two separately labelled controls and a durable-medium acknowledgement, and it ships the German Muster-Widerrufsformular wording.
Each request is signed with a keyed HMAC-SHA256 over its contents, using a secret generated once and kept private on your site. Because the secret never leaves the server, a stored request cannot be silently changed or forged and still produce the same fingerprint, and the customer holds an independent copy in their emailed receipt.
Yes. HPOS and cart/checkout blocks are declared compatible, and the digital-content consent is captured on both the classic and block checkout.
By default, no: refunds stay a deliberate decision. But you can opt in. Under Order handling you can have the order status change (On hold or Cancelled) when a request is confirmed or completed, and issue the refund automatically when you mark a request complete. The default leaves the order untouched.
Yes, and that is the default. After you confirm a withdrawal the customer gets a return code and your return address, the request waits at a “Received” step until the parcel arrives, and the refund settles when you mark it complete. You can turn the wait off if you prefer to refund straight away. A full withdrawal refunds the items and the original outbound shipping, and you can deduct for value lost to handling beyond normal inspection.
Yes. Choose Store credit when completing a withdrawal (or set it as your default) and the plugin issues the refund as a single-use, email-locked WooCommerce coupon and sends the customer the code. This covers most exchange requests without any third-party service.
From when the order reaches the status you treat as delivered (Completed by default), because the right of withdrawal runs from when the customer receives the goods, not from the order date. It also works with shipment-tracking plugins that record an exact delivery date.
Not directly, because reliable label generation depends on each store’s carrier account and country. You can record a return tracking number on each return, and a carrier integration can supply a prepaid label.
Yes. Every customer and admin notification is sent through WooCommerce’s own email template, so it uses your store’s email header, colors, logo and from-address, exactly like the rest of your WooCommerce emails.
Yes. Turn on the webhook under Settings and point it at a URL from Zapier, Make, n8n, or your own service; every event (created, confirmed, completed, rejected) is posted there as JSON. Add a signing secret and each request is signed so you can verify it came from your store.
The WooCommerce Orders list gains a “Withdrawal” column showing each order’s withdrawal state, and the order screen has an “EU Withdrawal” panel with the same badge and a link into the queue. The order’s own status is never overwritten unless you turn on order automation.
Reviews
Changelog
1.0.0
- Initial release.
- Guided setup wizard and a clean, modern admin dashboard.
- Guided, theme-adaptive customer flow (find order, choose items, confirm, receipt) with a no-JavaScript fallback.
- Durable-medium receipt email with the full declaration and exact timestamp.
- Keyed HMAC-SHA256 tamper-evident fingerprint for every request.
- Statutory model withdrawal form (Annex I.B / Muster-Widerrufsformular) via shortcode, pre-filled with store details.
- Configurable 14-day deadline with delivery-date detection, and product/category/type Article 16 exclusions.
- Digital-content consent captured at classic and block checkout, confirmed in the order email, with waiver-aware eligibility.
- Logged-in autofill and order picker; rate-limited, anti-enumeration guest order lookup.
- Admin review queue with a state-aware Confirm/Received/Complete/Reject lifecycle, status filters, a detail view, bulk actions, search, and CSV export.
- Full return loop: return (RMA) code, store return address and instructions on confirmation, a “Received” checkpoint that withholds the refund until the goods are back, refunds that include outbound shipping with an optional diminished-value deduction, and the option to refund as store credit.
- Accurate 14-day clock counted from the order’s delivered status.
- Daily return reminders (ship-it-back on by default, window-closing optional) and a “track your return” view with days left to withdraw on My Account.
- “Withdrawal” column on the Orders list and a status panel inside each order; HPOS-aware.
- Optional order automation: set the order status or issue a refund on confirm/complete (off by default).
- All notification emails sent through WooCommerce’s email template, inheriting the store’s branding and from-address.
- Outgoing webhook for withdrawal events, optionally signed.
- Structured, optional return reasons and a dashboard insights card (withdrawal rate and top reasons).
- One open withdrawal per order; duplicate requests are blocked.
- WordPress personal-data exporter and eraser; HPOS and cart/checkout blocks compatibility.
- Fully translatable; ships with German, including the legally exact labels and model-form wording.