E-commerce 6.1.4
2 August 2026
This release has upgrade notes. Read them before updating — they describe behaviour changes that need your attention.
E-commerce v6.1.4
Release Date: August 2, 2026 Tags: DASHBOARD, ADMIN, REPORTING, REVENUE, ORDERS, FULFILMENT, INVENTORY, CURRENCY, DEMO MODE, PRIVACY, LOADING STATES, DESIGN SYSTEM, LICENSING, BUG-FIXES
Overview
Version 6.1.4 is one body of work: the store admin dashboard. It has been rebuilt on the platform's standard page frame, and rebuilding it meant checking every figure on it against the code that produces it.
Most of them were wrong. Average order value read low by exactly the store's rejection rate. The revenue chart and the revenue card were two different numbers, and the chart's history moved whenever anybody edited a price. Every count on the page included orders an admin had deleted. And Rejected Orders read 0 on every store that has ever rejected one.
The page now leads with what is stuck rather than what is up: orders awaiting fulfilment and products out of stock sit above everything else, with the age and held value of the backlog beside the count.
Most of the figures on this page change value, and they change because the old ones were wrong — read Upgrade Notes before comparing anything against what you recorded last week.
Requires Core v6.6.1.
Update Instructions
pnpm updatorThen restart the backend:
pm2 restart allNothing needs configuring and nothing needs granting — this release adds no settings and no permissions. The dashboard's new wording ships translated in all 90 languages.
The update is otherwise routine, with one caveat: the figures on the dashboard will not match what you wrote down before it. Everything in Upgrade Notes applies on its own, without any action from you.
Upgrade Notes
Average order value was reading low — do not compare it against your history
Revenue on this page has always counted completed orders only. The average was that revenue divided by every order in the period, whatever its status, so the two halves of the sum were measured over different populations.
- Changed: the average is now revenue divided by the orders that produced it, on both sides of the period-on-period comparison.
- The figure rises, by the store's rejection rate. A store completing six orders in ten was reporting an average roughly 40% below what its buyers actually paid.
The revenue chart and the revenue card were two different numbers
The headline revenue figure reads each order's stored total — what the buyer was charged, after discount and including shipping and tax. The chart directly beneath it recalculated each bar from the current price of the products in that order.
- Changed: the chart is built from the same stored totals as the card, so the bars now add up to the headline.
- Bars move, in both directions. Any period containing a product whose price has since been edited was being redrawn at the new price; discounts, shipping and tax were ignored throughout.
Every figure counted orders you had deleted
Deleting an order from the admin removes it from the order screen but keeps the row. The dashboard was reading orders without that filter, so deleted orders were still being counted, still being summed into revenue, and still being listed.
- Changed: deleted orders are excluded from every figure, the chart and the recent-orders list.
- Revenue, order counts, units sold and the backlog all fall by whatever you have deleted. On a store that has never deleted an order, nothing moves.
The waiting-orders figure is no longer tied to the date range
- Changed: orders awaiting fulfilment, the age of the oldest one and the value they hold are all current state, all time. The date picker still governs everything below the masthead — revenue, orders, units, new customers, the chart and the order outcomes — and the page now says which scope each half is in.
- The backlog figure rises on any store with orders older than its default range, which is the last seven days. Those older orders are precisely the ones that need an operator, and they were the ones being dropped.
The out-of-stock count falls
Stock only prevents a sale on physical products — both checkout paths look at inventory only for those. The dashboard counted every product at quantity zero, including downloadable ones, disabled ones and deleted ones.
- Changed: it counts only products a customer could actually fail to buy, and captions itself with how many sellable physical products the store has in total.
- The figure falls, on any store selling downloads. A store selling nothing physical goes to zero, which is correct — it has nothing that can run out.
Rejected Orders stops reading zero
- Changed: the count of rejected orders in the period is now sent by the server and shown. The tile has been on the page for as long as the dashboard has, reading 0 on every store that has ever rejected an order.
Money is no longer labelled in dollars unless your store is in dollars
Every money figure here is a sum over the orders' own stored totals, and each order carries its own currency. The page printed a $ in front of the result regardless.
- Changed: if every order in your store shares one currency, that currency is named in the masthead and used on every figure — including four-letter crypto tickers such as USDT, which the old formatting could not express at all. If your orders span more than one currency, the totals are printed without a unit and the page says so, because a euro order summed into a dollar one is a wrong number, not a differently-labelled one.
Demo installations were masking the buyer's email in only one of the two places it appeared
Applies only where NEXT_PUBLIC_DEMO_STATUS is switched on. The recent-orders list carried each buyer twice — once as the display record the screen reads, once as the raw account record it is built from. Only the first was redacted, so the real address was still in the response body for anyone reading it out of the browser's network tab.
- Changed: both copies are redacted, and the screen reads the customer's name from the redacted record so the masking cannot be sidestepped by a later edit.
Added
The dashboard leads with what is waiting
- Added a state band above everything else, carrying two counts: orders awaiting fulfilment and products out of stock. Both are current state rather than period figures, both link straight to the screen you act on them from, and both stay neutral when there is nothing to do — so a coloured marker on that band always means work.
- Added the age of the oldest waiting order, in words. A backlog of twelve reads identically whether the oldest arrived an hour ago or in March, and those are not the same morning.
- Added the value held by the waiting orders, so the backlog can be weighed as money and not only as a row count.
- Added a total of sellable physical products beside the out-of-stock count, so the figure has a denominator.
Order outcomes for the period
- Added a row of four period figures under the range they belong to: total, completed, rejected and cancelled. Rejected was previously always zero and cancelled was never shown.
Provenance, at the top of the page
- Added a line stating when the figures were last read, which date range governs the period half of the page, and what currency the money is in. The old page spent that row on today's wall-clock date and time, which is not a fact about the data.
- Added a Refresh button. The dashboard could previously only be re-read by changing the date range or reloading the page.
Changed
The dashboard is on the standard page frame
- Changed the dashboard onto the platform's standard page frame and shared chart kit, so its heading, spacing, page width and card treatment match every other admin screen.
- Changed the sales chart from a hand-built one to the shared one. The old chart had no vertical axis, so its bars could only be compared with each other and never read as a value, and its hover label was hardcoded English with a hardcoded dollar sign — it appended the word "units" to order and customer counts in all 90 languages.
- Removed three tiles beneath the chart that restated total sales, orders and customers — three numbers already shown in the row of cards on the same screen, in a different visual language.
- Removed the Quick Actions panel. Its three destinations — products, categories, orders — are all in the navigation directly above it.
- Removed a Filter button beside the chart controls. It had no handler and had never done anything.
The store admin no longer blanks itself while the licence is checked
- Changed the licence check to cover the page content only. It previously wrapped the header, the navigation and the footer as well, so an in-flight check replaced the entire admin page — chrome included — with one centred spinner.
- Changed the store admin layout so the footer sits at the bottom of the window rather than directly under the content. Its position previously depended on how tall the data made the page, so it travelled down the screen as each screen finished loading.
The order page keeps its shape while it loads
- Changed the admin order detail page so that the back link, the heading, the status control, the line-item table, the money summary and the customer and shipping cards all render immediately, with only the values waiting. The page previously replaced roughly nine hundred pixels of itself with a small spinning ring.
A failed refresh no longer throws the dashboard away
- Changed a failed request to leave the figures on screen with a warning saying the refresh failed, and to mark the freshness indicator as stale. Any failure previously replaced the whole page with an error panel, including a failure that happened while a perfectly good dashboard was already loaded.
- Changed the error panel itself to offer Try again and a link to the order queue, rather than being a dead end.
A missing product image shows a product icon
- Changed the top-selling products list to draw a small product icon when a product has no image or its image file has gone missing, instead of a stock grey placeholder graphic drawn on a 1200-pixel canvas and squeezed into a 40-pixel square, which stayed light in dark mode.
Fixed
Average order value was understated by the store's rejection rate
- Fixed the average being completed-order revenue divided by all orders in the period. The two halves counted different populations, and the percentage change beside it compared one basis against the other. See Upgrade Notes.
The revenue chart was drawn from today's prices
- Fixed each bar being recalculated from the current price of the products in the order rather than the total the buyer was charged. The chart and the revenue card above it were two different numbers on one screen, and the chart's history moved whenever anybody edited a price. See Upgrade Notes.
Every figure counted deleted orders
- Fixed the dashboard reading orders without excluding deleted ones, so revenue, order counts, units sold, the backlog, the chart and the recent-orders list all included rows the admin cannot reach. The backlog was the visible symptom; the recent-orders list was the reachable one, offering a row whose detail page returns "not found". See Upgrade Notes.
Rejected Orders read zero on every store
- Fixed the dashboard asking for a rejected-order count the server did not send. The tile has shown 0 for as long as it has existed. See Upgrade Notes.
The out-of-stock count included products that cannot run out
- Fixed it counting every product at quantity zero, including downloadable products — which both checkout paths sell regardless of inventory — as well as disabled and deleted ones. See Upgrade Notes.
Revenue was captioned with a count of orders it does not include
- Fixed the revenue card reading "From N orders" where N was every order in the period and the revenue was completed orders only. A store completing 60 of 100 displayed its 60 orders' revenue over the words "From 100 orders" — and the outcomes row at the foot of the same page printed both numbers, so the dashboard contradicted itself on one screen. It now reads completed orders.
The dashboard reported an empty store for the whole of every load
- Fixed every figure on the page defaulting to zero before the data arrived. For the length of each load the dashboard stated $0.00 revenue, no orders, no units, no new customers, nothing awaiting fulfilment and nothing out of stock — a confident all-clear on the one band whose entire job is to be believed.
- Fixed the same fault in the two lists. Recent orders and top products each collapsed to a small spinner and then rebuilt at their real size; both now reserve their exact final shape, with product thumbnails held at their loaded size, so neither panel moves as the data lands.
A buyer with no name on record was listed as "null null"
- Fixed the buyer's display name being their first and last name joined without checking either was set. Both are optional, so an account with neither produced the literal text null null in Recent Orders. Such a buyer is now identified by their email address, and an order with no account attached says Guest as it always did.
A period exactly level with the one before it showed no comparison
- Fixed the period-on-period change being hidden whenever it came out at exactly zero. A dead-level week and a week with no comparison available looked identical: both showed nothing at all.
The status tiles promised a filtered order queue and delivered the whole list
- Fixed the four status tiles linking to the order screen with a status attached to the address, and the out-of-stock tile linking to the product screen with a stock filter attached. Neither screen reads a filter from the address, so every one of those links landed on the complete, unfiltered list — an operator clicking "Pending Orders" got every order the store has ever taken. The tiles now link to the screen plainly, where its own filters and summary break the rows apart on arrival.
Buyer email addresses were only half masked on demo installations
- Fixed the recent-orders payload carrying the buyer's account record alongside the display record built from it, with only the display record redacted. On an installation running in demo mode the real address was still in the response body. Nothing was ever shown on screen. See Upgrade Notes.