---
id: CAP-MBR-STR-011
title: Classify memberships and configure organization flow-down
feature: FEAT-MBR-STR-03
product_area: membership
module: structure
revision: 1
status: draft
product_intent: proposed
implementation_evidence: observed
supersedes:
  - react-console acceptance inventory CAP-MBR-CFG-003
source_sha:
  services-membership: 5994c270e8a37a30f848e99ba5b5ee6b87c08893
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
intent_sources: []
purpose: >-
  Administrators define program classifications and the settings through which an organization’s membership
  can reach its people.
outcomes:
  - Types qualify membership benefits and grace within their program.
  - Flow-down configuration identifies target classification and selected CRM categories.
concepts:
  - CON-MBR-STR-003
actors:
  - ACT-MBR-001
  - ACT-MBR-002
  - ACT-MBR-003
surfaces:
  - api
  - job
preconditions: []
postconditions: []
permissions:
  - key: membership.configuration.read
    where_checked: api
    scope: tenant
  - key: membership.configuration.manage
    where_checked: api
    scope: tenant
  - key: membership.application.access
    where_checked: api
    scope: tenant
rules:
  - id: BR-CAP-MBR-STR-011-01
    proved_by: [ATS-MBR-STR-011-01, ATS-MBR-STR-011-06, TST-MBR-STR-095]
    statement: >-
      A type belongs to one program, and packages and terms must use a type from their own program; package
      references prevent moving that type elsewhere.
    kind: invariant
    enforced_at:
      - database
    must_prove: true
    provenance: test
    source: >-
      services-membership:tests/e2e/database-refusals.e2e.spec.ts#mistakes only the database catches, through
      the API › DEF-MBR-0086: a configuration write a check, a foreign key or an integer column refuses ›
      refuses moving a type a package names to another program 400 naming program_id, and leaves it where it
      was
    origin: none
  - id: BR-CAP-MBR-STR-011-02
    proved_by: [ATS-MBR-STR-009-08, ATS-MBR-STR-011-02, ATS-MBR-STR-011-07, ATS-MBR-STR-016-11, TST-MBR-STR-032, TST-MBR-STR-037]
    statement: A type records benefit eligibility and can override program grace with a value including zero.
    kind: calculation
    enforced_at:
      - service
    must_prove: true
    provenance: observed
    source: 'services-membership:modules/configuration/db/membership-types.table.ts:membershipTypes'
    origin: none
  - id: BR-CAP-MBR-STR-011-03
    proved_by: [ATS-MBR-STR-011-03, ATS-MBR-STR-018-11, TST-MBR-STR-095]
    statement: Enabled flow-down requires an existing target type within the same program.
    kind: validation
    enforced_at:
      - database
    must_prove: true
    provenance: test
    source: >-
      services-membership:tests/e2e/database-refusals.e2e.spec.ts#mistakes only the database catches, through
      the API › DEF-MBR-0086: a configuration write a check, a foreign key or an integer column refuses ›
      refuses flow-down enabled without a target type 400 naming flowdown_type_id, and writes no type
    origin: none
  - id: BR-CAP-MBR-STR-011-04
    proved_by: [ATS-MBR-STR-011-04]
    statement: >-
      Flow-down role and organization-type selections accept at most 100 entries each, deduplicate them and
      replace only submitted lists without validating CRM existence.
    kind: policy
    enforced_at:
      - service
    must_prove: true
    provenance: observed
    source: 'services-membership:modules/configuration/services/persistence/membership-types.ts:replaceFlowdownLists'
    origin: none
  - id: BR-CAP-MBR-STR-011-05
    proved_by: []
    statement: Portal-specific type names and descriptions are retained without an implemented reader.
    kind: policy
    enforced_at:
      - service
    must_prove: false
    provenance: observed
    source: 'services-membership:modules/configuration/services/configuration/configuration-records.ts:typeContent'
    origin: none
  - id: BR-CAP-MBR-STR-011-06
    proved_by: [ATS-MBR-STR-011-05]
    statement: >-
      Deactivating a type prevents staff-created terms of that type, while an active package product remains
      sellable through the Commerce participant.
    kind: lifecycle
    enforced_at:
      - service
    must_prove: true
    provenance: documented
    source: 'react-console:acceptance/membership/journeys/configuration/MBR-ACC-0113.json'
    origin: none
scenarios:
  - id: SC-CAP-MBR-STR-011-01
    given: A corporate classification selects billing contacts for flow-down.
    when: The organization’s membership is established.
    then: Selected people receive the resulting granted memberships.
    provenance: test
    source: >-
      services-membership:tests/acceptance/configuration/MBR-ACC-0097.acceptance.ts#MBR-ACC-0097: A type's
      flow-down settings and benefits flag are configured and felt downstream: a firm's Corporate membership
      reaches its billing contacts, and a type without benefits makes its members active without benefits
edge_cases:
  - id: SC-CAP-MBR-STR-011-02
    given: The selected flow-down role has no corresponding CRM record.
    when: Staff save the classification and establish an organization holding.
    then: The setting is retained but that role identifies no recipients.
    provenance: documented
    source: 'react-console:acceptance/membership/journeys/configuration/MBR-ACC-0114.json'
constraints: []
depends_on:
  - CAP-MBR-STR-009
related:
  - CAP-MBR-STR-012
  - CAP-MBR-STR-016
journeys:
  - JNY-MBR-STR-004
open_questions: []
evidence:
  - >-
    services-membership: Examination of the membership types table, persistence, flow-down lists and request
    schema.
  - >-
    services-membership: Examination of database refusals end-to-end and acceptance journeys MBR-ACC-0092,
    0097, 0098, 0113, 0114.
  - 'react-console:acceptance/membership/journeys/configuration/MBR-ACC-0113.json'
  - 'services-membership:modules/configuration/db/membership-types.table.ts'
  - 'services-membership:modules/configuration/services/configuration/configuration-records.ts'
  - 'services-membership:modules/configuration/services/persistence/membership-types.ts'
  - 'services-membership:tests/e2e/database-refusals.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-004, 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-03-01, FAS-MBR-STR-03-02, FAS-MBR-STR-03-03, FAS-MBR-STR-03-04, FAS-MBR-STR-03-05]
suites: [TST-MBR-STR-032, TST-MBR-STR-037, TST-MBR-STR-095]
---

# Classify memberships and configure organization flow-down

## Purpose

Administrators define program classifications and the settings through which an organization’s membership can reach its people.

## How It Works

Staff create recognizable classifications such as Student or Regular within a program. Packages identify the classification they grant. The benefit setting and optional grace override affect how a holding is interpreted. Organization flow-down settings identify the classification people receive through an organization’s membership. Enabling that behavior requires a valid target in the same program. Selected CRM roles and organization categories narrow the intended recipients. Saving one selection list replaces that list while keeping an omitted list. CRM references are stored without remote validation. A package-dependent type cannot simply move to another program. Deactivation differs between staff term creation and Commerce selling today. The product should settle that difference before administrators treat type retirement as a complete sales stop.

## Relationships

- Programs establish the classification context.
- Packages refer to a type in their own program.
- Status calculations use the type’s benefit and grace settings.
