{"id":388471,"date":"2026-10-27T13:22:02","date_gmt":"2026-10-27T13:22:02","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/otkazpro-withdrawal-button-for-woocommerce\/"},"modified":"2026-10-28T07:38:46","modified_gmt":"2026-10-28T07:38:46","slug":"otkazpro","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/otkazpro\/","author":23587900,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"2.1.0","stable_tag":"2.1.0","tested":"7.1.4","requires":"6.4","requires_php":"7.4","requires_plugins":null,"header_name":"OtkazPro \u2013 Withdrawal Button for WooCommerce","header_author":"Project Yordanov","header_description":"Adds the online withdrawal function required by EU Directive 2023\/2673 (Bulgaria: Art. 52a of the Consumer Protection Act) to WooCommerce: a \u201cWithdraw from the contract here\u201d button, a two-step form, partial withdrawal, an instant confirmation email and a register of statements.","assets_banners_color":"6caa98","last_updated":"2026-10-28 07:38:46","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/github.com\/Project-Yordanov\/otkazpro","header_author_uri":"https:\/\/projectyordanov.com","rating":0,"author_block_rating":0,"active_installs":0,"downloads":90,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"2.0.0":{"tag":"2.0.0","author":"projectyordanov","date":"2026-10-27 13:21:27","revision":3768666},"2.1.0":{"tag":"2.1.0","author":"projectyordanov","date":"2026-10-28 07:38:46","revision":3770109}},"upgrade_notice":{"2.1.0":"<p>Adds refund deadline tracking, a store reminder email and \u201cPrepare refund\u201d. Existing withdrawals of orders that were already refunded are marked as processed.<\/p>","2.0.0":"<p>If you used WPOtkaz from GitHub: install and activate OtkazPro, then delete WPOtkaz \u2013 settings and records are kept.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3768666,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3768666,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3768666,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3768666,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["2.0.0","2.1.0"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3768666,"resolution":"1","location":"assets","locale":"","width":709,"height":1477},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3768666,"resolution":"2","location":"assets","locale":"","width":709,"height":1309},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3768666,"resolution":"3","location":"assets","locale":"","width":1440,"height":569},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3768666,"resolution":"4","location":"assets","locale":"","width":1440,"height":900}},"screenshots":{"1":"Step 2 \u2013 the customer selects products and confirms the withdrawal.","2":"Success screen with statement number, date and time.","3":"Register of withdrawal statements in the admin.","4":"Settings."}},"plugin_section":[],"plugin_tags":[131785,55969,263226,245590,286],"plugin_category":[45],"plugin_contributors":[288972],"plugin_business_model":[],"class_list":["post-388471","plugin","type-plugin","status-publish","hentry","plugin_tags-gdpr","plugin_tags-returns","plugin_tags-right-of-withdrawal","plugin_tags-withdrawal","plugin_tags-woocommerce","plugin_category-ecommerce","plugin_contributors-projectyordanov","plugin_committers-projectyordanov"],"banners":{"banner":"https:\/\/ps.w.org\/otkazpro\/assets\/banner-772x250.png?rev=3768666","banner_2x":"https:\/\/ps.w.org\/otkazpro\/assets\/banner-1544x500.png?rev=3768666","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/otkazpro\/assets\/icon-128x128.png?rev=3768666","icon_2x":"https:\/\/ps.w.org\/otkazpro\/assets\/icon-256x256.png?rev=3768666","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/otkazpro\/assets\/screenshot-1.png?rev=3768666","caption":"Step 2 \u2013 the customer selects products and confirms the withdrawal."},{"src":"https:\/\/ps.w.org\/otkazpro\/assets\/screenshot-2.png?rev=3768666","caption":"Success screen with statement number, date and time."},{"src":"https:\/\/ps.w.org\/otkazpro\/assets\/screenshot-3.png?rev=3768666","caption":"Register of withdrawal statements in the admin."},{"src":"https:\/\/ps.w.org\/otkazpro\/assets\/screenshot-4.png?rev=3768666","caption":"Settings."}],"raw_content":"<!--section=description-->\n<p>Since 2026, online shops in the EU must let consumers withdraw from a distance contract through an easily accessible online function (EU Directive 2023\/2673; in Bulgaria Art. 52a of the Consumer Protection Act, in force since 24 September 2026). OtkazPro adds exactly that to WooCommerce \u2013 without forcing the customer to log in or give a reason.<\/p>\n\n<p><strong>For the customer \u2013 two clicks<\/strong><\/p>\n\n<ul>\n<li>A clearly labelled <strong>\u201cWithdraw from the contract here\u201d<\/strong> button: in order emails, in My account \u2192 Orders, and on a dedicated page you can link from the footer.<\/li>\n<li>Guests find their order with the order number + email; links from emails open the order directly.<\/li>\n<li>All eligible products are pre-selected; the customer can untick products or lower quantities (<strong>partial withdrawal<\/strong>), then clicks <strong>\u201cConfirm withdrawal\u201d<\/strong>.<\/li>\n<li>A confirmation with the statement number, date, time, products and the full text of the statement is emailed immediately (durable medium).<\/li>\n<\/ul>\n\n<p><strong>For the shop<\/strong><\/p>\n\n<ul>\n<li>Register of all statements (WooCommerce \u2192 Withdrawals) with filters, CSV export, IP and user agent as evidence, and \u201cResend confirmation\u201d.<\/li>\n<li><strong>Refund deadline tracking:<\/strong> every statement shows how many days are left of the 14-day refund deadline. A daily email reminds the store of withdrawals whose deadline is near or past, and a withdrawal is marked as processed automatically when you refund the order.<\/li>\n<li><strong>\u201cPrepare refund\u201d<\/strong> opens the order with the WooCommerce refund form already filled in with the products and quantities of the statement \u2013 you check the amount and confirm the refund.<\/li>\n<li>Order note, order meta box, badge in the orders list and an indicative \u201cin time \/ late\u201d marker (the form itself never closes).<\/li>\n<li>Store notification email with a link to the order.<\/li>\n<li>Products, variations or categories can be marked as <strong>excluded from the right of withdrawal<\/strong> (e.g. personalised or perishable goods) \u2013 soft mode (selectable with a warning) or strict mode. Optional storefront label in product, cart and checkout pages (classic and block checkout).<\/li>\n<li>Optional custom order status \u201cWithdrawal requested\u201d.<\/li>\n<\/ul>\n\n<p><strong>Built to keep working<\/strong><\/p>\n\n<ul>\n<li>Works with any theme (shortcode <code>[otkazpro]<\/code>), page builders such as Elementor, classic and block themes.<\/li>\n<li>If the form page is missing or unpublished, links automatically fall back to a built-in page, so the function never disappears.<\/li>\n<li>Sends \u201cdo not cache\u201d signals to page caches and CDNs and <strong>checks itself<\/strong> whether the form page is cached (WooCommerce settings and Tools \u2192 Site Health).<\/li>\n<li>Adds the withdrawal link to order emails even when an email template plugin replaces the WooCommerce templates.<\/li>\n<li>HPOS compatible, WPML \/ Polylang ready, accessible (keyboard, screen readers), works without JavaScript.<\/li>\n<li>GDPR: personal data exporter, retention period with automatic deletion, privacy policy text suggestion.<\/li>\n<\/ul>\n\n<p><strong>Languages:<\/strong> English. Translations, including Bulgarian, are delivered automatically through translate.wordpress.org.<\/p>\n\n<p>This plugin does not provide legal advice. Your terms and conditions and the information on the right of withdrawal remain your responsibility.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Install and activate the plugin (WooCommerce 8.0 or newer is required).<\/li>\n<li>A page \u201cWithdrawal from contract\u201d with the <code>[otkazpro]<\/code> shortcode is created automatically. If a page with that address already exists, you are asked whether to use it or create a new one \u2013 nothing is overwritten.<\/li>\n<li>Go to <strong>WooCommerce \u2192 Settings \u2192 Withdrawal<\/strong> and set the store notification email, accent colour and return instructions.<\/li>\n<li>Add a footer \/ menu link with the text \u201cWithdraw from the contract here\u201d pointing to the form page (the URL is shown in the settings).<\/li>\n<li>Exclude the form page from your page cache and run <strong>\u201cCheck cache now\u201d<\/strong> in the settings.<\/li>\n<li>Mark products or categories that are excluded from the right of withdrawal (Product \u2192 Advanced, or the category edit screen).<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20the%20customer%20need%20an%20account%3F\"><h3>Does the customer need an account?<\/h3><\/dt>\n<dd><p>No. Guests find the order with its number and the email used for the order, or open the direct link from the order email.<\/p><\/dd>\n<dt id=\"does%20the%20plugin%20cancel%20the%20order%20or%20refund%20the%20payment%3F\"><h3>Does the plugin cancel the order or refund the payment?<\/h3><\/dt>\n<dd><p>No. It records the statement, notifies you and confirms it to the customer. Refunds and returns are processed manually by the shop.<\/p><\/dd>\n<dt id=\"does%20the%20form%20close%20after%2014%20days%3F\"><h3>Does the form close after 14 days?<\/h3><\/dt>\n<dd><p>No. The function is always available for eligible orders; the indicative deadline is shown only to the shop in the admin.<\/p><\/dd>\n<dt id=\"is%20a%20reason%20required%3F\"><h3>Is a reason required?<\/h3><\/dt>\n<dd><p>No. An optional, never mandatory reason field can be enabled in the settings.<\/p><\/dd>\n<dt id=\"is%20it%20compatible%20with%20my%20cache%20plugin%3F\"><h3>Is it compatible with my cache plugin?<\/h3><\/dt>\n<dd><p>The plugin tells page caches not to cache the form page (DONOTCACHEPAGE, Cache-Control, CDN headers, LiteSpeed, FlyingPress, WP Rocket) and the form keeps working even if a cache ignores this. The built-in cache check tells you if the page is still cached and what to exclude.<\/p><\/dd>\n<dt id=\"can%20i%20change%20the%20texts%3F\"><h3>Can I change the texts?<\/h3><\/dt>\n<dd><p>Yes \u2013 all texts (buttons, statement template, return instructions) are editable in the settings and translatable with WPML \/ Polylang. Templates can be overridden in your theme under <code>woocommerce\/otkazpro\/<\/code>.<\/p><\/dd>\n<dt id=\"what%20data%20is%20stored%3F\"><h3>What data is stored?<\/h3><\/dt>\n<dd><p>Name, email, order, selected products, statement text, date\/time, IP address and user agent \u2013 as evidence of the statement. Records are deleted automatically after the configured retention period (default 5 years).<\/p><\/dd>\n<dt id=\"does%20the%20plugin%20connect%20to%20external%20services%3F\"><h3>Does the plugin connect to external services?<\/h3><\/dt>\n<dd><p>No. All data stays in your WordPress database and nothing is sent to third parties. The only HTTP requests the plugin makes are to your own site: the cache check loads your withdrawal form page to verify that it is not served from a page cache.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>2.1.0<\/h4>\n\n<ul>\n<li>New: 14-day refund deadline for every withdrawal (days left \/ overdue) in the register, the statement view and the order.<\/li>\n<li>New: daily \u201cWithdrawal refund reminder\u201d email to the store for withdrawals whose refund deadline is near or past (WooCommerce \u2192 Settings \u2192 Emails).<\/li>\n<li>New: withdrawals are marked as processed automatically when a refund is created in the order; \u201cMark as processed\u201d \/ \u201cReopen\u201d for the rest.<\/li>\n<li>New: \u201cPrepare refund\u201d fills in the WooCommerce refund form with the products and quantities of the statement.<\/li>\n<li>New: refund status filter and CSV columns.<\/li>\n<\/ul>\n\n<h4>2.0.0<\/h4>\n\n<ul>\n<li>Published on WordPress.org as OtkazPro (previously distributed as WPOtkaz). Activating OtkazPro deactivates the previous edition and keeps all settings and records.<\/li>\n<li>Brand-consistent URL parameters, CSS classes and form fields (<code>otkazpro_*<\/code>); old links from emails keep working.<\/li>\n<li>Fallback page when the form page is missing or unpublished.<\/li>\n<li>Cache self-check and additional \u201cdo not cache\u201d headers.<\/li>\n<\/ul>\n\n<h4>1.3.0<\/h4>\n\n<ul>\n<li>Fixed links in My account when another plugin imitates WPML.<\/li>\n<\/ul>","raw_excerpt":"The online \u201cwithdraw from the contract\u201d button and form required by EU Directive 2023\/2673 \u2013 for WooCommerce stores in Bulgaria and the EU.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/388471","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=388471"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/projectyordanov"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=388471"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=388471"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=388471"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=388471"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=388471"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=388471"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}