UDX Easy Returns & Refunds for WooCommerce

Description

UDX Easy Returns & Refunds for WooCommerce adds a complete returns workflow to WooCommerce. Customers can request returns from My Account, guests can verify an order by email code, and store managers can review requests from a dedicated WooCommerce admin screen.

The plugin is built for stores that need a practical RMA-style process, configurable EU withdrawal information, secure uploads, partial returns, status notes and clear customer communication.

Main Features

  • Return, refund, exchange and withdrawal requests – customers can choose the request type that matches their case.
  • Guest order returns – guests verify an order with Order ID, billing email and a one-time email code.
  • My Account integration – logged-in customers can start returns and view request history from a WooCommerce account endpoint.
  • Partial returns – customers can choose specific order items and quantities.
  • Shipping refund option – store owners can allow customers to request shipping cost refunds.
  • File uploads – optional evidence uploads with server-side file type, size and ownership checks.
  • Bundle product support – bundled products can be handled as one returnable bundle, with bundled children displayed below the parent item.
  • WooCommerce Subscriptions support – subscription orders and subscription line items can be included or excluded with a setting.
  • Configurable button colors – primary, hover and text colors can be adjusted from the settings screen.
  • Admin dashboard – manage requests, statuses and internal/customer notes from WooCommerce admin.
  • Order metabox – see related return requests directly on the WooCommerce order screen.
  • Email notifications – verification codes, submission confirmations and status updates.
  • EU withdrawal support – configurable return period, withdrawal notice, policy text and exclusions for digital products or categories.
  • HPOS compatible – declares compatibility with WooCommerce High-Performance Order Storage.
  • No jQuery dependency – frontend and admin interactions use vanilla JavaScript.
  • Translation ready – strings are internationalized and a Polish translation file is included.

Security and Data Handling

The plugin was reviewed with WordPress.org expectations in mind and includes:

  • Nonce verification on AJAX actions.
  • WooCommerce admin capability checks for management actions.
  • Sanitization with wp_unslash(), sanitize_text_field(), sanitize_textarea_field(), sanitize_email(), absint() and related WordPress APIs.
  • Escaping of frontend, admin and email output.
  • Guest verification codes stored as hashes in transients.
  • Rate limiting for verification code requests and uploads.
  • Anti-enumeration responses for guest order verification.
  • Guest sessions stored in transients and bound to the requester IP.
  • Secure HttpOnly SameSite guest cookie for verified sessions.
  • Upload validation for allowed extensions and MIME types: JPG, PNG, WebP, GIF and PDF.
  • Upload ownership metadata, so users and guests can only attach files they uploaded.
  • Daily cleanup of orphaned private evidence uploads.
  • Scheduled hook cleanup on uninstall, with optional full data cleanup controlled from settings.
  • A phpcs.xml.dist ruleset for WordPress Coding Standards, PHP 7.4+ and WooCommerce capability awareness.

Settings

Store owners can configure:

  • Return request page.
  • Optional data deletion when the plugin is deleted.
  • Return period in days.
  • Eligible WooCommerce order statuses.
  • Return reasons.
  • Return shipping address (sent to the customer once a request is approved).
  • Admin notification email.
  • Auto-approval for new requests.
  • Auto-completing a return request when its order reaches a chosen status (for warehouse/OMS integrations such as BaseLinker).
  • Customer cancellation of pending requests.
  • Partial item and quantity returns.
  • Shipping refund requests.
  • Evidence uploads.
  • Guest access.
  • Verification code lifetime.
  • Maximum verification code requests per hour.
  • WooCommerce Subscriptions support.
  • Bundle product support.
  • Primary button color, hover color and text color.
  • EU withdrawal notice.
  • Custom return policy text.
  • Digital/downloadable product exclusion.
  • Product category exclusions.

EU Withdrawal and Consumer Rights

This plugin helps store owners present and record a clear return/withdrawal process. It includes a configurable 14-day default withdrawal period, an EU notice on the return form, request timestamps and status history.

Legal requirements can differ by country, product type and business model. Store owners should review their final policy text with a qualified legal advisor.

How Guest Access Works

  1. A guest opens the Return Request page.
  2. They enter the Order ID and billing email address.
  3. The plugin sends a one-time verification code if the order and email match.
  4. The guest enters the code and receives a temporary verified session.
  5. The guest can submit a return request for that order.
  6. The session is destroyed after successful submission or when it expires.

Supported Product Types

The plugin works with standard WooCommerce order items and includes optional logic for subscription products and common bundle product structures, including WooCommerce Product Bundles-style metadata, WPC Smart Bundles, YITH bundles and Easy Product Bundles-style parent/child metadata.

Bundle children are not returned separately when a bundle parent represents the group. The return form shows the bundle as one selectable item and displays included products below it.

Development Standards

The plugin includes a phpcs.xml.dist configuration and has been checked against WordPress Coding Standards. Development checks used during preparation include PHP linting, JavaScript syntax checks and PHPCS with WPCS/PHPCompatibilityWP tooling.

Support

If this plugin helps your store, you can support the work here: https://buymeacoffee.com/traskowski

Screenshots

Blocks

This plugin provides 1 block.

  • UDX Return Form

Installation

  1. Upload the udx-easy-returns-refunds-for-woocommerce folder to /wp-content/plugins/.
  2. Activate the plugin through the WordPress Plugins screen.
  3. Go to WooCommerce > Returns Settings and review the options.
  4. The plugin creates a Return Request page with the [udxretwc_return_form] shortcode on activation.
  5. You can also add the UDX Return Form block manually to another page.

FAQ

Does this plugin require WooCommerce?

Yes. WooCommerce 7.0 or higher is required.

Does it process refunds automatically?

The plugin never moves money on its own. A store manager reviews each request and processes the refund from the return request screen.

There is an optional auto-approval setting, but it only changes the request status to approved — it does not refund any payment.

When a manager processes a refund, they can also choose to refund the payment. If the order’s payment gateway supports API refunds, the amount is returned through the gateway automatically; otherwise WooCommerce records the refund and the payment is returned manually. The return request and order statuses are updated accordingly.

Can guests request returns without creating an account?

Yes. Guests verify ownership with Order ID, billing email and a one-time code sent by email.

Can customers return only part of an order?

Yes. Store owners can enable partial returns so customers can select specific items and quantities.

Can customers upload photos?

Yes, if uploads are enabled. The plugin accepts JPG, PNG, WebP, GIF and PDF files up to 5 MB each, with a maximum of 3 files per request.

How are bundle products handled?

When bundle support is enabled, bundle groups are represented by one selectable bundle item. Child products are displayed as included items and are not returned separately.

Is WooCommerce Subscriptions supported?

Yes. Store owners can enable or disable return eligibility for subscription orders and subscription line items.

Is it compatible with WooCommerce HPOS?

Yes. The plugin declares compatibility with WooCommerce High-Performance Order Storage.

How should I secure the uploads folder for file uploads?

Uploaded evidence files are validated by file extension and by real MIME type (the client-reported type is not trusted), are size-limited, are bound to the uploading customer or guest, are stored as private attachments, and executable types such as PHP are rejected.

As an additional, strongly recommended hardening step, configure your web server so the WordPress uploads directory cannot execute PHP or other scripts:

  • On Apache, add an .htaccess file in wp-content/uploads/ that denies access to PHP files (for example, a <Files *.php> block with Require all denied).
  • On NGINX, add a location rule that denies requests matching \.php$ under wp-content/uploads/.

This is a general WordPress security best practice and protects your entire site, not only this plugin. If you extend the allowed upload types with the provided filters, never allow executable extensions or MIME types.

Does the plugin provide hooks for developers?

Yes. The plugin exposes actions and filters across its lifecycle so you can extend behavior without modifying core files.

Actions:

  • udxretwc_before_return_request_created ( $data, $order ) — before a request is created.
  • udxretwc_return_request_created ( $request_id, $data ) — after a request is created.
  • udxretwc_return_request_submitted ( $request_id ) — after a request is fully submitted (triggers emails).
  • udxretwc_return_status_changed ( $request_id, $new_status, $old_status ) — on any status change.
  • udxretwc_status_changed_{status} ( $request_id, $old_status ) — dynamic, e.g. udxretwc_status_changed_approved.
  • udxretwc_note_added ( $request_id, $note, $author ) — after any note is added.
  • udxretwc_admin_note_added ( $request_id, $note ) — after an admin note is added.
  • udxretwc_return_request_cancelled ( $request_id ) — after a customer cancels a request.
  • udxretwc_before_refund_processed ( $request_id, $order, $refund_args ) — before the WooCommerce refund is created.
  • udxretwc_refund_processed ( $request_id, $refund, $order ) — after the refund is created.
  • udxretwc_file_uploaded ( $attachment_id, $upload_owner ) — after an evidence file is uploaded.
  • udxretwc_send_verification_code ( $email, $code, $order ) — when a guest verification code is issued.
  • udxretwc_before_return_form / udxretwc_after_return_form ( $order, $is_guest ) — around the return form.
  • udxretwc_before_my_account_requests / udxretwc_after_my_account_requests ( $requests ) — around the My Account list.
  • udxretwc_before_template / udxretwc_after_template ( $template, $args ) — around any plugin template.
  • udxretwc_settings_page_notices () — fires at the top of the plugin’s WooCommerce Settings Returns tab, before any fields; useful for adding your own integration notices (e.g. a warehouse/OMS mapping note) without modifying this plugin.

Filters:

  • udxretwc_create_request_data ( $data ) — modify request data before saving.
  • udxretwc_new_request_default_status ( $status, $data ) — set the initial status.
  • udxretwc_can_change_status ( $allowed, $request_id, $new_status, $old_status ) — block status transitions.
  • udxretwc_return_period_days ( $days, $order ) — per-order return window.
  • udxretwc_item_is_returnable ( $is_returnable, $item, $order ) — exclude specific items.
  • udxretwc_returnable_items ( $items, $order ) — adjust the full list of returnable items.
  • udxretwc_return_reasons ( $reasons, $order ) — modify the available reasons.
  • udxretwc_return_statuses ( $statuses ) — register or relabel statuses.
  • udxretwc_request_type_labels ( $labels ) — modify request type labels.
  • udxretwc_is_order_eligible ( $eligible, $order ) — final eligibility check.
  • udxretwc_validate_submission ( $error, $data, $order ) — add custom submission validation (return WP_Error to reject).
  • udxretwc_can_cancel_request ( $can_cancel, $request_id, $user_id ) — control cancellation.
  • udxretwc_max_upload_size ( $bytes ) — maximum upload size.
  • udxretwc_allowed_upload_extensions ( $extensions ) — allowed file extensions.
  • udxretwc_allowed_upload_mimes ( $mimes ) — allowed MIME types.
  • udxretwc_refund_line_items ( $line_items, $request_id, $order ) — adjust refund line items.
  • udxretwc_refund_total ( $refund_total, $request_id, $order ) — adjust the refund total.
  • udxretwc_restock_items ( $restock, $request_id, $order ) — control restocking.
  • udxretwc_refund_args ( $refund_args, $request_id, $order ) — adjust wc_create_refund() arguments.
  • udxretwc_should_mark_order_refunded ( $should, $order, $request_id ) — control order status update.
  • udxretwc_template_path ( $path, $template, $args ) — override a template path.
  • udxretwc_template_args ( $args, $template ) — modify template arguments.

For security reasons, some values are intentionally not filterable, including verification code length and lifetime, the maximum number of verification attempts, and upload rate limits.

How do I integrate with BaseLinker or another warehouse/OMS system?

Go to WooCommerce Settings Returns Automation and pick a WooCommerce order status under “Auto-Complete on Order Status”. Whenever an order reaches that status, any Approved return request linked to it is automatically moved to Completed — no code required.

This works with BaseLinker (or any other warehouse/OMS) without an extra API token or webhook: BaseLinker already pushes order status changes into WooCommerce through the standard WooCommerce REST API once you map its own “returned” status to a WooCommerce order status in its own panel. If you don’t already have a suitable WooCommerce order status for this, register a dedicated one first with register_post_status() plus the wc_order_statuses filter, then select it here.

The actual money refund stays a deliberate, manual step — use the “Process Refund” button on the return request detail screen.

Need more than a single global target status? Use the udxretwc_settings_page_notices action to add your own notice to this settings screen, or build fully custom logic on the standard WooCommerce woocommerce_order_status_changed hook combined with the plugin’s _udxretwc_order_id post meta and UDXRETWC_Post_Types::update_status().

Can the description be translated on WordPress.org?

Yes. The plugin’s source language is English (text domain udx-easy-returns-refunds-for-woocommerce). Translations, including the readme description, are managed through translate.wordpress.org. A Polish translation is bundled with the plugin as a fallback until directory translations are complete.

Reviews

There are no reviews for this plugin.

Contributors & Developers

“UDX Easy Returns & Refunds for WooCommerce” is open source software. The following people have contributed to this plugin.

Contributors

Changelog

1.0.3

  • Added: built-in “Auto-Complete on Order Status” setting (Settings Returns Automation) — automatically completes Approved return requests when their linked order reaches a chosen WooCommerce order status, for warehouse/OMS integrations such as BaseLinker. No code required.
  • Changed: the BaseLinker FAQ entry now documents this built-in setting as the primary path, with the hook-based approach kept as an advanced/custom option.

1.0.2

  • Added: udxretwc_settings_page_notices action, fired at the top of the Settings Returns tab, for adding custom integration notices without modifying the plugin.
  • Added: “Buy Me a Coffee” link on the Settings Returns screen and on the admin review-request notice.
  • Added: FAQ entry documenting a BaseLinker/warehouse-system integration pattern built entirely on standard WooCommerce order-status hooks.

1.0.1

  • Fixed: admin and frontend CSS/JS assets still used the old erfwc prefix after the udxretwc rename, breaking admin AJAX (status/notes/refund/rate prompt), the frontend return form (guest verification, item selection, upload, cancel), all plugin styling and the block editor registration.
  • Fixed: stale developer-hook and shortcode references in the readme.
  • Added: “Return Approved – Shipping Address” customer email plus a return shipping address setting.
  • Bumped version to force browsers to fetch the corrected CSS/JS instead of stale cached copies.

1.0.0

  • Initial release.
  • Added guest order verification via secure email code.
  • Added My Account return requests endpoint.
  • Added WooCommerce admin dashboard, status changes and notes.
  • Added return, refund, exchange and EU withdrawal request types.
  • Added partial returns with item quantity selection.
  • Added optional shipping refund requests.
  • Added evidence uploads with validation and orphan cleanup.
  • Added WooCommerce Subscriptions compatibility option.
  • Added bundle product compatibility option with whole-bundle return behavior.
  • Added configurable button colors.
  • Added EU withdrawal notice, policy text and product/category exclusions.
  • Added HPOS compatibility declaration.
  • Reworked frontend and admin JavaScript to vanilla JS.
  • Added security hardening for nonces, sanitization, escaping, guest sessions, transient cleanup and uploads.
  • Added developer actions and filters across the request, status, refund, upload, form and template lifecycle.
  • Added filters to control upload size and allowed upload types.
  • Added WordPress Coding Standards PHPCS configuration.
  • Added Polish translation files.