EU Withdrawal Button for WooCommerce — Octoplug
Directive (EU) 2023/2673 requires online stores selling to EU consumers to offer a clearly visible withdrawal function — a «withdrawal button» — so customers can withdraw from a contract as easily as they entered it. Octoplug adds that function to WooCommerce, end to end.
Also known across the EU as: pulsante di recesso / recesso digitale (art. 54-bis Codice del Consumo) in Italy, Widerrufsbutton / Widerrufsfunktion in Germany and Austria, bouton de rétractation in France, botón de desistimiento in Spain, przycisk odstąpienia od umowy in Poland. Whatever your market calls it, this plugin implements it.
What it does
- Adds a «Withdraw from contract here» button (or link) to the customer’s account area: on the order page and, optionally, as an action in the order list.
- Optional footer link on every page and a dedicated withdrawal page you can place anywhere with the
octoplug/withdrawalblock or the[opwb_withdrawal]shortcode — the page is created for you. - Two-step flow: the customer reviews the order, can select specific items and add an optional note (no reason required), then confirms. Works without JavaScript.
- Durable receipt: after confirming, the customer receives a confirmation email with the exact date and time of the withdrawal (site timezone plus UTC) and a SHA-256 integrity fingerprint — the proof the Directive requires. Delivery failures are logged and surfaced, never silent.
- Guest-friendly: customers without an account can find their order with the order number and billing email. The lookup is POST-only, rate-limited, honeypot-protected and always answers generically — no personal data leaks.
- Request queue under WooCommerce: statuses (New, In progress, Completed, Rejected, Cancelled by customer), filters, bulk actions, request detail with timeline, CSV export (injection-safe). A rejection always requires a note, which is sent to the customer.
- Lifecycle emails to the customer (completed, rejected, cancelled) and notifications to the store, in the language of the order (WPML and Polylang aware).
- Withdrawal window handling: 14 days minimum (configurable upwards), anchored to delivery/completion or order date, end-of-day deadlines, grace buffer. You decide what happens afterwards, with three modes:
- Refuse late requests (the default): past the deadline nothing can be submitted online. The customer is not left in front of a page that lost its button — a notice states when the period ended and invites them to write to your contact address.
- Hide the button but accept late requests: the button disappears, as you asked, and the notice says when the period ended — followed by a discreet link for the customer who wants to send the request anyway. It is registered with its date and flagged «out of window» for your review, which is exactly what the setting promises.
- Keep it visible and accept late requests: the button stays, above a banner saying the deadline appears to have passed and that the store will review the request. In no mode does the plugin tell a customer that the right of withdrawal is gone: when the consumer was not informed of that right the period extends to twelve months, and only you can judge the case. Requests accepted after the deadline are registered inside a configurable cut-off and flagged «out of window» for your review.
- Late attempts counter on the dashboard: how many orders reached the withdrawal function after the deadline in the last 30 days, counted once a day each. They are not requests and nothing lands in your queue — it is an early warning that deliveries or your pre-contractual information may need a look. The counter is a plain daily total: it stores no order number, no name and no IP address.
- Optional WooCommerce order statuses «Withdrawal requested» / «Withdrawal completed» with automatic revert.
- Simple exclusions: flag single products, whole categories or product types (virtual/downloadable) as exempt; flagged requests are marked for your review — never auto-rejected. Optional exemption note on the product page.
- Legal wording packs in English, Italian, German, French, Spanish and Polish: button label, confirmation texts, receipt template, suggested Terms & Conditions snippet — all editable.
- Setup wizard (5 minutes) and a compliance checklist that shows exactly what still needs attention.
- GDPR tools: integration with the WordPress personal data exporter/eraser (requests are anonymized, not destroyed — they are legal evidence) and an optional retention policy.
What it does NOT do
- It does not rewrite your Terms & Conditions (it suggests a snippet you can copy).
- It does not process refunds automatically — you stay in control in WooCommerce.
- It is a compliance tool, not legal advice. For specific legal questions, consult a qualified professional.
Privacy & transparency
- No external calls, no tracking, no accounts: everything runs on your site and your data never leaves it.
- Data stored per request: customer name and billing email, optional note, IP address (full, truncated or omitted — your choice), timestamps (GMT), order reference, receipt fingerprint. Stored in a dedicated table on your database.
- Uninstall is conservative by default: your withdrawal records are kept unless you explicitly enable «Delete all data on uninstall».
Multisite: network activation installs on existing sites; sites created afterwards need the plugin activated individually (planned for a future release). Uninstall cleans the current site only.
Translations
- The customer-facing legal wording (button label, confirmation page, receipt email, T&C snippet) ships in English, Italian, German, French, Spanish and Polish and always follows the language of the order — independent of the interface translation.
- The plugin interface is fully internationalized and translated through translate.wordpress.org, so WordPress installs and updates the language packs on its own. Italian, German, French and Spanish are contributed there by the author; any other language is open to the community.
