{"id":312715,"date":"2026-05-15T09:28:50","date_gmt":"2026-05-15T09:28:50","guid":{"rendered":"https:\/\/es.wordpress.org\/plugins\/eu-withdrawal-compliance\/"},"modified":"2026-05-16T07:55:07","modified_gmt":"2026-05-16T07:55:07","slug":"eu-withdrawal-compliance","status":"publish","type":"plugin","link":"https:\/\/es.wordpress.org\/plugins\/eu-withdrawal-compliance\/","author":1320655,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_crdt_document":"","version":"1.4.1","stable_tag":"1.4.1","tested":"7.0","requires":"6.0","requires_php":"7.4","requires_plugins":null,"header_name":"EU Withdrawal Compliance","header_author":"Fernando Tellado","header_description":"Adds the EU online withdrawal function required by Directive (EU) 2023\/2673 from June 19, 2026. Includes a shortcode, a Gutenberg-friendly form, a WooCommerce \"My account\" endpoint and a full admin log.","assets_banners_color":"05339b","last_updated":"2026-05-16 07:55:07","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/servicios.ayudawp.com","header_author_uri":"https:\/\/tellado.es","rating":0,"author_block_rating":0,"active_installs":0,"downloads":86,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.4.0":{"tag":"1.4.0","author":"fernandot","date":"2026-05-15 17:32:54"},"1.4.1":{"tag":"1.4.1","author":"fernandot","date":"2026-05-16 07:55:07"}},"upgrade_notice":{"1.4.1":"<p>Fixes a header that blocked activation on sites without WooCommerce. The plugin now runs as standalone with its own admin menu \u2014 WooCommerce features (My Account endpoint, order validation, exclusions, email injection) still activate automatically when WC is present.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.jpg":{"filename":"icon-128x128.jpg","revision":3533132,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.jpg":{"filename":"icon-256x256.jpg","revision":3533132,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500-es.jpg":{"filename":"banner-1544x500-es.jpg","revision":3533277,"resolution":"1544x500","location":"assets","locale":"es","width":1544,"height":500},"banner-1544x500.jpg":{"filename":"banner-1544x500.jpg","revision":3533205,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250-es.jpg":{"filename":"banner-772x250-es.jpg","revision":3533277,"resolution":"772x250","location":"assets","locale":"es","width":772,"height":250},"banner-772x250.jpg":{"filename":"banner-772x250.jpg","revision":3533205,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{"blueprint.json":{"filename":"blueprint.json","revision":3533628,"resolution":false,"location":"assets","locale":"","contents":"{\"landingPage\":\"\\\/wp-admin\\\/plugins.php\",\"preferredVersions\":{\"php\":\"latest\",\"wp\":\"latest\"},\"steps\":[{\"step\":\"login\",\"username\":\"admin\"},{\"step\":\"installPlugin\",\"pluginData\":{\"resource\":\"wordpress.org\\\/plugins\",\"slug\":\"woocommerce\"},\"options\":{\"activate\":false}},{\"step\":\"installPlugin\",\"pluginData\":{\"resource\":\"wordpress.org\\\/plugins\",\"slug\":\"eu-withdrawal-compliance\"},\"options\":{\"activate\":true}}]}"}},"all_blocks":[],"tagged_versions":["1.4.0","1.4.1"],"block_files":[],"assets_screenshots":{"screenshot-1-es.jpg":{"filename":"screenshot-1-es.jpg","revision":3533296,"resolution":"1","location":"assets","locale":"es","width":1920,"height":1355},"screenshot-1.jpg":{"filename":"screenshot-1.jpg","revision":3533296,"resolution":"1","location":"assets","locale":"","width":1920,"height":1355},"screenshot-2-es.jpg":{"filename":"screenshot-2-es.jpg","revision":3533296,"resolution":"2","location":"assets","locale":"es","width":1920,"height":952},"screenshot-2.jpg":{"filename":"screenshot-2.jpg","revision":3533296,"resolution":"2","location":"assets","locale":"","width":1920,"height":932},"screenshot-3-es.jpg":{"filename":"screenshot-3-es.jpg","revision":3533296,"resolution":"3","location":"assets","locale":"es","width":1920,"height":932},"screenshot-3.jpg":{"filename":"screenshot-3.jpg","revision":3533296,"resolution":"3","location":"assets","locale":"","width":1920,"height":932},"screenshot-4-es.jpg":{"filename":"screenshot-4-es.jpg","revision":3533296,"resolution":"4","location":"assets","locale":"es","width":1920,"height":1138},"screenshot-4.jpg":{"filename":"screenshot-4.jpg","revision":3533296,"resolution":"4","location":"assets","locale":"","width":1920,"height":1138}},"screenshots":{"1":"Public withdrawal form with all required fields.","2":"Withdrawal log inside the WordPress admin.","3":"Per-request detail screen with status management.","4":"WooCommerce My Account integration with per-order Withdraw button.","5":"EU Withdrawal Settings Page (WooCommece active)","6":"EU Withdrawal Settings Page (Standalone)"},"jetpack_post_was_ever_published":false},"plugin_section":[],"plugin_tags":[14361,255182,131785,245590,286],"plugin_category":[45],"plugin_contributors":[245779,133550],"plugin_business_model":[],"class_list":["post-312715","plugin","type-plugin","status-publish","hentry","plugin_tags-compliance","plugin_tags-consumer-rights","plugin_tags-gdpr","plugin_tags-withdrawal","plugin_tags-woocommerce","plugin_category-ecommerce","plugin_contributors-ayudawp","plugin_contributors-fernandot","plugin_committers-ayudawp","plugin_committers-fernandot","plugin_support_reps-ayudawp"],"banners":{"banner":"https:\/\/ps.w.org\/eu-withdrawal-compliance\/assets\/banner-772x250-es.jpg?rev=3533277","banner_2x":"https:\/\/ps.w.org\/eu-withdrawal-compliance\/assets\/banner-1544x500-es.jpg?rev=3533277","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/eu-withdrawal-compliance\/assets\/icon-128x128.jpg?rev=3533132","icon_2x":"https:\/\/ps.w.org\/eu-withdrawal-compliance\/assets\/icon-256x256.jpg?rev=3533132","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/eu-withdrawal-compliance\/assets\/screenshot-1-es.jpg?rev=3533296","caption":"Formulario de desistimiento p\u00fablico con todos los campos obligatorios."},{"src":"https:\/\/ps.w.org\/eu-withdrawal-compliance\/assets\/screenshot-2-es.jpg?rev=3533296","caption":"Registro de desistimientos en la administraci\u00f3n de WordPress."},{"src":"https:\/\/ps.w.org\/eu-withdrawal-compliance\/assets\/screenshot-3-es.jpg?rev=3533296","caption":"Pantalla de detalles por solicitud con gesti\u00f3n del estado."},{"src":"https:\/\/ps.w.org\/eu-withdrawal-compliance\/assets\/screenshot-4-es.jpg?rev=3533296","caption":"Integraci\u00f3n en \u00abMi cuenta\u00bb de WooCommerce con bot\u00f3n de \u00abDesistir\u00bb por pedido."}],"raw_content":"<!--section=description-->\n<p>The EU Directive 2023\/2673 obliges every online retailer in the European Union to offer a digital withdrawal function from June 19, 2026. The directive requires that exercising the right of withdrawal must be at least as easy as concluding the contract was: a single click should be enough.<\/p>\n\n<p>This plugin gives you the most complete implementation in the WordPress.org directory \u2014 fully free, no paid tier, no upsells, no premium add-ons \u2014 with three features that no other plugin in the directory offers:<\/p>\n\n<ul>\n<li><strong>Verifiable SHA-256 receipt hash<\/strong>: every withdrawal request issues a tamper-evident hash to the customer as durable-medium proof, recoverable from the stored fields if a dispute later arises.<\/li>\n<li><strong>Article 16 exclusions with category inheritance<\/strong>: mark products or whole WooCommerce categories as excluded from the right of withdrawal \u2014 subcategories inherit automatically \u2014 included at no extra cost (some competing plugins gate this feature behind their own paid Pro tier).<\/li>\n<li><strong>Native GDPR integration<\/strong>: contributes a suggested Privacy Policy snippet and registers a personal-data exporter and eraser so admins can answer access and erasure requests directly from <strong>Tools \u2192 Export \/ Erase Personal Data<\/strong>, no second plugin required.<\/li>\n<\/ul>\n\n<p>The plugin works as a standalone tool \u2014 form, shortcode, request log, email notifications, SHA-256 receipt hash and GDPR integration all run without WooCommerce, under their own top-level <strong>Withdrawals<\/strong> menu. When WooCommerce is active it layers extra store-specific features on top:<\/p>\n\n<ul>\n<li>A public withdrawal page automatically created on activation, pre-filled with a neutral, multilingual sample template (with a clear \"review with a legal advisor\" disclaimer) and the form embedded via shortcode.<\/li>\n<li>A <code>[ayudawp_withdrawal_form]<\/code> shortcode you can use anywhere in your site.<\/li>\n<li>A \"Right of withdrawal\" endpoint inside the WooCommerce <strong>My Account<\/strong> area, with a per-order \"Withdraw\" button shown only while the configured withdrawal window is open.<\/li>\n<li>Automatic injection of an \"Exercise withdrawal right here\" notice with link to the form inside WooCommerce transactional emails (processing, completed and customer invoice), to comply with the trader's obligation to inform consumers about the existence and placement of the withdrawal function. The list of eligible order statuses is configurable from the settings page (defaults to Processing and Completed).<\/li>\n<li>Automatic verification of the order\/email pair when WooCommerce is active, including the 14-day deadline check.<\/li>\n<li><strong>Configurable deadline calculation<\/strong>: choose whether the 14-day window starts from the order date or from the WooCommerce completion date, and add extra grace days from the settings page.<\/li>\n<li><strong>Article 16 exclusions<\/strong>: mark individual products or whole categories as excluded from the right of withdrawal (custom-made, perishable, sealed digital, etc.). Requests on orders containing excluded items are flagged for the admin to review manually \u2014 never auto-rejected, since a partial withdrawal over the rest of the order can still be valid.<\/li>\n<li><strong>Verifiable receipt hash<\/strong>: every submission generates a SHA-256 hash sent to the customer in the confirmation email so they keep a tamper-evident proof on a durable medium.<\/li>\n<li>Private order notes added to the WooCommerce order at every step of the lifecycle: when the request is received and again when it is accepted, rejected or marked as completed (including the admin's comment if any).<\/li>\n<li>Confirmation email to the customer on submission and a follow-up email when the request is accepted, rejected or completed. Optional admin comment is forwarded to the customer (required for rejections, optional for completed). Notification email to the shop admin (with reply-to set to the customer for fast handling, sanitized against header injection).<\/li>\n<li>Full request log as a private custom post type, with status tracking (pending, accepted, rejected, completed), customer details, IP address, user agent and submission timestamp for legal traceability.<\/li>\n<li>Bulk actions in the withdrawals listing to mark several requests as accepted, rejected or completed at once.<\/li>\n<li>\"Withdrawal\" column in the WooCommerce orders screen (legacy and HPOS) showing the status of any linked request, toggleable from \"Screen Options\".<\/li>\n<li>Adaptive admin menu: when WooCommerce is active, settings live at <strong>WooCommerce \u2192 EU Withdrawal<\/strong> and the request log at <strong>WooCommerce \u2192 Withdrawals<\/strong>. Without WooCommerce, the plugin gets its own top-level <strong>Withdrawals<\/strong> menu with a <strong>Settings<\/strong> submenu.<\/li>\n<li>Honeypot anti-spam protection.<\/li>\n<li>Conditional asset loading: CSS only loads on the withdrawal page and inside the plugin admin screens.<\/li>\n<li>Native integration with the WordPress GDPR tools: suggested Privacy Policy snippet, personal data exporter and eraser available from <strong>Tools \u2192 Export Personal Data<\/strong> and <strong>Tools \u2192 Erase Personal Data<\/strong>, all keyed on the customer email.<\/li>\n<li>Translation-ready, fully escaped, follows WordPress Coding Standards, HPOS-compatible.<\/li>\n<\/ul>\n\n<h3>Why this plugin?<\/h3>\n\n<p>The EU directive will be enforced in every member state from June 19, 2026, so several plugins offer a basic withdrawal button. This one stands out because:<\/p>\n\n<ul>\n<li>It is <strong>fully free with no paid tier<\/strong>, no premium add-on and no feature locked behind an upsell. Everything described in this page is what you get on install.<\/li>\n<li>It is the <strong>only plugin in the directory<\/strong> that issues a SHA-256 receipt hash as durable-medium proof of every withdrawal request, recoverable from the stored fields if a dispute later arises.<\/li>\n<li>It is the <strong>only plugin in the directory<\/strong> that ships Article 16 product\/category exclusions with full subcategory inheritance \u2014 a feature that competing plugins gate behind their own paid Pro tier.<\/li>\n<li>It is the <strong>only plugin in the directory<\/strong> that integrates natively with the WordPress GDPR tools (suggested privacy snippet + personal-data exporter and eraser) \u2014 no second GDPR plugin to install.<\/li>\n<li>It works with Sequential Order Numbers (free and Pro), Custom Order Numbers for WooCommerce (WPFactory) and YITH numbering schemes out of the box.<\/li>\n<li>It offers a configurable deadline calculation (order date vs. WooCommerce completion date) and configurable grace days from the settings UI, without writing code.<\/li>\n<li>It exposes 6 documented filters and 2 actions so developers and agencies can extend it without forking.<\/li>\n<li>It is maintained by a Spanish WordPress trainer with 15+ years on the platform: bundled es_ES translation, prompt replies on the WordPress.org support forum and an active roadmap of free improvements.<\/li>\n<\/ul>\n\n<h3>Roadmap<\/h3>\n\n<p>Planned for upcoming free versions:<\/p>\n\n<ul>\n<li>Rate limiting on the public form to prevent abuse.<\/li>\n<li>Custom WooCommerce order status \"Withdrawal requested\" with automatic transition on acceptance.<\/li>\n<li>Urgency indicators in the request list (days remaining, expired).<\/li>\n<li>Signed token in the email link so guest customers can check status without logging in.<\/li>\n<li>Optional IBAN field to speed up manual refunds.<\/li>\n<li>Dashboard widget with counters and pending requests.<\/li>\n<li>CSV export of withdrawal requests for audit and accounting.<\/li>\n<li>PDF download of the request with the receipt hash printed on it.<\/li>\n<li>HTML email templates that inherit the WooCommerce email theme.<\/li>\n<li>Optional modal display mode for the shortcode.<\/li>\n<li>Visible audit log on each request.<\/li>\n<\/ul>\n\n<h3>Privacy<\/h3>\n\n<p>This plugin stores the following personal data for each withdrawal request, exclusively to fulfil the legal traceability of consumer rights and to allow the shop to handle the request:<\/p>\n\n<ul>\n<li>Customer name and email address (required to contact the consumer about the request).<\/li>\n<li>Order reference and order date (required to validate the request against the purchase).<\/li>\n<li>IP address and User-Agent string (required to evidence when and how the request was submitted, in line with the directive's \"durable medium\" requirement).<\/li>\n<li>Submission timestamp (UTC) and SHA-256 receipt hash (required to recompute and verify the integrity of the original submission if disputed).<\/li>\n<\/ul>\n\n<p>Data is stored as a private custom post type entry (<code>ayudawp_withdrawal<\/code>) accessible only to administrators. The plugin does not transmit any data to third-party services; all communication happens between the shop and the customer via standard WordPress emails.<\/p>\n\n<p>You should add a section to your site's privacy policy describing this storage. The plugin contributes a suggested Privacy Policy snippet that you can paste from <strong>Settings \u2192 Privacy \u2192 Policy Guide<\/strong>. Withdrawal data is also exposed to the native WordPress <strong>Tools \u2192 Export Personal Data<\/strong> and <strong>Tools \u2192 Erase Personal Data<\/strong> screens (filtered by customer email).<\/p>\n\n<h3>Support<\/h3>\n\n<p>Need help or have suggestions?<\/p>\n\n<ul>\n<li><a href=\"https:\/\/servicios.ayudawp.com\">Official website<\/a><\/li>\n<li><a href=\"https:\/\/wordpress.org\/support\/plugin\/eu-withdrawal-compliance\/\">WordPress support forum<\/a><\/li>\n<li><a href=\"https:\/\/www.youtube.com\/AyudaWordPressES\">YouTube channel<\/a><\/li>\n<li><a href=\"https:\/\/ayudawp.com\">Documentation and tutorials<\/a><\/li>\n<\/ul>\n\n<p>Love the plugin? Please leave us a 5-star review and help spread the word!<\/p>\n\n<h3>About AyudaWP.com<\/h3>\n\n<p>We are specialists in WordPress security, SEO, AI and performance optimization plugins. We create tools that solve real problems for WordPress site owners while maintaining the highest coding standards and accessibility requirements.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin folder to <code>\/wp-content\/plugins\/<\/code>.<\/li>\n<li>Activate the plugin from the <strong>Plugins<\/strong> screen.<\/li>\n<li>The plugin creates a \"Right of withdrawal\" page automatically with a sample legal template. Review and edit it from <strong>Pages<\/strong>.<\/li>\n<li>Go to <strong>WooCommerce \u2192 EU Withdrawal<\/strong> to configure the notification email address and the page that hosts the form. Without WooCommerce, the settings live at <strong>Withdrawals \u2192 Settings<\/strong>.<\/li>\n<li>Add the URL of the withdrawal page to your footer or to the legal links section so it is visible from any page on your site.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"will%20the%20form%20check%20the%2014-day%20deadline%3F\"><h3>Will the form check the 14-day deadline?<\/h3><\/dt>\n<dd><p>Yes, when WooCommerce is active. If the order is older than the configured window the plugin rejects the request with a clear message. From version 1.2.0 you can configure the calculation basis (order date vs. completion date) and add extra grace days directly from <strong>WooCommerce \u2192 EU Withdrawal<\/strong>. The legacy <code>ayudawp_euw_grace_days<\/code> and <code>ayudawp_euw_skip_deadline_check<\/code> filters still work for programmatic overrides.<\/p><\/dd>\n<dt id=\"how%20do%20i%20mark%20products%20that%20are%20excluded%20from%20the%20right%20of%20withdrawal%20%28article%2016%29%3F\"><h3>How do I mark products that are excluded from the right of withdrawal (Article 16)?<\/h3><\/dt>\n<dd><p>You have two options, which can be combined:<\/p>\n\n<ol>\n<li><strong>By category<\/strong>: from <strong>WooCommerce \u2192 EU Withdrawal \u2192 Article 16 exclusions<\/strong> pick the WooCommerce categories whose products fall under one of the Article 16 exceptions (custom-made, perishable, sealed digital content opened by the consumer, hygiene-sealed items, etc.).<\/li>\n<li><strong>By product<\/strong>: when editing a product, tick the <strong>Excluded from right of withdrawal<\/strong> checkbox under the General tab.<\/li>\n<\/ol>\n\n<p>When a withdrawal request lands on an order containing excluded items, the plugin flags it in the admin notification email and on the request detail screen. The request is <strong>never auto-rejected<\/strong>, because a partial withdrawal over the non-excluded items in the same order can still be valid. The admin reviews and decides.<\/p><\/dd>\n<dt id=\"what%20is%20the%20receipt%20verification%20code%20in%20the%20customer%20email%3F\"><h3>What is the receipt verification code in the customer email?<\/h3><\/dt>\n<dd><p>It is a SHA-256 hash computed from the request data (post ID, customer name, email, order reference, scope, order date and submission timestamp). The customer keeps the email as a tamper-evident proof on a durable medium. If a dispute later arises, you can recompute the hash from the stored fields with the <code>ayudawp_euw_compute_receipt_hash()<\/code> helper and confirm the original submission was not altered.<\/p><\/dd>\n<dt id=\"where%20are%20withdrawal%20requests%20stored%3F\"><h3>Where are withdrawal requests stored?<\/h3><\/dt>\n<dd><p>Each request is saved as a private custom post type entry called <code>ayudawp_withdrawal<\/code>. You can manage them under <strong>WooCommerce \u2192 Withdrawals<\/strong> in your admin area. They are not publicly accessible from the frontend.<\/p><\/dd>\n<dt id=\"does%20it%20support%20hpos%20%28high-performance%20order%20storage%29%3F\"><h3>Does it support HPOS (High-Performance Order Storage)?<\/h3><\/dt>\n<dd><p>Yes. The plugin declares HPOS compatibility on load.<\/p><\/dd>\n<dt id=\"does%20the%20plugin%20work%20without%20woocommerce%3F\"><h3>Does the plugin work without WooCommerce?<\/h3><\/dt>\n<dd><p>Yes. The form, shortcode, withdrawal request log, email notifications, SHA-256 receipt hash and native GDPR integration all run as a standalone tool, with their own top-level <strong>Withdrawals<\/strong> menu in the admin and a <strong>Settings<\/strong> submenu. The plugin layers extra features on top automatically when WooCommerce is active: order\/email validation with the 14-day deadline, \"My Account\" withdrawal endpoint, withdrawal notice injected into transactional emails, \"Withdrawal\" column in the orders screen, private order notes on every status change, and Article 16 exclusions by product\/category. Activating WooCommerce later lights those features up; deactivating it leaves the standalone features intact.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20plugins%20that%20change%20the%20woocommerce%20order%20number%20%28sequential%20order%20numbers%2C%20custom%20order%20numbers%2C%20etc.%29%3F\"><h3>Does it work with plugins that change the WooCommerce order number (Sequential Order Numbers, Custom Order Numbers, etc.)?<\/h3><\/dt>\n<dd><p>Yes. The form accepts both the internal WooCommerce order ID and the displayed order number. The resolver looks up the customer-facing number in the standard <code>_order_number<\/code> post meta, which covers WooCommerce Sequential Order Numbers (free and Pro), Custom Order Numbers for WooCommerce (WPFactory) and any plugin that follows the same convention. For plugins that store the number elsewhere or compute it on the fly (e.g. YITH Sequential Order Number, custom integrations), use the <code>ayudawp_euw_pre_resolve_wc_order<\/code> filter to provide your own resolver.<\/p><\/dd>\n<dt id=\"will%20the%20notice%20appear%20on%20every%20woocommerce%20email%3F\"><h3>Will the notice appear on every WooCommerce email?<\/h3><\/dt>\n<dd><p>No. By default the notice is only added to the customer-facing emails relevant to the withdrawal window: order processing, completed and customer invoice (the manually triggered one). Admin emails never receive the notice. The notice is also gated by the configured list of eligible order statuses (default: Processing and Completed) so the manual invoice email only carries it when the order is in one of those statuses. You can change the email list with the <code>ayudawp_euw_email_ids<\/code> filter and the status list under <strong>WooCommerce \u2192 EU Withdrawal \u2192 Eligible order statuses<\/strong> or with the <code>ayudawp_euw_allowed_statuses<\/code> filter.<\/p><\/dd>\n<dt id=\"in%20which%20languages%20is%20the%20plugin%20available%3F\"><h3>In which languages is the plugin available?<\/h3><\/dt>\n<dd><p>All strings are translation-ready. Translations are managed through the official WordPress.org platform at <a href=\"https:\/\/translate.wordpress.org\/projects\/wp-plugins\/eu-withdrawal-compliance\/\">translate.wordpress.org<\/a>, so any locale with enough translated strings is delivered automatically to your site when the WordPress site language matches. Contributions to existing or new locales are welcome there.<\/p><\/dd>\n<dt id=\"does%20the%20plugin%20pass%20gdpr%20requirements%3F\"><h3>Does the plugin pass GDPR requirements?<\/h3><\/dt>\n<dd><p>The plugin asks for explicit privacy policy acceptance before submission and stores the visitor IP and user agent only for the purpose of legal traceability of the request. See the <strong>Privacy<\/strong> section above for the full list of stored fields. From version 1.4.0 the plugin also integrates natively with the WordPress GDPR tools: a suggested Privacy Policy snippet appears in <strong>Settings \u2192 Privacy \u2192 Policy Guide<\/strong>, and withdrawal data is exposed to <strong>Tools \u2192 Export Personal Data<\/strong> and <strong>Tools \u2192 Erase Personal Data<\/strong> so admins can fulfil access and erasure requests without leaving the WordPress admin.<\/p><\/dd>\n<dt id=\"what%20happens%20if%20the%20customer%20deletes%20their%20wordpress%20user%20account%3F\"><h3>What happens if the customer deletes their WordPress user account?<\/h3><\/dt>\n<dd><p>The withdrawal log is independent of the WordPress user table \u2014 it lives as a private custom post type indexed by the customer email. Deleting the user account does not delete the log automatically; the customer must request erasure through <strong>Tools \u2192 Erase Personal Data<\/strong> (where the plugin registers an eraser that removes every withdrawal request matching the customer email) or you can delete the corresponding <code>ayudawp_withdrawal<\/code> entries manually if your retention policy requires it.<\/p><\/dd>\n<dt id=\"can%20i%20customise%20the%20email%20subjects%20and%20bodies%3F\"><h3>Can I customise the email subjects and bodies?<\/h3><\/dt>\n<dd><p>Currently the emails are sent in plain text and their copy is translatable through the standard WordPress text-domain. HTML email templates that respect the WooCommerce email theme are planned for a later release. For now, advanced customisation requires hooking into the wp_mail filters.<\/p><\/dd>\n<dt id=\"which%20hooks%20does%20the%20plugin%20expose%20for%20developers%3F\"><h3>Which hooks does the plugin expose for developers?<\/h3><\/dt>\n<dd><p>Filters:<\/p>\n\n<ul>\n<li><code>ayudawp_euw_grace_days<\/code> \u2014 extra days added to the 14-day deadline. The default is the value stored in settings; the filter receives that value, so returning <code>$days + N<\/code> adds on top of it.<\/li>\n<li><code>ayudawp_euw_skip_deadline_check<\/code> \u2014 return <code>true<\/code> to disable the deadline check entirely. Receives the WC_Order as second argument.<\/li>\n<li><code>ayudawp_euw_email_ids<\/code> \u2014 array of WooCommerce email IDs where the withdrawal notice is injected.<\/li>\n<li><code>ayudawp_euw_allowed_statuses<\/code> \u2014 array of order statuses (without the <code>wc-<\/code> prefix) for which the withdrawal button and email notice are offered. Receives the value stored in settings and the current <code>WC_Order<\/code> (when available).<\/li>\n<li><code>ayudawp_euw_allow_unverified_order<\/code> \u2014 return <code>true<\/code> to accept submissions whose order number cannot be matched against a real WooCommerce order. Useful for sites that also handle non-WC purchases.<\/li>\n<li><code>ayudawp_euw_pre_resolve_wc_order<\/code> \u2014 short-circuit the order resolver. Return a <code>WC_Order<\/code> instance to accept, <code>false<\/code> to reject, or <code>null<\/code> (default) to fall through to the built-in strategies. Useful for plugins that store the displayed order number outside the standard <code>_order_number<\/code> post meta (e.g. YITH Sequential Order Number, custom ERP integrations).<\/li>\n<li><code>ayudawp_euw_resolve_wc_order<\/code> \u2014 late filter that receives the resolved <code>WC_Order<\/code> (or <code>false<\/code>) and the raw reference, for auditing or last-chance overrides.<\/li>\n<\/ul>\n\n<p>Actions:<\/p>\n\n<ul>\n<li><code>ayudawp_euw_after_submission<\/code> \u2014 fires after a withdrawal request has been processed. Arguments: CPT ID, submission data array.<\/li>\n<li><code>ayudawp_euw_after_status_change<\/code> \u2014 fires after a status change (individual or bulk). Arguments: CPT ID, new status, optional admin comment.<\/li>\n<\/ul><\/dd>\n<dt id=\"is%20this%20plugin%20enough%20to%20comply%20with%20eu%20directive%202023%2F2673%3F\"><h3>Is this plugin enough to comply with EU Directive 2023\/2673?<\/h3><\/dt>\n<dd><p>Yes. The plugin implements every functional requirement that Directive 2023\/2673 imposes EU-wide from 19 June 2026: a discoverable digital withdrawal function, deadline validation, Article 16 exclusions with subcategory inheritance and durable-medium proof of the request via the SHA-256 receipt hash. On top of that it adds operational tools that the directive does not mandate but that make handling requests practical: per-status email injection, status lifecycle with bulk actions, native GDPR integration and full traceability. Member States can layer extra national requirements on top of the EU baseline \u2014 the strictest known so far (Germany) requires a two-step confirmation flow with an intermediate review page, which is not yet implemented because the Spanish transposition is still pending. A future release will adapt to the final Spanish Real Decreto once published.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.4.1<\/h4>\n\n<ul>\n<li>Fix: removed <code>Requires Plugins: woocommerce<\/code> from the plugin header. The plugin has always been designed to run as a standalone tool (its own top-level <strong>Withdrawals<\/strong> menu and <strong>Settings<\/strong> submenu activate automatically when WooCommerce is not present), but the header was blocking activation on sites without WooCommerce. Stores that don't use WooCommerce can now use the public form, shortcode, request log, email notifications, SHA-256 receipt hash and native GDPR integration as a standalone solution. WooCommerce-specific features (order validation, My Account endpoint, transactional email injection, order notes, Article 16 exclusions) still light up automatically when WooCommerce is active.<\/li>\n<li>Tweak: reworded the plugin description and FAQ to make the standalone mode explicit.<\/li>\n<\/ul>\n\n<h4>1.4.0<\/h4>\n\n<ul>\n<li>New: native integration with the WordPress GDPR tools. The plugin contributes a suggested Privacy Policy snippet (visible in <strong>Settings \u2192 Privacy \u2192 Policy Guide<\/strong>) and registers a personal data exporter and eraser, so admins can answer access and erasure requests for withdrawal data from <strong>Tools \u2192 Export Personal Data<\/strong> and <strong>Tools \u2192 Erase Personal Data<\/strong> without leaving WordPress. The exporter and eraser match by customer email and cover every meta field stored alongside the request (name, order reference, IP, user-agent, scope, submission timestamp, receipt hash and free-text details).<\/li>\n<li>New: declares <code>Requires Plugins: woocommerce<\/code> in the plugin header so WordPress can prompt users to install or activate WooCommerce before activating the plugin.<\/li>\n<\/ul>\n\n<p>For older changelog entries, please check the <a href=\"https:\/\/plugins.svn.wordpress.org\/eu-withdrawal-compliance\/trunk\/changelog.txt\">changelog.txt<\/a> file<\/p>","raw_excerpt":"Adds the EU online withdrawal function required by Directive (EU) 2023\/2673, applicable from June 19, 2026.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/es.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/312715","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/es.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/es.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/es.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=312715"}],"author":[{"embeddable":true,"href":"https:\/\/es.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/fernandot"}],"wp:attachment":[{"href":"https:\/\/es.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=312715"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/es.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=312715"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/es.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=312715"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/es.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=312715"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/es.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=312715"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/es.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=312715"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}