xpay✦ Commerce
Directory
WooCommerce plugins
APG Withdrawal for WooCommerce
APG Withdrawal for WooCommerce
Add to WooCommerce an online withdrawal workflow with customer form, My Account integration and admin request log.
5.0
(1 ratings)Will this break my store?
What the WordPress.org registry says about keeping APG Withdrawal for WooCommerce running.
Tested to 7.1
Tested against the WordPress branch in use today.1 month ago
7.4
Your host must be running at least this version.6.0
woocommerce
These must be installed and active first.1
A single maintainer. Worth knowing if the plugin is load-bearing for your store.Maintenance & trust
Scored on how APG Withdrawal for WooCommerce is looked after — not on how many stores run it.
Maintenance
35 / 35WordPress compatibility
20 / 20Support responsiveness
Not enough dataMerchant satisfaction
10 / 15Listing transparency
10 / 10Ratings
5.0
1 ratingAPG 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 configurable selector chooses when to display it — never, only on virtual products (or per-product
_apg_withdrawal_type = digital), on every order, or on selected categories and/or selected products. The customer’s choice is persisted to order meta 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/v1to 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).
- 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.xmland 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.
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/
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).
Yes. The plugin is fully compatible with WooCommerce High-Performance Order Storage.
Yes. The form supports both logged-in customers (with pre-filled data and order selector) and guests (with email lookup of their orders).
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 optionallabel,classandtargetattributes, 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).
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.
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.
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.
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.
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.
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.
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.
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.
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.
Categories
Plugin details
Tags on WordPress.org
