Skip to content

URD: Product

ModuleCORE-05Versionv0.7
StatusBuiltDate2026-06-04

Business documentation. This URD is Product's feature list - each feature below is one Functional Area (<AREA>). The same <AREA> keys the feature's PRDs (PRD-<AREA>-NNN) and tests (TC-<AREA>-NNN), and each feature is listed in the Delivery feature catalog. See the Feature Spine convention.

1. Purpose

Define the user-facing requirements for product catalogue management: how owners create and maintain products, the variants they actually sell, the prices (fares) those variants carry, the categories that organize them, and the identifiers used to look them up. The catalogue is the foundation every selling channel reads from.

2. Scope

IncludedExcluded
Product create / update / status managementBill of Materials & recipes → Inventory
Categories (with add-on flag)Stock levels per location → Inventory
Variants and aggregate variant operationsOrder processing & checkout → Orders
Fares and fare sets (pricing input)Promotion discount calculation (In-progress)
Multi-scheme identifiers (SYSTEM, SLUG, SKU, BARCODE, QRCODE)Unit-conversion engine (Planned)
Sale-channel availabilityCSV / bulk import (Planned)
Variant types & units of measureTechnical API specifications → developer docs
Role-based data filtering

Conceptual definitions only - concrete schema and behavior live in commerce domain model and pricing fares.

3. Definitions

TermDefinition
ProductA base item in a merchant's catalogue.
VariantA sellable unit of a product (e.g. a size or flavour). What is actually sold and priced.
Variant typeClassification driving stocking & bundling: STORABLE, CONSUMABLE, SERVICE, KIT, COMBO, MANUFACTURED.
OptionA way a product varies (Size, Ice level…), owned by one product; each variant chooses one of its values.
Option valueA choice on an option (S / M / L); unique within its option.
CombinationThe set of values a variant takes - its identity within the product.
Fare setThe pricing container linked 1-to-1 to a variant.
FareA price entry inside a fare set; can be a base price, an override, or a quantity/time/channel tier.
CategoryA product grouping within a merchant; can be flagged add-on.
IdentifierA scheme-based code (SYSTEM, SLUG, SKU, BARCODE, QRCODE) used for lookup.
BundleA combo, add-on, or frequently-bought-together relationship between variants.
Sale-channel productA mapping controlling which products appear in which channels.

4. Conceptual Model

Conceptual only - full schema lives in the commerce domain model and pricing fares.

5. Feature Catalog

The feature list of this module. Each row is one feature (a Functional Area). Detail in §6. Mirrored in the Delivery feature catalog.

Feature IDFeaturePhaseStatusPriority
PRDProduct CatalogueP1BuiltHigh
CATCategoriesP1BuiltHigh
VARVariantsP2BuiltHigh
BNDCombos & BundlesP2BuiltHigh
OPTProduct OptionsP2BuiltHigh
FARFares / PricingP2BuiltHigh
PIDIdentifiersP1BuiltHigh
CMPPromotionsP3In-progressMedium
ACCAccess ControlP1BuiltHigh
SCHSale ChannelsP2BuiltHigh

Status: live from Plane where mapped, otherwise registry-declared. Vocabulary mirrors Plane (state-group / phase).

6. Features

One sub-section per feature, in catalog order. Each feature keeps its description, requirements, and acceptance together. Priority = MoSCoW (Must / Should / Could / Won't).

PRD - Product Catalogue Built

Feature ID: products/PRD · Phase: P1 · PRDs: - · Dev: @nx/commerce

What it does for users: owners create products within a merchant - each with multilingual name/description, a system identifier and slug, a default variant, images, sale-channel assignment, and a full lifecycle (deactivate / reactivate / archive). Products are searchable and listable, role-filtered.

Requirements

IDPRequirementStatus
URD-PRD-001MOwner can create a product within a merchantBuilt
URD-PRD-002MEach product gets a system-generated identifier and slugBuilt
URD-PRD-003MProduct name & description support multiple languagesBuilt
URD-PRD-004MA default variant is created with each new productBuilt
URD-PRD-005MOwner can update product informationBuilt
URD-PRD-006MOwner can deactivate / reactivate / archive a productBuilt
URD-PRD-007MProduct slug is unique within the same merchantBuilt
URD-PRD-008MUser can find a product by ID or slugBuilt
URD-PRD-009MUser can view a product list (role-filtered)Built
URD-PRD-013SOwner can attach images / media to productsBuilt
URD-PRD-014SOwner can assign products to specific sale channelsBuilt
URD-PRD-015SArchived products are read-only (terminal status)Built
URD-PRD-016SProducts support a parent-child hierarchyBuilt
URD-PRD-017SUser can search products by name (partial, i18n-aware)Built
URD-PRD-018SUser can filter the product list by categoryBuilt
URD-PRD-019COwner can import a catalogue from CSV / spreadsheetPlanned

Acceptance

AC-PRD-01: Product creation
GivenWhenThen
Owner with an active merchantCreates a product with name + categoryProduct created with generated identifiers; default variant created; product linked to merchant
Slug would collideSystem ensures a unique slug within the merchant

CAT - Categories Built

Feature ID: products/CAT · Phase: P1 · PRDs: - · Dev: @nx/commerce

What it does for users: owners group products into categories with multilingual names; categories can be flagged as add-on to drive add-on selling at the point of sale.

Requirements

IDPRequirementStatus
URD-CAT-001MOwner can create categories within a merchantBuilt
URD-CAT-002MCategory name supports multiple languagesBuilt
URD-CAT-003MOwner can update and delete categoriesBuilt
URD-CAT-004SA category can be flagged as add-onBuilt

Acceptance

AC-CAT-01: Category management
GivenWhenThen
Owner with an active merchantCreates a category with a multilingual nameCategory created and scoped to the merchant
Category flagged as add-onSavedAdd-on flag is persisted on the category

VAR - Variants Built

Feature ID: products/VAR · Phase: P2 · PRDs: - · Dev: @nx/commerce

What it does for users: owners add multiple sellable variants per product, each with a type (STORABLE/CONSUMABLE/SERVICE/KIT/COMBO/MANUFACTURED), units of measure, identifiers, an effective date range, and bundle relationships - created or updated atomically together with their info, fare set, fares, and identifiers.

Requirements

IDPRequirementStatus
URD-VAR-001MEvery product has at least one variant; status can changeBuilt
URD-VAR-002MOwner can create additional variantsBuilt
URD-VAR-003MAggregate create: variant + info + fare set + fares + identifiers in one atomic stepBuilt
URD-VAR-004MAggregate update: update a variant with all related data atomicallyBuilt
URD-VAR-005MEach variant has a system-generated identifierBuilt
URD-VAR-006MVariant type (STORABLE / CONSUMABLE / SERVICE / KIT / COMBO / MANUFACTURED) is selectableBuilt
URD-VAR-007SVariant can have an effective date rangeBuilt
URD-VAR-008SOwner can assign SKU / BARCODE / QRCODE identifiersBuilt
URD-VAR-009SVariant stores base / purchase / sale units of measureBuilt
URD-VAR-010SBundles relate variants as combo / add-on / frequently-bought-togetherBuilt
URD-VAR-011CA variant's resolved price can be read via a dedicated endpointPlanned
URD-VAR-012CUnit conversions between purchase and sale unitsPlanned

Acceptance

AC-VAR-01: Aggregate variant
GivenWhenThen
An existing productOwner creates a variant with info, fares, and identifiers in one stepVariant + info + fare set + fares + identifiers created atomically
Any sub-step failsEntire operation rolls back; nothing is persisted

BND - Combos & Bundles Built

Feature ID: products/BND · Phase: P2 · PRDs: PRD-BND-001 · Dev: @nx/commerce · @nx/sale

What it does for users: owners relate two variants with a typed bundle - a combo (priced once, made of component variants), an add-on (a free related variant attached to a host line), or a frequently-bought-together suggestion (directional, with its own optional price override). At the point of sale a combo is expanded server-side into one priced lead line plus zero-priced component lines, component quantities scale with the combo quantity, and add-ons / FBT items attach to an existing top-level lead line. The expansion is guarded against runaway depth, cycles, and empty combos, and the whole bundle graph is created atomically with the variant. (This is the detailed feature behind the URD-VAR-010 bundle mention.)

Requirements

IDPRequirementStatus
URD-BND-001MA bundle relates a lead variant to a related variant with one of three types: COMBO, ADDON, FBTBuilt
URD-BND-002MA combo is composed of component variants each with its own quantity; the combo is priced, its components are zeroedBuilt
URD-BND-003MAn add-on relates an always-free related variant to a host variantBuilt
URD-BND-004SAn FBT entry suggests a related variant, is directional, and may carry its own price override (fixed / percentage / per-unit / tiered) or fall back to the suggested variant's fareBuilt
URD-BND-005MThe same (type, lead, related) relationship cannot be duplicatedBuilt
URD-BND-006SBundles of a lead and type carry a display orderBuilt
URD-BND-007MBundles are created atomically with the variant aggregate; any failure rolls the whole create backBuilt
URD-BND-008MAdding a combo to the cart expands it server-side into a priced lead line plus zero-priced component child lines linked to the leadBuilt
URD-BND-009MEach component's quantity is its per-combo quantity × the combo quantity; a component reached on multiple branches is merged into one line with summed quantityBuilt
URD-BND-010SCombos may nest; expansion recurses up to a maximum depth of five levelsBuilt
URD-BND-011MA combo exceeding the depth limit, forming a cycle, or having no components is refused with a specific reasonBuilt
URD-BND-012MCombo component lines cannot be edited directly; the owner edits the combo lead and children scale automaticallyBuilt
URD-BND-013MA combo product variant must declare at least one combo component at creationBuilt
URD-BND-014SAn add-on or FBT item attaches at the point of sale to an existing top-level lead line, validated against the configured relationship; a combo cannot be attached this wayBuilt
URD-BND-015SAn add-on still reserves inventory for its component even though it is freeBuilt
URD-BND-016SEach combo lead and component line records which combo and bundle rows produced it for downstream kitchen / refund / auditBuilt

Acceptance

AC-BND-01: Combo expands at cart-add
GivenWhenThen
A combo priced once, made of 1 burger + 1 fries + 1 drinkCashier adds the combo to the cartA priced lead line plus three zero-priced component lines linked to the lead are created
The same combo, quantity twoCashier adds itEach component line is scaled to twice its per-combo quantity
AC-BND-02: Combo expansion guards
GivenWhenThen
A combo nested beyond five levelsCashier adds itRefused - the combo nesting is too deep
A combo that transitively references itselfCashier adds itRefused - a combo cycle is detected
A combo variant with no componentsCashier adds itRefused - the combo has no components
AC-BND-03: Attach an add-on / FBT
GivenWhenThen
A top-level lead line and a configured add-on relationshipCashier attaches the add-onA free add-on line is created under the lead and its stock is reserved
A configured FBT relationshipCashier attaches the FBT itemA line carrying its own (possibly overridden) price is created under the lead
A combo relationshipCashier tries to attach itRefused - a combo is server-expanded, not attachable
The item does not match the bundle's configured lead / related variantCashier attaches itRefused - the bundle relationship does not match
AC-BND-04: Combo lines stay consistent
GivenWhenThen
A combo on the orderOwner tries to edit a component line directlyRefused - components are not directly editable
The same comboOwner edits the combo lead's quantityEvery component line scales automatically
AC-BND-05: Bundle creation
GivenWhenThen
A combo product variant declared with no combo componentOwner creates itRefused - a combo variant must declare at least one component
A variant with combo / add-on / FBT bundlesOwner creates it; any sub-step failsThe whole variant create rolls back; no bundle row is persisted

OPT - Product Options Built

Feature ID: products/OPT · Phase: P2 · PRDs: PRD-OPT-001 · PRD-OPT-002 · Dev: @nx/commerce

What it does for users: owners define the options a product varies by (Size, Ice level, Colour…) with ordered values, and each variant takes one value per option - so each variant is uniquely identified by its combination of choices. At product creation the owner declares the option axes together with the exact variants to generate, and the system creates the whole product - options, values, variants, bindings, identifiers and inventory attributes - atomically, resolves one default variant, and makes each variant findable by its options in search.

Requirements

IDPRequirementStatus
URD-OPT-001MOwner can define a product's options, each with a name and a display orderBuilt
URD-OPT-002MEach option carries an ordered list of valuesBuilt
URD-OPT-003MAn option and its values are created or changed together in one stepBuilt
URD-OPT-004MA variant declares its value on each option it uses; an unknown option or value is refusedBuilt
URD-OPT-005MA variant takes at most one value per optionBuilt
URD-OPT-006MEvery value a variant uses must belong to the product and to its optionBuilt
URD-OPT-007MNo two variants of a product may share the same combination; option-free variants are exemptBuilt
URD-OPT-008MA merchant setting can require every variant to use options, refusing option-free onesBuilt
URD-OPT-009SAn owner can change which options a variant usesBuilt
URD-OPT-010SAn option offered with no values, or a duplicated choice, is refusedBuilt
URD-OPT-011MAt product creation the owner supplies both the option axes and the exact variants to generate, each declaring its own choice per axisBuilt
URD-OPT-012MOnly the declared variants are generated - the system never auto-expands the full option matrixBuilt
URD-OPT-013MOption axes, their values, and every declared variant are generated together with the product in one atomic stepBuilt
URD-OPT-014MExactly one generated variant is the default: an explicitly flagged one, else the first declared is promotedBuilt
URD-OPT-015MDeclaring more than one explicit default in the same creation request is refusedBuilt
URD-OPT-016SThe owner can change which variant is the default after creationBuilt
URD-OPT-017SEach generated variant can carry its own SKU / barcode; a barcode repeated in-request or already used in the merchant is refusedBuilt
URD-OPT-018SInventory-tracking attributes are generated only for stockable variant types; combos and non-stockable types are created untrackedBuilt
URD-OPT-019SGenerated variants and their option choices are denormalized into search, kept current as axes, values, or bindings changeBuilt

Acceptance

AC-OPT-01: Define options and declare a variant
GivenWhenThen
A product with options Size (S/M/L) and Ice (100/50/0)Owner declares a variant for Large, 50% iceVariant is saved with its two chosen values
The same productOwner declares a variant using a size that doesn't existRefused - the value is not part of the product
AC-OPT-02: Duplicate combination refused
GivenWhenThen
A variant for Large, 50% ice already existsOwner declares another variant for the same Large, 50% iceRefused - the combination is the same regardless of the order chosen
AC-OPT-03: Strict-options setting
GivenWhenThen
The strict-options setting is onOwner creates a variant that uses no optionsRefused - every variant must use options
The setting is offThe same requestVariant saved; option-free variants may coexist
AC-OPT-04: Choices stay within the product
GivenWhenThen
An option belonging to product AA variant of product B tries to use itRefused - the option is not part of that product
A value belonging to the Size optionA variant pairs it with the Ice optionRefused - the value is not part of that option
AC-OPT-05: Explicit variant generation
GivenWhenThen
A product with axes Size (S/M/L) and Ice (100/50/0)Owner creates it declaring five specific variantsExactly those five variants are generated - never the full nine-cell matrix
The same createAny sub-step fails (bad option, duplicate barcode, two defaults)The whole product graph rolls back; nothing is persisted
AC-OPT-06: Default variant on generation
GivenWhenThen
Several declared variants, one flagged defaultProduct is createdThe flagged variant is the default
Several declared variants, none flaggedProduct is createdThe first declared variant is promoted to default
Two declared variants flagged defaultProduct is createdRefused - only one default is allowed
AC-OPT-07: Change the default after creation
GivenWhenThen
A product whose default is variant AOwner promotes variant B to defaultB becomes the default and A is no longer default
AC-OPT-08: Per-variant barcode uniqueness
GivenWhenThen
Two declared variants carry the same barcodeProduct is createdRefused - the barcode is duplicated within the request
A declared variant's barcode already exists in the merchantProduct is createdRefused - the barcode is already in use
AC-OPT-09: Inventory attributes by variant type
GivenWhenThen
A stockable variant typeVariants are generatedInventory-tracking attributes are generated for each variant
A combo or non-stockable typeVariants are generatedVariants are created untracked
AC-OPT-10: Variants findable by their options
GivenWhenThen
A generated variant bound to Size=M, Ice=50Search is queried/filtered by its option valuesThe variant is returned and filterable by size and ice
Its axis, value, or binding later changesThe change is appliedThe variant's option facets in search are refreshed accordingly

FAR - Fares / Pricing Built

Feature ID: products/FAR · Phase: P2 · PRDs: - · Dev: @nx/pricing

What it does for users: every variant carries exactly one fare set with at least one default fare; fares can be tiered by date range, quantity window, and context (channel, time), and the system resolves the applicable price at sale time (override → discount → default).

Requirements

IDPRequirementStatus
URD-FAR-001MEvery variant has exactly one fare setBuilt
URD-FAR-002MEvery fare set contains at least one (default) fareBuilt
URD-FAR-003MFare amount must be zero or positiveBuilt
URD-FAR-004MAt sale time the system resolves the applicable fare: override → discount → defaultBuilt
URD-FAR-005SFares can have effective date rangesBuilt
URD-FAR-006SFares can have min / max quantity windowsBuilt
URD-FAR-007SFares support parent-child groups with context rules (channel, time, quantity)Built

The current fare model uses OVERRIDE and DISCOUNT group types (an earlier draft labelled these SALE/OVERRIDE). See pricing fares.

Acceptance

AC-FAR-01: Fare resolution
GivenWhenThen
A variant with multiple active faresAdded to cartOverride group wins; otherwise lowest qualifying discount; otherwise the default fare; date & quantity windows filter candidates first
No qualifying fareThe default (base) fare is used

PID - Identifiers Built

Feature ID: products/PID · Phase: P1 · PRDs: - · Dev: @nx/commerce

What it does for users: products and variants are looked up by scheme-based codes - SYSTEM and SLUG are auto-generated, while owners can attach SKU, BARCODE, and QRCODE identifiers, each unique per scheme within a merchant.

Requirements

IDPRequirementStatus
URD-PID-001MEach identifier is unique per scheme within a merchantBuilt
URD-PID-002MA product / variant can hold multiple identifiers across schemesBuilt
URD-PID-003MSYSTEM and SLUG identifiers are auto-generated on creationBuilt
URD-PID-004SOwner can assign SKU, BARCODE, QRCODE identifiersBuilt

Acceptance

AC-PID-01: Identifier lookup
GivenWhenThen
A product createdOn creationSYSTEM and SLUG identifiers are auto-generated
Owner assigns a SKU/BARCODE/QRCODESavedIdentifier is unique per scheme within the merchant

CMP - Promotions In-progress

Feature ID: products/CMP · Phase: P3 · PRDs: - · Dev: @nx/pricing

What it does for users: owners create and manage merchant-scoped promotion campaigns with a date range and usage limit; the automatic discount application at pricing time is not yet enabled.

Requirements

IDPRequirementStatus
URD-CMP-001SOwner can create and manage promotion campaigns (with date range, usage limit)In-progress
URD-CMP-002SPromotions are scoped to a merchantIn-progress
URD-CMP-003CPromotion discounts are applied automatically at pricing timePlanned

Promotion CRUD is functional; the discount calculation engine is disabled, so discounts are not yet applied automatically. See pricing promotions.

Acceptance

AC-CMP-01: Promotion campaign
GivenWhenThen
Owner with an active merchantCreates a promotion campaign with a date range and usage limitCampaign created and scoped to the merchant

ACC - Access Control Built

Feature ID: products/ACC · Phase: P1 · PRDs: - · Dev: @nx/commerce

What it does for users: every product operation is filtered by the requesting user's role - owners and employees see only products in their own/assigned merchants, while admins bypass role filtering.

Requirements

IDPRequirementStatus
URD-ACC-001MAll product operations are filtered by the requesting user's roleBuilt
URD-ACC-002MOwner sees only products under own merchantsBuilt
URD-ACC-003MEmployee sees only products in assigned merchantsBuilt
URD-ACC-004MAdmin / Super Admin bypass role filteringBuilt

Acceptance

AC-ACC-01: Role-based access
GivenWhenThen
Owner with merchants X, YViews productsOnly products under X and Y are returned
Employee assigned to XViews productsOnly products under X are returned
AdminViews productsAll products returned; filtering bypassed

SCH - Sale Channels (Menu organizer & channel visibility) Built

Feature ID: products/SCH · Phase: P2 · PRDs: PRD-SCH-001 · Dev: @nx/commerce

What it does for users: owners organize what they sell into sale channels - named, multilingual, hierarchical menu surfaces (counter, takeaway, delivery, kiosk). A product appears in a channel only when assigned to it, so visibility is a single switch flipped at product creation. Each channel carries a priority-ordered inventory-location chain (the lowest priority is the auto-pick default stock source), has a lifecycle status (activated / deactivated / archived), and cannot be deactivated while it still has active orders. Every channel and product list is served filtered by the caller's policy grants - an owner sees only their merchants' channels, an admin sees all - so the menu a device receives is always scoped to who is asking. (This is the detailed feature behind the URD-PRD-014 sale-channel mention.)

Requirements

IDPRequirementStatus
URD-SCH-001MOwner can create sale channels within a merchant, each with a multilingual name/description and an auto-generated system identifierBuilt
URD-SCH-002MA channel slug is unique among live channels within the same merchantBuilt
URD-SCH-003MA channel has a lifecycle status: activated, deactivated, archivedBuilt
URD-SCH-004MOwner can update a channel; an update with no fields is refusedBuilt
URD-SCH-005MDeactivating a channel is refused while it still has active sale ordersBuilt
URD-SCH-006SChannels support a parent-child hierarchyBuilt
URD-SCH-007MA product is assigned to one or more channels; the assignment controls whether the product appears in that channelBuilt
URD-SCH-008MProduct-to-channel assignments are written as part of the atomic product createBuilt
URD-SCH-009SA channel carries a priority-ordered inventory-location chain; the lowest-priority location is the auto-pick default; the chain diff-syncs on updateBuilt
URD-SCH-010MDeleting a channel unlinks its products and soft-deletes the channelBuilt
URD-SCH-011MChannel and product lists/counts are served filtered by the caller's policy grants; admins bypass the filterBuilt
URD-SCH-012SChannels and products are searchable, scoped to the caller's merchantsBuilt
URD-SCH-013SCreating a merchant's first channel completes the merchant's channel onboarding stepBuilt

Acceptance

AC-SCH-01: Create a channel
GivenWhenThen
Owner with an active merchantCreates a channel with a multilingual name and a slugChannel created, scoped to the merchant, with an auto-generated system identifier
A live channel in the merchant already uses that slugOwner creates another with the same slugRefused - the slug is already in use in this merchant
AC-SCH-02: Channel visibility via product assignment
GivenWhenThen
A Counter channel and a Delivery channelOwner creates a product assigned only to CounterThe product appears in Counter and not in Delivery
The same productOwner assigns it to Delivery as wellThe product now appears in both channels
AC-SCH-03: Deactivation guard
GivenWhenThen
A channel with an open (active) orderOwner deactivates the channelRefused - the channel still has active orders
The same channel after its orders are closed / cancelledOwner deactivates itThe channel is deactivated
AC-SCH-04: Inventory-location chain
GivenWhenThen
A channel created with locations [A, B, C]The channel is savedLocation A (lowest priority) is the auto-pick default stock source
The chain is updated to [B, A]The update is appliedB becomes the default; removed locations are unlinked; survivors keep their row
The input lists a location twiceThe channel is savedThe duplicate collapses to its first occurrence
AC-SCH-05: Policy-scoped serving
GivenWhenThen
Owner granted merchants X and YLists channels / productsOnly channels / products of X and Y are returned
Employee assigned to XLists channels / productsOnly those of X are returned
Admin / Super AdminLists channels / productsAll are returned; filtering is bypassed
AC-SCH-06: Delete unlinks products
GivenWhenThen
A channel with assigned productsOwner deletes the channelThe channel's product assignments are unlinked and the channel is soft-deleted

7. Constraints & Non-Goals

Constraints

IDConstraint
C-01A product belongs to exactly one merchant
C-02Product slug is unique within the same merchant
C-03Every product has at least one variant
C-04Every variant has exactly one fare set with at least one fare
C-05Aggregate create / update operations are all-or-nothing
C-06All records use soft-delete; nothing is physically removed
C-07Role-based filtering applies to every list and count operation

Non-Goals

  • Bill of Materials / recipe management (→ Inventory)
  • CSV / Excel bulk import
  • Unit-conversion engine
  • Promotion discount calculation (CRUD only today)

8. Version History

DateAuthorDescriptionVer
2026-02-26P. Do - Product OwnerInitial user stories & requirementsv0.1
2026-04-16P. Do - Product OwnerExpanded variant & fare requirementsv0.3
2026-05-29Docs migrationRestructured to module-docs convention; status-honest Built/In-progress/Planned per dev docs; promotions split from inventory (moved to Inventory module)v0.4
2026-06-04Claude (AI pair)Reorganize by feature (Feature Spine); each feature carries its own requirements + acceptancev0.5
2026-06-15Product squadAdd BND Combos & Bundles feature (URD-BND-001..016) with acceptance; links PRD-BND-001v0.6
2026-06-15Product squadAdd SCH Sale Channels (menu organizer & channel visibility) feature (URD-SCH-001..013) with acceptance; links PRD-SCH-001v0.7

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