Order Tools
Free order tools for Magento 2: your own order, invoice, shipment and credit memo numbers, useful extra columns in the order grid, a test order flag and carefully guarded order deletion with an audit log.
- Magento 2.4.7 – 2.4.9
- PHP 8.2 – 8.5
- Hyvä and Luma
- Version 1.2.2
Free
No payment needed, with 12 months of updates.
Add it to your cart and complete the free checkout. Your ZIP downloads and Composer access will be in your account.
What is included
- 12 months of new versions and fixes; the versions released in that time stay yours
- Install with Composer, or download a zip from your account
- Licence for one production domain, staging and development copies included
No subscription or automatic renewal. Keep using the versions included in your update period. Update and licence details
Key features
- Custom order, invoice, shipment and credit memo numbers
- Prefix, suffix, padding, start value and step per store view
- Date and store placeholders, optional yearly or monthly restart
Composer package softaware/module-order-tools
-
Numbers that fit your business
Orders like WEB-26-000123 instead of 000000123, with invoices, shipments and credit memos numbered your way or matching the order.
-
Less clicking in the order grid
See the ordered SKUs, coupon code, shipping country and order comment in Sales > Orders, with filters, without opening each order.
-
Deleting with guard rails
Deleting is off until you switch it on, needs its own permission, only accepts the statuses you allow and records every deletion in a log.
All features
What is included
Document numbers
- Order, invoice, shipment and credit memo, each configured separately
- Per store view, website or default scope
- Placeholders {store_id} {yyyy} {yy} {mm} {dd}
- Yearly or monthly restart only when the number contains the period
- Atomic counters, duplicate check and fallback to Magento's number
Order grid
- Items as "SKU x qty"
- Coupon Code and Order Comment (text filters)
- Shipping Country (select filter)
- Test Order flag with Mark and Unmark mass actions
- CLI backfill for orders placed before installation
Deleting orders
- Off by default, own ACL resource Delete Orders
- Only the order statuses you allow (default: Canceled)
- POST with form key and a confirmation dialog
- Removes invoices, shipments, credit memos, payment, addresses and comments
- One transaction per order, together with its log entry
Admin and developers
- Deleted Orders Log with keyword search and CSV export
- Customer email in the log stored as a SHA-256 hash or in clear
- Separate ACL permissions per feature
- CLI: show next numbers, backfill grid columns
- No storefront code, no core rewrites
Feature tour
Everything your shoppers and your team see
01 / 06
Your own numbering, previewed before the next order
Prefix, suffix, minimum length, start value and step per store view, with {yyyy}, {yy}, {mm}, {dd} and {store_id} placeholders. The Next Numbers table shows what each store view will issue next.
02 / 06
More of the order in the grid
Items (SKU x qty), Coupon Code, Shipping Country, Order Comment and Test Order columns, each switched on separately and kept current by Magento's own grid indexer.
03 / 06
A clear confirmation before anything is deleted
The Delete Permanently mass action names the number of selected orders and what is not restored. At most 200 orders per request.
04 / 06
Orders with other statuses are refused
Every order is checked on the server against the allowed statuses (default: Canceled only), and checked again under a row lock just before it is deleted.
05 / 06
Delete one order from its page
The Delete Permanently button appears only when deleting is on, the admin role allows it and the order's status is allowed.
06 / 06
Every deletion on record
Order number, store view, status, grand total, deleted documents, admin user, IP address and time. Read-only, searchable, with CSV export. The customer email is stored as a hash by default.
Live demo
Try it before you install it
A full Magento store with the module installed, on Luma and on Hyvä. The admin demo signs you in with one click.
Compatibility
Requirements and compatibility
| Magento | 2.4.7 – 2.4.9 |
|---|---|
| Storefront themes | Luma Blank Hyvä |
| PHP | 8.2 – 8.5 |
| Latest version | 1.2.2 |
| composer.json requires | php ~8.2.0||~8.3.0||~8.4.0||~8.5.0 magento/framework ~103.0.7 softaware/module-core ^1.0 magento/module-backend * magento/module-config * magento/module-directory * magento/module-sales * magento/module-sales-sequence * magento/module-store * magento/module-ui * |
Installation
Up and running in minutes
Get it free, create a Composer key in your account, then in the root of your Magento project:
-
01Add the repository and your key (once per project)
composer config repositories.softaware composer https://repo.softawarecommerce.com composer config --auth http-basic.repo.softawarecommerce.com PUBLIC_KEY PRIVATE_KEY
-
02Install the module
composer require softaware/module-order-tools -
03Enable it
bin/magento setup:upgrade bin/magento setup:di:compile bin/magento setup:static-content:deploy bin/magento cache:flush
The last three are only needed in production mode.
Prefer a zip? Every version you are entitled to can be downloaded from My modules. More about Composer access
User guide
How to set up and use Order Tools
For version 1.2.2. The same guide comes with the module, in docs/user-guide.md.
Small, frequently requested order utilities in one module: your own order, invoice, shipment and credit memo numbers, extra columns in the order grid, a test order flag and guarded order deletion with an audit log. Everything that changes behaviour is off by default. This guide covers installation, configuration and day-to-day use.
- Admin demo: https://demo.softawarecommerce.com/try-admin/order-tools
- Changelog: Release notes · Questions: FAQ

1. Requirements
| Magento | Open Source or Adobe Commerce 2.4.7 to 2.4.9 |
| PHP | 8.2 to 8.5 |
| Storefront | None: the module is admin only. The numbers appear wherever Magento shows them, on Luma, Hyvä and other themes alike. |
| Other | softaware/module-core (installed automatically) |
2. Installation
Install with Composer from repo.softawarecommerce.com. The access keys are in your account on softawarecommerce.com; see Composer access for details.
composer config repositories.softaware composer https://repo.softawarecommerce.com
composer config --auth http-basic.repo.softawarecommerce.com PUBLIC_KEY PRIVATE_KEY
composer require softaware/module-order-tools
bin/magento setup:upgrade
bin/magento setup:di:compile # production mode only
bin/magento setup:static-content:deploy # production mode only
bin/magento cache:flush
bin/magento softaware:order-tools:grid:backfillThe last command fills the new order grid columns for orders placed before the installation (section 5). Orders saved later are handled by Magento's own grid indexer.
To update later: composer update softaware/module-order-tools, then the same bin/magento commands.
After installation the admin menu has Softaware > Order Tools with Deleted Orders Log, Document Numbers and Settings. Nothing changes in your store until you switch a feature on.
3. Settings
The settings are in two sections of the Softaware tab under Stores > Configuration:
- Softaware > Order Tools: the master switch, the order grid and deleting orders (default scope only).
- Softaware > Order Tools: Document Numbers: numbering per document type (default, website or store view scope).
General
| Setting | What it does |
|---|---|
| Enabled | Master switch (default: Yes). When off, Magento's own document numbers are used, the extra grid columns and actions are hidden and orders cannot be deleted. Each feature also has its own switch. |
Order Grid
| Setting | What it does |
|---|---|
| Extra Columns | Adds the selected columns to Sales > Orders: Items (SKU x quantity), Coupon Code, Shipping Country, Order Comment (customer note). Default: none. |
| Test Order Flag | Adds the Test Order column and the mass actions Mark as Test Order and Unmark Test Order. Default: No. |
Deleting Orders

| Setting | What it does |
|---|---|
| Allow Deleting Orders | Adds Delete Permanently to the order grid actions and the order page. Default: No. |
| Only Orders With These Statuses | Orders with any other status are refused, also when they are selected in the grid. Default: Canceled. Avoid statuses of orders that were paid or shipped unless you keep their records elsewhere. |
| Customer Email in the Log | Store a hash (SHA-256) only (default) or Store the email address. |
4. Document numbers
Open Stores > Configuration > Softaware > Order Tools: Document Numbers (or Softaware > Order Tools > Document Numbers). There is one group each for Order Numbers, Invoice Numbers, Shipment Numbers and Credit Memo Numbers, and a Next Numbers table at the top.
Settings per document type
| Setting | What it does |
|---|---|
| Numbering | Magento default (default), Custom format, or for invoices, shipments and credit memos Same as the order number. Applies to new documents only; existing numbers never change. |
| Prefix | Text before the counter, for example WEB-{yy}-. Up to 20 characters: letters, digits, -, _, . and the placeholders below. Default: empty. |
| Suffix | Text after the counter, same rules as the prefix. Default: empty. |
| Minimum Counter Length | The counter is padded with leading zeros to this length (1 to 10). 6 gives 000123. Default: 6. |
| Start Value | The first counter value. Raising it later makes a running counter jump to it; lowering it has no effect on a counter that is already running. Default: 1. |
| Increment Step | How much the counter goes up per document (1 to 1000). Default: 1. |
| Restart Counter | Never (default), Every year or Every month. Default scope only (see below). |
Placeholders in the prefix and suffix use the store view's time zone:
| Placeholder | Example |
|---|---|
{store_id} | 1 |
{yyyy} | 2026 |
{yy} | 26 |
{mm} | 10 |
{dd} | 09 |
The character rules keep numbers safe in URLs, PDF file names and CSV files.
Example
Prefix WEB-{yy}-, minimum counter length 6, start value 1: the orders are numbered WEB-26-000001, WEB-26-000002, and so on. With the same settings from the command line:
bin/magento config:set softaware_ordertools_numbers/order/mode custom
bin/magento config:set softaware_ordertools_numbers/order/prefix 'WEB-{yy}-'
bin/magento config:set softaware_ordertools_numbers/order/length 6Same as the order number
With Same as the order number, the first invoice of order WEB-26-000123 is WEB-26-000123, a second invoice of the same order is WEB-26-000123-1, then -2, and so on. The same applies to shipments and credit memos.
Restarting the counter
The counter restarts at the start value only if the number contains the period: {yyyy} or {yy} for every year, plus {mm} for every month. Otherwise it keeps counting, so numbers never repeat. The admin refuses a restart setting that would not be safe. The restart is set in the default scope, because store views with the same prefix and suffix share one counter.
Counters and uniqueness
- Store views with the same prefix and suffix share one counter. Use
{store_id}or different prefixes to give each store view its own series. - Each value is taken with one atomic database statement on a separate connection, so parallel checkouts never get the same value and the counter is not locked for the length of an order or invoice transaction.
- Every candidate number is checked against the existing documents of all store views and skipped if taken. Magento's unique key on the document number remains the final guard.
- If a custom number cannot be built, Magento's own number is used and the error is logged, so a checkout never fails because of the numbering.
- The module plugs into Magento's sales sequence; it does not rewrite core classes. Magento's own sequence is not used while a custom format is active.
Next Numbers
The Next Numbers table shows the next number of each document type for every store view, based on the saved settings (save to update it), with the last number used. Custom numbers also need Order Tools > General > Enabled; the table shows a warning when Order Tools is switched off.
5. Order grid columns

Select the columns under Order Grid > Extra Columns. They appear in Sales > Orders and can be shown, hidden and filtered like Magento's own columns:
| Column | Content | Filter |
|---|---|---|
| Items | "SKU x qty" of the order's top-level items | Text |
| Coupon Code | The coupon code used for the order | Text |
| Shipping Country | Country of the shipping address | Select |
| Order Comment | The order's customer note (admin order comment or checkout comment modules) | Text |
| Test Order | Yes or No (with Test Order Flag on) | Select |
The columns are kept up to date by Magento's order grid indexer, with synchronous or asynchronous grid indexing. For orders placed before the installation run the backfill once (section 8).
6. Test orders
With Test Order Flag = Yes, select orders in Sales > Orders and choose Actions > Mark as Test Order (or Unmark Test Order). Filter the Test Order column to find them later, for example to cancel and delete them. The flag is also stored in the Deleted Orders Log.
7. Deleting orders
Deleting orders is permanent. It is off by default and protected by several guards, all checked on the server for every order, whatever the admin page showed:
- Allow Deleting Orders must be Yes (and Order Tools enabled).
- The admin role needs the ACL resource Softaware > Order Tools > Delete Orders. It is not added to any role automatically; roles with access to all resources have it.
- The order's current status must be one of Only Orders With These Statuses (default: Canceled only). The status is checked again with a row lock inside the delete transaction, so an order whose status changed in the meantime is not deleted.
- At most 200 orders per request.
- Only POST requests with a valid form key are accepted, after a confirmation dialog.

From the order grid: select the orders in Sales > Orders, choose Actions > Delete Permanently and confirm. The dialog shows the number of selected orders. Orders with a status that is not allowed are skipped and named in a message; the others are deleted.

From the order page: the Delete Permanently button appears only when deleting is on, the role has the permission and the order's status is allowed. The dialog Delete Order Permanently names the order number.

What is deleted
The order with its invoices, shipments and credit memos (through Magento's repositories, so their grid rows are removed too), items, addresses, payment, payment transactions, comments and tax rows. Each order is deleted in its own database transaction together with its log entry: if anything fails, nothing of that order is deleted.
What is not restored
Nothing is reversed: no stock, no refunds, no reward points or store credit. Cancel and refund an order first if you need that. Downloadable links bought with the order are kept by Magento (unlinked from the order). Sales reports keep their aggregated figures until they are refreshed.
Deleted Orders Log

Softaware > Order Tools > Deleted Orders Log lists every deleted order, newest first: deleted at, order number, store view, status, grand total, customer email, test order flag, the deleted document numbers and the admin user. Order ID, currency, order date and IP address are available under Columns.
- The customer email is stored as a SHA-256 hash by default (shown shortened as "Hashed (...)") or in clear, depending on Customer Email in the Log.
- The keyword search finds order numbers, admin users and email addresses. An email address also finds entries where it was stored as a hash, so you can check whether a given customer's order was deleted.
- Export downloads the log as CSV. Values that a spreadsheet would run as a formula are prefixed with an apostrophe.
- The log is read-only; entries cannot be deleted from the admin.
- While nothing has been deleted, the page explains whether deleting is switched on and which statuses can be deleted, with links to the orders and the settings.
8. Command line
bin/magento softaware:order-tools:sequence:show [--store=<id|code>]
bin/magento softaware:order-tools:grid:backfill [--batch-size=500]sequence:showlists the numbering, last number and next number of each document type per store view. It is read-only and does not use up a number.grid:backfillfills the Order Tools grid columns for existing orders, in batches of 500 by default. Run it once after installation.
There is no command for deleting orders, on purpose: deleting is only possible in the admin, under its permission.
9. Permissions (ACL)
Under System > Permissions > User Roles > Role Resources > Softaware > Order Tools:
| Resource | Allows |
|---|---|
| Delete Orders | The Delete Permanently mass action and order page button |
| View Deleted Orders Log | The log page and its CSV export |
| Mark Test Orders | Mark as Test Order and Unmark Test Order |
| Settings: Order Grid and Deleting | The Order Tools configuration section |
| Settings: Document Numbers | The Order Tools: Document Numbers configuration section |
Admins who delete orders also need access to Sales > Orders. On Adobe Commerce, give Delete Orders only to roles with access to all websites (admin role scopes were not tested with deletion).
10. Troubleshooting
| Problem | Solution |
|---|---|
| New orders still have Magento's numbers | Check Order Tools > General > Enabled and Numbering = Custom format for the store view of the order, then look at the Next Numbers table. If a custom number could not be built, the reason is in var/log/system.log. |
| A gap in the number series | Like Magento's own sequence, a number taken by a checkout that then fails is not reused. |
| The extra grid columns are empty for older orders | Run bin/magento softaware:order-tools:grid:backfill. |
| Delete Permanently is missing | Check Allow Deleting Orders, the role's Delete Orders permission and the order's status against Only Orders With These Statuses. |
| "Not deleted because of their status" | The order's status is not in the allowed list. Cancel the order first, or add the status in the settings. |
| The IP address in the log is the proxy's | The IP is taken from REMOTE_ADDR. Behind a proxy or CDN, configure your web server's real IP module. |
| Two documents of one order saved at the same moment, one fails | With Same as the order number, both get the same candidate number and Magento's unique key refuses one. Save it again. |
11. Limitations
- Orders edited in the admin keep Magento's behaviour: the new order gets the old number plus
-1,-2, ... - The counter restart applies to the whole installation (default scope).
- With Enabled = No, the
sot_*grid columns and the counters stay; the grid columns are still filled by the grid indexer, just not shown.
12. Uninstall
bin/magento module:disable Softaware_OrderTools
composer remove softaware/module-order-tools
bin/magento setup:upgradeExisting document numbers stay as they are; new documents use Magento's own sequence again.
Export the Deleted Orders Log as CSV first if you want to keep it: once the module is disabled, Magento's declarative schema can drop the module's tables (softaware_ordertools_counter, softaware_ordertools_deleted_order) and the sot_* columns of sales_order and sales_order_grid on the next setup:upgrade.
Changelog
Release notes
1.2.2
Latest
1.2.2 (2026-10-09)
Added
- Product listing, FAQ and user guide (docs/).
1.2.1
Fixed
bin/magento softaware:order-tools:grid:backfillworks on Magento 2.4.7 and 2.4.8. It stopped with "Call to protected method" there, because Magento madegetGridOriginSelect()of the sales grid public only in 2.4.9.- README: the module requires
softaware/module-core^1.0 (the README said ^1.2; composer.json was right).
1.2.0
- Deleted Orders Log: keyword search by order number, admin user or customer email. An email address also finds entries where the email was stored as a hash, so you can check whether a given customer's order was deleted.
- Deleted Orders Log: a one-line introduction above the grid; while nothing has been deleted, an explanation instead of an empty table that says whether deleting is switched on and which statuses can be deleted, with "Go to Orders" / "Open Settings". Fewer default columns (ID, order ID, currency, order date and IP address are under Columns), newest deletions first by Deleted At, status labels instead of status codes, hashed customer emails shown shortened (the CSV export keeps the codes and the full value).
- Order grid: the mass action "Remove Test Order Mark" is now "Unmark Test Order" (fits the actions menu).
- Order page: "Delete Permanently" opens a titled confirmation dialog ("Delete Order Permanently") whose button says "Delete Permanently" instead of "OK"; no inline JavaScript on the button.
- Settings: the two Order Tools sections sit next to each other in the Softaware tab; General, Next Numbers and Order Numbers open first; every comment names the default; shorter wording for Enabled and Allow Deleting Orders; Prefix and Suffix can be restored to the default and are checked for 20 characters in the browser.
- Next Numbers table: aligned cells (it used to inherit the form's field padding), "Last used" instead of "last", a warning when Order Tools is switched off, and the styles come from a small module CSS file that is loaded only on this settings section.
1.1.0
- Requires
softaware/module-coreinstead ofsoftaware/module-base. The admin menu and ACL now sit underSoftaware_Core::core("Softaware"); roles that had access keep it (migrated by module-core). After updating all SoftAware modules,softaware/module-basecan be removed.
1.0.0
- Custom order, invoice, shipment and credit memo numbers per store view: prefix, suffix, minimum counter length, start value, increment step, placeholders
{store_id}{yyyy}{yy}{mm}{dd}, optional yearly or monthly counter restart (only when the number contains the period), "same as the order number" for invoices, shipments and credit memos, next-number preview, atomic counters with a duplicate check and fallback to Magento's number. - Optional order grid columns: items (SKU x qty), coupon code, shipping country, order comment, test order; kept up to date by Magento's grid indexer.
- Test order flag with mass actions and grid filter.
- Guarded order deletion (off by default): separate ACL resource, allowed statuses (default Canceled), status re-checked under a row lock, 200 orders per request, POST with form key, confirmation dialogs.
- Deleted Orders Log (read-only) with formula-safe CSV export; customer email hashed by default.
- CLI:
softaware:order-tools:sequence:show,softaware:order-tools:grid:backfill.
FAQ
Questions, answered
Something else on your mind? The developers who wrote the module answer before and after you buy.
Ask a question →Already installed it? Open a support ticket
Does Order Tools change anything when I install it?
No. Document numbers stay on Magento's default, no extra grid columns are shown, the test order flag is off and deleting orders is off. You switch on each feature yourself under Stores > Configuration > Softaware > Order Tools and Order Tools: Document Numbers.
Will my existing order and invoice numbers change?
No. The settings only apply to documents created afterwards. Existing orders, invoices, shipments and credit memos keep their numbers.
Can two orders get the same number?
The counter is taken with a single atomic database statement on a separate connection, so parallel checkouts never get the same value. Every candidate number is also checked against the existing documents of all store views and skipped if it is taken, and Magento's unique key on the number stays the final guard. If a custom number cannot be built, Magento's own number is used and the error is logged, so a checkout never fails because of the numbering.
Can the counter start again every year or every month?
Yes, with Restart Counter. The restart is only applied when the number contains the period ({yyyy} or {yy} for yearly, plus {mm} for monthly), so a restarted counter can never repeat an earlier number. The admin refuses a setting that would not be safe.
Can invoices use the same number as the order?
Yes. Set the invoice, shipment or credit memo Numbering to Same as the order number. The first document gets the order number, further documents of the same order get -1, -2 and so on.
Can I use different numbers per store view?
Yes. The numbering settings can be set per website and store view. Store views with the same prefix and suffix share one counter; use {store_id} or a different prefix to give each store view its own series.
Which columns does it add to the order grid?
Items (SKU x qty), Coupon Code, Shipping Country, Order Comment and, with the test order flag, Test Order. Payment method, shipping information and customer group are already in Magento's own Columns menu, so they are not duplicated. Run bin/magento softaware:order-tools:grid:backfill once to fill the columns for older orders.
How is deleting orders protected?
Several guards, all checked on the server for every order: Allow Deleting Orders must be switched on (it is off by default); the admin role needs the separate permission Softaware > Order Tools > Delete Orders; the order's current status must be one of the statuses you allow (default: Canceled only), and it is checked again with a row lock just before the order is deleted; at most 200 orders per request; only POST requests with a valid form key; and a confirmation dialog in the grid and on the order page.
What exactly is deleted, and what is restored?
The order with its invoices, shipments, credit memos, items, addresses, payment, payment transactions, comments and tax rows, and their grid rows. Nothing is restored: no stock, no refunds, no reward points or store credit. Cancel and refund an order first if you need that. Sales reports keep their figures until they are refreshed.
Is there a record of deleted orders?
Yes. Softaware > Order Tools > Deleted Orders Log lists every deleted order with its number, store view, status, grand total, the deleted document numbers, order date, admin user, IP address and time. It is read-only, can be searched and exported as CSV, and entries cannot be deleted from the admin.
Is the customer email kept in the log?
By default only a SHA-256 hash of it is stored, which suits deletions made for data-protection requests. You can still search the log by email address: the search also finds entries stored as a hash. If you prefer, choose Store the email address in the settings.
Does it work with Hyvä?
Order Tools has no storefront code. The numbers appear wherever Magento shows them (emails, My Account, PDFs), on Luma, Hyvä and any other theme alike.
Is Order Tools free?
Yes, Order Tools is free. It requires softaware/module-core, which Composer installs automatically.
Support