Recesso Manager for WooCommerce helps WooCommerce store owners collect, document and manage online right-of-withdrawal declarations from customers.
The plugin adds a public form where customers can identify an order, select eligible products and quantities, confirm the declaration and receive an e-mail receipt with content, date and time of the online transmission.
In the WordPress admin area, merchants can review declarations, manage the received/accepted/rejected status, add private notes, resend e-mails, export data, and see linked declarations from the WooCommerce order edit screen.
The plugin supports guest checkout, configurable allowed WooCommerce order statuses, optional product/category exclusions, WPML/Polylang translation workflows and WooCommerce HPOS.
Recesso Manager for WooCommerce is a technical workflow tool. It does not provide legal advice, does not guarantee legal compliance, does not calculate or trigger refunds, does not create shipping labels, does not manage couriers and does not automatically change WooCommerce order status.
Author and contact
Developed by Giacomo Zamprogno.
Website: https://www.giazam.it Contact e-mail: giacomo.zamprogno@gmail.com
Legal disclaimer
Recesso Manager for WooCommerce provides a technical workflow to help store owners collect, record and manage online withdrawal declarations for WooCommerce orders.
The plugin does not provide legal advice, does not replace a qualified legal consultant and does not guarantee that a store, its policies, its contractual documents or its withdrawal process are legally compliant.
Store owners remain responsible for verifying applicable laws, withdrawal deadlines, product exclusions, customer communications, refund handling, data retention and all legal, tax and operational obligations.
Accessibility
Version 1.6.5 includes an accessibility-focused pass inspired by WCAG 2.2 principles for the plugin-owned interface. The public form uses associated labels, fieldsets, legends, table captions, keyboard-operable native controls, visible focus styles, announced error/status messages and responsive tables that preserve text labels on small screens.
Requirements
- WordPress 6.4 or higher.
- PHP 8.1 or higher.
- WooCommerce 8.2 or higher.
- WooCommerce is declared as a required plugin through the
Requires Plugins: woocommerceheader. - Database permissions to create custom tables.
The plugin uses WooCommerce CRUD APIs and declares compatibility with WooCommerce High-Performance Order Storage (HPOS).
Configuration
The settings page includes:
- Withdrawal form page.
- Informational withdrawal period in days.
- Allowed WooCommerce order statuses for technical access to the withdrawal flow.
- Optional excluded product categories.
- Merchant notification recipients.
- E-mail sender name and address.
- Customer receipt subject and intro text.
- Merchant notification subject and intro text.
- Privacy checkbox text with a
%splaceholder for the privacy policy link. - Privacy policy page.
- Optional terms/withdrawal information page snapshot.
- Optional e-mail footer text with safe HTML.
- Optional WooCommerce e-mail and My Account links.
- Predefined rejection reasons.
- Merchant reminder settings.
- Data retention settings.
Allowed order statuses are loaded from WooCommerce, including custom statuses added by other plugins. The setting only controls technical access to the form and does not determine whether the right of withdrawal legally applies.
Product and category exclusions are technical exclusions from the public form. They should be configured only after verifying the concrete legal and operational case.
The withdrawal period value is informational only. The plugin does not automatically accept or reject declarations based on dates, because it does not know the actual product delivery date. The merchant remains responsible for verifying terms and applicability.
Configurable texts, privacy wording, e-mail content, rejection reasons and operational procedures should be reviewed with a qualified legal consultant before production use.
Shortcodes
[rmwc_withdrawal_form]
Displays the full withdrawal workflow.
[rmwc_withdrawal_link]
Displays a link to the configured form page.
[rmwc_withdrawal_link text="Exercise the right of withdrawal"]
Customizes the link text.
If no form page is configured, the shortcode does not generate a broken URL. Administrators may see a discreet notice; visitors see no output.
Customer workflow
- The customer enters billing e-mail address and order number, unless they start from a logged-in My Account order action.
- The plugin verifies the order and allows only orders whose WooCommerce status is enabled in the plugin settings.
- The customer selects products and quantities.
- The plugin shows a summary.
- The customer must confirm the withdrawal statement and privacy checkbox.
- The customer submits the withdrawal declaration.
- The plugin creates a unique request code, saves the statement and historical item data, adds a private order note and attempts to send e-mails.
- If previous partial withdrawal declarations exist, the customer can submit a further declaration only for remaining quantities.
The essential workflow works without JavaScript.
Admin workflow
The Recesso Manager menu contains:
- Withdrawals.
- Settings.
- Event log.
- Instructions.
- Configuration status.
The merchant can view declarations, filter by status, search by code/order/customer/e-mail/product/note, inspect selected products and quantities, review clearer event logs, add private internal notes, resend customer receipts, resend merchant notifications, accept or reject declarations and export CSV files.
Accepting or rejecting a declaration sends a decision e-mail to the customer. A rejection reason is required for rejected declarations.
Multilingual and translation support
The plugin works on monolingual sites and is prepared for WPML, Polylang Pro and Loco Translate workflows.
Fixed plugin interface strings use the standard WordPress gettext/i18n system with the recesso-manager-for-woocommerce text domain. On WordPress.org, translations are handled through translate.wordpress.org and delivered by the standard WordPress translation update system.
Configurable texts entered in Recesso Manager > Settings are edited in the site source/default language. Runtime translations are handled as follows:
- WPML: configurable texts are registered for WPML String Translation.
- Polylang Pro: configurable texts are registered with Polylang string translations when the Polylang API is available.
- Loco Translate: fixed gettext strings can be customized locally; texts saved in settings remain site configuration values unless translated by a runtime multilingual plugin.
Multilingual page handling:
- the configured form, privacy and terms pages are stored as default/source-language page IDs;
- current-language page translations are resolved when generating frontend links;
- the language active at submission time is saved in the declaration;
- the historical declaration statement, customer receipt and decision e-mails are generated in the submission language;
- merchant notifications and internal reminders use the site default/source language.
Recommended setup:
- Create the form page in the default/source language and add
[rmwc_withdrawal_form]. - Translate that page and keep the shortcode in each translation.
- Translate the privacy and terms/withdrawal pages.
- Translate configurable plugin strings in WPML String Translation or Polylang string translations.
- Use translate.wordpress.org or local gettext tools only for fixed plugin interface strings.
- Check Recesso Manager > Configuration status.
E-mail compatibility
The plugin sends e-mails with the standard WordPress wp_mail() function. It does not configure SMTP, include a custom PHPMailer library or call WP Mail SMTP APIs. SMTP plugins can therefore intercept mail normally.
A successful wp_mail() result means that WordPress accepted the message for sending. It does not prove final mailbox delivery.
Data storage and retention
The plugin creates these custom tables:
{$wpdb->prefix}rmwc_requests{$wpdb->prefix}rmwc_request_items{$wpdb->prefix}rmwc_request_logs
Default retention settings:
- withdrawal declarations: 10 years;
- business/documentary logs: 10 years;
- technical/security logs: 180 days;
- automatic technical log cleanup: enabled;
- automatic declaration deletion: disabled/manual.
Automatic cleanup only deletes technical and security logs older than the configured retention period. Withdrawal declarations and business/documentary logs are not deleted automatically.
On plugin deletion, data is preserved by default. Administrators can explicitly enable complete data deletion before uninstalling from Recesso Manager > Settings > Data retention. Complete deletion requires selecting the destructive uninstall option and entering the confirmation phrase shown in the settings page. When enabled, uninstall removes custom tables, plugin options and temporary transients. This operation is irreversible and should only be used after checking retention obligations and taking a backup.
Privacy
The plugin stores personal data connected to withdrawal declarations, including billing e-mail address, customer name, order number, selected products and quantities, withdrawal statement, privacy acceptance text, request status, merchant decision notes, internal admin notes, e-mail status and management logs.
The plugin integrates with WordPress privacy tools:
- personal data exporter for withdrawal declarations matching an e-mail address;
- personal data eraser that reports retained documentary records instead of deleting them automatically.
Deletion requests should be assessed manually by the site owner according to the store retention policy and applicable legal/contractual obligations.
The plugin also adds suggested text to the WordPress privacy policy guide.
External services
The WordPress.org-ready build does not load third-party JavaScript, images, tracking pixels or external anti-spam services. E-mail delivery uses WordPress wp_mail(). Optional anti-spam integrations should be implemented by separate add-ons and documented by those add-ons.
No Contact Form 7 integration is required or used.
Security notes
The plugin uses WordPress nonces, server-side validation, rate limiting, opaque temporary tokens, idempotency keys, prepared database queries, late escaping and WooCommerce CRUD APIs.
Order lookup errors are intentionally generic and do not disclose whether the order number, e-mail address or order status is the failing condition.
Limitations
The plugin does not:
- determine whether a withdrawal is legally valid;
- check product delivery dates;
- apply withdrawal exceptions automatically;
- manage return shipping;
- generate return labels;
- calculate refunds;
- create WooCommerce refunds;
- change stock;
- change WooCommerce order status automatically;
- provide legal advice or guarantee compliance.
Developer documentation
Recesso Manager for WooCommerce exposes a small public developer API through WordPress actions and filters. The supported public hook prefix is rmwc_. Use these hooks from a custom plugin or child theme; do not edit the plugin files directly.
The plugin intentionally keeps the API focused on integration points that are useful without turning the plugin into an RMA, shipping or refund system. Hook callbacks should avoid changing the historical meaning of declarations that have already been submitted.
Order and item filters
rmwc_resolve_order_id– Customize how the customer-entered order number is resolved to a WooCommerce order ID. Parameters:$order_id,$order_number,$billing_email.rmwc_allowed_order_statuses– Customize which WooCommerce order statuses can enter the withdrawal flow. The settings UI loads statuses dynamically from WooCommerce. Default:completed. Parameters:$statuses.rmwc_item_is_withdrawable– Include or exclude a specific order item from the public withdrawal form. Parameters:$is_withdrawable,$item,$order,$product.rmwc_visible_item_meta– Customize public order item metadata saved internally with the declaration. Parameters:$public_meta,$item,$order.
Validation and declaration filters
rmwc_final_confirmation_validation– Run additional server-side validation before the final declaration is saved. Returntrueto continue,falseto block with a generic error, orWP_Errorto block with a specific error message. Parameters:$valid,$flow,$order.rmwc_request_code– Customize the generated declaration code after the database row has been created. Parameters:$code,$request_id,$request_data.rmwc_statement_text– Customize the historical declaration text saved at submission time. Parameters:$text,$order,$selected_items,$customer_name,$language. Use this with caution because it changes the documentary statement stored for new declarations.
Status, label and log filters
rmwc_allowed_review_statuses– Customize the internal management statuses. Default statuses arereceived,acceptedandrejected. Parameters:$statuses. Use with caution because custom statuses may require custom UI handling.rmwc_review_status_labels– Customize human-readable management status labels. Parameters:$labels.rmwc_email_status_labels– Customize human-readable e-mail status labels. Parameters:$labels.rmwc_log_scope_for_event– Customize the event-log scope assigned to an event. Parameters:$scope,$event_type.rmwc_log_event_type_labels– Customize human-readable event labels shown in the event log. Parameters:$labels.
E-mail filters
rmwc_customer_email_subject– Customize the customer receipt subject. Parameters:$subject,$request.rmwc_customer_email_body– Customize the customer receipt HTML body. Parameters:$body,$request,$items.rmwc_merchant_email_subject– Customize the merchant notification subject. Parameters:$subject,$request.rmwc_merchant_email_body– Customize the merchant notification HTML body. Parameters:$body,$request,$items.rmwc_customer_decision_email_subject– Customize the customer decision e-mail subject. Parameters:$subject,$request,$review_status,$decision_note.rmwc_customer_decision_email_body– Customize the customer decision e-mail HTML body. Parameters:$body,$request,$items,$review_status,$decision_note.rmwc_merchant_pending_reminder_email_subject– Customize the merchant pending-reminder subject. Parameters:$subject,$request.rmwc_merchant_pending_reminder_email_body– Customize the merchant pending-reminder HTML body. Parameters:$body,$request,$items.
WooCommerce link filters
rmwc_wc_email_link_email_ids– Choose which WooCommerce e-mail IDs receive the automatic withdrawal link. Default:customer_completed_order. Parameters:$email_ids.rmwc_wc_email_link_language– Customize the language used for the automatic link in WooCommerce e-mails. Parameters:$language,$order,$email.rmwc_my_account_link_language– Customize the language used for the link in the My Account order list. Parameters:$language,$order.rmwc_my_account_detail_link_language– Customize the language used for the link in the My Account order detail page. Parameters:$language,$order.rmwc_my_account_allow_billing_email_fallback– Control whether a logged-in customer can use the order billing e-mail as fallback in the My Account flow. Parameters:$allow,$order,$user_id.
Rate limit and retention filters
rmwc_rate_limit_max_attempts– Customize failed lookup attempts before temporary blocking. Default:5. Parameters:$attempts.rmwc_rate_limit_window– Customize the rate-limit window in seconds. Default:15 * MINUTE_IN_SECONDS. Parameters:$seconds.rmwc_rate_limit_block_duration– Customize the temporary block duration in seconds. Default:30 * MINUTE_IN_SECONDS. Parameters:$seconds.rmwc_log_cleanup_scopes– Choose which log scopes are automatically cleaned. Default:technicalandsecurity. Parameters:$scopes.rmwc_log_cleanup_batch_size– Customize the log cleanup batch size. Parameters:$batch_size.rmwc_log_cleanup_max_batches– Customize the maximum number of cleanup batches per run. Parameters:$max_batches.
Actions
rmwc_before_request_created– Fires before a declaration is inserted. Parameters:$request_data,$item_rows,$order.rmwc_request_created– Fires after a declaration has been created. Parameters:$request_id,$order,$selected_items.rmwc_review_status_changed– Fires after the merchant changes the management status. Parameters:$request_id,$old_status,$new_status,$decision_note,$actor_user_id.rmwc_customer_receipt_sent– Fires after the customer receipt has been accepted bywp_mail(). Parameters:$request_id,$customer_email.rmwc_customer_receipt_failed– Fires after the customer receipt send attempt fails. Parameters:$request_id,$error_message.rmwc_merchant_notification_sent– Fires after the merchant notification has been accepted bywp_mail(). Parameters:$request_id,$recipients.rmwc_merchant_notification_failed– Fires after the merchant notification send attempt fails. Parameters:$request_id,$error_message.rmwc_customer_decision_email_sent– Fires after the decision e-mail has been accepted bywp_mail(). Parameters:$request_id,$customer_email,$review_status.rmwc_customer_decision_email_failed– Fires after the decision e-mail send attempt fails. Parameters:$request_id,$error_message,$review_status.rmwc_merchant_pending_reminder_sent– Fires after a merchant reminder has been accepted bywp_mail(). Parameters:$request_id,$recipients.rmwc_merchant_pending_reminder_failed– Fires after a merchant reminder send attempt fails. Parameters:$request_id,$error_message.rmwc_technical_logs_cleaned– Fires after automatic technical/security log cleanup. Parameters:$deleted_count,$threshold_gmt,$scopes.
Examples
Allow processing orders as well as completed orders:
add_filter( 'rmwc_allowed_order_statuses', static function ( $statuses ) { return array( 'completed', 'processing' ); } );
Run a custom integration after a declaration is created:
add_action( 'rmwc_request_created', static function ( $request_id, $order, $selected_items ) { /* Send data to your internal system. */ }, 10, 3 );