{"id":329745,"date":"2026-07-15T06:22:48","date_gmt":"2026-07-15T06:22:48","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/easy-withdrawal-and-returns-for-woocommerce\/"},"modified":"2026-07-15T06:22:12","modified_gmt":"2026-07-15T06:22:12","slug":"cancello-for-woocommerce","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/cancello-for-woocommerce\/","author":23519976,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.0","stable_tag":"1.0.0","tested":"7.0.1","requires":"5.8","requires_php":"7.4","requires_plugins":null,"header_name":"Cancello \u2013 Withdrawal & Returns for WooCommerce","header_author":"579 ApS","header_description":"Add an EU right-of-withdrawal and returns button to WooCommerce. Lets customers (logged-in or guest) cancel unshipped orders or request a return for shipped orders. Place it anywhere with the [cancello_withdrawal_button] shortcode or the Elementor \"Cancel Order Button\" widget. Every customer-facing text is editable from the admin.","assets_banners_color":"","last_updated":"2026-07-15 06:22:12","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/579.dk\/","header_author_uri":"https:\/\/579.dk","rating":0,"author_block_rating":0,"active_installs":0,"downloads":39,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.0":{"tag":"1.0.0","author":"579aps","date":"2026-07-15 06:22:12"}},"upgrade_notice":{"1.0.0":"<p>First public release.<\/p>"},"ratings":[],"assets_icons":[],"assets_banners":[],"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.0"],"block_files":[],"assets_screenshots":[],"screenshots":{"1":"The cancellation \/ withdrawal button on a page.","2":"A logged-in customer's order list with cancel and return actions.","3":"The customisable return (RMA) form with item selector and reason dropdown.","4":"Button styling controls with live preview.","5":"The admin Requests screen.","6":"The settings screen with fully editable texts."}},"plugin_section":[],"plugin_tags":[144997,395,55969,170592,245590],"plugin_category":[],"plugin_contributors":[271600],"plugin_business_model":[],"class_list":["post-329745","plugin","type-plugin","status-publish","hentry","plugin_tags-cancel-order","plugin_tags-eu","plugin_tags-returns","plugin_tags-rma","plugin_tags-withdrawal","plugin_contributors-579aps","plugin_committers-579aps"],"banners":[],"icons":{"svg":false,"icon":"https:\/\/s.w.org\/plugins\/geopattern-icon\/cancello-for-woocommerce.svg","icon_2x":false,"generated":true},"screenshots":[],"raw_content":"<!--section=description-->\n<p>Cancello gives your WooCommerce store the clear, easy-to-find order cancellation function that EU consumer law expects \u2014 and pairs it with a complete returns (RMA) workflow for orders that have already shipped. It works for logged-in customers <strong>and<\/strong> guests, and every word your customers see can be edited from the admin.<\/p>\n\n<p>From 19 June 2026, Directive (EU) 2023\/2673 requires online stores selling to EU consumers to provide an easy-to-use way to withdraw from (cancel) a distance contract. This plugin gives you that button, the durable-medium acknowledgement, and the audit trail to back it up. <em>(This plugin is a tool to help you comply; it is not legal advice.)<\/em><\/p>\n\n<p><strong>Place it anywhere<\/strong><\/p>\n\n<ul>\n<li>Shortcode: <code>[cancello_withdrawal_button]<\/code> (short alias: <code>[cancello_button]<\/code>)<\/li>\n<li>Elementor: the <strong>Cancel Order Button<\/strong> widget, in the WooCommerce widget category.<\/li>\n<li>It also appears automatically on the native <strong>My Account \u2192 Orders<\/strong> table.<\/li>\n<\/ul>\n\n<p><strong>A clear customer journey<\/strong><\/p>\n\n<ul>\n<li><strong>Logged-in customers<\/strong> see their recent orders, each with a Cancel or Return action.<\/li>\n<li><strong>Unshipped orders<\/strong> \u2192 a confirmation step (a popup <em>or<\/em> an inline \"please confirm\" link \u2014 your choice) \u2192 the order is cancelled immediately. The confirmation also works completely <strong>without JavaScript<\/strong>, as the regulation expects.<\/li>\n<li><strong>Shipped orders<\/strong> \u2192 a customisable returns page: full or partial return, an item picker, a reason dropdown you control, and a details field.<\/li>\n<li><strong>Guests<\/strong> are first asked whether they have an account. If they do, they're sent to log in; if not, they look up their order with their email + order number and get exactly the same cancel\/return flow.<\/li>\n<\/ul>\n\n<p><strong>Built for compliance<\/strong><\/p>\n\n<ul>\n<li><strong>Durable-medium receipt<\/strong> \u2014 the customer is emailed an acknowledgement of their withdrawal, secured with a SHA-256 verification hash.<\/li>\n<li><strong>Audit trail<\/strong> \u2014 every request is stored with timestamp, IP and user agent, so you can prove what happened and when.<\/li>\n<li><strong>Article 16 exclusions<\/strong> \u2014 flag individual products or whole categories as exempt from the right of withdrawal (e.g. custom-made or sealed goods); excluded orders are held for your review instead of auto-cancelled.<\/li>\n<li><strong>Checkout consent<\/strong> \u2014 optional confirmations for digital content and services, so the customer acknowledges they may lose the right of withdrawal.<\/li>\n<\/ul>\n\n<p><strong>Make it yours \u2014 no code<\/strong><\/p>\n\n<ul>\n<li><strong>Every customer-facing text is editable<\/strong> from the settings screen.<\/li>\n<li><strong>Built-in language switch<\/strong> with a ready-made Danish text set, plus standard <code>.po<\/code>\/<code>.mo<\/code> translation support.<\/li>\n<li><strong>Button styling controls<\/strong> with a live preview: colours and hover colours, font size, corner radius, full width, alignment, and independent padding for all four sides.<\/li>\n<li>One click to <strong>reset all texts<\/strong> back to the defaults.<\/li>\n<\/ul>\n\n<p><strong>Admin tools<\/strong><\/p>\n\n<ul>\n<li>A dedicated <strong>Requests<\/strong> screen lists every cancellation and return with its status.<\/li>\n<li><strong>Email notifications<\/strong> to you and the customer \u2014 with a <strong>separate recipient address for cancellations and for returns<\/strong> if you want them handled by different people.<\/li>\n<li><strong>Import \/ export<\/strong> your settings and texts, and <strong>export \/ import the requests log<\/strong> (imports are appended, never overwritten) \u2014 handy for backups or moving between sites.<\/li>\n<li>Choose exactly <strong>which order statuses<\/strong> count as cancellable and which count as shipped.<\/li>\n<\/ul>\n\n<p><strong>Reliable by design<\/strong><\/p>\n\n<ul>\n<li><strong>HPOS<\/strong> (High-Performance Order Storage) compatible.<\/li>\n<li><strong>Cache-friendly<\/strong> \u2014 the flow issues a fresh security token on each use, so it keeps working behind full-page caching.<\/li>\n<li><strong>No accidental duplicates<\/strong> \u2014 double-clicks and double submissions are prevented on both the browser and the server, so a slow connection never creates two records.<\/li>\n<li>No automatic refunds: cancelling sets the order to <em>Cancelled<\/em> and notifies you, leaving you in full control of any refund.<\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Install via <strong>Plugins \u2192 Add New \u2192 Upload<\/strong>, or upload the plugin folder to <code>\/wp-content\/plugins\/<\/code>.<\/li>\n<li>Activate the plugin (WooCommerce must be active).<\/li>\n<li>Go to <strong>Cancel Orders \u2192 Settings<\/strong> to set your statuses, texts, styling and email recipients.<\/li>\n<li>Add <code>[cancello_withdrawal_button]<\/code> to any page, or drop the <strong>Cancel Order Button<\/strong> Elementor widget where you want it. The action also appears on the My Account orders table automatically.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"do%20i%20need%20this%20for%20the%20new%20eu%20rules%3F\"><h3>Do I need this for the new EU rules?<\/h3><\/dt>\n<dd><p>If you sell to EU consumers, from 19 June 2026 you must offer an easy way for customers to withdraw from (cancel) their order. This plugin provides that button, the acknowledgement email and the record-keeping. It is a tool to help you comply and does not constitute legal advice.<\/p><\/dd>\n<dt id=\"how%20does%20the%20plugin%20know%20an%20order%20has%20shipped%3F\"><h3>How does the plugin know an order has shipped?<\/h3><\/dt>\n<dd><p>You choose which order statuses count as \"shipped\" (default: <em>Completed<\/em>). Orders in those statuses show the return flow; all other eligible orders show the cancellation flow.<\/p><\/dd>\n<dt id=\"does%20cancelling%20refund%20the%20customer%20automatically%3F\"><h3>Does cancelling refund the customer automatically?<\/h3><\/dt>\n<dd><p>No. Cancelling sets the order to <em>Cancelled<\/em> and notifies you; you issue any refund manually in WooCommerce.<\/p><\/dd>\n<dt id=\"can%20guests%20cancel%20or%20return%20without%20an%20account%3F\"><h3>Can guests cancel or return without an account?<\/h3><\/dt>\n<dd><p>Yes. Guests verify ownership with their email address and order number, then get the same cancel\/return flow as logged-in customers.<\/p><\/dd>\n<dt id=\"can%20i%20change%20the%20wording%3F\"><h3>Can I change the wording?<\/h3><\/dt>\n<dd><p>Yes \u2014 every customer-facing text is editable in the settings, and you can reset everything to the defaults with one click. A Danish text set is included.<\/p><\/dd>\n<dt id=\"does%20it%20work%20without%20javascript%3F\"><h3>Does it work without JavaScript?<\/h3><\/dt>\n<dd><p>Yes. The two-step withdrawal confirmation has a full no-JavaScript fallback.<\/p><\/dd>\n<dt id=\"is%20hpos%20supported%3F\"><h3>Is HPOS supported?<\/h3><\/dt>\n<dd><p>Yes, the plugin declares HPOS compatibility.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>First public release.<\/li>\n<li>Easy-to-find cancellation \/ withdrawal button via shortcode, Elementor widget and the My Account orders table.<\/li>\n<li>Works for logged-in customers and guests (email + order-number lookup).<\/li>\n<li>Unshipped orders: two-step confirmation with a no-JavaScript fallback. Shipped orders: full\/partial returns (RMA) flow with item selector and a customisable reason dropdown.<\/li>\n<li>Durable-medium receipt email with SHA-256 verification and a full audit trail (timestamp, IP, user agent).<\/li>\n<li>Article 16 product\/category exclusions and checkout consent for digital content and services.<\/li>\n<li>Every customer-facing text editable, built-in language switch with a Danish text set, and one-click reset to defaults.<\/li>\n<li>Button styling controls with live preview (colours, hover, font size, radius, four-sided padding, width, alignment).<\/li>\n<li>Separate cancellation\/return email recipients; settings and requests-log import\/export.<\/li>\n<li>Duplicate-submission protection on the browser and server. HPOS compatible and cache-friendly.<\/li>\n<\/ul>","raw_excerpt":"An easy-to-find EU withdrawal &amp; cancellation button plus a full returns (RMA) flow for WooCommerce \u2014 for logged-in customers and guests.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/329745","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=329745"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/579aps"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=329745"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=329745"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=329745"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=329745"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=329745"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=329745"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}