← All releases

QA Release — 2026-08-06

Tag qa-2026-08-06 · Created: 2026-08-06 · Last Updated: 2026-08-06

What shipped to QA in this release (changes since 2026-07-20), grouped by area. The Ref column is stable — cite it when reporting. Rows marked → How to test are expanded at the bottom.

✨ Highlights

Signing in on the merchant portal no longer ends on a 404
see Sign-in & behind the scenes.
"Open in merchant portal" opens QA again instead of an address that does not exist — see Admin portal.
A Manager gets their sidebar back and can work adjustments end to end — see Merchant portal.
Editing a record someone else just changed opens a merge dialog instead of overwriting them — see Across both portals.
Completing a sale actually moves stock now
see Merchant portal.

🖥️ Admin portal 4

Type What changed Where to check Ref
Fixed The module catalog lists modules again. It was rendering completely empty with every stat card at 0 even though the server was returning 26 modules. → How to test Platform › Modules #957
Fixed A merchant's module grid shows real category names instead of lowercase keys, and a core module can no longer be switched off — the toggle is locked and a forced attempt is refused. → How to test Platform › Merchants › detail › Modules #943
Fixed Devices on a partner's merchant detail show their real status. Every row used to read "Sin conexión" regardless of the device's actual state. → How to test Partner › Merchants › detail › Devices #1008 #995
Fixed "Open in merchant portal" opens the QA merchant portal. It was opening https://localhost:7710, an address that only resolves on a developer machine, so the new tab failed to load after you picked a reason. → How to test Platform › Merchants › detail › Open in merchant portal

🏪 Merchant portal 19

Type What changed Where to check Ref
New Completing a sale, return or void now moves stock — quantity on hand changes and a movement row is written in the same transaction, and a void nets out whatever was already returned against it instead of crediting the full amount. Selling more than you have is still allowed on purpose. → How to test Inventory › Stock · Inventory › Movements #961 #968
New A purchase order can be recreated as a draft copy of an earlier one, carrying its supplier and lines. → How to test Purchase orders › Reorder from a previous PO #972 #1001
New The purchase order list flags orders running late, and ones due today, without opening each one. → How to test Purchase orders #1025
New A supplier can require a money minimum for a whole order, and submitting below it is refused. → How to test Suppliers › open a supplier · Purchase orders › Submit #1053
New A reason code can require a note, and an adjustment cannot be created, saved or completed in a note-requiring state without one. → How to test Settings › Reason codes · Inventory › Adjustments #1112
Improved Inventory documents now credit the operator who actually changed their status — "Updated by" used to keep showing whoever created the document. → How to test Inventory › Adjustments › open one › Updated by #1087
Improved Low Stock's suggested quantity now matches the reorder worksheet and the report for the same item. All three used to disagree because Low Stock ignored on-order quantities, the supplier minimum and the need-greater-than-zero gate. → How to test Inventory › Low stock · Inventory › Reorder worksheet · Reports #954 #1010
Improved Location pickers search the whole list. They were plain dropdowns holding only the first 100 locations, so a merchant with more than that could not pick the rest. → How to test Purchase orders › create · Purchase receipts › New · Inventory › Adjustments · Transfers #948
Improved The reorder worksheet says when its list was cut short, showing how many items it is displaying out of how many are below their reorder point. You can still generate the order from a shortened list. → How to test Inventory › Reorder worksheet #949
Improved The reorder worksheet appears on the Inventory hub. Inventory › hub cards #985
Fixed Opening the reorder worksheet by direct link while "all locations" is selected now shows the location switcher instead of a dead end that said "Pick a location" with nothing to pick it with. → How to test Inventory › Reorder worksheet #956
Fixed Dashboard report figures follow the selected location. The location filter was being dropped, so every figure aggregated across all locations. → How to test Dashboard #992
Fixed Clearing the weight or barcode on a product variant now saves as empty. It reported success and silently kept the old value. → How to test Products › open a product › variants #1079
Fixed Documents that used a payment method or reason code still open after that code is deleted, and show the code they were saved with. They used to come back empty or as a 404. → How to test Inventory › Adjustments › open one #983
Fixed An inactive tax group is refused for a new or changed assignment. Assignments made before it was deactivated are kept and can still be edited, and deactivating a group is not blocked. → How to test Taxes › Tax groups · Customer tax profiles · Products #970
Fixed Adding the same variant twice to a price change is refused with a message naming it, instead of failing with an unexpected error. → How to test Inventory › Price changes #1040
Fixed The purchase order "Add product" drawer repopulates after you add a line. The list went blank and stayed blank until you toggled the stock filter. → How to test Purchase orders › open a PO › Add product #993
Fixed A Manager sees the full sidebar again and can work adjustments end to end. The role lost every module-gated menu item and hit "not authorized" on the screens behind them. → How to test Sidebar · Inventory › Adjustments #1076 #1060 #1085
Fixed Pre-existing duplicate open draft receipts were cancelled by this release — the oldest one per purchase order survives, and each cancelled one carries a note saying why. Purchase receipts #1094

🧩 Across both portals 3

Type What changed Where to check Ref
New Saving a record that someone else changed while you had it open now opens a dialog comparing both versions field by field, and lets you apply a merge, discard your edit, or keep editing. It used to overwrite them silently. → How to test Any edit drawer on either portal #1033
Improved Buttons and rows show a pressed state on touch, so a tap on a tablet no longer feels unresponsive. Any button on a touch device #958
Fixed The delete button meets the AA contrast requirement in its resting state, not only on hover. Any delete confirmation #1119

🔑 Sign-in & behind the scenes 3

Type What changed Where to check Ref
Improved Invitation and magic-link email goes out through a queue, so a provider hiccup retries instead of dropping the message. → How to test Platform › Users › invite a user #982 #1128
Improved Sync commands are addressed by their global identifier instead of an internal number. A tool or saved link using the old numeric form will stop working. Platform › Sync monitor #1116
Fixed Signing in returns you to the portal that started it. The merchant portal used to land on a 404 and the admin portal could report an invalid state. Sign-in links issued before this release no longer work — request a new one. → How to test Merchant portal › Sign in · Admin portal › Sign in #1091

🧪 How to test 24

Only the items that need more than a glance. Click to expand.

#1091 — signing in returns you to the portal that started it
(no PR) — "Open in merchant portal" opens QA
#1033 — the conflict dialog when two people edit the same record
#961 and #968 — stock moves on sale, return and void
#1076, #1060 and #1085 — a Manager gets the sidebar and adjustments back
#1112 — reason codes that require a note
#1053 — supplier minimum order amount
#972 and #1001 — recreate a purchase order from an earlier one
#1025 — overdue and due-today purchase orders
#1087 — who last changed an inventory document
#954 and #1010 — one reorder quantity everywhere
#948 — location pickers reach every location
#949 — the reorder worksheet says when its list was cut short
#956 — the reorder worksheet is no longer a dead end
#992 — dashboard figures follow the selected location
#1079 — clearing weight or barcode on a variant
#983 — documents survive the deletion of a code they used
#970 — inactive tax groups on new assignments
#1040 — the same variant twice on a price change
#993 — the "Add product" drawer keeps its list
#957 — the module catalog is not empty
#943 — module category labels and the core-module lock
#1008 and #995 — device status on the partner view
#982 and #1128 — email through the outbox

🔧 Technical — not QA-testable 13

Referenced in development but with nothing to verify through the normal portal flow — listed so a referenced number never dead-ends.

Ref What Why not testable
#1037 Duplicate lines on a stock count are refused. Before this, finalizing multiplied the variance by the number of duplicate lines and silently moved stock by the wrong amount. Stock counts have no portal screen yet — API-only.
#1094 (race) Two people starting a receipt for the same purchase order at the same instant can no longer both succeed; the guarantee is now a database index. Needs two creates in the same instant. The sequential case was already blocked last release.
#1039 Two simultaneous registrations of the same device code both get a clean conflict instead of one unexpected error. Needs concurrent requests; a sequential duplicate already reported a clear error.
#978 Saving quantity on hand reloads and re-applies the change instead of failing when another writer commits first. Needs simultaneous writes; a successful retry is indistinguishable from an ordinary save.
#1054 #1014 Return-quantity guard serialized, and a helper renamed ahead of the shift-total work. Concurrency-only, and the rename carries no behaviour change at all.
#953 #959 #966 Module activation hardened against two simultaneous toggles. Needs two requests in the same millisecond; no screen can produce it.
#947 Module payloads no longer carry an internal numeric id. Identity plumbing — the visible screens are unchanged.
#1007 API read caching moved onto HybridCache. No trigger of its own; behaviour is identical and only timing changes.
#1128 (retry) Email retry behaviour when the provider fails. Needs the provider to fail; cannot be forced from the portal. Normal delivery is in the table.
#1075 POS device bootstrap and key storage. Needs a POS terminal build; not reachable from either portal.
#1016 #945 #971 Shared UI package released as 0.9.0 with more public exports (including AppShell and UserMenu). Library surface — the portals already rendered these; nothing visible changed.
#1043 SQL data-plane auditing on the QA server. Verified in Azure storage, not in the product.
#974 Fonts allowed from the asset origin under the production security policy. POS-only and only observable in browser devtools.