{"id":319524,"date":"2026-06-02T11:34:42","date_gmt":"2026-06-02T11:34:42","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/right-of-withdrawal-online-form-refunds\/"},"modified":"2026-06-03T19:16:54","modified_gmt":"2026-06-03T19:16:54","slug":"bitron-right-of-withdrawal","status":"publish","type":"plugin","link":"https:\/\/vec.wordpress.org\/plugins\/bitron-right-of-withdrawal\/","author":13379012,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.1","stable_tag":"trunk","tested":"7.0","requires":"6.4","requires_php":"8.0","requires_plugins":null,"header_name":"Bitron Right of Withdrawal","header_author":"oaron","header_description":"Akad\u00e1lymentes el\u00e1ll\u00e1si \u0171rlap webshopoknak. A 2026-06-19-i CRD\/45-2014 megfelel\u0151s\u00e9ghez.","assets_banners_color":"","last_updated":"2026-06-03 19:16:54","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"","rating":0,"author_block_rating":0,"active_installs":30,"downloads":149,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":[],"upgrade_notice":[],"ratings":[],"assets_icons":[],"assets_banners":[],"assets_blueprints":{},"all_blocks":{"right-of-withdrawal\/form":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"right-of-withdrawal\/form","version":"0.4.0","title":"Withdrawal Form","category":"widgets","icon":"undo","description":"Accessible withdrawal form for consumer orders. Same output as the [bitrow_form] shortcode.","keywords":["withdrawal","refund","form","consumer"],"textdomain":"bitron-right-of-withdrawal","attributes":{"primaryColor":{"type":"string","default":""},"primaryTextColor":{"type":"string","default":""},"textColor":{"type":"string","default":""},"backgroundColor":{"type":"string","default":""},"borderColor":{"type":"string","default":""},"introText":{"type":"string","default":""}},"supports":{"html":false,"multiple":false,"reusable":true,"align":["wide","full"]},"editorScript":"file:.\/index.js"}},"tagged_versions":[],"block_files":[],"assets_screenshots":{"screenshot-1.jpg":{"filename":"screenshot-1.jpg","revision":3557967,"resolution":"1","location":"assets","locale":"","width":694,"height":824},"screenshot-2.jpg":{"filename":"screenshot-2.jpg","revision":3557967,"resolution":"2","location":"assets","locale":"","width":1778,"height":688},"screenshot-3.jpg":{"filename":"screenshot-3.jpg","revision":3557967,"resolution":"3","location":"assets","locale":"","width":1450,"height":822},"screenshot-4.jpg":{"filename":"screenshot-4.jpg","revision":3557967,"resolution":"4","location":"assets","locale":"","width":1437,"height":806}},"screenshots":{"1":"The customer-facing withdrawal form \u2014 accessible by default, with a clear two-step flow, programmatic labels, and live status announcements.","2":"The Withdrawals admin list collects every incoming declaration with its unique <code>BITROW-XXXXXX<\/code> reference, the linked order, and the customer's refund preference.","3":"Settings \u2192 General \u2014 withdrawal window length, admin notification, and opt-in record deletion at uninstall.","4":"Settings \u2192 Form \u2014 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."}},"plugin_section":[],"plugin_tags":[1953,255182,131785,9682,245590],"plugin_category":[34],"plugin_contributors":[93346],"plugin_business_model":[],"class_list":["post-319524","plugin","type-plugin","status-publish","hentry","plugin_tags-accessibility","plugin_tags-consumer-rights","plugin_tags-gdpr","plugin_tags-refund","plugin_tags-withdrawal","plugin_category-accessibility","plugin_contributors-oaron","plugin_committers-oaron"],"banners":[],"icons":{"svg":false,"icon":"https:\/\/s.w.org\/plugins\/geopattern-icon\/bitron-right-of-withdrawal.svg","icon_2x":false,"generated":true},"screenshots":[{"src":"https:\/\/ps.w.org\/bitron-right-of-withdrawal\/assets\/screenshot-1.jpg?rev=3557967","caption":"The customer-facing withdrawal form \u2014 accessible by default, with a clear two-step flow, programmatic labels, and live status announcements."},{"src":"https:\/\/ps.w.org\/bitron-right-of-withdrawal\/assets\/screenshot-2.jpg?rev=3557967","caption":"The Withdrawals admin list collects every incoming declaration with its unique <code>BITROW-XXXXXX<\/code> reference, the linked order, and the customer's refund preference."},{"src":"https:\/\/ps.w.org\/bitron-right-of-withdrawal\/assets\/screenshot-3.jpg?rev=3557967","caption":"Settings \u2192 General \u2014 withdrawal window length, admin notification, and opt-in record deletion at uninstall."},{"src":"https:\/\/ps.w.org\/bitron-right-of-withdrawal\/assets\/screenshot-4.jpg?rev=3557967","caption":"Settings \u2192 Form \u2014 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."}],"raw_content":"<!--section=description-->\n<p>From 19 June 2026, EU member states require every consumer-facing online shop to provide an <strong>online withdrawal function<\/strong> \u2014 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.<\/p>\n\n<p>Bitron Right of Withdrawal delivers exactly that, accessibly.<\/p>\n\n<p><strong>What the plugin does<\/strong><\/p>\n\n<ul>\n<li>A continuously available, accessible withdrawal form \u2014 embeddable via the <code>[bitrow_form]<\/code> shortcode or the <em>Withdrawal Form<\/em> Gutenberg block, so it drops into any classic-editor page, a block-built layout, or a page builder that handles either.<\/li>\n<li>Tight WooCommerce integration: the form is surfaced to logged-in customers as a <em>Withdrawal<\/em> item in their <em>My Account<\/em> menu, but only while they have at least one order still inside the window \u2014 so a customer with nothing eligible doesn't see a dead link.<\/li>\n<li>Withdrawal CTA is automatically attached to WooCommerce's customer order emails (processing, completed, invoice) while the window is open \u2014 HTML and plain-text variants, with a filter to extend the list of carrier emails.<\/li>\n<li>Guest and logged-in customer paths. A logged-in customer sees a select of their own in-window orders. For guests, optional <strong>email verification<\/strong>: with the free <a href=\"https:\/\/wordpress.org\/plugins\/onecode-login\/\">OneCode Login<\/a> 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 \u2014 closing the gap where anyone who knew an order number and the billing email could file on someone else's behalf. When OneCode Login isn't installed, the classic order-number + email path still works, so the plugin remains fully standalone.<\/li>\n<li>Item-level partial withdrawal. After the customer picks an order, they tick exactly which line items (and quantities) they want to withdraw from \u2014 the form is not all-or-nothing.<\/li>\n<li>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 \u2014 validated client- and server-side with MOD-97 \/ CDV checks \u2014 so the shop has everything to wire the refund manually.<\/li>\n<li>Customizable form copy and brand colors. An optional intro paragraph above the form and the submit-button colors (background + text) are configurable from <em>Settings \u2192 Form<\/em>, 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 \u2014 these three are not contrast-checked and carry an explicit \"you own the contrast\" warning. The same values can be overridden per-instance through <code>[bitrow_form]<\/code> shortcode attributes or the block's <em>Inspector<\/em> panel.<\/li>\n<li>Automatic confirmation email to the customer (durable medium) and notification to the shop admin, with editable subject and body templates for both \u2014 empty fields fall back to safe i18n defaults so the plugin is functional out of the box.<\/li>\n<li>Per-product and per-category withdrawal exemptions for the CRD \u00a716 \/ 45-2014 \u00a729 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 <em>Settings \u2192 Exclusions<\/em> tab manages both lists with searchable autocompletes.<\/li>\n<li>\"Withdrawals\" hub in the customer's <em>My Account<\/em> area \u2014 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.<\/li>\n<li>Minimal record-keeping with unique <code>BITROW-XXXXXX<\/code> references for evidentiary value, plus a per-record detail page in the admin.<\/li>\n<li>Admin can mark a record as <em>closed<\/em> (and reopen it) once the case is resolved, with timestamp and the closing user recorded \u2014 keeps the working list focused on what's still pending.<\/li>\n<li>WCAG 2.1 AA accessibility throughout \u2014 programmatic labels, focus management, live regions, sufficient contrast.<\/li>\n<li>GDPR integration with WordPress' personal data export and erase tools, plus a suggested paragraph for the Privacy Policy Guide.<\/li>\n<\/ul>\n\n<p><strong>Compatibility<\/strong><\/p>\n\n<p>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 \u2014 the trademark is not used in the plugin name or slug.<\/p>\n\n<p><strong>Important \u2014 what this plugin does NOT do<\/strong><\/p>\n\n<p>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 \u2014 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.<\/p>\n\n<p>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.<\/p>\n\n<p><strong>Privacy<\/strong><\/p>\n\n<p>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.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Install the plugin through the <em>Plugins \u2192 Add New<\/em> screen, or upload the plugin folder to <code>\/wp-content\/plugins\/bitron-right-of-withdrawal\/<\/code>.<\/li>\n<li>Activate the plugin through the <em>Plugins<\/em> screen in WordPress.<\/li>\n<li>Create the page that should host the form (for example, \"Withdrawal declaration\") and either:\n\n<ul>\n<li>add the shortcode <code>[bitrow_form]<\/code> to the page content, or<\/li>\n<li>insert the <em>Withdrawal Form<\/em> block in the block editor.<\/li>\n<\/ul><\/li>\n<li>Go to <em>Withdrawals \u2192 Settings<\/em> in the WordPress admin and select that page in the <em>Form page<\/em> setting. This is what enables the contextual link in WooCommerce's \"My Account\" area and in the order confirmation emails.<\/li>\n<li>Review the other settings on the same screen (withdrawal window length, admin notification, email subject and body) and save.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"do%20i%20still%20need%20to%20put%20withdrawal%20information%20in%20my%20terms%20of%20service%3F\"><h3>Do I still need to put withdrawal information in my Terms of Service?<\/h3><\/dt>\n<dd><p>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 \u2014 the plugin does not.<\/p><\/dd>\n<dt id=\"what%20about%20the%20privacy%20policy%3F\"><h3>What about the privacy policy?<\/h3><\/dt>\n<dd><p>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.<\/p><\/dd>\n<dt id=\"can%20guests%20verify%20their%20identity%20before%20filing%20a%20withdrawal%3F\"><h3>Can guests verify their identity before filing a withdrawal?<\/h3><\/dt>\n<dd><p>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.<\/p><\/dd>\n<dt id=\"does%20it%20automatically%20refund%20the%20customer%3F\"><h3>Does it automatically refund the customer?<\/h3><\/dt>\n<dd><p>No. The plugin records the withdrawal and notifies you; refunds remain a deliberate admin action through WooCommerce's standard refund interface.<\/p><\/dd>\n<dt id=\"is%20it%20accessible%3F\"><h3>Is it accessible?<\/h3><\/dt>\n<dd><p>Accessibility is the product's main differentiator. The form is WCAG 2.1 AA \u2014 programmatic labels, keyboard operability, visible focus, live regions for status messages, sufficient contrast. The admin list follows the same standard.<\/p><\/dd>\n<dt id=\"where%20can%20my%20customers%20see%20the%20withdrawal%20declarations%20they%27ve%20submitted%3F\"><h3>Where can my customers see the withdrawal declarations they've submitted?<\/h3><\/dt>\n<dd><p>Under <em>My Account \u2192 Withdrawals<\/em>. The page is a single hub: when you've set the withdrawal form page in <em>Settings \u2192 Form<\/em>, 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 \u2014 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.<\/p><\/dd>\n<dt id=\"can%20i%20exclude%20certain%20products%20or%20categories%20from%20the%20withdrawal%20form%3F\"><h3>Can I exclude certain products or categories from the withdrawal form?<\/h3><\/dt>\n<dd><p>Yes. Under <em>Settings \u2192 Exclusions<\/em> there are two pickers \u2014 one for individual products, one for product categories \u2014 backed by searchable autocompletes. The CRD \u00a716 (transposed in Hungary as 45\/2014. Korm. r. \u00a729) 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.<\/p>\n\n<p>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 \u2014 a crafted POST that tries to set a positive quantity on an excluded item is rejected with a clear error.<\/p><\/dd>\n<dt id=\"can%20i%20customize%20the%20form%20text%2C%20background%2C%20and%20border%20colors%3F\"><h3>Can I customize the form text, background, and border colors?<\/h3><\/dt>\n<dd><p>Yes. <em>Settings \u2192 Form<\/em> 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 <code>text<\/code>, <code>background<\/code>, <code>border<\/code> attributes on the <code>[bitrow_form]<\/code> shortcode and as inspector controls on the <em>Withdrawal Form<\/em> block.<\/p>\n\n<p>These three colours are <strong>not<\/strong> contrast-checked \u2014 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.<\/p><\/dd>\n<dt id=\"can%20a%20guest%20customer%20use%20it%2C%20or%20only%20logged-in%20users%3F\"><h3>Can a guest customer use it, or only logged-in users?<\/h3><\/dt>\n<dd><p>Both. A guest provides the order number plus the email used on the order; a logged-in customer sees a select of their own in-window orders. The form is never gated behind login.<\/p><\/dd>\n<dt id=\"can%20i%20change%20the%2014-day%20withdrawal%20window%3F\"><h3>Can I change the 14-day withdrawal window?<\/h3><\/dt>\n<dd><p>Yes. <em>Settings \u2192 Bitron Right of Withdrawal<\/em> exposes the window length in days. The default is 14 (the EU minimum); some jurisdictions require longer.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20hpos%20%28high-performance%20order%20storage%29%3F\"><h3>Does it work with HPOS (High-Performance Order Storage)?<\/h3><\/dt>\n<dd><p>Yes. The plugin declares HPOS compatibility and uses the WooCommerce CRUD API rather than direct post-meta access.<\/p><\/dd>\n<dt id=\"where%20can%20i%20find%20the%20recorded%20withdrawals%3F\"><h3>Where can I find the recorded withdrawals?<\/h3><\/dt>\n<dd><p>Under <em>Withdrawals<\/em> in the WordPress admin sidebar. Each entry has a unique reference (e.g. <code>BITROW-XXXXXX<\/code>) and a timestamp; the list is a simple, paginated view.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.1<\/h4>\n\n<ul>\n<li>New \u2014 guest email verification: with the free <a href=\"https:\/\/wordpress.org\/plugins\/onecode-login\/\">OneCode Login<\/a> 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 <em>Settings \u2192 Form \u2192 Guest email verification<\/em> (on by default when OneCode Login is available). When OneCode Login isn't active the setting is shown disabled with a one-click \"Install &amp; 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.<\/li>\n<li>New \u2014 product and category withdrawal exemptions: exclude individual products and whole product categories from the right of withdrawal, for the CRD \u00a716 \/ 45-2014 \u00a729 carve-outs (perishables, custom-made goods, sealed digital downloads, etc.). Managed from a dedicated <em>Settings \u2192 Exclusions<\/em> 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.<\/li>\n<li>New \u2014 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 <em>Settings \u2192 Form<\/em>, or override per-instance through <code>[bitrow_form]<\/code> shortcode attributes and the <em>Withdrawal Form<\/em> block's Inspector panel.<\/li>\n<li>New \u2014 customer \"Withdrawals\" hub in <em>My Account<\/em>: 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 \u2014 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.<\/li>\n<li>Improvement \u2014 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.<\/li>\n<\/ul>\n\n<h4>1.0<\/h4>\n\n<ul>\n<li>Initial release<\/li>\n<\/ul>","raw_excerpt":"Accessible online withdrawal form. Built for the EU Consumer Rights Directive update effective 19 June 2026.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/vec.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/319524","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vec.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/vec.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/vec.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=319524"}],"author":[{"embeddable":true,"href":"https:\/\/vec.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/oaron"}],"wp:attachment":[{"href":"https:\/\/vec.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=319524"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/vec.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=319524"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/vec.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=319524"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/vec.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=319524"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/vec.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=319524"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/vec.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=319524"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}