{"id":340926,"date":"2026-07-24T08:03:48","date_gmt":"2026-07-24T08:03:48","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/w3s-eu-withdrawal-request-for-woocommerce\/"},"modified":"2026-08-20T08:43:24","modified_gmt":"2026-08-20T08:43:24","slug":"w3s-eu-withdrawal-request-for-woocommerce","status":"publish","type":"plugin","link":"https:\/\/vec.wordpress.org\/plugins\/w3s-eu-withdrawal-request-for-woocommerce\/","author":23293217,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.1.0","stable_tag":"1.1.0","tested":"7.1","requires":"6.2","requires_php":"7.4","requires_plugins":null,"header_name":"W3S EU Withdrawal Request for WooCommerce","header_author":"W3 Specialists","header_description":"EU right-of-withdrawal function for WooCommerce under Directive (EU) 2023\/2673 and Directive 2011\/83\/EU: a guest-accessible withdrawal form, a My Account cancellation action, and an admin request-management panel with custom order statuses.","assets_banners_color":"f4c9d6","last_updated":"2026-08-20 08:43:24","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"https:\/\/www.w3specialists.com\/","rating":0,"author_block_rating":0,"active_installs":10,"downloads":250,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.0":{"tag":"1.0.0","author":"w3specialists","date":"2026-07-24 08:03:27"},"1.1.0":{"tag":"1.1.0","author":"w3specialists","date":"2026-08-20 08:43:24"}},"upgrade_notice":{"1.1.0":"<p>Adds a Styling tab for the form&#039;s button colours, makes the order-lookup hint editable, and confirms compatibility with WooCommerce 11.0.<\/p>","1.0.0":"<p>Initial public release.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3621166,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3621166,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3621231,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3621231,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.0","1.1.0"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3640481,"resolution":"1","location":"assets","locale":"","width":1732,"height":984},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3640481,"resolution":"2","location":"assets","locale":"","width":1733,"height":1068},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3640481,"resolution":"3","location":"assets","locale":"","width":1730,"height":1606},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3640481,"resolution":"4","location":"assets","locale":"","width":1732,"height":571},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3640481,"resolution":"5","location":"assets","locale":"","width":1750,"height":707}},"screenshots":{"1":"General settings \u2014 withdrawal period and its starting point, eligible order statuses, the withdrawal form page and the automatic order-status changes.","2":"Texts \u2014 every customer-facing label and message is editable, shown in the site language and translatable via WPML \/ Polylang.","3":"Emails \u2014 templates for the customer acknowledgment, the store notification and the status-change emails, with rich placeholders like {items_table}, plus the notification recipients.","4":"Styling \u2014 the colours of the withdrawal form's submit button, with a colour picker, hex \/ rgb(a) input and a live preview.","5":"Product exclusions (made-to-order \/ personalised goods under Article 16(c)) are available in the Pro edition."}},"plugin_section":[],"plugin_tags":[395,131785,263226,245590,286],"plugin_category":[45],"plugin_contributors":[243286],"plugin_business_model":[],"class_list":["post-340926","plugin","type-plugin","status-publish","hentry","plugin_tags-eu","plugin_tags-gdpr","plugin_tags-right-of-withdrawal","plugin_tags-withdrawal","plugin_tags-woocommerce","plugin_category-ecommerce","plugin_contributors-w3specialists","plugin_committers-w3specialists"],"banners":{"banner":"https:\/\/ps.w.org\/w3s-eu-withdrawal-request-for-woocommerce\/assets\/banner-772x250.png?rev=3621231","banner_2x":"https:\/\/ps.w.org\/w3s-eu-withdrawal-request-for-woocommerce\/assets\/banner-1544x500.png?rev=3621231","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/w3s-eu-withdrawal-request-for-woocommerce\/assets\/icon-128x128.png?rev=3621166","icon_2x":"https:\/\/ps.w.org\/w3s-eu-withdrawal-request-for-woocommerce\/assets\/icon-256x256.png?rev=3621166","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/w3s-eu-withdrawal-request-for-woocommerce\/assets\/screenshot-1.png?rev=3640481","caption":"General settings \u2014 withdrawal period and its starting point, eligible order statuses, the withdrawal form page and the automatic order-status changes."},{"src":"https:\/\/ps.w.org\/w3s-eu-withdrawal-request-for-woocommerce\/assets\/screenshot-2.png?rev=3640481","caption":"Texts \u2014 every customer-facing label and message is editable, shown in the site language and translatable via WPML \/ Polylang."},{"src":"https:\/\/ps.w.org\/w3s-eu-withdrawal-request-for-woocommerce\/assets\/screenshot-3.png?rev=3640481","caption":"Emails \u2014 templates for the customer acknowledgment, the store notification and the status-change emails, with rich placeholders like {items_table}, plus the notification recipients."},{"src":"https:\/\/ps.w.org\/w3s-eu-withdrawal-request-for-woocommerce\/assets\/screenshot-4.png?rev=3640481","caption":"Styling \u2014 the colours of the withdrawal form's submit button, with a colour picker, hex \/ rgb(a) input and a live preview."},{"src":"https:\/\/ps.w.org\/w3s-eu-withdrawal-request-for-woocommerce\/assets\/screenshot-5.png?rev=3640481","caption":"Product exclusions (made-to-order \/ personalised goods under Article 16(c)) are available in the Pro edition."}],"raw_content":"<!--section=description-->\n<p>Implements the withdrawal (\"cancellation\") function required by Directive (EU) 2023\/2673, on top of the consumer right of withdrawal in Directive 2011\/83\/EU: 14 calendar days from receipt, a guest-accessible withdrawal form, and a complete admin workflow.<\/p>\n\n<ul>\n<li><strong>Guest-accessible public form<\/strong> \u2014 order number + email <em>or phone<\/em> lookup (rate-limited; orders of registered customers also match their account email), line items shown with thumbnail \/ SKU \/ variation attributes, EU Annex I.B fields, an optional reason, a refund IBAN asked only on bank-transfer orders (stored encrypted, masked in the UI), a two-step confirmation, an acknowledgment email to the customer (durable medium), a merchant notification (with configurable recipients) and an order note.<\/li>\n<li><strong>My Account<\/strong> \u2014 a \"Withdrawal \/ Order Cancellation\" action on eligible orders opens the pre-filled withdrawal form.<\/li>\n<li><strong>Admin panel<\/strong> \u2014 a list of all requests with status \/ type \/ date filters; an approve \/ reject \/ close workflow with order notes and status-specific customer emails (accepted \/ rejected \/ completed); an optional decision reasoning that is stored, shown to the customer and available in emails via <code>{admin_reason}<\/code>; a CSV export honoring the active filters (masked IBANs); custom order statuses \"Withdrawal requested\" \/ \"Withdrawal completed\"; refunds via the native WooCommerce refund UI.<\/li>\n<li><strong>Configurable withdrawal window<\/strong> \u2014 start point is the completion date (falling back to paid, then created) or the order creation date.<\/li>\n<li><strong>Configurable eligible statuses<\/strong> \u2014 the withdrawal action appears only on the order statuses you choose (Completed by default).<\/li>\n<li><strong>Emails with product tables<\/strong> \u2014 the <code>{items_table}<\/code> placeholder renders thumbnails + SKU in WooCommerce-styled emails; <code>{items}<\/code> stays plain text.<\/li>\n<li><strong>Styling<\/strong> \u2014 a Styling tab sets the colours of the form's submit button (background \/ text and their hover state) with a colour picker and a live preview, so the form matches your theme.<\/li>\n<li><strong>Requests stored in dedicated custom tables<\/strong> (dbDelta), not post meta.<\/li>\n<li><strong>English source, translation-ready<\/strong> \u2014 every string uses the <code>w3s-eu-withdrawal-request-for-woocommerce<\/code> text domain and ships with an up-to-date <code>.pot<\/code> template; locales are served by translate.wordpress.org.<\/li>\n<li><strong>HPOS-compatible<\/strong> \u2014 declares <code>custom_order_tables<\/code> compatibility and uses the WooCommerce order CRUD exclusively.<\/li>\n<li><strong>Privacy tools<\/strong> \u2014 a personal-data exporter and eraser for stored request data.<\/li>\n<\/ul>\n\n<p><strong>Note:<\/strong> the encrypted IBAN key derives from the site's <code>AUTH<\/code> salts; rotating the salts makes previously stored IBANs unreadable.<\/p>\n\n<h4>Pro edition<\/h4>\n\n<p>The Pro edition adds a product <strong>exclusion engine<\/strong> for made-to-order \/ personalised goods (Article 16(c) of Directive 2011\/83\/EU):<\/p>\n\n<ul>\n<li>exclusion rules by attribute \/ brand \/ category \/ tag or by individual product ID (parent categories cascade to their children);<\/li>\n<li>a per-product \"Exclude from withdrawal\" checkbox on the product edit screen;<\/li>\n<li>a checkout consent gate that appears only when the cart contains an excluded item, blocks checkout (classic and block \/ Store API) until the customer accepts, and stores proof of consent on the order (UTC timestamp, the exact text and a SHA-256 hash);<\/li>\n<li>excluded-item handling on the withdrawal form and multilingual (WPML \/ Polylang) term and product coverage.<\/li>\n<\/ul>\n\n<p>The free and Pro editions share the same stored data, so installing Pro keeps all of your settings, texts, requests and consent records and simply unlocks the exclusions feature. Contact sales@w3specialists.com.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>w3s-eu-withdrawal-request-for-woocommerce<\/code> folder to <code>\/wp-content\/plugins\/<\/code>, or install it from Plugins \u2192 Add New.<\/li>\n<li>Activate the plugin. A public page \"Withdrawal Form\" containing the <code>[w3s_eu_withdrawal_request_form]<\/code> shortcode is created automatically.<\/li>\n<li>Review W3Specialists \u2192 EU Withdrawal Request (general options, texts, emails). The requests list lives under WooCommerce \u2192 Withdrawals.<\/li>\n<li>On multilingual sites (WPML \/ Polylang), translate the form page; admin-entered texts and emails are registered for translation via <code>wpml-config.xml<\/code>.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20this%20plugin%20exclude%20made-to-order%20products%20from%20the%20right%20of%20withdrawal%3F\"><h3>Does this plugin exclude made-to-order products from the right of withdrawal?<\/h3><\/dt>\n<dd><p>Excluding made-to-order \/ personalised products (Article 16(c) of Directive 2011\/83\/EU) is a feature of the Pro edition. The free edition treats every product as covered by the right of withdrawal. See the \"Exclusion (PRO Feature)\" tab on the settings screen, or contact sales@w3specialists.com.<\/p><\/dd>\n<dt id=\"is%20the%20withdrawal%20form%20accessible%20without%20an%20account%3F\"><h3>Is the withdrawal form accessible without an account?<\/h3><\/dt>\n<dd><p>Yes. Customers look up their order by its order number and their email or phone; registered customers can also use their account email. Lookups are rate-limited.<\/p><\/dd>\n<dt id=\"can%20i%20change%20the%20colours%20of%20the%20withdrawal%20form%3F\"><h3>Can I change the colours of the withdrawal form?<\/h3><\/dt>\n<dd><p>Yes. W3Specialists \u2192 EU Withdrawal Request \u2192 Styling sets the submit button's background and text colour and their hover state, as a hex code or an rgb \/ rgba value, with a live preview. Everything else can be styled from your theme's custom CSS \u2014 the form markup uses <code>w3s-ewr-<\/code> prefixed classes, and the templates can be overridden in <code>{theme}\/w3s-eu-withdrawal-request-for-woocommerce\/<\/code>.<\/p><\/dd>\n<dt id=\"is%20it%20compatible%20with%20hpos%20%28high-performance%20order%20storage%29%3F\"><h3>Is it compatible with HPOS (High-Performance Order Storage)?<\/h3><\/dt>\n<dd><p>Yes. The plugin declares <code>custom_order_tables<\/code> compatibility and uses the WooCommerce order CRUD exclusively.<\/p><\/dd>\n<dt id=\"in%20which%20languages%20is%20it%20available%3F\"><h3>In which languages is it available?<\/h3><\/dt>\n<dd><p>The source language is English. Translations are served by translate.wordpress.org and install automatically \u2014 a Greek translation is available there. You can contribute your own language at https:\/\/translate.wordpress.org\/projects\/wp-plugins\/w3s-eu-withdrawal-request-for-woocommerce\/, or by translating the bundled <code>languages\/w3s-eu-withdrawal-request-for-woocommerce.pot<\/code> template.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<p>Entries are prefixed with the type of change: <strong>Add<\/strong> (new feature), <strong>Fix<\/strong> (bug fix), <strong>Update<\/strong> (compatibility or content update), <strong>Tweak<\/strong> (small behaviour or UI change) and <strong>Dev<\/strong> (developer-facing change).<\/p>\n\n<h4>1.1.0 2026-08-10<\/h4>\n\n<ul>\n<li>Add - Styling tab: the colours of the withdrawal form's submit button \u2014 background, text and their hover state \u2014 are now editable, with a colour picker, hex \/ rgb(a) input and a live preview.<\/li>\n<li>Add - The order-lookup hint on the public form (\"Enter the order number and the email or phone you used at purchase\u2026\") is now an editable text under Texts \u2192 Order lookup hint, translatable via WPML \/ Polylang.<\/li>\n<li>Update - Compatibility with WooCommerce 11.0: verified against the 11.0 developer advisories. Declared \"WC tested up to: 11.0\".<\/li>\n<li>Dev - New settings keys <code>button_bg<\/code>, <code>button_text<\/code>, <code>button_bg_hover<\/code> and <code>button_text_hover<\/code>, whitelisted to hex \/ rgb(a) and printed with <code>wp_add_inline_style<\/code>. They match the Pro edition's keys, so colours carry over on an upgrade.<\/li>\n<li>Dev - New text key <code>lookup_intro<\/code>, registered for WPML in <code>wpml-config.xml<\/code>. Themes overriding <code>form-lookup.php<\/code> receive it as <code>$lookup_intro<\/code>.<\/li>\n<li>Fix - Corrected the readme: translations are served by translate.wordpress.org, not bundled in the plugin. The <code>.pot<\/code> template ships and is up to date.<\/li>\n<\/ul>\n\n<h4>1.0.0 2026-07-22<\/h4>\n\n<ul>\n<li>Add - Guest-accessible withdrawal form ([w3s_eu_withdrawal_request_form]) with order number + email or phone lookup, rate limiting, EU Annex I.B fields and a two-step confirmation.<\/li>\n<li>Add - \"Withdrawal \/ Order Cancellation\" action on eligible orders in My Account.<\/li>\n<li>Add - Admin request management: status \/ type \/ date filters, an approve \/ reject \/ close workflow with order notes, decision reasoning shown to the customer, and a CSV export honouring the active filters.<\/li>\n<li>Add - Custom order statuses \"Withdrawal requested\" and \"Withdrawal completed\", with refunds handled by the native WooCommerce refund UI.<\/li>\n<li>Add - Configurable withdrawal window, eligible order statuses and store-notification recipients.<\/li>\n<li>Add - Customer acknowledgment (durable medium), store notification and status-change emails, sent through the WooCommerce mailer with a <code>{items_table}<\/code> product table.<\/li>\n<li>Add - Refund IBAN asked only on bank-transfer orders, stored encrypted and masked in the UI.<\/li>\n<li>Add - Personal-data exporter and eraser for stored request data.<\/li>\n<li>Dev - Requests stored in dedicated custom tables (dbDelta), not post meta; HPOS (<code>custom_order_tables<\/code>) compatibility declared and the WooCommerce order CRUD used exclusively.<\/li>\n<\/ul>","raw_excerpt":"EU consumer right-of-withdrawal for WooCommerce: a guest withdrawal form, admin request workflow, custom order statuses and privacy tools.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/vec.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/340926","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vec.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/vec.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/vec.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=340926"}],"author":[{"embeddable":true,"href":"https:\/\/vec.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/w3specialists"}],"wp:attachment":[{"href":"https:\/\/vec.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=340926"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/vec.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=340926"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/vec.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=340926"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/vec.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=340926"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/vec.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=340926"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/vec.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=340926"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}