---
id: CAP-ACC-PRD-001
title: Understand the available product kinds
feature: FEAT-ACC-PRD-01
product_area: accounting
module: products
revision: 4
status: draft
product_intent: proposed
implementation_evidence: observed
supersedes:
  - react-console acceptance inventory CAP-ACC-PRD-001
  - react-console acceptance inventory CAP-ACC-PRD-019 (the grid's type tabs)
source_sha:
  services-accounting: f47cb263875bbc0c5640fba7dae6785ec32695f8
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
intent_sources:
  - 'services-accounting:docs/milestones/ACCT-M1-books-and-invoices.md#D4'
  - 'services-accounting:docs/milestones/ACCT-M1-books-and-invoices.md#R8'
  - 'services-accounting:docs/migrations/accounting-modernization/products-shared/README.md#D-1'
purpose: Finance starts with the catalogue’s product kinds.
outcomes:
  - Product kinds guide appropriate configuration.
concepts:
  - CON-ACC-PRD-001
actors:
  - ACT-ACC-006
  - ACT-ACC-007
  - ACT-ACC-010
  - ACT-ACC-011
surfaces:
  - console
  - api
permissions:
  - key: accounting.products.read
    where_checked: api
    scope: tenant
rules:
  - id: BR-CAP-ACC-PRD-001-01
    proved_by: [ATS-ACC-PRD-001-01, TST-ACC-PRD-031]
    statement: All workspaces share a release-managed register of product kinds that application callers cannot modify.
    kind: invariant
    enforced_at:
      - database
    must_prove: true
    provenance: test
    source: >-
      services-accounting:modules/products/tests/integration/db/products.table.integration.spec.js#refuses the
      application role an INSERT
    origin: none
  - id: BR-CAP-ACC-PRD-001-02
    proved_by: [ATS-ACC-PRD-001-02, TST-ACC-PRD-030, TST-ACC-PRD-038]
    statement: >-
      Accounting kinds appear first: Accounting Products use fixed prices and support bundles, Donation
      Products take the giver’s amount, and Legacy Products use fixed prices but are never sold.
    kind: policy
    enforced_at:
      - database
      - service
    must_prove: true
    provenance: test
    source: >-
      services-accounting:modules/products/tests/e2e/products.e2e.spec.js#answers the three Accounting types
      first, in display order, with their labels and legacy types
    origin: 'services-accounting:docs/milestones/ACCT-M1-books-and-invoices.md#D4'
    examples:
      positive: Legacy Products remain visible as a kind even though they are unsellable.
      negative: A workspace cannot register an additional Accounting kind for itself.
  - id: BR-CAP-ACC-PRD-001-03
    proved_by: [ATS-ACC-PRD-001-02, ATS-ACC-PRD-001-06, TST-ACC-PRD-030, TST-ACC-PRD-038]
    statement: >-
      The register identifies Membership, Commerce and Events kinds by owner and extension record, with
      membership add-ons and Events kinds inactive.
    kind: policy
    enforced_at:
      - database
    must_prove: true
    provenance: test
    source: >-
      services-accounting:modules/products/tests/e2e/products.e2e.spec.js#answers the domains’ types after
      them, each with its owning service and extension table, the Events ones inactive
    origin: 'services-accounting:docs/migrations/accounting-modernization/products-shared/README.md#D-1'
  - id: BR-CAP-ACC-PRD-001-04
    proved_by: []
    statement: >-
      A kind declares its pricing model and whether its products support selling, shipping, inventory,
      deferral, installments and bundles.
    kind: policy
    enforced_at:
      - database
    must_prove: false
    provenance: test
    source: >-
      services-accounting:modules/products/tests/e2e/products.e2e.spec.js#answers each type’s pricing model
      and capabilities
    origin: none
  - id: BR-CAP-ACC-PRD-001-05
    proved_by: [ATS-ACC-PRD-001-05]
    statement: >-
      Registry reads return every kind in display order with a count and fail if the register exceeds two
      hundred entries.
    kind: policy
    enforced_at:
      - service
    must_prove: true
    provenance: observed
    source: 'services-accounting:modules/products/services/persistence/product-types.ts:listProductTypes'
    origin: none
  - id: BR-CAP-ACC-PRD-001-06
    proved_by: [ATS-ACC-PRD-001-03, TST-ACC-PRD-028]
    statement: Access to the product-kind register requires product read permission.
    kind: permission
    enforced_at:
      - api
    must_prove: true
    provenance: test
    source: >-
      services-accounting:modules/products/tests/e2e/products-security.e2e.spec.js#reads the product type
      registry
    origin: 'services-accounting:docs/milestones/ACCT-M1-books-and-invoices.md#D3'
  - id: BR-CAP-ACC-PRD-001-07
    proved_by: [ATS-ACC-PRD-001-04, TST-ACC-PRD-021]
    statement: >-
      The Accounting Products page provides tabs only for Accounting Products, Donation Products and Legacy
      Products.
    kind: policy
    enforced_at:
      - console
    must_prove: true
    provenance: observed
    source: 'react-console:components/accounting-config/products/use-products.ts:accountingProductTypesOf'
    origin: 'services-accounting:docs/milestones/ACCT-M1-books-and-invoices.md#R8'
  - id: BR-CAP-ACC-PRD-001-08
    proved_by: []
    statement: 'The console creates active Accounting-owned kinds except Legacy Products, which require API creation.'
    kind: policy
    enforced_at:
      - console
    must_prove: false
    provenance: observed
    source: 'react-console:components/accounting-config/products/use-products.ts:isCreatedHere'
    origin: none
scenarios:
  - id: SC-CAP-ACC-PRD-001-01
    given: The workspace catalogue is empty.
    when: A controller visits Products.
    then: 'The page offers Accounting, Donation and Legacy tabs and explains that legacy items are not sold.'
    provenance: observed
    source: 'react-console:components/accounting-config/products/products-page.tsx:ProductsList'
  - id: SC-CAP-ACC-PRD-001-02
    given: Membership kinds are available and Events kinds remain inactive.
    when: A caller requests the kind register.
    then: 'Packages and chapter dues appear active, while Events entries appear inactive.'
    provenance: test
    source: >-
      services-accounting:modules/products/tests/e2e/products.e2e.spec.js#answers the domains’ types after
      them, each with its owning service and extension table, the Events ones inactive
edge_cases: []
constraints: []
depends_on: []
related:
  - CAP-ACC-PRD-002
  - CAP-ACC-PRD-007
journeys:
  - JNY-ACC-PRD-001
open_questions: []
evidence:
  - 'react-console:components/accounting-config/products/products-page.tsx'
  - 'react-console:components/accounting-config/products/use-products.ts'
  - 'services-accounting:docs/accounting/products.md'
  - 'services-accounting:docs/migrations/accounting-modernization/products-shared/README.md'
  - 'services-accounting:docs/milestones/ACCT-M1-books-and-invoices.md'
  - 'services-accounting:modules/products/aws/api/products.routes.ts'
  - 'services-accounting:modules/products/db/product-types.table.ts'
  - 'services-accounting:modules/products/services/persistence/product-types.ts'
  - 'services-accounting:modules/products/tests/e2e/products-security.e2e.spec.js'
  - 'services-accounting:modules/products/tests/e2e/products.e2e.spec.js'
  - 'services-accounting:modules/products/tests/integration/db/products.table.integration.spec.js'
  - >-
    services-accounting:modules/products/tests/integration/services/persistence/product-types.queries.integration.spec.js
controls: [TC-IAM-001, TC-IAM-002, TC-IAM-004, TC-IAM-005, TC-AZ-001, TC-AZ-002, TC-AZ-003, TC-AZ-004, TC-AZ-006, TC-TEN-001, TC-TEN-002, TC-TEN-003, TC-LOG-002, TC-LOG-003, TC-LOG-004, TC-LOG-005, TC-PI-001]
exercised_by: [FAS-ACC-PRD-01-01, FAS-ACC-PRD-01-02, FAS-ACC-PRD-01-04]
suites: [TST-ACC-PRD-021, TST-ACC-PRD-028, TST-ACC-PRD-030, TST-ACC-PRD-031, TST-ACC-PRD-038]
---

# Understand the available product kinds

## Purpose

Finance starts with the catalogue’s product kinds.

## How It Works

Finance starts with the catalogue’s product kinds. Each kind tells staff which pricing and selling choices make sense. The shared register also identifies which application owns a domain product. Accounting’s list limits its tabs to the three kinds finance manages directly. Staff choose the appropriate tab before creating a product. Legacy Products remain available for reference but have no console creation action. Inactive domain kinds remain visible through the API register. Product read authority is needed to inspect this register.

## Relationships

The product record supplies the identity and configuration used by this outcome.
