2026
Reader-visible change only, most recent first. Conventions are on Writing release notes.
Note
Entries before this page existed were reconstructed from merge history rather than written at the time, so they were never reviewed by whoever made the change. Treat anything surprising as worth confirming against the code.
August
| Date | Change | |
|---|---|---|
| 18 Aug | Changed | Search facets reduced to the four with data behind them — brand, category, colour, gender. Search |
| 7 Aug | Added | Internal service staff can act across every customer instead of one. Access |
| 4 Aug | Fixed | A duplicate "added to customer" email was sent daily to administrators provisioned by the ERP |
July
| Date | Change | |
|---|---|---|
| 30 Jul | Changed | Order confirmation email now groups lines by colourway, matching order history |
| 30 Jul | Fixed | 3DS challenge outcome re-verified server-side before capture, rather than trusting the client |
| 28 Jul | Fixed | A non-authenticated 3DS status is treated as a decline, not captured |
| 28 Jul | Changed | Basket accepts a bulk line add, consolidating with existing lines |
| 28 Jul | Fixed | Buy-X-get-Y counts units rather than basket lines, so the same quantity split across lines qualifies identically |
| 23 Jul | Added | Indent brands are unioned with allowed brands when deciding what a customer may see |
| 22 Jul | Added | Purchase order numbers required, and rejected when they duplicate one already used by that customer |
| 21 Jul | Added | Free road shipping in Australia above a configurable order value |
| 21 Jul | Fixed | That threshold is inclusive — free at the value, not only above it |
| 21 Jul | Fixed | Acknowledgement email showed the wrong pickup address and amount due; pickup codes now validated |
| 21 Jul | Fixed | A rejected user sees an access-denied message before being signed out |
| 20 Jul | Fixed | Clearance product images resolve per variant |
| 17 Jul | Changed | Basket validation reorganised into phase-tagged rules — some at the moment of change, some against the composed basket. Rule set with phases |
| 17 Jul | Fixed | Bonus reward lines carry a tax code, so a zero-price line maps correctly to the ERP |
| 16 Jul | Added | Company profile — a customer's own administrator can manage that customer's users |
| 16 Jul | Added | Bulk ordering by SKU, parsed server-side with a preview before anything is added |
| 15 Jul | Added | Portal-managed users — an identity and access model owned by Commerce, with administrative APIs |
| 14 Jul | Fixed | Reservations take on-hand stock only, all or nothing. Concurrent checkouts could previously reserve into back-order. Inventory lifecycle |
| 14 Jul | Fixed | Order numbers made globally unique; blocked and charge products guarded at checkout |
| 13 Jul | Added | Bonus product promotions — a qualifying basket offers a reward product |
| 13 Jul | Changed | Charge lines computed on the basket rather than stored. Compute on read |
| 9 Jul | Changed | Customer discounts hidden and promotions surfaced instead, resolved per customer |
| 7 Jul | Added | Product card tags and curated product grids |
| 6 Jul | Added | Stock cap validation by stratification |
| 5 Jul | Added | PayWay as a card provider alongside Stripe, selected per site by a setting |
| 5 Jul | Fixed | Brand code included in product search results |
| 5 Jul | Fixed | Postcode routing and package upserts are additive and no longer delete rows absent from a push |
| 3 Jul | Fixed | Purchase order numbers limited to 20 characters |
| 2 Jul | Fixed | Search suggestions matched by SKU now show the product name |
| 2 Jul | Changed | ERP order mapping tidied — tax codes, billing and reservations |
| 1 Jul | Fixed | A delivery basket with no address yet no longer fails pricing outright |
June
| Date | Change | |
|---|---|---|
| 30 Jun | Added | Payment options reflect account payment terms, with a payment type for cash on delivery |
| 30 Jun | Changed | Customer's permitted brands shown, where blank means all |
| 30 Jun | Fixed | Card surcharge computed on the fulfillable amount, and all basket money emitted at two decimal places |
| 30 Jun | Fixed | Search index missed products when only an owned type or a category changed |
| 26 Jun | Added | Order confirmation email, sent asynchronously from an editable template. Email |
| 26 Jun | Added | Invoice and credit documents fetched from the ERP on demand |
| 25 Jun | Added | Public Product API — batch lookup by EAN or SKU, API-key authentication, administrator-managed tokens. Public API |
| 23 Jun | Added | Promotions gained line-level proration and cart-context qualifiers |
| 22 Jun | Added | Canadian shipping |
| 19 Jun | Added | New Zealand and Australian shipping options and pricing. Fulfilment |
| 16 Jun | Added | Sub-brands and compliance icons, and search improvements |
| 15 Jun | Added | Order posted to the ERP asynchronously after placement. Async work |
| 15 Jun | Added | Surcharge membership and a line-level promotion type at checkout |
| 12 Jun | Added | Item discount group as a pricing rule target |
| 9 Jun | Changed | Product detail prices resolved through the pricing engine, so a product page and a basket cannot disagree |
| 8 Jun | Added | Product EAN, sleeve length and fabric type |
| 5 Jun | Fixed | Stripe payment intent aligned with the embedded payment element flow |
Before June
Initial build. The domains, the four API surfaces, authentication, the database and the integration contracts were established between late April and the end of May.
Not itemised — almost every change created something for the first time rather than changing something. Architecture describes the result.