Skip to content

URD: Commerce

ModuleCORE-03Versionv0.8
StatusBuiltDate2026-06-15

Business documentation. This URD is Commerce'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

Commerce lets a business owner stand up and run their business structure: a single Organization (the brand) and one or more Merchants (the legal point-of-sale units), each with its own sale channels and product categories. The module delivers a one-step onboarding that creates the whole structure atomically, plus full lifecycle management of every entity afterwards.

2. Scope

IncludedExcluded
Organization creation via onboardingEmployee lifecycle & login (→ User Management)
Organization profile, hierarchy, settings, attachmentsRole/permission definition (→ Permissions)
Merchant creation (single, batch, aggregate)Product catalog content (→ Products)
Business-type classificationStock levels (→ Inventory)
Sale-channel managementOrder / checkout processing (→ Orders)
Category management with add-on flagPayment processing (→ Payment)
Per-merchant deletion policyE-invoice issuance (→ Tax & Invoice)
Encrypted merchant configurationTechnical API specifications (→ developer docs)
Role-based data filtering

3. Definitions

TermDefinition
OrganizationTop-level virtual brand entity. Parent container for merchants, users, and devices. Carries branding, not legal identity.
MerchantA physical/legal point-of-sale unit under an organization where transactions occur. Holds tax info, invoice profile, and wallet.
Sale ChannelA selling channel within a merchant (e.g. dine-in, takeout, delivery). Supports hierarchy.
CategoryA product grouping within a merchant. Can be flagged as add-on.
Business TypeClassification that drives the POS UI: DEFAULT, TICKET, FNB, THEATER.
Aggregate OperationA single request that creates or updates a merchant together with its categories and sale channels, atomically.
Deletion PolicyPer-merchant configuration controlling cascade behavior on entity deletion.
ConfigurationEncrypted key-value settings for a merchant (payment providers, integrations).
SlugURL-friendly identifier. Globally unique for organizations; unique per organization for merchants; unique per merchant for sale channels.

4. Conceptual Model

Conceptual only - the full schema lives in the developer domain model.

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
ORGOrganizationP1BuiltHigh
MERMerchantP1BuiltHigh
SCSale ChannelsP1BuiltHigh
CATCategoriesP2BuiltHigh
DELDeletion PolicyP2BuiltMedium
CFGConfigurationP2BuiltMedium
ACCAccessP1BuiltHigh
RCPReceipt TemplatesP2BuiltMedium
FLRTable & Floor AllocationP2BuiltHigh
RTLRetail business typeP2PlannedHigh
BOPBackoffice portalP2PlannedHigh

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).

ORG - Organization Built

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

What it does for users: owners create a single brand entity via onboarding - the parent container for all merchants, users, and devices - then manage its profile, hierarchy, settings, and attachments throughout its lifecycle.

Requirements

IDPRequirement
URD-ORG-001MUser can create one organization via onboarding
URD-ORG-002MOnboarding atomically creates organization + default merchant + sale channels + access
URD-ORG-003MThe creating user is automatically assigned as Owner
URD-ORG-004MName (multilingual) and slug are required; all other fields optional
URD-ORG-005MA unique system identifier is generated on creation and is not editable
URD-ORG-006MOrganization can be found by ID or by slug (cascading lookup)
URD-ORG-007MOwner can update organization profile
URD-ORG-008MAggregate create/update supports file attachments
URD-ORG-009SOrganization list/count is filtered by the user's role
URD-ORG-010SOrganization can be deactivated (data preserved, reversible)
URD-ORG-011SOrganization can designate a headquarter merchant
URD-ORG-012SOrganization can be archived (permanently read-only)
URD-ORG-013COrganization can have child organizations (hierarchy)
URD-ORG-014MSelf-service onboarding runs in one local transaction and grants the calling user Owner, with no license issued (PRD-ORG-001)
URD-ORG-015MAdministrative (aggregate) onboarding provisions a new owner user and a license as a two-phase operation, fully compensating in reverse on a phase-2 failure
URD-ORG-016MAdministrative onboarding is idempotent - an Idempotency-Key replays a completed result and rejects a concurrent retry as in-progress
URD-ORG-017SOnboarding auto-creates a fixed default set: one headquarter merchant, two sale channels (Offline, Take away), and F&B category templates (F&B industry only)
URD-ORG-018SChanging the headquarter merchant emits an organization-HQ-changed event to downstream consumers

Acceptance

AC-ORG-01: Onboarding is atomic
GivenWhenThen
A new authenticated user with no organizationOnboarding completes with a valid name + slugOrganization (Activated) + default merchant + default channel(s) created; owner access granted; system & slug identifiers auto-generated
Any step failsDuring onboardingEntire operation rolls back - nothing persisted
AC-ORG-02: Slug uniqueness
GivenWhenThen
An organization already uses slug "my-business"Another user tries the same slugCreation rejected - slug already in use
AC-ORG-03: Two onboarding paths (PRD-ORG-001)
GivenWhenThen
An authenticated user with no organizationCompletes self-service onboardingOrg + HQ merchant + defaults created in one local transaction; the calling user is Owner; no license issued
A back-office operator provisioning a clientCompletes administrative (aggregate) onboardingA new owner user and a license are provisioned; on a phase-2 failure everything is compensated and nothing is left behind
AC-ORG-04: Idempotent administrative onboarding
GivenWhenThen
An administrative onboarding request with an Idempotency-KeySubmitted again after it completedThe stored result is replayed - no second organization is provisioned
The same Idempotency-KeySubmitted again while still in flightThe retry is rejected as in-progress

MER - Merchant Built

Feature ID: commerce/MER · Phase: P1 · PRDs: PRD-ORG-001 · Dev: @nx/commerce

What it does for users: owners add the legal point-of-sale units under their organization - one at a time, several at once, or together with their categories and channels - and manage each merchant's profile and lifecycle.

Requirements

IDPRequirement
URD-MER-001MDefault merchant created during onboarding
URD-MER-002MOwner can create additional merchants
URD-MER-003MOwner can batch-create multiple merchants
URD-MER-004MOwner can aggregate-create a merchant with categories + sale channels
URD-MER-005MMerchant slug is unique within the same organization
URD-MER-006MMerchant can be viewed with its channels and categories
URD-MER-007MOwner can update merchant information
URD-MER-008MAggregate update: ID-only = delete, ID+data = update, no ID = create
URD-MER-009MMerchant can be found by ID or by slug (cascading lookup)
URD-MER-010MMerchant list is filtered by the user's role
URD-MER-011MMerchant count respects the same filtering as the list
URD-MER-012SMerchant can be deactivated (reversible)
URD-MER-013SMerchant can be archived (permanently read-only)
URD-MER-014CMerchant hierarchy (parent-child)
URD-MER-015SExplicit delete flag distinguishes "delete" from "leave unchanged" in aggregate update
URD-MER-016MAll legal & financial attributes (business type, tax identity, e-invoice details, finance accounts and wallets, currency) belong to the merchant only - never to the organization
URD-MER-017MEvery organization has exactly one headquarter merchant, created at onboarding and recorded on the organization
URD-MER-018MA merchant's sectors must be valid business sectors; onboarding sets up the default sale channels and category templates for those sectors
URD-MER-019STax identity entered on the merchant is automatically reused by the e-invoice profile, with no re-entry
URD-MER-020MThe headquarter merchant is created with a derived slug, "Headquarter" name, headquarter flag, and direct tax method
URD-MER-021MMerchant enum defaults: business type Household (or Business); industry F&B (Retail / Ticket / Other); currency VND
URD-MER-022SOnboarding progress is six ordered steps on the merchant (merchant info → sale channel → finance account → tax info → product → employee), surfaced as completed/total in the launchpad
URD-MER-023SSlug uniqueness is soft-delete-aware (a removed slug is freed); aggregate onboarding auto-suffixes a unique token on collision; there is no maximum number of merchants per organization

Acceptance

AC-MER-01: Aggregate create
GivenWhenThen
An owner with an existing organizationCreates a merchant with categories + channelsMerchant, categories, channels all created atomically; identifiers generated
Any child is invalidDuring aggregate createEntire operation rolls back
AC-MER-02: Aggregate smart update
GivenWhenThen
Child item with ID onlyAggregate updateItem deleted
Child item with ID + dataAggregate updateItem updated
Child item without IDAggregate updateItem created
AC-MER-03: Headquarter & legal attributes
GivenWhenThen
A user completes onboardingThe organization is createdA headquarter merchant exists and is recorded as the organization's headquarter - in the same step
An organizationThe owner looks for where to enter tax identity / e-invoice / walletThere is nowhere - these are entered on a merchant, not the organization
A merchant has its tax code enteredThe owner issues an e-invoiceIt uses the merchant's tax identity automatically, with no re-entry
AC-MER-04: Auto-created defaults (PRD-ORG-001)
GivenWhenThen
Any onboarding completesThe structure is createdExactly one headquarter merchant (derived slug, "Headquarter", direct tax method) and two sale channels (Offline, Take away) exist
The onboarding industry is F&BThe merchant is createdF&B category templates are seeded
The onboarding industry is retail / ticket / otherThe merchant is createdNo category templates are seeded

SC - Sale Channels Built

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

What it does for users: each merchant has one or more selling channels (dine-in, takeout, delivery), created at onboarding and managed via the merchant aggregate or batch-added to an existing merchant.

Requirements

IDPRequirement
URD-SC-001MDefault channel(s) created during onboarding
URD-SC-002MChannels managed as part of merchant aggregate operations
URD-SC-003MChannels can be batch-created for an existing merchant
URD-SC-004MChannel slug unique within the same merchant
URD-SC-005MA unique system identifier is generated on creation and is not editable
URD-SC-006CChannel hierarchy (parent-child)
URD-SC-007SChannels can be deactivated or archived

Acceptance

AC-SC-01: Channel via aggregate
GivenWhenThen
An owner with an existing merchantManages channels via merchant aggregate or batch-addChannels created with a unique system identifier; slug unique within the merchant

CAT - Categories Built

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

What it does for users: owners group products into categories per merchant, managed through the merchant aggregate, with the option to flag a category as an add-on group.

Requirements

IDPRequirement
URD-CAT-001MCategories managed as part of merchant aggregate operations
URD-CAT-002MCategories can be renamed via aggregate update without affecting their products
URD-CAT-003MCategories can be deleted via aggregate update (soft-delete)
URD-CAT-004SCategory can be marked as add-on (and un-marked)

Acceptance

AC-CAT-01: Category via aggregate
GivenWhenThen
A category with linked productsRenamed via aggregate updateCategory renamed; its products are unaffected
A categoryDeleted via aggregate updateCategory soft-deleted

DEL - Deletion Policy Built

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

What it does for users: each merchant carries a configurable policy that controls how deletions cascade - whether a category with linked products can be removed, and whether deleting a category also deletes its products.

Requirements

IDPRequirement
URD-DEL-001SEach merchant has a configurable deletion policy
URD-DEL-002SstrictCategoryDeletion: when true, blocked if category has linked products
URD-DEL-003ScascadeProductDeletion: when true, deleting a category cascades to its products
URD-DEL-004SOwner can view and update the deletion policy

Acceptance

AC-DEL-01: Deletion policy
GivenWhenThen
strictCategoryDeletion = trueDeleting a category that has productsBlocked
cascadeProductDeletion = trueDeleting a categoryIts products are also deleted

CFG - Configuration Built

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

What it does for users: merchants store payment-provider credentials and integration settings as encrypted key-value configuration, organized into functional groups.

Requirements

IDPRequirement
URD-CFG-001SMerchants can store payment-provider credentials and integration settings
URD-CFG-002SSensitive credentials are encrypted at rest
URD-CFG-003SConfigurations are organized by group (system, table, integration)

Acceptance

AC-CFG-01: Encrypted configuration
GivenWhenThen
A merchant stores payment-provider credentialsSavedSensitive credentials are encrypted at rest and organized by group

ACC - Access Built

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

What it does for users: data is isolated by role - owners see only their own organization and merchants, employees see only the merchants they are assigned to, and every list/count is filtered accordingly.

Requirements

IDPRequirement
URD-ACC-001MUser access is managed via role-based policies (org-level or merchant-level)
URD-ACC-002MEmployees can be assigned to specific merchants
URD-ACC-003MA user can be granted access to multiple organizations
URD-ACC-004MOwner sees only their own organization and merchants
URD-ACC-005MAll list/count operations are filtered by the user's role (Admin bypasses)
URD-ACC-006MOwner can create, view, and update their organization
URD-ACC-007MOwner can create, update, and deactivate merchants
URD-ACC-008MOwner can manage channels and categories via aggregate operations
URD-ACC-009MOwner can assign an employee to a specific merchant
URD-ACC-010MEmployee sees only assigned merchants
URD-ACC-011MEmployee cannot access unassigned merchants
URD-ACC-012MA user with an unrecognized role is denied (no silent empty result)
URD-ACC-013MThe license is issued against the new owner user; its activation/contract code is echoed back, never stored
URD-ACC-014MThe owner grant is three access rows - join-domain to org, join-domain to merchant, assign-role Owner
URD-ACC-015MAdministrative merchant aggregate-create branches on caller - a back-office admin scopes Owner to the merchant; an organization owner links themselves
URD-ACC-016SOrganization/merchant list/count/find reads are scoped at the handler from the caller's grants (the central policy engine does not currently gate these reads)

Acceptance

AC-ACC-01: Role-based isolation
GivenWhenThen
Owner A (Org X) and Owner B (Org Y)Owner A requests organization/merchant dataOnly Org X data returned; Org Y not visible
Employee assigned to Merchant X onlyRequests merchant listOnly Merchant X returned

FLR - Table & Floor Allocation Built

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

What it does for users: an F&B merchant designs its physical floor as a named layout holding a tree of zones (floor → room → table) whose leaf zones carry units (tables) with capacity, position, and style - built in one atomic aggregate - then at the POS occupies units with dine-in orders, sees each table free or busy live, finds free tables, transfers parties between zones, and frees a table when its order is done.

Requirements

IDPRequirement
URD-FLR-001MA merchant models its floor as a named layout; each layout belongs to one merchant
URD-FLR-002MA layout holds a tree of zones (floor / room / table), self-nesting up to two levels below the layout root
URD-FLR-003MA leaf zone holds units (tables); a unit declares an optional capacity, a placement (canvas position), and a style
URD-FLR-004MOwner can create a layout with its whole nested zone tree in one atomic aggregate operation
URD-FLR-005MLayout aggregate update follows the id-convention: id-only = delete (cascades to the sub-tree), id+data = update, no id = create
URD-FLR-006MA zone is itself create/update-able as an aggregate with nested sub-zones and units; zones can also be batch-created
URD-FLR-007MAn aggregate that would exceed the two-level depth cap, or that references a zone not rooted in the target layout, is refused before anything persists
URD-FLR-008SOwner can read a layout aggregate (zone tree + units) with a configurable max depth - full tree for back-office, shallow for the POS
URD-FLR-009SLayouts, zones, and units each carry a lifecycle status (Activated / Deactivated / Archived) and are soft-deleted
URD-FLR-010MLayouts, zones, and units are also managed standalone (CRUD), scoped per merchant
URD-FLR-011MOpening a dine-in sale order on one or more units creates an occupancy usage that marks those units busy on the floor plan
URD-FLR-012MA usage carries a reservation window (from / to); when no end is given, a default 90-minute window applies
URD-FLR-013MOccupancy follows reserved/active → success → completed (table freed), or cancelled; a terminal usage cannot be cancelled again
URD-FLR-014MA unit is shown busy while it holds a usage in the reserved / active / success states, and free otherwise
URD-FLR-015MThe POS can query available units in a zone, and available child zones where every unit is free, at the current resolution depth
URD-FLR-016MStaff can transfer a party between zones - the source usages are cancelled and the target zone's units are occupied per order, atomically
URD-FLR-017MSplitting an order clones its active usages onto each new order; merging moves them to the surviving order
URD-FLR-018MEvery occupancy change broadcasts a real-time floor-plan event so all POS terminals stay in sync
URD-FLR-019SA usage may capture guest details (name, phone, email, party size)
URD-FLR-020SThe order / reservation keeps an allocation snapshot (the unit and its zone path, plus guest) so the assignment survives on the document
URD-FLR-021MAll allocation operations are scoped per merchant (x-merchant-id) and gated by allocation permissions

Acceptance

AC-FLR-01: Atomic floor aggregate (PRD-FLR-001)
GivenWhenThen
An owner designing a floorSaves a layout with its nested zones and units in one aggregateLayout, zones, and units are all created atomically
A child item with id only / id + data / no idA layout aggregate updateThe id-only child is deleted (cascading), the id+data child is updated, the no-id child is created
Any sub-step failsDuring the aggregateThe whole operation rolls back - no half-built tree persists
AC-FLR-02: Depth cap & layout-rooted guard
GivenWhenThen
A zone tree deeper than two levels below the layout rootSubmitted as an aggregateThe save is refused before anything persists
An update referencing a zone that belongs to a different layout (or is not a root zone)SubmittedThe save is refused as not-layout-rooted
AC-FLR-03: Occupy & free a table
GivenWhenThen
A free tableA dine-in order opens on itThe unit shows busy on the floor plan; a usage with a reservation window (default 90 minutes) is recorded
A table whose order is paid (success)The table is completedThe usage becomes completed and the unit shows free again
A usage already completed or cancelledAn attempt to cancel itRefused - a terminal usage cannot be cancelled again
AC-FLR-04: Free-table availability
GivenWhenThen
A zone with some tables occupiedA "free tables" queryOnly units with no reserved/active/success usage are returned
A parent zone with several child zonesAn available-zones queryOnly child zones where every unit is free are returned
AC-FLR-05: Transfer a party between zones
GivenWhenThen
A party seated in the main roomTransferred to the patio zoneAtomically: the source usages are cancelled and the patio's units are occupied for each affected order; both moves are broadcast live
The source zone has no active usage, or the target zone has no unitsTransfer attemptedRefused with a clear reason; nothing is changed

RCP - Receipt Templates Built

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

What it does for users: owners design how their printed receipt looks - per merchant or per sale channel, and per language - by assembling a named layout from a fixed set of blocks (text, separators, logo image, a line-item table, barcode, QR code, and a grid for side-by-side rows). The layout is validated on save, one template is the default per language, and at checkout the chosen template renders to a monochrome raster sized for 58mm or 80mm thermal paper.

Requirements

IDPRequirement
URD-RCP-001MA named receipt template is scoped to either a merchant or a sale channel
URD-RCP-002MEach template declares a paper width (58mm or 80mm) and a base font size
URD-RCP-003MTemplate name is unique per (principal, locale) and soft-delete aware
URD-RCP-004MTemplates are locale-specific; a merchant/channel keeps a template set per language
URD-RCP-005MExactly one template is the default per (principal, locale); promoting a default unsets the previous one
URD-RCP-006MThe layout is an ordered list of blocks from a fixed vocabulary: text, line, image, line-item table, barcode, QR code, grid
URD-RCP-007MThe layout is validated against the block vocabulary on create and update; a non-conforming layout is refused
URD-RCP-008MText, line-item, barcode, and QR blocks bind to dynamic order fields resolved at print time
URD-RCP-009SThe line-item table renders configurable columns (field, header, width, align, format) with an optional header row
URD-RCP-010SA grid block lays children into proportional columns with alignment / justification (up to 5 rows)
URD-RCP-011SBlocks carry presentation styling (alignment, weight, transform, decoration, borders, colors, padding)
URD-RCP-012SNumeric, currency, and date values format per a declared format on the block or column
URD-RCP-013MA template renders to a monochrome raster sized for its paper width (58mm → 384px, 80mm → 576px)
URD-RCP-014STemplates carry a lifecycle status (Activated / Deactivated / Archived) and are soft-deleted
URD-RCP-015MAll operations are scoped per merchant (x-merchant-id) and gated by receipt-template permissions
URD-RCP-016STemplates are listable/filterable by principal, locale, status, and default flag

Acceptance

AC-RCP-01: Layout validated on save (PRD-RCP-001)
GivenWhenThen
An owner editing a receipt layoutSaves a layout built from the fixed block vocabularyThe template is stored; the layout is accepted
A layout with a missing column field or an unknown block typeSavedThe save is refused - invalid receipt template content; nothing is stored
AC-RCP-02: One default per scope and language
GivenWhenThen
A merchant with template A as the Vietnamese defaultTemplate B is marked default for VietnameseB becomes the default; A is no longer the default - exactly one default for that (principal, locale)
A channel's English default and Vietnamese defaultLooked at togetherEach language has its own single default; they do not interfere
AC-RCP-03: Scope & render at checkout
GivenWhenThen
A merchant with an 80mm default template and a completed paymentThe receipt printsThe merchant's default template for the order's language is used, order fields and items are bound, and a 576px-wide monochrome raster is produced
A sale channel with its own templateA sale on that channel printsThe channel's template is used in preference to the merchant's

RTL - Retail Business Type Planned

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

What it does for users: a general retail shop (grocery, fashion, convenience) can run on KICKO the retail way - onboard as a retail business, get a retail catalog structure, and sell at a scan-first counter with no table/kitchen steps in the way. Retail is a full business line (business rules + dedicated UI), not an F&B variant.

Requirements

IDPRequirement
URD-RTL-001MOwner can onboard a merchant with business type Retail
URD-RTL-002MBusiness type is an explicit choice at onboarding - never silently defaulted to F&B
URD-RTL-003MRetail merchants receive retail category templates at onboarding (as F&B sectors do today)
URD-RTL-004MAt the POS, a retail merchant gets a counter selling flow: scan/search → cart → pay - no table/floor steps
URD-RTL-005MCashier can add an item to the cart by scanning its variant barcode
URD-RTL-006MInvoicing and tax behave correctly for a retail merchant
URD-RTL-007SF&B-only surfaces (floor map, kitchen, reservations) are hidden for retail merchants
URD-RTL-008SCatalog screens handle variant-heavy goods (size/colour) efficiently
URD-RTL-009SRetail merchants operate shifts and cash reconciliation identically to F&B
URD-RTL-010CGrocery: the sale screen surfaces lot/expiry information where tracked

Acceptance

AC-RTL-01: Retail onboarding
GivenWhenThen
A new owner choosing business type RetailOnboarding completesMerchant created with retail category templates; no F&B artifacts (floor plan, kitchen) are set up
A new owner skipping business typeOnboarding submitsSelection is required - no silent F&B default
AC-RTL-02: Counter sale
GivenWhenThen
A retail merchant at the POSCashier scans a variant barcodeThe item lands in the cart immediately; checkout completes with no table/kitchen step

BOP - Backoffice Portal Planned

Feature ID: commerce/BOP · Phase: P2 (Jun-Aug) · PRDs: PRD-BOP-001 · Dev: @nx/commerce · @nx/helpdesk

What it does for users: an operator runs a client end-to-end from the BO alone - onboard, configure, import data, support, and monitor.

Requirements

IDPRequirement
URD-BOP-001MOperator onboards a client end-to-end from BO (org → merchant (MST) → channels → business type)
URD-BOP-002MOperator configures packages & licenses, industries & category templates, tax groups from BO
URD-BOP-003MTransaction lookup at admin level (across merchants)
URD-BOP-004MBulk Excel import: categories, products/variants, prices, tax - row-level errors, duplicate-safe re-import
URD-BOP-005MSupport Center in BO: ticket list + detail worked end-to-end
URD-BOP-006SSLA / category / agent configuration
URD-BOP-007SAdmin dashboard: stores by industry, transactions by store
URD-BOP-008SPayment-methods configuration promoted to admin level

Acceptance

AC-BOP-01: Run a client from BO alone
GivenWhenThen
A new client signedOperator onboards + configures via BO onlyThe merchant can sell - no other tool touched
A catalog spreadsheetOperator imports itCatalog ready; bad rows reported by row; re-import creates no duplicates

7. Constraints & Non-Goals

Constraints

IDConstraint
C-01Organization must exist before creating merchants
C-02Aggregate operations are atomic - all or nothing
C-03All entities use soft-delete; nothing is physically removed
C-04Slug uniqueness: global for organizations, per-org for merchants, per-merchant for channels
C-05All operations require authentication
C-06Payment credentials are encrypted at rest

Non-Goals

  • Cross-organization access or sharing merchants between organizations
  • Ownership transfer (Planned)
  • Hard-delete of any entity
  • Standalone sale-channel / category CRUD outside the merchant aggregate (Planned)

8. Version History

DateAuthorDescriptionVer
2026-06-15Commerce squadAdded FLR Table & Floor Allocation feature (URD-FLR-001..021) - layout/zone/unit floor model authored as an atomic aggregate (depth cap, layout-rooted guard) plus live usage occupancy, availability, transfer, snapshot and real-time floor plan; backlinked to PRD-FLR-001v0.8
2026-06-15Commerce squadAdded RCP Receipt Templates feature (URD-RCP-001..016) - merchant/channel-scoped, locale-aware, fixed block vocabulary, one default per locale, thermal raster render; backlinked to PRD-RCP-001v0.7
2026-06-15Commerce squadOnboarding internals: two onboarding paths, saga + compensation, idempotency, license, defaults, six steps, owner-grant rows (URD-ORG-014..018, MER-020..023, ACC-013..016); backlinked to PRD-ORG-001v0.6
2026-06-04Claude (AI pair)Reorganize by feature (Feature Spine); each feature carries its own requirements + acceptancev0.5
2026-05-30P. NguyenMigrated to module-docs convention; reconciled requirement IDs/areas with test casesv0.4
2026-04-17P. NguyenMerged Organization + Merchant into Commerce modulev0.3
2026-02-27QE AssessmentQE findingsv0.2
2026-02-26P. Do - Product OwnerInitialv0.1

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