Skip to content

PRD: Menu organizer & channel visibility

ModuleProductsPRD IDPRD-SCH-001
StatusReady to devFEATSCH
EpicPlaneBANA-1552
Date2026-06-15Versionv1.0
Packages@nx/commerce · @nx/core · @nx/searchURDSCH
SurfaceClient · Owner/MgrSale · POS
OwnerPhát Nguyễn

What menu organizer & channel visibility is

The catalogue (PRD-PRD-001) defines what a merchant sells, but not where each product is offered. This increment organizes what a merchant sells into sale channels - named, multilingual, hierarchical menu surfaces (counter, takeaway, delivery, kiosk) - and controls which products appear in each. Assigning a product to a channel is the visibility switch, and every channel and product list is served already filtered to the caller's access, so a device only ever sees its own merchant's menu.

Two gaps channels close

A merchant rarely sells the same list everywhere: dine-in differs from delivery, a kiosk shows a subset, a seasonal pop-up needs its own surface. Without channels, every device sees one flat catalogue and the merchant can't turn a product on for delivery while keeping it off the counter.

Two gaps follow. A channel must know where its stock comes from, with a sensible default when several locations qualify. And the menu a device receives must be scoped to who is asking - an owner of two merchants sees those two merchants' channels, an employee only their assigned merchant, an admin everything - without anyone hand-filtering.

One café, two channels

An owner with a café creates a Delivery channel and a Counter channel. New products go to Counter only; a subset is also assigned to Delivery, so the courier app shows a smaller menu. Delivery's chain lists the back-merchant location first - but today its orders source stock from the location recorded directly on the channel, not from the head of the priority chain just saved; if no location is recorded directly, it falls back to the merchant default. When the owner tries to deactivate Counter while a table still has an open order, the system refuses until that order closes.

Where this goes wrong

The priority-ordered inventory chain isn't read at runtime

A channel can record a whole priority-ordered inventory-location chain - and that makes it easy to assume the system walks the chain to find a stock source. It doesn't: fulfillment today only looks at the single location recorded directly on the channel; if that's empty, it falls straight back to the merchant's default location. The priority chain is stored and reconciled correctly, but it is never read at fulfillment.

Don't read FR-009's 🔶 as "the fallback logic is nearly done" - the part that's done is storage; the part that isn't built is the walk itself.

Proprietary and Confidential. Unauthorized copying, distribution, or use of this software is strictly prohibited.