---
id: SVC-MBR-MEM-commerce-participant
title: Commerce Participant Service Module
product_area: membership
module: memberships
repository: services-membership
source_module: modules/commerce-participant
revision: 1
status: draft
design_intent: proposed
implementation_evidence: partially-observed
inference: []
source_sha:
  services-membership: 5994c270e8a37a30f848e99ba5b5ee6b87c08893
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
owns: []
does_not_own:
  - >-
    Memberships owns holdings and periods; participant claims and enforcement
    are dependent operational facets.
  - 'Commerce owns carts, orders, obligations, amendments, refunds and payments.'
  - Accounting owns membership products and their prices.
operations:
  - operation_id: prepare_purchase
    intent: >-
      Explain eligible coverage, components, grants and pricing context for
      checkout without reserving or pricing money.
    access: internal
    permission: 'none: Commerce invokes the participant function''s live alias over IAM'
    realises:
      - CAP-MBR-MEM-009
    published_to_submissions: >-
      not published: an internal service, partner or query contract; no intake
      route is registered
  - operation_id: commerce_commit_claims
    intent: >-
      Reserve pending periods within Commerce placement and create unnumbered
      first-purchase holdings where needed.
    access: internal
    permission: 'none: an owner database function executable by Commerce''s claimer role'
    realises:
      - CAP-MBR-MEM-009
    published_to_submissions: >-
      not published: an internal service, partner or query contract; no intake
      route is registered
  - operation_id: fulfill
    intent: >-
      Commit authorized reserved coverage and its dependent membership facts
      once per authorization.
    access: internal
    permission: 'none: Commerce invokes the participant function over IAM'
    realises:
      - CAP-MBR-MEM-009
    published_to_submissions: >-
      not published: an internal service, partner or query contract; no intake
      route is registered
  - operation_id: prepare_change
    intent: >-
      Reject amendment preparation until the domain change operation is
      implemented.
    access: internal
    permission: 'none: Commerce invokes the participant function over IAM'
    realises:
      - CAP-MBR-MEM-009
    published_to_submissions: >-
      not published: an internal service, partner or query contract; no intake
      route is registered
  - operation_id: modify
    intent: >-
      Reject amendment application because the current participant cannot
      perform it.
    access: internal
    permission: 'none: Commerce invokes the participant function over IAM'
    realises:
      - CAP-MBR-MEM-009
    published_to_submissions: >-
      not published: an internal service, partner or query contract; no intake
      route is registered
  - operation_id: commerce_claim_change
    intent: Set the holding’s amendment fence within Commerce’s claim transaction.
    access: internal
    permission: 'none: an owner database function executable by Commerce''s claimer role'
    realises:
      - CAP-MBR-MEM-009
    published_to_submissions: >-
      not published: an internal service, partner or query contract; no intake
      route is registered
  - operation_id: prepare_cancellation
    intent: >-
      Calculate the proposed coverage closure and refundable fraction without
      changing records.
    access: internal
    permission: 'none: Commerce invokes the participant function over IAM'
    realises:
      - CAP-MBR-MEM-010
    published_to_submissions: >-
      not published: an internal service, partner or query contract; no intake
      route is registered
  - operation_id: commerce_claim_cancellation
    intent: Set the claimed cancellation’s fence inside Commerce’s transaction.
    access: internal
    permission: 'none: an owner database function executable by Commerce''s claimer role'
    realises:
      - CAP-MBR-MEM-010
    published_to_submissions: >-
      not published: an internal service, partner or query contract; no intake
      route is registered
  - operation_id: cancel
    intent: Apply an identified cancellation obligation and clear its holding fence.
    access: internal
    permission: 'none: Commerce invokes the participant function over IAM'
    realises:
      - CAP-MBR-MEM-010
    published_to_submissions: >-
      not published: an internal service, partner or query contract; no intake
      route is registered
  - operation_id: commerce_release_claims
    intent: >-
      Release unfulfilled order reservations and remove eligible empty
      first-purchase holdings.
    access: internal
    permission: 'none: an owner database function executable by Commerce''s claimer role'
    realises:
      - CAP-MBR-MEM-010
    published_to_submissions: >-
      not published: an internal service, partner or query contract; no intake
      route is registered
  - operation_id: enforce
    intent: Record payment enforcement and apply a suspend action when appropriate.
    access: internal
    permission: 'none: Commerce invokes the participant function over IAM'
    realises:
      - CAP-MBR-MEM-010
    published_to_submissions: >-
      not published: an internal service, partner or query contract; no intake
      route is registered
  - operation_id: restore
    intent: >-
      Record enforcement restoration and clear only eligible Commerce
      suspension.
    access: internal
    permission: 'none: Commerce invokes the participant function over IAM'
    realises:
      - CAP-MBR-MEM-010
    published_to_submissions: >-
      not published: an internal service, partner or query contract; no intake
      route is registered
events:
  - name: membership.term.committed
    direction: produced
    when: 'A writer commits initial, renewed, granted or child coverage.'
    payload_summary: >-
      Holding identity, classification, period, purchase context and
      attribution.
  - name: membership.term.terminated
    direction: produced
    when: A writer closes started coverage or the sweep records its first lapse.
    payload_summary: >-
      Holding reference, final rights day, first day without coverage and
      closure reason.
  - name: membership.term.cancelled
    direction: produced
    when: A writer closes coverage effective on or before its start.
    payload_summary: Holding reference and whether first-purchase cancellation removed it.
  - name: membership.membership.suspended
    direction: produced
    when: A successful staff or enforcement write sets suspension.
    payload_summary: Holding reference and available suspension reason.
  - name: membership.membership.restored
    direction: produced
    when: A writer clears an eligible suspension.
    payload_summary: Identity and attribution for the holding whose suspension cleared.
jobs: []
integrations:
  - system: Commerce
    direction: inbound
    contract: >-
      Implement the versioned participant envelope, product manifest and four
      reservation owner functions.
  - system: Accounting products
    direction: outbound
    contract: >-
      Read pricing grids using the products port and the calculated purchase
      audience.
consistency:
  - rule: >-
      Preparation remains read-only; reservation belongs to the Commerce
      placement transaction.
    kind: transactional
    compensation: Placement rollback removes pending coverage and its new claim.
  - rule: >-
      Later obligations recognize their authorization, cancellation or
      enforcement identifier across repeated delivery.
    kind: eventual
    compensation: >-
      Return recorded results for repeated obligations; components request retry
      before package completion.
  - rule: >-
      Void release removes only unfulfilled coverage and eligible otherwise
      empty new holdings.
    kind: transactional
    compensation: >-
      Retain fulfilled coverage; the release response lacks a specific
      explanation for its retention.
evidence:
  - >-
    services-membership at 5994c270: modules/commerce-participant (contracts,
    services, db, ports); db/migrations/20261018044117_commerce_participant.sql;
    docs/migrations/participant/README.md.
controls: [TC-AVL-002, TC-AVL-003, TC-AVL-004, TC-AZ-001, TC-AZ-002, TC-AZ-003, TC-AZ-004, 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-002, TC-DAT-003, TC-DAT-004, TC-DAT-007, TC-IAM-001, TC-IAM-002, TC-IAM-004, TC-IAM-005, TC-IAM-006, TC-LOG-002, TC-LOG-003, TC-LOG-004, TC-LOG-005, TC-MON-001, TC-MON-002, TC-MON-003, TC-MON-004, TC-PI-001, TC-PI-002, TC-PI-003, TC-PI-004, TC-PI-005, TC-PRV-001, TC-PRV-002, TC-SEC-001, TC-SEC-004, TC-TEN-001, TC-TEN-002, TC-TEN-003]
---

# Commerce Participant Service Module

## What This Service Is For

The participant gives Commerce the membership meaning of a purchase and applies its later obligations. It determines coverage, units and eligibility while Commerce controls prices, payment and refund execution.

## Boundary

Membership records remain owned by Memberships. Claims and enforcement implement reservation and payment-hold facets. Structure supplies offers and unit rules, and Accounting supplies product prices through the configured port.

## Operations in Words

Preparation returns a plan without writes. Placement invokes owner database functions to reserve or fence within Commerce’s transaction. Fulfilment commits authorized coverage, cancellation closes it, void release frees pending coverage, and payment enforcement manages eligible suspension. Amendment preparation and application are refused.

## Events and Jobs

Coverage and suspension effects publish Membership events with their writes. Commerce drives the participant directly; no local jobs replace its obligation delivery.

## Consistency Guarantees

Placement shares one commit boundary with reservation. Authorization, cancellation and enforcement identifiers recognize repeated obligations. The current placement source is incompatible with history attribution, and component fulfilment depends on prior package completion.
