APG Withdrawal for WooCommerce adds to your WooCommerce store a complete online right of withdrawal workflow compliant with EU consumer protection legislation. Features Customer withdrawal form via the [apg_withdrawal_form] shortcode. Partial withdrawal down to the unit: the customer ticks the order
PricingFree downloadThe WordPress.org download is free. Pro versions, add-ons or external services may cost extra.
CompatibilityRequires WordPress 6.0 and PHP 7.4.
SourceWordPress plugins · Nov 8, 2026
01 / Source details
Aboutthistool.
APG Withdrawal for WooCommerce adds to your WooCommerce store a complete online right of withdrawal workflow compliant with EU consumer protection legislation.
Features
Customer withdrawal form via the [apg_withdrawal_form] shortcode.
Partial withdrawal down to the unit: the customer ticks the order lines and adjusts how many units of each one they are withdrawing from.
Configurable withdrawal window (days) and deadline source (completed or created date).
Optional extra grace days on top of the standard withdrawal window.
Active request detection: hides the withdrawal button if a request is already open for the order.
Optional digital-content waiver checkbox at checkout (both classic shortcode and block-based checkout): a single excluding selector chooses when to display it — never, on products classified as digital content, or on every order. Which products count is decided exclusively by the per-product / per-category “Withdrawal type”, never by whether the product is virtual or downloadable : the product’s own type is read first and, when it keeps the default allowed , it is inherited from its categories with the most restrictive one winning. The customer’s choice is persisted to order meta as a structured log — the exact label shown, UTC timestamp, IP, user agent and checkout type — as legal evidence.
Admin request log with full request details (custom post type), status views with counts, bulk status changes and sortable status column.
Own WooCommerce order status Withdrawal requested , optionally applied to the order as soon as a declaration is received, so affected orders can be filtered, sorted and bulk-edited with the native tools.
Optional refund account (IBAN) validated with the international control digits (ISO 7064 MOD-97-10).
Optional double opt-in for guests: the request is held until the customer opens a single-use link sent to the email address on the order, while keeping the date and time of the original submission.
Jurisdiction setting (EU baseline / Spain) that governs the statutory reference shown to the customer.
REST API under apg-withdrawal/v1 to list, read, create and progress requests from headless storefronts and back-office integrations.
IP address and browser identifier storage options for legal evidence.
Email notification to the store admin on every new request.
Automatic customer acknowledgement email on submission.
Customer status update emails when the request is accepted, rejected or completed.
Automation: updates the withdrawal request status automatically when the linked WooCommerce order changes status.
My Account integration: customers can view their withdrawal request history.
CSV export of withdrawal requests, honouring the status currently selected in the list, with protection against spreadsheet formula injection.
100% compatible with HPOS (High-Performance Order Storage).
Warning when WooCommerce 11.1’s own order withdrawal feature is switched on at the same time, so the shop never offers customers two unconnected forms.
Public form built to WCAG 2.1 AA — the level EN 301 549 requires today — with the WCAG 2.2 target-size criterion already met: grouped and labelled controls, live regions for dynamic notices and focus moved to each new step.
One-click WooCommerce refund built from the request: the declared lines and quantities, capped by whatever is still refundable on the order. Always started by hand, never automatically. Works with Redsys and Bizum out of the box.
WPML and Polylang ready, both through wpml-config.xml and through runtime string registration.
Translations
English: by Art Project Group (default language).
Spanish: by Art Project Group .
More information
You can learn more about APG Withdrawal for WooCommerce on our official website , and follow the development on GitHub .
You can also read the full documentation , with every setting explained one by one.
Thanks
Thanks to everyone who uses the plugin, helps improve it, makes a donation or encourages us with their comments.
If you find this plugin useful, you can support its development with a small donation .
External Services
This plugin connects to the WordPress.org Plugins API to fetch information about the plugin (such as the rating). It sends the plugin slug when requesting data. More information: https://wordpress.org/about/privacy/
See it in action
Screenshots & previews.
Plugin settings page with general options, automation rules and customer email notifications.Customer withdrawal form on the public page (guest checkout).Withdrawal form integrated in the My Account area with order selector.My Account orders list with the Withdrawal request action per order.Admin withdrawals list with status, scope and order reference.Edit withdrawal screen with full request details and status history.
02 / Source details
Gettingstarted.
01Install the plugin in one of the following ways: Upload the apg-withdrawal-for-woocommerce folder to the /wp-content/plugins/ directory via FTP.
02Upload the full ZIP file via Plugins -> Add New -> Upload in the WordPress administration panel.
03Search for APG Withdrawal for WooCommerce in Plugins -> Add New and click Install Now .
04Activate the plugin through the Plugins menu in the WordPress administration panel.
05Configure the plugin in WooCommerce -> Withdrawal or through the Settings link on the plugins page.
06Add the [apg_withdrawal_form] shortcode to the page configured as the withdrawal page in the settings.
03 / Source details
Frequently asked questions.
How do I configure the plugin?
In the plugin settings you can configure the notification email, the withdrawal page, the withdrawal window in days, the deadline source (completed or created date), the extra grace days and which data to store (IP address, browser identifier).
Is the plugin compatible with HPOS?
Yes. The plugin is fully compatible with WooCommerce High-Performance Order Storage.
WooCommerce 11.1 has its own withdrawal feature. Can I use both?
You can, but you should not. WooCommerce 11.1 added Order withdrawal under WooCommerce → Settings → Advanced → Features, off by default. With both running, your customers reach two different forms at two different addresses, each keeping its own record and sending its own acknowledgement, and neither knows about the other: the same declaration can be registered twice and answered twice. The plugin detects the core feature and warns you, with a link to the screen where you turn it off.
The core feature covers the basics: a form, a review step, acknowledgement emails, matching to the order and a note on it. This plugin adds what a shop needs around that — withdrawal type per product and per category with inheritance and the exclusion notice on the product page, the Article 16(m) digital-content waiver at checkout with its structured log, the printable Annex I.B model form, the SHA-256 receipt hash for the burden of proof of Article 16a(8), the WooCommerce refund panel driven by the declared lines, the GDPR exporter, eraser and anonymisation, and the REST API. Pick one of the two and turn the other off.
Can guest customers submit a withdrawal request?
Yes. A logged-in customer gets their data pre-filled and picks from a dropdown of their own orders. A guest types the order number and the email address recorded on the order, which is the pair the plugin validates before accepting any declaration — the same proof WooCommerce asks for in its own order tracking. The plugin never lists a customer’s orders to a visitor who has only supplied an email address.
Where should I place the withdrawal link?
The withdrawal form page is auto-created on activation and contains the [apg_withdrawal_form] shortcode. To comply with Article 11a of Directive 2011/83/EU (added by Directive 2023/2673), the link to that page should be prominently visible and easy to find on the storefront. The plugin gives you several tools to place it; deciding where to place it is the merchant’s (or their web designer’s) responsibility:
The fixed URL of the auto-created page, available in WooCommerce → Withdrawal → Withdrawal page .
The [apg_withdrawal_link] shortcode, with optional label , class and target attributes, to drop the link inside any post, page, footer widget or HTML block.
The matching Withdrawal link Gutenberg block for sites built with the Full Site Editor.
The Withdrawal request action that is automatically added to every eligible order in the My Account → Orders table.
Typical recommended placements:
The site footer, so the link is reachable from any page.
The My Account menu (the per-order action is already added; you can also add a top-level menu item linking to the public form).
The Terms and Conditions / Privacy Policy pages, alongside the rest of the consumer information required by Article 6.1.h of Directive 2011/83/EU.
The order processing / completed emails (the plugin already injects the link there automatically via woocommerce_email_after_order_table , except on orders whose products are all excluded from the right of withdrawal).
What happens if my store does not offer the withdrawal function?
Article 11a of Directive 2011/83/EU has applied throughout the EU since 19 June 2026, regardless of whether each Member State has transposed it. Spain had not done so at the time of this release — the European Commission issued a reasoned opinion against Spain in June 2026 — but the obligation applies by direct effect, and non-compliance is penalised through the general regime of the TRLGDCU, whose fines reach 100,000 € for minor infringements, 1,000,000 € for serious ones and 4,000,000 € (or 4% of the turnover in Spain, whichever is higher) for very serious ones. Check the regime applicable in your own country: this note is informative and is not legal advice.
Can I ask the customer for a bank account?
Yes, in WooCommerce → Withdrawal → Request handling → Account for the refund (IBAN) , either as an optional or as a required field. It is disabled by default. The number is validated with the international control digits (ISO 7064 MOD-97-10) before being accepted, is stored alongside the request, is included in the privacy exporter and is deleted outright by the privacy eraser. Only enable it when you genuinely cannot refund through the original payment method.
How do I stop somebody else from submitting a withdrawal in a customer’s name?
Enable Confirm guest requests by email? . A visitor who is not logged in then has their request held while a single-use link is sent to the address recorded on the order; only opening it registers the declaration. The request keeps the date and time of the original submission, so the customer never loses days of their withdrawal period. Logged-in customers are unaffected, since WordPress has already authenticated them.
Is the plugin accessible? Does it help with the European Accessibility Act?
The public form targets WCAG 2.1 level AA , which is what EN 301 549 — the standard the European Accessibility Act points to — requires today: the line-item selector is a labelled fieldset of native checkboxes and number inputs operable with a keyboard, dynamic notices are live regions, and focus moves to each new step of the flow. It also already satisfies the WCAG 2.2 target-size criterion (2.5.8), which arrives with version 4.1.1 of that standard, and the guest confirmation link is the pattern WCAG 2.2 recommends for accessible authentication (3.3.8), since it asks the customer for no cognitive test.
Two caveats. First, the Accessibility Act (Directive (EU) 2019/882, in Spain Law 11/2023) has applied to e-commerce since 28 June 2025 , and it binds the shop , not a single plugin: colour contrast, focus visibility and page structure come from your theme, and the responsibility for the store as a whole is the merchant’s. Second, companies with fewer than 10 employees and a turnover below 2 million euros are exempt from the obligations on services. Check your own situation: this note is informative and is not legal advice.
Can I refund the customer from the withdrawal request?
Yes. Each request shows a Refund panel with the amount the declaration implies — the declared lines at their declared quantities, plus the standard delivery cost when the withdrawal covers the whole contract, as Article 13(1) of Directive 2011/83/EU requires — always capped by whatever is still refundable on the order, so a refund you already issued by hand is never handed out twice. Nothing happens until you press the button. By default the refund is only recorded in WooCommerce, without moving money or touching stock; two checkboxes let you send it through the payment gateway (when the gateway supports it) and restock the returned products. The apg_withdrawal_refund_plan filter lets you adjust the figures, for instance to deduct the diminished value of returned goods.
Does it work with Redsys and Bizum?
Yes, and nothing extra needs installing. Bizum runs on Redsys for e-commerce, and the WooCommerce implementations of Redsys — José Conti’s paid gateway, Codection’s, the official unified module — issue refunds through the standard WooCommerce refund API. The refund panel uses that same API, so ticking Send the money back through Redsys reaches your virtual POS directly. The panel names the gateway it is about to use, so you always know where the money is going.
Three things worth knowing. Redsys accepts both full and partial refunds , so a partial withdrawal is returned as declared. When the customer sees the money depends on their bank , typically between 2 and 31 days — the 14-day limit in Article 13(1) of Directive 2011/83/EU applies to you issuing the refund, not to their bank crediting it. And if you use a Redsys gateway that does not implement refunds, such as the free Light edition, the panel says so and records the refund in WooCommerce without moving money, so you can issue it from your bank’s back office and keep the accounting straight.
When a gateway rejects a refund, the reason it gives — the SIS code, in the case of Redsys — is shown in the error notice instead of a generic failure, so you have something to act on.
Does the plugin have a REST API?
Yes, under the apg-withdrawal/v1 namespace. GET /requests and GET /requests/<id> list and read requests, and PUT /requests/<id> moves one through the workflow; all three require the manage_woocommerce capability. POST /requests registers a declaration coming from a headless storefront and is public, exactly like the public form: it goes through the same processor, so the order must match the email address, the rate limiter applies and the guest email verification kicks in when you enabled it.
How long should I keep the withdrawal request records?
The plugin does not delete withdrawal request records automatically. As a general recommendation, keep them for at least 5 years after their creation — the typical statute of limitations for consumer and contractual actions in many EU jurisdictions. Always check the applicable retention period in your country before deleting old records or running the plugin’s CSV export + uninstall flow.
Where can I get support?
APG Withdrawal for WooCommerce is a free plugin. Art Project Group does not provide free technical support, but offers a paid technical support service for installation and configuration.
FinderPress Media Auditor helps site administrators scan for broken images, missing Media Library files, unreachable media URLs, and other media issues across WordPress content. Use it to audit images, video, audio, PDFs, featured images, and attachment files without sending scan data to an external
The Accepted Payment Methods plugin is a straightforward, lightweight solution that enhances your website by displaying visually appealing icons of the payment methods you accept. This plugin is ideal for a variety of websites, including e-commerce platforms, service-oriented websites, and informati