Plugin documentation

WC Cancel Order

Customers ask to cancel a WooCommerce order from My Account, or from a link in the order email if they are guests. You approve or decline each request, and the store and the customer are emailed.

Version 3.7.0 WooCommerce plugin Free plugin Requires WordPress 6.7 Requires PHP 8.0 Tested up to 7.1 Updated 6 Oct 2026

1. Overview

WC Cancel Order lets a customer ask to cancel a WooCommerce order from My Account → Orders, or, for a guest, from a link in the order email. The customer clicks Cancel Request, explains why, and the order moves to a status called Cancel Request. Nothing is cancelled until you decide.

You review each request under WooCommerce → WC Cancel and approve or decline it. Approving sets the order to Cancelled, and WooCommerce puts the stock back. Declining returns the order to the status it had before the request. The store and the customer are emailed at each step.

This page documents version 3.7.0. In the admin menu and in the WooCommerce settings the plugin appears as "WC Cancel". It does not refund payments: approving a request cancels the order only. Refunds, partial cancellation and instant cancellation belong to the paid WC Cancel Order Pro, which uses the same data (see WC Cancel Order and WC Cancel Order Pro together).

How it works

  1. The customer opens an eligible order in My Account and clicks Cancel Request.
  2. A popup asks for "Cancellation details" and shows your own note, if you wrote one.
  3. The plugin records the request, saves the customer's text on the order, and sets the order status to Cancel Request. The store receives the "Cancellation Request Received" email.
  4. You open WooCommerce → WC Cancel, read the request and click Approve Request or Decline Request.
  5. On approval the order becomes Cancelled and the customer receives the "Cancellation Request Approved" email. On decline the order returns to its previous status and the customer receives the "Cancellation Request Declined" email.

At a glance

Customer request

A Cancel Request button on the orders list and the order page, for the order statuses you choose (default: Pending payment, Processing, On hold).

You decide

Every request waits for your approval. One screen lists them with Pending, Approved and Declined links, counts and a search box.

Guests too

Guests get a "Want to cancel this order?" link in their order emails. It opens a page for that one order. On by default.

Three emails

Request received (to the store), approved and declined (to the customer). Subject, heading and format are editable in WooCommerce; the store email also has a recipients field.

No double requests

A double click or two tabs create one request and one email. Two admins cannot decide the same request twice.

Works with Pro

Pro reads the same settings and requests, so you can upgrade without losing anything.

What it does not do

  • It does not refund money. Approving a request cancels the order and WooCommerce restores stock; refund the payment from the order screen as usual.
  • It does not cancel single items or quantities. A request is always for the whole order.
  • It does not cancel an order without your approval. There is no instant cancellation.
  • It has no limit by user role and no time limit. Eligibility depends on the order status and on whether an earlier request was already decided; for logged-out visitors it also depends on the guest setting.
  • It has no cancellation fee, reason list or wallet. These are Pro features.
  • It adds no shortcodes you need to place, no blocks, no REST routes and no WP-CLI commands.

2. Requirements

ItemRequirement
WordPress6.7 or later (tested up to 7.1). The plugin header also carries Requires Plugins: woocommerce, which WordPress reads for its plugin-dependency check.
PHP8.0 or later.
WooCommerce8.0 or later (tested up to 11.1). WooCommerce must be active and installed in the folder woocommerce: the plugin starts only when woocommerce/woocommerce.php is in the active plugins list.
PermalinksPretty permalinks (anything except Plain) for the guest cancellation page. WordPress only provides the request path the plugin matches when rewrite rules are in use (checked in WordPress 7.1.2, WP::parse_request).
EmailA working WordPress mail setup. The plugin sends its emails through WooCommerce's email system.
Other pluginsNone needed. The plugin ships a wpml-config.xml for WPML. WC Cancel Order Pro, if installed and active, replaces this plugin (see below).
BrowserThe popup uses the native <dialog> element and jQuery, which WordPress already loads.

If WooCommerce is not active, the plugin does nothing and shows no message of its own. Declared compatibility with WooCommerce features: High-Performance Order Storage (custom_order_tables), Cart and Checkout blocks (cart_checkout_blocks), analytics, new navigation, product block editor, marketplace, order attribution and HPOS full-text search indexes.

3. Installation

  1. Make sure WooCommerce is installed and active.
  2. Open Plugins → Add Plugin, search for "WC Cancel Order", then click Install Now and Activate. To install from a zip file, use Plugins → Add Plugin → Upload Plugin.
  3. Open WooCommerce → Settings → WC Cancel and review the five settings (see Settings).
  4. Open WooCommerce → Settings → Emails and check the recipient of "Cancellation Request Received".

What activation creates

  • The database table {prefix}wc_cancel_orders, with indexes on order_id, user_id and cancel_request_date.
  • The option wc_cancel_db_version, written when the table check runs. The settings option wc_cancel_settings is created the first time you save the settings screen.
  • On the Plugins screen, two links under the plugin name: Settings and Get Pro Version.

The plugin creates no pages, no user roles and no scheduled events. The guest cancellation page is a virtual page served at /guest-cancel-req/; it does not exist in Pages and needs no rewrite flush.

Updating and what is kept

Updating keeps your settings, requests and email settings. The first admin page load after an update runs a table check when wc_cancel_db_version differs from the plugin version. It creates the table if it is missing, makes the two date columns nullable, and adds the three indexes if they are absent.

Multisite

The plugin starts when WooCommerce is active on the site or network-wide. Each site has its own table (its own prefix), settings and requests. The table check runs on a site's first admin request, so a site that was not the one you activated on still gets its table. On deletion, uninstall.php repeats the clean-up for every site in the network (see Privacy).

Pro replaces this pluginIf you activate WC Cancel Order Pro, it deactivates this plugin and takes over its settings and requests. Do not run both. Details: WC Cancel Order and WC Cancel Order Pro together.

4. Quick start

  1. Activate the plugin and check that Settings → Permalinks is not set to Plain.
  2. Open WooCommerce → Settings → WC Cancel. Leave Allow cancellation requests for order statuses as it is, or choose your own statuses. Write a short note (for example your cancellation policy) in Note shown in the cancel popup. Click Save changes.
  3. Open WooCommerce → Settings → Emails → Cancellation Request Received and set the recipient (it defaults to the site admin email).
  4. Place a test order, sign in as that customer and click Cancel Request in My Account → Orders. Enter some text and click Confirm Cancellation.
  5. Open WooCommerce → WC Cancel. Click View Request to read it, then Approve Request or Decline Request, then Confirm.
  6. If you approved an order the customer had already paid for, refund it from the order screen. This plugin does not refund.

5. Features

The Cancel Request button

The plugin adds an order action called Cancel Request (action key wc-cancel-order) through the WooCommerce filter woocommerce_my_account_my_orders_actions at priority 100. WooCommerce 11.1.2 uses that filter for the buttons in My Account → Orders and for the "Actions" row of the order page. The button appears when both of these are true:

  • The order's status is one of the statuses selected in Allow cancellation requests for order statuses.
  • No request for this order has been decided yet. Once a request is approved or declined, the button never returns for that order.

The button does not check who is looking at it. The server checks that when the request is sent: a logged-in user always passes, a logged-out visitor passes only when Allow guest cancellation is on. So on the order-received (thank-you) page a logged-out visitor can see the button while guest cancellation is off, and the request is then refused.

The plugin also removes WooCommerce's own Cancel action from the same list, so a Pending payment order shows Cancel Request instead of an immediate cancel link. The result passes through the filter wc_cancel_order_btn.

Hiding the button does not stop a request. When the customer submits the popup, the server checks the order again (see What happens when a request is sent), but it does not use wc_cancel_order_btn.

The request popup

Clicking the button opens a popup instead of following the link. It contains:

  • The title "Request Order Cancellation" and the line "Order #" followed by the order number.
  • Your note, if you wrote one under Note shown in the cancel popup. Basic HTML is allowed in it.
  • A text box headed "Cancellation details" (5 rows). The server keeps the first 5,000 characters.
  • Two buttons: Close and Confirm Cancellation.

If Require cancellation details is on and the box is empty, the popup shows "Cancellation details required!" and does not send. The server checks the same rule, so a request that bypasses the popup is refused with the same message. On success the popup shows "Cancellation request sent successfully." and the page reloads after about 1.5 seconds. If the request fails, the popup stays open with an error such as "Cancellation request could not be processed. Please try again." instead of reporting success.

The popup is built on the native <dialog> element. It has a close button, a heading label for screen readers, a busy state while sending, closes with Esc or a click on the backdrop, and returns the focus to the button that opened it. It has layouts for phones and right-to-left languages.

The popup scripts and styles load only on pages that need them: the orders, view-order and order-received endpoints of My Account and checkout, and any page whose content contains [wc_cancel_order_details]. Use the filter wc_cancel_order_init_script to load them elsewhere.

What happens when a request is sent

  1. The plugin takes a lock for the order (waiting up to 10 seconds) so that two requests at the same moment cannot both run. If it cannot get the lock, the customer sees "Your cancellation request is being processed. Please try again in a moment."
  2. It reads the order fresh from the database and checks that the request is allowed: the nonce is valid, no earlier request was decided, guest cancellation is on (for logged-out visitors), the visitor is the order's customer or holds the order's key, and the order's status is one of the selected statuses. If a check fails, nothing is changed.
  3. If details are required and empty, it stops with "Cancellation details required!".
  4. It saves the customer's text in the order meta _wc_cancel_additional_txt.
  5. It writes the request row (is_approved = 0, request date in GMT).
  6. It sets the order status to Cancel Request with the order note "Order Status updated by Wc Cancel Order." The previous status is saved in _wc_cancel_prev_status when the status changes.
  7. The status change sends the "Cancellation Request Received" email to the store, and the plugin then fires the action wc_cancel_request with the order ID.

Guest cancellation

With Allow guest cancellation on (the default), the plugin adds a block to WooCommerce customer emails (hook woocommerce_email_customer_details, priority 999): the heading "Want to cancel this order?" and a link "Cancel Order". In plain-text emails it prints the heading and the URL. The block is not added to emails sent to the store.

The link appears only when the order has a cancel key (order meta _wc_cancel_key, set at checkout), its status is one of the selected statuses, and no earlier request was decided. Orders placed before the plugin was installed have no key and get no link. The link opens:

https://example.com/guest-cancel-req/?key=THE_KEY

That page is virtual: titled "Order Details", with the shortcode [wc_cancel_order_details] as its content, shown inside your theme's page layout. It displays the order using WooCommerce's order page template, including the Cancel Request button. If the key is wrong, or guest cancellation is off, it shows "Sorry, this order is invalid and no details found."

When the customer submits the popup on that page, the page's key is sent with the request and checked against the order. On the order-received (thank-you) page, key is WooCommerce's own order key, which the plugin also accepts.

CarefulAnyone who has the link can see the order details on that page and send a cancellation request for the order. The link goes to the billing email address of the order. Customers should not forward it.

The requests list

Open WooCommerce → WC Cancel (capability manage_woocommerce). The screen is titled "Cancellation Requests" and has a Settings button. While requests are waiting, the menu item shows a bubble with the number of orders currently in Cancel Request.

  • Status links: All, Pending, Approved and Declined, each with a count. The counts respect the search box.
  • Search: the "Search orders" box uses WooCommerce's own order search (order number, name, email, address and item names). A number you type is also tried as an order ID.
  • Columns: Order (order number and buyer name, linked to the order), Date, Status (the order's status, with a tooltip of the latest order note), Request Status (Pending, Approved or Declined), Total and Actions.
  • Date: shown as "x ago" for the first 24 hours, then as a date and time in the site's timezone.
  • Paging: 20 requests per page, newest request first.
  • Empty list: "No cancellation requests yet. When a customer asks to cancel an order it will show up here for you to approve or decline." With a filter or search: "No cancellation requests match these filters."

The list shows orders that are in the Cancel Request status and orders that have a request row. An order that was moved to Cancel Request by hand has no row and counts as Pending. A request row of an order that has since been deleted is not listed.

Each row has View Request. A pending request in the status Cancel Request also has Approve Request and Decline Request. There are no bulk actions in the free plugin. The filter wc_cancel_order_admin_action lets code change the row buttons.

Approving and declining

All three buttons open a popup. View Request ("Cancellation Request Detail") shows the customer's text under "Cancellation details :" (or "--" when empty), the "Request Date:", and, once decided, a banner "Cancellation Request Approved." with the "Approved Date:" or "Cancellation Request Declined." with the "Declined Date:". The approve and decline popups ("Approve Cancellation Request ?" and "Decline Cancellation Request ?") show the same details with Close and Confirm buttons.

Approve does this, under a lock for the order:

  1. Checks that the order is still in Cancel Request. If not, the popup shows "This order has no pending cancellation request."
  2. Marks the request row approved (is_approved = 1) and saves the decision (approved, heading, GMT date) in the order meta _wc_cancel_request_data.
  3. Sets the order to Cancelled with the order note "Cancellation Request Approved."
  4. WooCommerce restores stock for an order that had reduced it (WooCommerce 11.1.2 hooks wc_maybe_increase_stock_levels to the Cancelled status). The plugin does not change stock itself.
  5. Sends the "Cancellation Request Approved" email to the billing email of the order.

Decline marks the row declined (is_approved = 2), saves the decision, sets the order back to its previous status with the order note "Cancellation Request Declined.", and sends the "Cancellation Request Declined" email. The previous status is the one stored when the request was made. If none is stored (requests made before version 3.6.2) or it is not a valid status, the order goes to Processing. The filter wc_cancel_declined_status can change the result. A declined customer does not see the Cancel Request button again.

If two people click at the same moment, the second sees "This request is being processed right now. Please wait a moment and reload the list." After a successful decision the list reloads.

No refundThe plugin never refunds a payment. After approving a paid order, refund it yourself from the order screen, or upgrade to WC Cancel Order Pro, which can refund on approval.

When you change the status yourself

You can also move an order out of Cancel Request from the order screen, a bulk action or another plugin. The plugin watches every status change that involves Cancel Request:

ChangeWhat the plugin does
Any status to Cancel RequestSaves the previous status, and sends the "Cancellation Request Received" email to the store. This also happens when you set Cancel Request by hand.
Cancel Request to CancelledMarks a pending request row approved and sends the "Cancellation Request Approved" email.
Cancel Request to RefundedMarks a pending request row approved. No email is sent.
Cancel Request to FailedThe request row is left as it is. No email is sent.
Cancel Request to any other statusMarks a pending request row declined and sends the "Cancellation Request Declined" email.

Before version 3.7.0 such a request stayed "Pending" in the list for ever. A request row is only changed while it is still pending.

The Cancel Request order status

The plugin registers the order status wc-cancel-request with the label "Cancel Request". It is public, appears in the status links of WooCommerce → Orders with a count, and is offered in the order status drop-down. It is never offered in the plugin's own status list.

The statuses Cancelled, Refunded, Failed, Cancel Request and WooCommerce's internal Draft are not offered in Allow cancellation requests for order statuses. Every other status, including Completed, can be selected.

Emails

The plugin adds three emails to WooCommerce → Settings → Emails. Their text and layout come from WooCommerce's email header and footer, the order details table, the customer details and the customer's text ("Cancellation Details:" followed by what the customer wrote).

Email (ID)Sent toWhenDefault subjectDefault heading
Cancellation Request Received (wc_cancel_request_received)The recipients you set; the site admin email while the field is empty.The order moves to Cancel Request.[{site_title}]: Order (#{order_number}) cancellation request received.Order cancellation request received
Cancellation Request Approved (wc_cancel_request_approved)The billing email of the order.You approve, or the order moves from Cancel Request to Cancelled.[{site_title}]: Order (#{order_number}) cancellation request approved.Order cancellation request approved
Cancellation Request Declined (wc_cancel_request_declined)The billing email of the order.You decline, or the order leaves Cancel Request for a status other than Cancelled, Refunded or Failed.[{site_title}]: Order (#{order_number}) cancellation request declined.Order cancellation request declined
  • The "Received" email also contains a link "Review this request" to WooCommerce → WC Cancel filtered to Pending (request_status=pending).
  • The Approved email says "Your order (#N) cancellation request is approved and order has been marked as cancelled." The Declined email says "Your order (#N) cancellation request is declined, The order details are shown below for your reference:". The plain-text customer emails do not include admin-only links or SKUs.
  • The "Received" email has these fields: Enable/Disable, Recipient(s), Subject, Email heading and Email type. The Approved and Declined emails have WooCommerce's standard fields (Enable/Disable, Subject, Email heading, Additional content and Email type, plus any extra fields your WooCommerce version adds). The plugin's templates do not print "Additional content", so it has no visible effect on these emails.
  • Subject and heading accept the placeholders {order_date} and {order_number}, and WooCommerce's {site_title}, {site_address} and {site_url}.
  • If an email is disabled, or the order has no billing email, no email is sent.

Protection against duplicates

Requests for the same order are processed one at a time, and so are decisions. The plugin uses a MySQL named lock (GET_LOCK()), released automatically when the PHP request ends. If the database does not support it, it falls back to a row in the options table named wcc_lock_ followed by a hash, which expires after 120 seconds if a request crashes. After taking a lock, the order is read again from the database, not from a cache. The effect: one request and one email for a double click, and a second admin gets a message instead of a second decision.

Compatibility

  • HPOS: the requests list and the guest key lookup use the HPOS tables when High-Performance Order Storage is on, and the posts tables otherwise. Order links use WooCommerce's own edit URL, which is right for both.
  • Cart and Checkout blocks: the cancel key is written for orders placed with block checkout (through woocommerce_store_api_checkout_order_processed) and with classic checkout (woocommerce_checkout_update_order_meta).
  • Translations: text domain wc-cancel-order. The plugin ships a template (wc-cancel-order.pot) and translations for en_US, fr_FR and it_IT.
  • WPML: wpml-config.xml marks the order meta _wc_cancel_reason, _wc_cancel_additional_txt and _wc_cancel_request_data as translatable, and the settings key confirm-note (and the Pro key reason-options) as admin text. This was not tested against WPML here.

WC Cancel Order and WC Cancel Order Pro together

WC Cancel Order (the free plugin, folder wc-cancel-order, version 3.7.0) and WC Cancel Order Pro (folder wc-cancel-order-pro, version 4.10.0) are two builds of one cancellation workflow. They read and write the same settings option, the same request table, the same order status and the same email settings. A store can therefore move from one to the other without entering its data again. Only one of them runs at a time.

Which plugin runs

  • Pro is active: the free plugin does not start. Its main file starts the plugin only when WooCommerce is active and wc-cancel-order-pro/wc-cancel-order-pro.php is not in the list of active plugins.
  • Pro switches the free plugin off. When you activate Pro, it deactivates the free plugin and shows the notice "WC Cancel Order (free) has been deactivated because WC Cancel Order Pro is now active. Only the Pro version is needed." Pro repeats the check on every request (on init, priority 5), so activating the free plugin again while Pro is active has no lasting effect.
  • Going back to the free plugin: deactivate Pro, then activate the free plugin. Settings and data stay in the database and the free plugin carries on with them.
  • Keep both folders named as shipped. The checks above look for the folder names wc-cancel-order and wc-cancel-order-pro.

Data both plugins use

ItemWhat it holdsUsed by the free pluginUsed by Pro
Option wc_cancel_settingsOne array with all settings. Saved with autoload off.Five keys: req-status, text-required, confirm-note, guest-cancel, delete-data.27 keys: those five and 22 more (listed in the Pro documentation).
Table {prefix}wc_cancel_ordersOne row per order that had a full cancellation request. {prefix} is the database table prefix of the site. is_approved is 0 (pending), 1 (approved) or 2 (declined).Columns id, order_id, user_id, is_approved, cancel_request_date and cancel_date.Those six plus decision_date, refund_method, refund_amount, cancel_fee, refund_id, refund_txn_id and refund_gateway. Pro adds the missing columns to a table the free plugin created.
Option wc_cancel_db_versionThe plugin version that last checked the tables.Writes 3.7.0. When the stored value differs, it runs its table check on the next admin request.Writes 4.10.0 whenever it creates its tables.
Order status wc-cancel-request (Cancel Request)An order waiting for a decision on a full cancellation request.Registers and uses it.Registers and uses it. Pro also registers wc-partial-request and wc-partial-cancelled.
Order meta _wc_cancel_key, _wc_cancel_additional_txt, _wc_cancel_request_data, _wc_cancel_prev_statusThe key for the guest link, the customer's text, the decision (approved or declined, heading and date) and the status the order had before the request.Reads and writes all four.Reads and writes the key, the text and the previous status. It writes the decision too, but reads it from the request table, not from this meta. Pro also writes _wc_cancel_reason (the reason the customer chose).
Email settings woocommerce_wc_cancel_request_received_settings, woocommerce_wc_cancel_request_approved_settings, woocommerce_wc_cancel_request_declined_settingsEnabled, recipient, subject, heading and type of the three emails with the IDs wc_cancel_request_received, wc_cancel_request_approved and wc_cancel_request_declined.Sends these three emails.Sends the same three, with the same IDs and the same stored settings, plus four more of its own.
Shared namesThe menu WooCommerce → WC Cancel (page wc_cancel), the settings tab WooCommerce → Settings → WC Cancel (wc_cancel_settings), the AJAX actions wc_cancel_request and wc-cancel-request, the shortcode [wc_cancel_order_details], the guest page /guest-cancel-req/, the filters wc_cancel_order_btn, wc_cancel_order_init_script, wc_cancel_order_admin_action and wc_cancel_settings, and the action wc_cancel_request.Provides all of them.Provides all of them.

Pro alone creates the tables {prefix}wc_cancel_partial_requests, {prefix}wc_cancel_partial_items and {prefix}wc_cancel_wallet_txns, the user meta _wc_cancel_wallet_balance, the options wc_cancel_pro_schema_version and wc_cancel_pro_flush_rewrite, and the settings of its Store Wallet payment method and its four extra emails. The free plugin never reads them.

The five settings both plugins read

KeyLabel in the free pluginLabel in ProDefault while nothing is storedDifference
req-statusAllow cancellation requests for order statusesAllow cancellation requests for order statusesPending payment, Processing, On hold (both)Same meaning. In Pro, statuses listed in "Allow immediate full cancellation for order statuses" win over this list.
text-requiredRequire cancellation detailsRequire text inputFree: on. Pro: off.Both mean that the customer must fill in the free-text box. A saved value (on or off) is shared as it is.
confirm-noteNote shown in the cancel popupNote shown in the cancel popupEmpty (both)The free plugin keeps basic HTML (post-content tags). Pro removes all HTML tags when it saves.
guest-cancelAllow guest cancellationAllow guest cancellationOn (both)Same meaning.
delete-dataDelete all data when the plugin is deletedDelete all data when the plugin is deletedOff (both)Same meaning. See "Deleting the plugins" below.

How saving works

  • When you save WooCommerce → Settings → WC Cancel in the free plugin, it merges its five keys into the stored array. Keys that only Pro knows are kept.
  • When you save the same screen in Pro, it replaces the stored array with the 27 keys it knows.
Moving from the free plugin to ProPro-only settings have no stored value yet, so Pro applies its own defaults straight away. Review its settings page before customers use it. In particular: orders in Processing and On hold can be cancelled at once without your approval; a declined request sends the order to Processing instead of its previous status; customers must pick one of three built-in cancellation reasons; logged-in users need the Administrator or Customer role to use the button (any other role, such as a shop manager, does not); and no refund method is enabled, so approvals issue no refund until you turn one on.

Moving from Pro back to the free plugin

  • Everything Pro stored stays in the database but only Pro can use it. The free plugin does not register the statuses wc-partial-request and wc-partial-cancelled, has no Store Wallet payment method, and does not show partial requests or refund details.
  • Customers keep their wallet balances in the database, but they cannot spend them while Pro is inactive, because the Store Wallet payment method belongs to Pro.

Deleting the plugins

  • Deleting either plugin from the Plugins screen removes nothing unless Delete all data when the plugin is deleted is ticked (it is off by default).
  • Each plugin's uninstall.php also removes nothing while the other plugin's folder is still in the plugins directory: the free plugin looks for wc-cancel-order-pro, Pro looks for wc-cancel-order.
  • The free plugin removes only the table {prefix}wc_cancel_orders, its options (wc_cancel_settings, wc_cancel_db_version and the three email settings above) and its lock rows. It does not know the Pro tables or the wallet balances. If you used Pro before and delete the free plugin last with the setting ticked, those Pro data remain.
  • To remove everything, tick the setting, delete the free plugin first (nothing is removed because Pro is still installed), then delete Pro (it removes all of its data because the free plugin is gone).
  • On multisite, each plugin repeats this for every site of the network.

Free and Pro compared

FeatureWC Cancel Order (free)WC Cancel Order Pro
Cancel Request button in My Account and on the order pageYesYes
Guest cancellation from a link in order emailsYesYes
Cancel Request order status, requests list with Pending, Approved and Declined links and searchYesYes
Approve or decline one request at a timeYesYes
Bulk approve and declineNoYes
Cancel a whole orderYes, always after your approvalYes, after your approval or at once for statuses you choose
Cancel single items or quantities (partial cancellation)NoYes (off until you enable it)
What the customer fills inOne text box, "Cancellation details", required by defaultA list of reasons you define (radio buttons) and an optional text box, each required or not
Note in the popupYes, basic HTML allowedYes, plain text
Limit by user role, limit by order ageNoYes
Status after approvalCancelledYou choose (default Cancelled)
Status after declineThe status before the request (Processing when none is stored)A status you choose (default Processing) or the status before the request
Refund when you approveNo. Approving cancels the order; you refund from the order screen.Gateway, manual or store wallet refund
Cancellation fee, store wallet, Store Wallet payment methodNoYes
StockWooCommerce puts stock back when the order becomes CancelledThe same, plus an "Auto restock" option for refunds
EmailsThreeSeven
WooCommerce Subscriptions and Ultimate Member buttonsNoYes
Cancelled and remaining quantities on order screensNoYes

Documentation of the other plugin: WC Cancel Order and WC Cancel Order Pro.

6. Screens

ScreenWhereWhat it is for
Cancellation RequestsWooCommerce → WC CancelReview, approve and decline requests. See The requests list.
WC Cancel settingsWooCommerce → Settings → WC Cancel, or the Settings link on the Plugins screen, or the Settings button on the requests screenThe five settings.
EmailsWooCommerce → Settings → EmailsEdit the three emails.
OrdersWooCommerce → OrdersA "Cancel Request" status link with a count lets you list the orders waiting for a decision.
My Account → Orders and the order pageCustomer sideThe Cancel Request button and popup.
Guest cancellation page/guest-cancel-req/?key=...The order page for a guest, with the Cancel Request button.

7. Settings

All settings are on one screen: WooCommerce → Settings → WC Cancel. The heading reads "WC Cancel Order Settings" with the text "Control when and how customers can request order cancellations from their account and order emails." Two links sit above the fields: "Rate Wc Cancel Order" (opens the WordPress.org review page) and "Get Pro Version". Saving needs the manage_woocommerce capability. The values are stored in the option wc_cancel_settings (autoload off), merged with any keys that Pro saved.

Setting (label)KeyDefaultWhat it does
Allow cancellation requests for order statusesreq-statusPending payment, Processing, On holdMultiple select. The Cancel Request button appears for orders in these statuses, and the server refuses requests for any other status. Cancelled, Refunded, Failed, Cancel Request and Draft are not offered. Only statuses that exist are saved. If you clear the list and save, it stays empty (nobody can request) and the defaults are not restored. The list can be changed with the filter wc_cancel_settings_order_status, which also limits what can be saved.
Require cancellation detailstext-requiredOn (until you save the screen)Checkbox. When on, the customer must write something in "Cancellation details", checked in the popup and again on the server. Saved as 1 or 0. After you save with the box unticked, the stored 0 keeps it off.
Note shown in the cancel popupconfirm-noteEmptyText area. Shown above the details box. HTML tags allowed in post content (wp_kses_post) are kept, for example links and bold text; scripts are removed. Leave empty for no note.
Allow guest cancellationguest-cancelOnCheckbox. When on, the "Want to cancel this order?" link is added to customer emails and the guest page works; logged-out visitors can send requests. When off, the link is not added to emails, the guest page shows no order and the server refuses requests from logged-out visitors (the button can still be drawn for them on the order-received page). Logged-in customers can still cancel from My Account.
Delete all data when the plugin is deleteddelete-dataOffCheckbox. When on, deleting the plugin removes the settings, the request table and the email settings. Nothing is removed while WC Cancel Order Pro is still installed. See Privacy.

The label "Require cancellation details" is stored as text-required, a key Pro also uses. If the key has never been saved, the plugin treats it as on, so a fresh install requires details.

Email settings

The email options are WooCommerce's and are saved under WooCommerce → Settings → Emails. Click an email's name to edit it.

FieldEmailsDefaultWhat it does
Enable/DisableAll threeEnabledTurn the email off to stop sending it.
Recipient(s)Received onlyEmpty (uses the site admin email)Comma-separated addresses. The approved and declined emails always go to the order's billing email and have no recipient field.
SubjectAll threeEmpty (uses the default subject)Overrides the default subject. Placeholders {order_date}, {order_number}, {site_title}, {site_address}, {site_url}.
Email headingAll threeEmpty (uses the default heading)Overrides the heading inside the email. Same placeholders.
Email typeAll threeHTMLThe formats WooCommerce offers: plain text, HTML or multipart.

The settings are stored in the options woocommerce_wc_cancel_request_received_settings, woocommerce_wc_cancel_request_approved_settings and woocommerce_wc_cancel_request_declined_settings.

8. Developer reference

Everything below is for version 3.7.0. The plugin has no REST routes, WP-CLI commands, blocks, cron events, custom post types or user roles.

Shortcode

[wc_cancel_order_details] has no attributes. It reads the query parameter key (cleaned with sanitize_key) and prints WooCommerce's order page for the order whose _wc_cancel_key equals it, when Allow guest cancellation is on. With no key it prints nothing; with a key that matches no order, or while guest cancellation is off, it prints "Sorry, this order is invalid and no details found." Since 3.7.0 it returns its output instead of printing it. The virtual page /guest-cancel-req/ uses it; you can also place it on your own page, which loads the popup scripts there, but the page must be opened with ?key=.

AJAX endpoints

ActionWhoParametersResponse
wc_cancel_request (wp_ajax_ and wp_ajax_nopriv_)Customers and guestsorder_id (integer), _wpnonce (nonce action wc-cancel-request), order_key (the cancel key from the guest page, or WooCommerce's order key), additional_details (text, first 5,000 characters used), wcc_ajax (any value other than empty or 0 gives a JSON reply). order_num is only used by the button's link.With wcc_ajax: JSON {"res": true|false, "message": "...", "fragments": {"div.wc-cancel-notice": "..."}}. Without it: a redirect to the referring page, or to My Account orders.
wc-cancel-request (wp_ajax_ only)Users with manage_woocommerce; others get wp_die(-1)req (view, approve or decline), order_id, _wpnonce (nonce action wc-cancel-backend), wcc_ajax (present for a JSON reply).With wcc_ajax: JSON {"reload": true|false, "html": "..."}. Without it: a redirect to admin.php?page=wc_cancel.

The button's link is a plain URL to admin-ajax.php with action=wc_cancel_request, order_id, order_num and a nonce, so the request still works through the redirect if the script fails to load.

Actions and filters

HookType and argumentsWhen
wc_cancel_requestAction. $order_idAfter a customer's request is stored and the order is in Cancel Request.
woocommerce_email_wc_cancel_reasonAction. $order, $sent_to_admin, $plain_text, $emailInside the three email templates. The plugin hooks its own output ("Cancellation Details:" and the customer's text) at priority 10.
wc_cancel_order_btnFilter. $actions, $orderAfter the Cancel Request action is added to the order's action list.
wc_cancel_order_init_scriptFilter. $init (bool)Decides whether the popup scripts and styles load on the current page.
wc_cancel_order_admin_actionFilter. $actionsThe buttons in the Actions column of the requests list. Each entry has url, name, title and action (a CSS class).
wc_cancel_settings_order_statusFilter. $statuses (slug with wc- prefix => label)The statuses offered in the settings, and the only ones accepted on save.
wc_cancel_declined_statusFilter. $status (without wc-), $orderThe status a declined order returns to.
wc_cancel_settingsFilter. $settings (WooCommerce settings fields)The fields of the WC Cancel settings tab.

These names belong to the free plugin. Pro keeps wc_cancel_request, wc_cancel_order_btn, wc_cancel_order_init_script, wc_cancel_order_admin_action and wc_cancel_settings, but names its status filters wc_cancel_order_status and wc_cancel_decline_status, so code that uses wc_cancel_settings_order_status or wc_cancel_declined_status does nothing under Pro.

Add a note to the order when a request arrives:

add_action( 'wc_cancel_request', function ( $order_id ) {
    $order = wc_get_order( $order_id );
    if ( $order ) {
        $order->add_order_note( 'Customer asked to cancel. Check the shipping status before approving.' );
    }
} );

Return declined orders to On hold:

add_filter( 'wc_cancel_declined_status', function ( $status, $order ) {
    return 'on-hold';
}, 10, 2 );

Load the popup on a custom account page:

add_filter( 'wc_cancel_order_init_script', function ( $init ) {
    return $init || is_page( 'my-orders' );
} );

Constants

  • WC_CANCEL_DIR: the plugin folder path. Defined if not already defined.
  • WC_CANCEL_VERSION: 3.7.0. Used as the version of the scripts and styles.
  • WC_CANCEL_SC_FOOTER: defaults to true and is passed as the "in footer" argument when scripts are registered. Define it as false in wp-config.php to load them in the page header.

Capabilities

The requests screen, its AJAX actions and saving the settings need manage_woocommerce. Customer requests need no capability: they depend on the nonce, the order's customer (or key) and the settings. The plugin adds no capabilities or roles.

Database table

{prefix}wc_cancel_orders (InnoDB, utf8). One row per order. Dates are stored in GMT.

ColumnTypeMeaning
idbigint, primary key, auto incrementRequest ID.
order_idbigint, indexedThe WooCommerce order.
user_idbigint, indexedThe user who sent the request (0 for a guest), or the admin who decided it when the order was put into Cancel Request by hand and no row existed yet.
is_approvedtinyint, default 00 pending, 1 approved, 2 declined. A value other than 0 stops further requests for the order.
cancel_request_datedatetime, nullable, indexedWhen the request was recorded (GMT).
cancel_datetimestamp, nullableCreated but not written by the plugin.

If the table also has the Pro columns, the free plugin leaves them alone.

Options, order meta and statuses

  • Options: wc_cancel_settings, wc_cancel_db_version, and the three WooCommerce email option names listed under Email settings. The plugin creates no transients and no user meta.
  • Order meta: _wc_cancel_key (the guest key; the lookup matches the exact value), _wc_cancel_additional_txt (the customer's text), _wc_cancel_request_data (an array with approved, head and date), _wc_cancel_prev_status (status slug without wc-).
  • Order status: wc-cancel-request, label "Cancel Request".
  • Lock rows: options named wcc_lock_ plus a hash, used only when GET_LOCK() is unavailable.

Email templates

The templates are in templates/emails/ with plain-text versions in templates/emails/plain/. To override one, copy it to your theme's woocommerce/emails/ folder (WooCommerce looks for yourtheme/woocommerce/ followed by the template name):

  • yourtheme/woocommerce/emails/admin-request-received.php
  • yourtheme/woocommerce/emails/customer-request-approved.php
  • yourtheme/woocommerce/emails/customer-request-declined.php
  • yourtheme/woocommerce/emails/plain/admin-request-received.php, .../plain/customer-request-approved.php and .../plain/customer-request-declined.php

The comment at the top of the two customer templates names them admin-request-approved.php and admin-request-declined.php; the file names above are the ones WooCommerce uses.

File layout

wc-cancel-order/
  wc-cancel-order.php              main file, class WC_Cancel_Order
  uninstall.php                    removal on delete (see Privacy)
  readme.txt, wpml-config.xml
  classes/
    class-wc-cancel-dashboard.php  requests list (WP_List_Table)
    class-wc-cancel-guest.php      virtual guest page
    class-wc-cancel-order-details.php  order page for the guest key
    class-wc-cancel-lock.php       named locks
    class-wc-cancel-sql.php        table creation and indexes
    class-wc-cancel-uninstall.php  data removal
    class-wc-cancel-request-received.php / -approved.php / -declined.php
  includes/  dashboard.php, settings.php, wc-cancel-options.php
  templates/emails/ (+ plain/)
  assets/    css (admin, front, modal), js (admin, front, wcc-modal), fonts
  languages/ .pot, en_US, fr_FR, it_IT

The browser scripts expose WCCModal.open(config) and the localised objects wc_cancel (customer side) and wc_cancel_back (admin side).

Core and WooCommerce hooks the plugin uses

  • active_plugins (filter, read by the plugin): the main file reads the list of active plugins to decide whether to start (WooCommerce active, Pro not active).
  • woocommerce_loaded: loads the settings and registers the settings tab with woocommerce_settings_tabs_array (priority 50), woocommerce_settings_tabs_wc_cancel_settings and woocommerce_update_options_wc_cancel_settings. The tab uses a custom field type, output through woocommerce_admin_field_wc_cancel_setting.
  • woocommerce_update_options: saves the settings (checks the woocommerce-settings nonce and manage_woocommerce before touching anything).
  • woocommerce_my_account_my_orders_actions (priority 100): adds Cancel Request and removes WooCommerce's Cancel.
  • woocommerce_after_order_details: on the guest page, prints a "Want to cancel this order?" block with the button when WooCommerce did not already print the action.
  • woocommerce_order_status_changed: priority 10 stores the previous status; priority 999 sends the emails and settles request rows.
  • woocommerce_email_classes (priority 999): registers the three emails.
  • woocommerce_email_customer_details (priority 999): adds the guest link.
  • woocommerce_checkout_update_order_meta and woocommerce_store_api_checkout_order_processed (both priority 1): write the guest key.
  • wc_order_statuses and register_post_status on init (priority 999): the Cancel Request status.
  • the_posts (main query only): serves the virtual guest page.
  • admin_init: the once-per-version table check.
  • plugin_action_links_wc-cancel-order/wc-cancel-order.php: the Settings and Get Pro Version links.
  • woocommerce_screen_ids, admin_menu, admin_enqueue_scripts (priority 999), wp_enqueue_scripts (priority 20) and before_woocommerce_init (compatibility declarations).

The text box in the popup is a form field named wc-cancel-additional-text; its value is sent as additional_details.

9. Privacy

What is stored

  • In the request table: the order ID, the ID of the user who sent the request (0 for a guest), the decision (pending, approved or declined) and the request date.
  • In the order's meta: the text the customer typed (_wc_cancel_additional_txt), the guest cancel key (_wc_cancel_key), the decision with its date (_wc_cancel_request_data) and the previous status (_wc_cancel_prev_status). The text can contain personal data, depending on what the customer writes.
  • In order notes: short notes such as "Order Status updated by Wc Cancel Order.", "Cancellation Request Approved." and "Cancellation Request Declined."
  • In emails: the customer's text is included in the three emails, which go to the store recipients and to the order's billing email.

Cookies and external services

The plugin sets no cookies and uses no browser storage. It sends no data to any external service: it contains no remote requests, no tracking and no analytics. Emails leave your site only through the mail system you have configured for WordPress.

The guest link

The guest link contains a key that identifies one order. Whoever holds the link can see the order details shown on the guest page and can send a cancellation request. The link is sent to the order's billing email address. If guest cancellation is switched off, the link no longer works.

Retention and removal

  • Request rows and order meta are kept until you delete them. Deleting an order does not delete its row in {prefix}wc_cancel_orders, but the requests list only shows requests of orders that still exist.
  • The plugin registers no personal data exporter or eraser. To remove a customer's text, delete the order or the meta key _wc_cancel_additional_txt from it with a database tool or code.
  • Deactivating removes nothing.
  • Deleting the plugin removes nothing by default. With Delete all data when the plugin is deleted ticked, and when WC Cancel Order Pro is not installed, it drops {prefix}wc_cancel_orders, deletes the options wc_cancel_settings, wc_cancel_db_version and the three email setting options, and deletes any lock rows. It does not remove order meta, and it does not remove order notes. On multisite it does this for every site. See also WC Cancel Order and WC Cancel Order Pro together for the order in which to delete both plugins.

10. Troubleshooting

ProblemLikely cause and fix
No Cancel Request button on an orderThe order's status is not selected under Allow cancellation requests for order statuses; a request for the order was already decided (approved or declined); or the visitor is logged out, Allow guest cancellation is off and the page is the guest cancellation page (it shows no order then). Also check that WooCommerce is active and that your theme still prints WooCommerce's order actions.
Clicking the button does not open a popupThe popup script did not load. It loads only on the My Account orders, view-order and order-received pages and on pages containing [wc_cancel_order_details]. For another page, use the wc_cancel_order_init_script filter. Also check the browser console for script errors and that the theme calls wp_footer(). Without the script the button is a plain link to admin-ajax.php: when details are not required, one click sends the request at once with no popup; when they are required, the server refuses it and returns the customer to the same page.
"Cancellation details required!"Require cancellation details is on and the text box is empty. Ask the customer to write something, or untick the setting.
"Cancellation request could not be processed. Please try again."The server refused the request: the security token expired (a cached page can carry an old one; reload the page), the order is not in an allowed status, a request was already decided, the visitor is not the order's customer and has no valid key, or guest cancellation is off.
"Your cancellation request is being processed. Please try again in a moment."Another request for the same order held the lock for more than 10 seconds. Wait a moment and try again.
The guest link shows the home page or a 404 pagePermalinks are set to Plain. Choose any other structure under Settings → Permalinks.
The guest page says "Sorry, this order is invalid and no details found."The key in the link does not match an order, or Allow guest cancellation is off.
The order email has no "Want to cancel this order?" linkGuest cancellation is off; the order has no cancel key (it was placed before the plugin was installed); its status is not selected; or a request was already decided. The link is only added to emails sent to customers.
No emails arriveThe email is disabled under WooCommerce → Settings → Emails; the "Received" recipient is wrong; the order has no billing email (customer emails need it); or WordPress cannot send mail from the server.
I approved a request but the customer was not refundedThe free plugin never refunds. Refund from the order screen. WC Cancel Order Pro can refund on approval.
Stock did not go back after approvalThe plugin leaves stock to WooCommerce, which restores it only when the order had reduced stock before it was cancelled. Check the order notes and the product's stock management.
A declined order went to Processing, not to its earlier statusThe request was made before version 3.6.2 (no stored status), or the earlier status no longer exists, or a filter on wc_cancel_declined_status changes it.
A request shows "Pending" but has no Approve and Decline buttonsThe buttons need the order to be in Cancel Request and the request to be pending. If the order was moved by hand before version 3.7.0, the row was never updated. Since 3.7.0 the row follows the status change.
"This order has no pending cancellation request."Someone already decided it, or the order's status changed. Reload the list.
The "Security check failed" message in the approve or decline popupThe page was open for too long. Reload the requests screen and try again.
This plugin is switched off after I installed ProPro deactivates it on purpose and keeps using its data. See WC Cancel Order and WC Cancel Order Pro together.

11. Frequently asked questions

Does the order get cancelled as soon as the customer clicks the button?

No. The order moves to the Cancel Request status and waits. It is cancelled only when you approve the request under WooCommerce → WC Cancel.

Which orders can customers cancel?

Orders in the statuses selected under WooCommerce → Settings → WC Cancel. By default these are Pending payment, Processing and On hold. Orders in other statuses show no button.

Is the payment refunded automatically?

No. Approving a request cancels the order and WooCommerce restores the stock, but the free plugin does not refund the payment. Refund it from the order screen. WC Cancel Order Pro can refund on approval.

What happens when I decline a request?

The order goes back to the status it had before the request and the customer receives the "Cancellation Request Declined" email. The Cancel Request button is not shown again for that order.

Can guests cancel their orders?

Yes, while Allow guest cancellation is on. Guests find a "Want to cancel this order?" link in their order emails that opens a page for that order.

Can I change the emails?

Yes. Open WooCommerce → Settings → Emails and click the email. You can switch it off, change the subject, heading and format, and (for the "Received" email) the recipients.

Can customers cancel only some items of an order?

Not in this plugin. Partial cancellation is part of WC Cancel Order Pro.

A customer clicked twice. Do I get two requests?

No. Requests for one order are processed one at a time, so you get one request and one email.

I moved an order out of Cancel Request myself. What happens to the request?

Since version 3.7.0 the request is recorded as approved or declined, depending on the new status, and the customer is emailed. See the table under "When you change the status yourself".

What happens to my data when I delete the plugin?

Nothing is removed by default. Tick Delete all data when the plugin is deleted first if you want the requests and settings removed. If WC Cancel Order Pro is still installed, nothing is removed because both plugins use the same data.

Can I use the free plugin and Pro together?

Not at the same time. Pro deactivates the free plugin when you activate it and takes over its settings and requests. You can go back by deactivating Pro and activating the free plugin.

Where can I get help?

Open a topic in the support forum or write to support@wpexpertshub.com.

12. Changelog

3.7.0 - 06/10/2026

  • Fix - Two cancellation requests (or two approvals) for the same order at the same moment no longer create duplicate requests and emails.
  • Fix - The guest cancellation page printed the order above the page content because the [wc_cancel_order_details] shortcode echoed instead of returning its output.
  • Fix - "Require cancellation details" is now enforced by the server as well as in the popup.
  • Fix - Saving the settings checks the user's capability, keeps only real order statuses and no longer erases settings that WC Cancel Order Pro stored in the same option. WooCommerce's internal "Draft" status is no longer offered.
  • Fix - A request an admin moved out of Cancel Request by hand (for example straight to Cancelled) stayed "Pending" in the list for ever; it is now recorded as approved or declined.
  • Fix - Order links in the requests list opened the wrong screen on stores using High-Performance Order Storage; a deleted customer or order no longer breaks the list.
  • Fix - Approving or declining a request that was already decided now says so, and a bad security token explains itself instead of silently reloading. Popups no longer spin for ever when the request fails.
  • New - The requests list has status links (All / Pending / Approved / Declined) with counts, a search box (order number, name, email) and a bubble on the WC Cancel menu item while requests are pending.
  • New - The "request received" email to the shop links straight to the pending requests.
  • New - The popup has a close button, is labelled for screen readers, returns focus to the Cancel Request button, and works on phones and in right-to-left languages.
  • New - "Delete all data when the plugin is deleted" (off by default). Nothing is removed while WC Cancel Order Pro is installed, because the two plugins share their data.

3.6.2 - 28/09/2026

  • Fix - Cancellation emails (request received, approved, declined) were not being sent since 3.6.1.
  • Fix - Declining a cancellation request now restores the order's previous status (e.g. On hold or Pending payment) instead of always setting it to Processing. Requests made before this update still fall back to Processing.
  • Fix - The "Declined" email is now also sent when an admin moves an order out of Cancel Request by hand to any status other than Cancelled, Refunded or Failed.
  • Fix - The cancellation popup no longer reports success when the request could not be processed; it now shows an error instead.
  • Fix - Guests can now cancel from the order-received (thank you) page.
  • Fix - Plain-text Approved/Declined customer emails no longer include admin-only links and SKUs.
  • Fix - The "Want to cancel this order?" link in customer emails is only shown when the order can actually be cancelled, and is proper plain text in plain-text emails.
  • Fix - Removed the duplicate Cancel Request button on the guest cancellation page.
  • Fix - Clearing all "Allow cancellation requests for order statuses" in the settings now saves instead of restoring the defaults.
  • Fix - PHP 8.2+ deprecation notice, request dates on non-HPOS stores, and escaping in the admin request popup.
  • Tweak - Plugin Check: prepared SQL in the database index upgrade; tested up to WordPress 7.1 and WooCommerce 11.1.

3.6.1 - 10/09/2026

  • Perf - Index added on db columns.
  • Perf - Front-end cancel assets (scripts, styles and translations) are now only registered and localized on pages that actually use the cancel flow instead of on every page load.

3.6 - 15/08/2026

  • Fix - Cancellation request dates now display in the site's configured timezone (timestamps stored as GMT and rendered via WordPress date functions).
  • Tweak - Plugin Check compliance: added nonce verification, sanitized and escaped input/output, prepared database queries, and documented schema changes.

3.5.1 - 30/10/2025

  • Fix - Compatibility check and tweaks.

3.5 - 08/10/2024

  • Fix - Compatibility check and hook fixed.

3.4 - 04/01/2024

  • Tweak - HPOS Compatibility.

3.3 - 23/08/2023

  • Tweak - Compatibility check.

3.2 - 11/03/2023

  • Fix - Sanitizing data fixed.

3.1.9 - 15/02/2023

  • Fix - Guest cancellation 404 page issue fixed.

3.1.8 - 11/11/2022

  • Tweak - Compatibility check.

3.1.7 - 29/07/2022

  • Tweak - Minor fix and compatibility check.

3.1.6 - 25/07/2022

  • Fix - Translation string fix
  • Fix - Divi Global Header fix

3.1.5 - 20/05/2022

  • Fix - Cancel link removed from completed order email.
  • Fix - Cyrillic input allowed.

3.1.4 - 31/03/2022

  • Fix - Filters and Hooks added.

3.1.3 - 06/01/2022

  • Fix - Multisite enabled.

3.1.2 - 30/08/2021

  • Tweak - Compatibility check.
  • Fix - HTML submission in additional text fixed.

3.1.1 - 12/07/2021

  • Fix - Admin setting issue fixed.

3.1 - 11/07/2021

  • Fix - Compatibility issue fixed.
  • Fix - Admin settings added.
  • Fix - Improved admin interface.
  • Fix - Improved Functionality.

3.0 - 30/08/2020

  • Fix - Compatibility issue fixed.
  • Fix - Improved admin interface.
  • Fix - Functionality Tweaks.

2.9.1 - 14/11/2019

  • Fix - Minor Tweaks

2.9 - 05/03/2019

  • Fix - Inventory restore issue fix on order cancellation.

2.8 - 04/01/2019

  • Fix - Email template issue fixed.
  • Fix - WooCommerce 3.5 emails compatibility issue fixed.

2.7 - 17/12/2018

  • Fix - WooCommerce 3.5 compatibility issue fixed.

2.6 - 18/03/2018

  • Fix - WooCommerce 3.3 compatibility issue fixed.

2.5 - 07/12/2017

  • Fix - Restore product inventory/stock when cancel request accepted.

2.4 - 01/06/2017

  • Fix - WooCommerce compatibility issue fixed.

2.3 - 04/05/2017

  • Fix - WooCommerce compatibility issue fixed.

2.2 - 26/04/2017

  • Fix - Translation string added.

2.1 - 25/03/2017

  • Fix - Admin style/script hook fixed.

2.0 - 25/02/2017

  • Fix - Email issue fixed.
  • Fix - WooCommerce compatibility issue fixed.
  • Tweak - Admin style/scripts.

1.9 - 17/05/2016

  • Fix - Shop Manager role availability fixed.

1.8 - 25/02/2016

  • Fix - WooCommerce version compatibility.

1.7 - 12/02/2016

  • Feature - Multilingual ready / Translation ready.

1.6 - 11/10/2015

  • Fix - Get Status Fatal error fixed.

1.5 - 12/04/2015

  • Fix - Restore inventory/stock after Order cancel.

1.4 - 31/03/2015

  • Fix - E-Mail Notification Fixed.
  • Fix - Minor Changes done accordingly woocommerce version 2.3.

1.3 - 22/11/2014

  • Fix - Cancel Request Approve Notification E-Mail added.
  • Fix - Tool-tip fixed for WC Cancel Order admin dashboard icons.

1.2 - 21/11/2014

  • Fix - Cancel Request Permission issue fixed.

1.1 - 10/11/2014

  • Fix - Admin css hook fixed.

1.0 - 09/11/2014

  • Initial Revision.

13. Support

For the free plugin, open a topic in the WordPress.org support forum or email support@wpexpertshub.com. Please include:

  • The plugin version (this page documents 3.7.0), your WordPress and PHP versions and your WooCommerce version.
  • Whether High-Performance Order Storage is on, and whether WC Cancel Order Pro is installed.
  • What you did, what you expected and what happened, with any message shown. If you paid for WC Cancel Order Pro, add your order ID.
  • What you already tried, for example switching to a default theme or disabling other plugins.