Description
From 19 June 2026, EU member states require every consumer-facing online shop to provide an online withdrawal function — not just static information, but a continuously available electronic interface where the consumer can declare intent to withdraw, and from which the shop sends an automatic confirmation on a durable medium. In Hungary the same rule applies through the amendment of Government Decree 45/2014.
Bitron Right of Withdrawal delivers exactly that, accessibly.
What the plugin does
- A continuously available, accessible withdrawal form — embeddable via the
[bitrow_form]shortcode or the Withdrawal Form Gutenberg block, so it drops into any classic-editor page, a block-built layout, or a page builder that handles either. - Tight WooCommerce integration: the form is surfaced to logged-in customers as a Withdrawal item in their My Account menu, but only while they have at least one order still inside the window — so a customer with nothing eligible doesn’t see a dead link.
- A withdrawal link is automatically attached to WooCommerce’s customer order emails (processing, completed, invoice) while the window is open — a discreet text link (not a prominent button) to avoid accidental clicks. Its position in the email (top, after the order details, or bottom — bottom by default) and both the surrounding message text and the link label are configurable under Settings → Email. HTML and plain-text variants, with a filter to extend the list of carrier emails.
- Guest and logged-in customer paths. A logged-in customer sees a select of their own in-window orders. For guests, optional email verification: with the free OneCode Login plugin active, the guest proves they own their email with a one-time code, and the form then loads that email’s orders just like for a logged-in customer — closing the gap where anyone who knew an order number and the billing email could file on someone else’s behalf. When email verification is not in force, an unverified guest is never shown any order data: instead of looking up an order, they file a free-text withdrawal declaration (no order is matched server-side, no line items or totals are disclosed), which is recorded flagged as unverified for the shop to match by hand. Order data is therefore only ever shown to logged-in or email-verified customers.
- Item-level partial withdrawal. After the customer picks an order, they tick exactly which line items (and quantities) they want to withdraw from — the form is not all-or-nothing.
- Bank-account capture for non-card payments. When the original gateway can’t refund automatically (e.g. cash on delivery, bank transfer), the customer enters a Hungarian IBAN or domestic GIRO account number — validated client- and server-side with MOD-97 / CDV checks — so the shop has everything to wire the refund manually.
- Customizable form copy and brand colors. An optional intro paragraph above the form and the submit-button colors (background + text) are configurable from Settings → Form, with a live WCAG contrast meter that announces the ratio as you type so a custom brand color cannot quietly drop below AA. An “advanced” panel additionally exposes the form body text, wrapper background, and input/fieldset border colors for themes that need the form to blend in — these three are not contrast-checked and carry an explicit “you own the contrast” warning. The same values can be overridden per-instance through
[bitrow_form]shortcode attributes or the block’s Inspector panel. - Automatic confirmation email to the customer (durable medium) and notification to the shop admin, with editable subject and body templates for both — empty fields fall back to safe i18n defaults so the plugin is functional out of the box. The admin notification recipient is a configurable email address (defaults to the site administration email); leave it empty to switch admin notifications off.
- Optional business-customer exclusion: because the right of withdrawal is a consumer right, shops that also sell to VAT-registered businesses can switch the online form off for orders carrying a business marker (e.g. a VAT-number checkout field). Business buyers are shown a contact pointer instead; consumer orders are unaffected. It’s a technical filter, not legal advice.
- Per-product and per-category withdrawal exemptions for the CRD §16 / 45-2014 §29 carve-outs (perishables, custom-made, sealed digital downloads, etc.). The withdrawal form still shows exempted items inside an eligible order so the customer sees what they bought, but the quantity input is locked at zero with a visible “Not eligible for withdrawal” badge; orders that consist entirely of exempt items are blocked at step 1 with a contact pointer. A separate Settings → Exclusions tab manages the lists with searchable autocompletes.
- Exclusion type split — excluded by law vs waivable. The exclusion settings separate two legally distinct cases: “excluded by law” items (perishables, custom-made, opened sealed goods) where the right never applies and no customer action is involved, and “waivable” items where the right exists but the customer can expressly give it up. Each case has its own product and category pickers; existing exclusions keep behaving as “by law”.
- Checkout withdrawal waiver. For waivable goods (typically digital content), the shop can show a consent checkbox at checkout through which the customer expressly waives the right of withdrawal for the affected items. It appears only when the cart actually contains a waivable item, works on both the classic shortcode checkout and the block-based (Store API) checkout, can be optional or mandatory, and records the consent on the order as evidence (timestamp, IP, a fingerprint of the statement text, the covered products and the mode). Off by default; enable and word it under Settings → Exclusions.
- “Withdrawals” hub in the customer’s My Account area — a single durable, log-in-gated landing page for everything withdrawal-related: a one-click button to start a new declaration (when the form page is configured), plus the full list of past declarations submitted from the account (reference number, date, order link, items, refund preference, status). The menu item appears only when the customer has at least one past record OR an order still inside the withdrawal window; the list itself is privacy-scoped to the customer’s own account email and never reveals records filed under a different email.
- Minimal record-keeping with unique
BITROW-XXXXXXreferences for evidentiary value, plus a per-record detail page in the admin. - Admin can mark a record as closed (and reopen it) once the case is resolved, with timestamp and the closing user recorded — keeps the working list focused on what’s still pending.
- Withdrawal status on the order screen. When an order has an associated withdrawal, the WooCommerce order-edit screen shows a “Right of withdrawal” panel with the withdrawal’s status and a direct link to its record.
- Optional withdrawal column on the orders list. A Settings → General switch (off by default) adds a column to the WooCommerce orders list flagging which orders have a withdrawal and its status (a dash when none). HPOS- and legacy-orders compatible.
- WCAG 2.1 AA accessibility throughout — programmatic labels, focus management, live regions, sufficient contrast.
- GDPR integration with WordPress’ personal data export and erase tools, plus a suggested paragraph for the Privacy Policy Guide.
Compatibility
The plugin integrates with WooCommerce orders. It declares HPOS (High-Performance Order Storage) compatibility and uses the WooCommerce CRUD API throughout. WooCommerce is referenced for compatibility only — the trademark is not used in the plugin name or slug.
Important — what this plugin does NOT do
This is a technical tool, not legal advice, and does not by itself guarantee legal compliance. The plugin does not generate Terms of Service text, privacy-policy text, or other legal content — those must be prepared by your own lawyer. The confirmation email contains only a factual acknowledgement (received, when, with which ID, what content); any “what happens next” wording is the shop operator’s own policy and must come from you.
The plugin records each withdrawal and notifies you, but it does not issue refunds automatically. Refunds remain a deliberate admin action through WooCommerce’s standard refund interface.
Privacy
The plugin stores only what is necessary to acknowledge and document the withdrawal: name, email, order reference, optional note, timestamps and a unique identifier. No IP address is stored in plain text. On plugin removal the stored records are kept by default (so an accidental deactivation cannot destroy evidence); a setting lets you opt in to deletion at uninstall.
Pro version
The free plugin covers the full legal compliance core on its own. Bitron Right of Withdrawal Pro adds a convenience and automation layer on top, for shops that process withdrawals regularly:
- One-click WooCommerce refund — issue the refund straight from the withdrawal record, instead of re-entering it by hand in WooCommerce.
- Status management and history — a richer status workflow (received, in progress, goods returned, refunded, rejected) with a full audit trail of who changed what and when.
- Automation rules — define rules that act on incoming withdrawals automatically (status transitions, notifications), so routine cases handle themselves.
- Custom form fields — add your own fields to the withdrawal form and store them on the record.
- Searchable admin + CSV export — find any declaration fast and export the list for accounting or reporting.
- Webhooks — push withdrawal events to your CRM, ERP or any external system in real time.
- REST API — read and manage withdrawal records programmatically from your own integrations.
The Pro plugin is standalone: it contains the full compliance core plus the convenience layer, so you install it instead of the free plugin, not alongside it. Pro adds convenience, not extra compliance — the free plugin already makes you compliant.
Screenshots
BITROW-XXXXXX reference, the linked order, and the customer’s refund preference.→ General — withdrawal window length, admin notification, and opt-in record deletion at uninstall.” class=”wp-image-9000003″ srcset=”https://i0.wp.com/ps.w.org/bitron-right-of-withdrawal/assets/screenshot-3.jpg?rev=3557967&w=300 300w, https://i0.wp.com/ps.w.org/bitron-right-of-withdrawal/assets/screenshot-3.jpg?rev=3557967&w=600 600w, https://i0.wp.com/ps.w.org/bitron-right-of-withdrawal/assets/screenshot-3.jpg?rev=3557967&w=900 900w” sizes=”(max-width: 599px) 50vw, 33vw” width=”1450″ height=”822″ loading=”eager” fetchpriority=”high” decoding=”async”/>
→ Form — optional intro paragraph and brand colors for the submit button, with a live WCAG contrast meter so a custom brand color cannot quietly drop below AA.” class=”wp-image-9000004″ srcset=”https://i0.wp.com/ps.w.org/bitron-right-of-withdrawal/assets/screenshot-4.jpg?rev=3557967&w=300 300w, https://i0.wp.com/ps.w.org/bitron-right-of-withdrawal/assets/screenshot-4.jpg?rev=3557967&w=600 600w, https://i0.wp.com/ps.w.org/bitron-right-of-withdrawal/assets/screenshot-4.jpg?rev=3557967&w=900 900w” sizes=”(max-width: 599px) 50vw, 33vw” width=”1437″ height=”806″ loading=”eager” fetchpriority=”high” decoding=”async”/>
Blocks
This plugin provides 1 block.
- Withdrawal Form Accessible withdrawal form for consumer orders. Same output as the [bitrow_form] shortcode.
Installation
- Install the plugin through the Plugins → Add New screen, or upload the plugin folder to
/wp-content/plugins/bitron-right-of-withdrawal/. - Activate the plugin through the Plugins screen in WordPress.
- Create the page that should host the form (for example, “Withdrawal declaration”) and either:
- add the shortcode
[bitrow_form]to the page content, or - insert the Withdrawal Form block in the block editor.
- add the shortcode
- Go to Withdrawals → Settings in the WordPress admin and select that page in the Form page setting. This is what enables the contextual link in WooCommerce’s “My Account” area and in the order confirmation emails.
- Review the other settings on the same screen (withdrawal window length, admin notification, email subject and body) and save.
FAQ
-
Do I still need to put withdrawal information in my Terms of Service?
-
Yes. The plugin provides the technical function; your Terms of Service must still explain the right of withdrawal, exceptions, and refund handling under your shop’s policy. Your legal advisor drafts that text — the plugin does not.
-
What about the privacy policy?
-
The plugin registers a suggested paragraph in the WordPress Privacy Policy Guide describing what data it processes. Your lawyer should integrate that into the shop’s full privacy policy.
-
Can guests verify their identity before filing a withdrawal?
-
Yes, optionally. Install the free OneCode Login plugin and a guest can prove they own their email with a one-time code; the form then loads the orders for that email. When enabled, this is required for guests (it replaces matching a typed email against the order). Without OneCode Login, guests identify an order by entering its number together with the billing email, as before.
-
Does it automatically refund the customer?
-
No. The plugin records the withdrawal and notifies you; refunds remain a deliberate admin action through WooCommerce’s standard refund interface.
-
Is it accessible?
-
Accessibility is the product’s main differentiator. The form is WCAG 2.1 AA — programmatic labels, keyboard operability, visible focus, live regions for status messages, sufficient contrast. The admin list follows the same standard.
-
Where can my customers see the withdrawal declarations they’ve submitted?
-
Under My Account → Withdrawals. The page is a single hub: when you’ve set the withdrawal form page in Settings → Form, it shows a “Submit a new withdrawal declaration” button at the top; below it (or alone if the form page isn’t set) it lists every declaration the logged-in customer has filed under their account email, with the reference number, date, the affected order, the items, the refund preference and the current status. The menu item appears only when the customer has at least one past record OR an order still inside the withdrawal window — accounts that never use the feature don’t see a dead menu link. Records filed under a different email (e.g. with the customer logged out) are not surfaced here for privacy reasons; the customer can still find those via the confirmation email they received at submission time.
-
Can I exclude certain products or categories from the withdrawal form?
-
Yes. Under Settings → Exclusions there are two pickers — one for individual products, one for product categories — backed by searchable autocompletes. The CRD §16 (transposed in Hungary as 45/2014. Korm. r. §29) lists categories of goods where the right of withdrawal does not apply at all: perishables, custom-made items, sealed digital downloads, items inseparably mixed with others, etc. Use the exclusions to mirror that list for your shop.
Excluded items still appear on the withdrawal form so customers see exactly what they bought, but their quantity input is locked at zero and the row is marked with a “Not eligible for withdrawal” badge. If the customer picks an order whose every line item is excluded, the form blocks at step 1 with a “please contact us” pointer rather than presenting a step 2 where everything is greyed out. The server enforces the same rule on submit — a crafted POST that tries to set a positive quantity on an excluded item is rejected with a clear error.
-
Can I switch the withdrawal form off for business (B2B) customers?
-
Yes. The right of withdrawal is a consumer right, so under Settings → Exclusions you can enable “Switch the online form off for business purchases” and choose the checkout field whose presence on an order marks it as a business purchase — typically a VAT-number field. The list of available fields is read live from your checkout, so it reflects whatever fields your theme or other plugins add. Orders that carry a value in that field are blocked at step 1 with a message pointing the buyer to your contact channel; orders without it behave exactly as before. This is a technical filter to match your own policy — it is not legal advice, and you decide which field marks a business buyer.
-
Can I customize the form text, background, and border colors?
-
Yes. Settings → Form has a “Form colours (advanced)” card with three colour pickers (form text, form background, input + fieldset border), and the same three are also available as
text,background,borderattributes on the[bitrow_form]shortcode and as inspector controls on the Withdrawal Form block.These three colours are not contrast-checked — there is no single adjacent surface to validate the body text against, so we cannot give you a meaningful ratio in the admin UI. WCAG 2.1 AA requires at least 4.5:1 for normal text and 3:1 for UI borders; verify any combination you change with an external checker (e.g. WebAIM Contrast Checker). The submit-button pair above is still contrast-checked live as before.
-
Can a guest customer use it, or only logged-in users?
-
Both, but what a guest is shown depends on whether they can prove their identity. A logged-in customer sees a select of their own in-window orders. A guest with email verification active (the free OneCode Login plugin) proves they own their email with a one-time code and then sees that email’s orders the same way. An unverified guest — when email verification is not in force — does not get the two-step order-matching form and is never shown any order data: instead they file a free-text withdrawal declaration in their own words (no order is looked up or matched server-side, no line items or totals are disclosed), recorded flagged “unverified” for the shop to match by hand. The form is never gated behind login.
-
Can I change the 14-day withdrawal window?
-
Yes. Settings → Bitron Right of Withdrawal exposes the window length in days. The default is 14 (the EU minimum); some jurisdictions require longer.
-
Does it work with HPOS (High-Performance Order Storage)?
-
Yes. The plugin declares HPOS compatibility and uses the WooCommerce CRUD API rather than direct post-meta access.
-
Where can I find the recorded withdrawals?
-
Under Withdrawals in the WordPress admin sidebar. Each entry has a unique reference (e.g.
BITROW-XXXXXX) and a timestamp; the list is a simple, paginated view.
Reviews
Contributors & Developers
“Bitron Right of Withdrawal” is open source software. The following people have contributed to this plugin.
Contributors“Bitron Right of Withdrawal” has been translated into 1 locale. Thank you to the translators for their contributions.
Translate “Bitron Right of Withdrawal” into your language.
Interested in development?
Browse the code, check out the SVN repository, or subscribe to the development log by RSS.
Changelog
1.7
- New — the guest email-verification (OTP) texts are now editable in the admin under Settings → Form: the verification prompt shown to unverified guests, the “send verification email” and “confirm code” button labels, and the verification-code help text. Previously these were fixed built-in strings. Leaving a field empty keeps the built-in default.
- New — the guest email-verification step is now visually highlighted as a clear call to action: the prompt sits in an accented callout and its verify/confirm button is a solid, filled button so an unverified guest notices the action they must take. The emphasis never relies on colour alone (left-border surface plus the prompt text and accessible button names), and the button keeps AAA contrast.
- New — the above verification texts are multilingual: they can be translated per language through WPML String Translation or Polylang’s strings screen, like the other admin-entered texts. On single-language sites nothing changes.
1.6
- New — multilingual support (WPML and Polylang): all admin-entered texts (form intro and disclaimer, the submission success message, the notification email subjects and bodies, the order-email withdrawal link label and text) can now be translated per language through WPML String Translation or Polylang’s strings screen, and the form-page link follows the current language. On single-language sites nothing changes.
- New — the submission success message shown after the form is sent can now be edited in the admin under Settings → Form, including a {uid} placeholder for the record’s reference id. Previously it was a fixed built-in text.
- Fix — secondary button hover: the secondary button’s text colour is now pinned on hover, so it no longer turns unreadable (e.g. white-on-white) under themes that restyle button hover states.
- Fix — notification emails are now sent as HTML, so line breaks survive on sites where an SMTP or email-template plugin renders mail as HTML. Previously the text could arrive as one run-on block.
- Fix — the withdrawal form now recognises custom order numbers. When a plugin overrides WooCommerce’s default order number (for example MD0574), the form accepts the displayed number, not only the original numeric ID.
1.5
- Hardening (security) — this change was made to satisfy the WordPress.org plugin security review. Unverified guests now file a free-text withdrawal declaration without any order data being looked up or shown. Order data is disclosed only to logged-in or email-verified customers; a visitor who cannot prove their identity describes their order in their own words, and the resulting declaration is flagged “unverified” in the admin for manual matching before any refund.
- New — checkout withdrawal waiver: for goods where the right of withdrawal can be waived (typically digital content), the shop can now show a consent checkbox at checkout through which the customer expressly waives that right for the affected items. The checkbox appears only when the cart actually contains a waivable item, and works on both the classic shortcode checkout and the block-based (Store API) checkout. It can be set globally to optional or mandatory — mandatory blocks placing the order until the box is ticked. The consent is recorded on the order as evidence (timestamp, IP address, a fingerprint of the exact statement text, the covered products and the mode) and shown in a “Withdrawal waiver” panel on the order-edit screen. Off by default; enable and word it under Settings → Exclusions. For the block-based Checkout, add the “Withdrawal waiver” block to your Checkout page once where you want it to appear.
- New — exclusion type split (excluded by law vs waivable): the withdrawal-exclusion settings now separate two legally distinct cases. “Excluded by law” items (perishables, custom-made goods, opened hygiene/sealed products) are never withdrawable — the right does not apply, no customer action is involved and no checkbox is shown. “Waivable” items are those where the right exists but the customer can give it up with the checkout consent: only these drive the consent checkbox, and such an item stays excluded only when the customer actually consents — without consent the right of withdrawal is retained. Existing exclusions keep behaving as “by law”, so nothing changes for orders that predate this. Each case has its own product and category pickers under Settings → Exclusions.
- New — withdrawal status on the order screen: when an order has an associated withdrawal, the WooCommerce order-edit screen now shows a “Right of withdrawal” panel with the withdrawal’s status and a link straight to its record.
- New — optional withdrawal column on the orders list: a new Settings → General switch (“Show a withdrawal column in the orders table”, off by default) adds a column to the WooCommerce orders list flagging which orders have a withdrawal and its status (a dash when none). HPOS- and legacy-orders compatible.
- Fix — bank account entry: a Hungarian IBAN (starting “HU”) could not be typed into the field — the letters were stripped as you went, so the prefix never took. Typing an IBAN now works character by character (pasting one already worked).
- Improvement — domestic (GIRO) bank account validation is no longer over-strict: it still checks the account format and the bank + branch check digit, but no longer rejects on the account-holder block’s check digit, which is bank-dependent and not present at every bank. Valid accounts issued by some banks (e.g. Raiffeisen, Budapest Bank) that were previously refused are now accepted.
- New — the withdrawal link added to WooCommerce order emails is now a discreet text link instead of a prominent box, to avoid accidental clicks. Its position in the email is configurable (top, after the order details, or bottom — bottom by default), and both the surrounding message text and the link label can be customised under Settings → Email.
- Improvement — withdrawal form, step 2: item quantities now start at 0 and the customer increases them, instead of pre-filling the full purchased quantity. The per-item maximum still applies, and at least one item must be selected to submit.
1.4.1
- Fix — the “order not found” validation message now displays correctly in Hungarian (the message was rewritten in 1.4 and its translation was missing from the shipped language pack, so it fell back to English).
1.4
- Fix — guest (not-logged-in) form completion: the withdrawal form now fills in and submits reliably for visitors who are not logged in, including on shops running a login-hardening layer (rename wp-login.php, hide-wp-admin, a firewall) that could previously break the guest two-step submission. Where 1.3.2 only diagnosed an intercepted submit, the guest path now completes.
- New — Pro version visibility: administrators can clearly see that a Pro version exists and, when the Pro plugin is installed, which Pro version is active. The free-only upsell never appears once Pro is present.
- Fix — double-submission guard: a duplicated or retried submission (double click, network retry) can no longer create two withdrawal records or send two confirmation emails for the same declaration. The legitimate partial / repeat-withdrawal flow is unaffected.
- Fix — GDPR personal-data export now labels the “by later arrangement” refund preference correctly, instead of showing it as “Original payment method”.
- Fix — the admin “notification could not be sent” notice now escapes its output correctly.
- Hardening — the guest email-verification code requests now carry their own rate limit, independent of whether the OneCode Login plugin enforces one, to prevent code-request flooding.
- Maintenance — uninstall now removes every option the plugin can create (customer-service contact, diagnostics toggle, error colours); plus minor robustness fixes in stored-record decoding and query handling.
1.3.2
- Fix — when submitting the form fails because a caching or security layer (firewall, “hide wp-admin” rule, full-page cache) intercepts the request — most often for visitors who are not logged in — the form no longer does nothing silently. It now shows an accessible diagnostic with the server response status and a short excerpt of what came back, so the shop owner can identify and whitelist the layer that is blocking the submission.
- New — these intercepted submissions are also recorded in the WooCommerce logs (WooCommerce → Status → Logs, source “bitron-right-of-withdrawal”), including the response status, the page, and whether the visitor was logged in, so the shop owner has a server-side trail even if no one reports the problem. Stale-nonce failures (a cached form) are logged too. Logging is rate-limited, stores no plain-text IP addresses, and can be turned off with the bitrow_diagnostics_enabled filter.
1.3.1
- Fix — email notifications: the order total no longer leaks raw HTML entities into the plain-text message (e.g. “12 990 Ft” / “Ft”) — the amount is now stripped and entity-decoded to clean text such as “12 990 Ft”.
- New — a dismissible admin banner introduces the Pro version (one-click refunds, status management, automation, custom fields, CSV export, webhooks, REST API) with a link to learn more. Shown only in the free plugin and only to administrators, can be dismissed per-user, and never appears when the Pro plugin is present.
1.3
- Fix — the bank account number is no longer mandatory: when the original payment method cannot auto-refund, the customer can choose “by later arrangement” and submit the declaration without entering an account number; the shop arranges the refund details afterwards.
- Fix — corrected a bank account number handling bug.
- Fix — resolved a block editor (Gutenberg) issue with the Withdrawal Form block.
- Fix — Hungarian translation: customer-facing strings switched to the formal register (magázás) for a consistent tone across the form, emails and account pages.
- Improvement — the bank account field now formats the number as you type (IBAN in groups of four, domestic accounts as 8-8-8) and shows a “saved as” preview of the exact value the shop will receive, cutting down copy-paste and typing mistakes. When you finish typing it checks the IBAN/GIRO and announces the result (valid or not) to screen readers, instead of only failing on submit. Fully keyboard- and screen-reader-accessible; pasting a number with spaces or hyphens still works.
- New — repeat-withdrawal guard: once a customer has already declared withdrawal for every eligible item in an order, re-selecting that order is blocked at step 1 with a clear message. If only some items — or some quantities — are still eligible, the form lets them through but limits each item to the remaining amount and marks the already-withdrawn ones. Enforced server-side, so it cannot be bypassed from the browser.
- New — customisable error colours: the validation error summary and the blocked-order notice (the red box above the form) now take their text, background, and left-accent-border colours from Settings → Form → “Error message colours”, the
[bitrow_form]error_text/error_background/error_borderattributes, or the block’s inspector — matching the existing form-colour customisation. Defaults are unchanged (and stay WCAG-AA); like the other advanced colours these are not contrast-checked, so you own the contrast on any override. - New — customer-service contact: a dedicated Settings → General → “Customer service contact” section lets you enter a support email and phone number. These are shown on every step-1 message that stops a customer from proceeding — the repeat-withdrawal block, the §16-exempt and business-purchase blocks, and orders with nothing withdrawable — so they always know how to reach you instead of hitting a dead end. Both fields are optional — the email falls back to your WordPress administration email when left empty, and the phone is offered only when set.
1.2
- New — business-customer exclusion: the right of withdrawal is a consumer right, so shops that also sell to VAT-registered businesses can now switch the online withdrawal form off for business orders. Under Settings → Exclusions enable “Switch the online form off for business purchases” and pick the checkout field whose presence on an order marks it as a business purchase (for example a VAT-number field). The available fields are read live from your checkout (
woocommerce_checkout_fields), grouped by Billing / Shipping / Account / Order. Orders that carry a value in that field are blocked at step 1 with a message pointing the buyer to your contact channel; orders without it are treated as consumer purchases and work exactly as before. This is a technical filter, not legal advice — you decide which field marks a business buyer. - New — the admin notification setting is now a free-form email field instead of an on/off toggle: send each new declaration to any address, not just the site administration email. It defaults to your WordPress administration email (filled in automatically on update), you can point it elsewhere, and leaving it empty turns admin notifications off. An invalid address is rejected with a clear, screen-reader-announced error instead of silently disabling notifications.
- Improvement — the Form page selector is now a searchable, fully keyboard- and screen-reader-accessible combobox (the same accessible search already used by the product/category exclusion pickers), so picking the form page no longer means scrolling a huge dropdown on shops with many pages.
- Maintenance — resolved all Plugin Check findings (translator comments, escaping, prepared-statement annotations) and hardened the test suite (deterministic colour-setting isolation). No behaviour change for the customer-facing form.
1.1
- New — guest email verification: with the free OneCode Login plugin active, a not-logged-in customer can prove they own their email with a one-time code before filing. The form emails a code; once entered, it loads the orders for that email just like for a logged-in customer. This replaces the previous “order number + typed email” guest path (which anyone who knew both could use), closing that gap. Controlled by Settings → Form → Guest email verification (on by default when OneCode Login is available). When OneCode Login isn’t active the setting is shown disabled with a one-click “Install & activate OneCode Login” button (for admins who can install plugins) plus a manual-install link; the classic guest path keeps working so the plugin remains fully standalone. Keyboard- and screen-reader-accessible; the verification step requires JavaScript.
- New — product and category withdrawal exemptions: exclude individual products and whole product categories from the right of withdrawal, for the CRD §16 / 45-2014 §29 carve-outs (perishables, custom-made goods, sealed digital downloads, etc.). Managed from a dedicated Settings → Exclusions tab with searchable, fully keyboard- and screen-reader-accessible autocompletes. Exempt items still appear inside an eligible order (with a visible “Not eligible for withdrawal” badge and the quantity locked at zero) so the customer sees what they bought; an order made up entirely of exempt items is blocked at step 1 with a contact pointer.
- New — text and colour customization: match the form to your shop’s look. The submit-button background and text colours come with a live WCAG contrast meter that announces the ratio as you type, and an advanced panel adds the form text, background, and input/fieldset border colours. There’s also an optional intro paragraph and the editable disclaimer below the form. Set everything from Settings → Form, or override per-instance through
[bitrow_form]shortcode attributes and the Withdrawal Form block’s Inspector panel. - New — customer “Withdrawals” hub in My Account: a single, logged-in landing page combining a “Submit a new withdrawal declaration” button (when the form page is configured) with the customer’s own record of every declaration filed from their account — reference number, date, affected order, items, refund preference and status. The menu item appears only when there’s something to show, and the list is privacy-scoped to the account email.
- Improvement — for logged-in customers the step-1 name field prefills from the WooCommerce billing record (family name + given name) instead of the WordPress display name, so the declaration carries the real name used at checkout; email prefills from the account.
1.0
- Initial release
Meta
- Version 1.7
- Last updated 24 hours ago
- Active installations 200+
- WordPress version 6.4 or higher
- Tested up to 7.0
- PHP version 8.0 or higher
- Languages
- Tags
- Advanced View
