---
id: CAP-MBR-STR-008
title: Connect unit dues to products and settlement choices
feature: FEAT-MBR-STR-02
product_area: membership
module: structure
revision: 1
status: draft
product_intent: proposed
implementation_evidence: observed
supersedes:
  - react-console acceptance inventory CAP-MBR-STR-010
  - react-console acceptance inventory CAP-MBR-STR-011
source_sha:
  services-membership: 5994c270e8a37a30f848e99ba5b5ee6b87c08893
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
intent_sources:
  - >-
    services-membership:docs/migrations/packages-as-products/README.md#D-1 (Andrew, 2026-10-18: the package is
    the product)
  - >-
    services-membership:docs/migrations/packages-as-products/README.md#Ordering profiles (Commerce's decision
    approved by Andrew on 2026-10-18)
purpose: >-
  Administrators connect local dues offerings to Accounting products and the unit’s Commerce settlement
  profile.
outcomes:
  - Accounting remains the source of shared dues-product information.
  - A unit can express its own settlement choice or inherit one.
concepts:
  - CON-MBR-STR-002
actors:
  - ACT-MBR-001
  - ACT-MBR-002
  - ACT-MBR-005
surfaces:
  - api
preconditions: []
postconditions: []
permissions:
  - key: membership.structure.read
    where_checked: api
    scope: tenant
  - key: membership.structure.manage
    where_checked: api
    scope: tenant
  - key: membership.application.access
    where_checked: api
    scope: tenant
rules:
  - id: BR-CAP-MBR-STR-008-01
    proved_by: [ATS-MBR-STR-004-09, ATS-MBR-STR-008-01, TST-MBR-STR-009, TST-MBR-STR-096]
    statement: >-
      A dues extension uses the identity of an existing Accounting chapter-dues product and rejects missing
      products or other product types.
    kind: validation
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      services-membership:tests/e2e/packages-as-products.e2e.spec.ts#packages as products, through the API ›
      extends a product of type chapter_dues as a unit’s dues product, under the product’s id, with the
      product’s name
    origin: >-
      services-membership:docs/migrations/packages-as-products/README.md#D-1 (Andrew, 2026-10-18: the package
      is the product)
  - id: BR-CAP-MBR-STR-008-02
    proved_by: [ATS-MBR-STR-008-02]
    statement: >-
      Each unit has at most one dues extension per package and one extension without a package, and a product
      cannot extend dues for multiple units.
    kind: invariant
    enforced_at:
      - service
      - database
    must_prove: true
    provenance: observed
    source: >-
      services-membership:modules/structure/services/persistence/organizational-unit-dues-products.ts:createDuesProduct
    origin: none
  - id: BR-CAP-MBR-STR-008-03
    proved_by: [ATS-MBR-STR-008-03, ATS-MBR-STR-012-14, TST-MBR-STR-009]
    statement: >-
      Dues reads obtain name, status, visibility, business unit and sale dates from Accounting; a missing
      product returns its identifier with inactive and hidden defaults.
    kind: calculation
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      services-membership:modules/structure/tests/unit/accounting-products.spec.ts#the Accounting products
      port › answers a product Accounting no longer has as its id, inactive, hidden, with no product status
    origin: >-
      services-membership:docs/migrations/packages-as-products/README.md#D-1 (Andrew, 2026-10-18: the package
      is the product)
  - id: BR-CAP-MBR-STR-008-04
    proved_by: [ATS-MBR-STR-008-04, TST-MBR-STR-096]
    statement: >-
      A dues extension can change its package at the version read, while retirement and deletion are
      unavailable in Membership because product status belongs to Accounting.
    kind: lifecycle
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      services-membership:tests/e2e/packages-as-products.e2e.spec.ts#packages as products, through the API ›
      re-points a unit’s dues product at another package at the version just read, 200 with the next version
    origin: >-
      services-membership:docs/migrations/packages-as-products/README.md#D-1 (Andrew, 2026-10-18: the package
      is the product)
  - id: BR-CAP-MBR-STR-008-05
    proved_by: []
    statement: A dues extension’s package reference is not verified against the workspace’s package catalogue.
    kind: validation
    enforced_at:
      - service
    must_prove: false
    provenance: observed
    source: >-
      services-membership:modules/structure/services/persistence/organizational-unit-dues-products.ts:createDuesProduct
    origin: none
  - id: BR-CAP-MBR-STR-008-06
    proved_by: [ATS-MBR-STR-006-11, ATS-MBR-STR-008-05, TST-MBR-STR-082]
    statement: >-
      Financial settings are created without a version, then require the current version for replacement; a
      premature version fails and absent settings read as not found.
    kind: policy
    enforced_at:
      - service
    must_prove: true
    provenance: observed
    source: >-
      services-membership:modules/structure/services/persistence/organizational-unit-financial-settings.ts:setFinancialSettings
    origin: none
  - id: BR-CAP-MBR-STR-008-07
    proved_by: [ATS-MBR-STR-008-06, ATS-MBR-STR-008-08, TST-MBR-STR-082]
    statement: >-
      A unit stores only an ordering-profile reference checked for shape, with an absent choice inheriting the
      program, application and workspace defaults.
    kind: policy
    enforced_at: []
    must_prove: true
    provenance: documented
    source: >-
      services-membership:docs/migrations/packages-as-products/README.md#Ordering profiles (added the same
      day, from Commerce's decision Andrew approved at about 15:45 UTC)
    origin: >-
      services-membership:docs/migrations/packages-as-products/README.md#Ordering profiles (Commerce's
      decision approved by Andrew on 2026-10-18)
    note: >-
      The permitted implementation stores a soft reference. The cited product record describes fallback
      resolution; this examination does not establish its execution in the owning checkout service.
  - id: BR-CAP-MBR-STR-008-08
    proved_by: []
    statement: The stored default dues-product reference is checked for shape and has no consumer.
    kind: validation
    enforced_at:
      - service
    must_prove: false
    provenance: observed
    source: >-
      services-membership:modules/structure/services/finance/accounting-references.ts:checkAccountingReferenceShapes
    origin: none
  - id: BR-CAP-MBR-STR-008-09
    proved_by: [ATS-MBR-STR-003-09, ATS-MBR-STR-008-07, TST-MBR-STR-077]
    statement: Inactive and merged units permit financial-setting saves and dues-extension creation.
    kind: policy
    enforced_at:
      - service
    must_prove: false
    provenance: observed
    source: >-
      services-membership:modules/structure/services/persistence/organizational-unit-dues-products.ts:createDuesProduct
    origin: none
scenarios:
  - id: SC-CAP-MBR-STR-008-01
    given: Accounting contains the chapter-dues product intended for Atlanta.
    when: Staff create its unit extension without a package-specific association.
    then: The returned dues offering uses the Accounting product’s shared fields.
    provenance: test
    source: >-
      services-membership:tests/e2e/packages-as-products.e2e.spec.ts#packages as products, through the API ›
      extends a product of type chapter_dues as a unit’s dues product, under the product’s id, with the
      product’s name
edge_cases:
  - id: SC-CAP-MBR-STR-008-02
    given: The product behind Atlanta’s dues becomes inactive.
    when: The dues extension is read again.
    then: Its returned product fields identify it as inactive and hidden.
    provenance: test
    source: >-
      services-membership:modules/structure/tests/unit/accounting-products.spec.ts#the Accounting products
      port › answers the product’s common fields under the names the package wire kept: inactive is not active
      and not portal visible
constraints: []
depends_on:
  - CAP-MBR-STR-006
  - CAP-MBR-STR-012
related:
  - CAP-MBR-STR-003
  - CAP-MBR-STR-009
journeys:
  - JNY-MBR-STR-001
open_questions: []
evidence:
  - >-
    services-membership: Examination of dues product and financial settings persistence, the Accounting
    products port and the reference checker.
  - >-
    services-membership: Examination of packages-as-products end-to-end, Accounting port unit and integration
    tests, acceptance journeys MBR-ACC-0023 and 0024.
  - 'services-membership: Examination of the packages-as-products record.'
  - 'services-membership:modules/structure/services/finance/accounting-references.ts'
  - 'services-membership:modules/structure/services/persistence/organizational-unit-dues-products.ts'
  - 'services-membership:modules/structure/services/persistence/organizational-unit-financial-settings.ts'
  - 'services-membership:modules/structure/tests/unit/accounting-products.spec.ts'
  - 'services-membership:tests/e2e/packages-as-products.e2e.spec.ts'
controls: [TC-AVL-002, TC-AVL-003, TC-AZ-001, TC-AZ-002, TC-AZ-003, TC-AZ-004, TC-AZ-005, TC-AZ-006, TC-CHG-001, TC-CHG-002, TC-CHG-003, TC-CHG-004, TC-CRY-001, TC-CRY-002, TC-CRY-003, TC-DAT-001, TC-DAT-007, TC-IAM-001, TC-IAM-002, TC-IAM-004, TC-IAM-005, TC-LOG-001, TC-LOG-002, TC-LOG-003, TC-LOG-004, TC-PI-001, TC-PI-003, TC-PI-005, TC-SEC-001, TC-SEC-004, TC-TEN-001, TC-TEN-002, TC-TEN-003]
exercised_by: [FAS-MBR-STR-02-01, FAS-MBR-STR-02-02, FAS-MBR-STR-02-03, FAS-MBR-STR-02-04, FAS-MBR-STR-02-05]
suites: [TST-MBR-STR-009, TST-MBR-STR-077, TST-MBR-STR-082, TST-MBR-STR-096]
---

# Connect unit dues to products and settlement choices

## Purpose

Administrators connect local dues offerings to Accounting products and the unit’s Commerce settlement profile.

## How It Works

Staff first prepare a chapter-dues product in Accounting. They extend it in Membership for the appropriate unit, optionally associating a membership package. A package-specific offering and a catch-all express different selling contexts. The extension keeps the product’s identity. Reads obtain shared product information live rather than maintaining a competing copy. Staff can replace the package association at the version read. Product retirement remains an Accounting action. Financial settings separately identify the Commerce profile for the unit’s dues. An omitted profile delegates to the documented inheritance choices. Saving those settings creates the first record or replaces the existing version. The product should make the unverified package and profile references clear when staff configure local finance.

## Relationships

- Unit records supply the owner of each local finance setting.
- Membership packages identify the package-specific dues context.
- Merging leaves local finance records for separate resolution.
