

Form where the customer enters their billing email and order number
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.
Developed by Giacomo Zamprogno.
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.
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.
Requires Plugins: woocommerce header.The plugin uses WooCommerce CRUD APIs and declares compatibility with WooCommerce High-Performance Order Storage (HPOS).
The settings page includes:
%s placeholder for the privacy policy link.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.
[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.
The essential workflow works without JavaScript.
The Recesso Manager menu contains:
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.
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:
Multilingual page handling:
Recommended setup:
[rmwc_withdrawal_form].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.
The plugin creates these custom tables:
{$wpdb->prefix}rmwc_requests{$wpdb->prefix}rmwc_request_items{$wpdb->prefix}rmwc_request_logsDefault retention settings:
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.
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:
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.
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.
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.
The plugin does not:
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.
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.rmwc_final_confirmation_validation – Run additional server-side validation before the final declaration is saved. Return true to continue, false to block with a generic error, or WP_Error to 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.rmwc_allowed_review_statuses – Customize the internal management statuses. Default statuses are received, accepted and rejected. 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.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.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.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: technical and security. 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.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 by wp_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 by wp_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 by wp_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 by wp_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.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 );