---
id: CAP-COM-FUL-003
title: Protect a member-priced purchase until its membership arrives
feature: FEAT-COM-FUL-01
product_area: commerce
module: fulfillment
revision: 1
status: draft
product_intent: confirmed
implementation_evidence: observed
supersedes:
  - CAP-COM-REG-027
source_sha:
  services-commerce: c8b66a98e2490617aec38ba5c8165dd9bd0a8f9b
intent_sources:
  - >-
    services-commerce:docs/milestones/plans/COMM-M2-plan.md#D7 (decision (a),
    Andrew 2026-10-21)
purpose: >-
  A purchase receiving a provisional member price waits for the membership
  bought alongside it.
outcomes:
  - Join-and-buy purchases retain the intended member-price benefit.
  - Membership failure leaves price follow-up to an explicit staff decision.
concepts:
  - CON-COM-FUL-001
actors:
  - ACT-COM-011
  - ACT-COM-008
surfaces:
  - job
  - api
preconditions: []
postconditions: []
permissions:
  - key: commerce.obligations.read
    where_checked: api
    scope: tenant
rules:
  - id: BR-CAP-COM-FUL-003-01
    proved_by: [ATS-COM-FUL-003-01, TST-COM-FUL-023]
    statement: >-
      Placement records the same-order membership line as the prerequisite of a
      line receiving its member price, without adding that dependency to the
      membership line itself.
    kind: policy
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      services-commerce:modules/fulfillment/tests/e2e/same-cart-grants.e2e.spec.js#writes
      the T-shirt’s obligation with the prerequisite on the membership line and
      domain_prerequisite on its gate; the membership’s without
    origin: >-
      COMM-M2 D7 (a), Andrew 2026-10-21:
      services-commerce:docs/milestones/plans/COMM-M2-plan.md#D7
  - id: BR-CAP-COM-FUL-003-02
    proved_by: [ATS-COM-FUL-002-13, ATS-COM-FUL-003-01, ATS-COM-FUL-003-06, ATS-COM-FUL-004-08, TST-COM-FUL-023]
    statement: >-
      Payment does not release a dependent line while the membership it relies
      on remains undelivered.
    kind: policy
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      services-commerce:modules/fulfillment/tests/e2e/same-cart-grants.e2e.spec.js#opens
      the membership’s gate and keeps the T-shirt’s closed prerequisite_not_met
      while the membership is not delivered
    origin: >-
      COMM-M2 D7 (a), Andrew 2026-10-21:
      services-commerce:docs/milestones/plans/COMM-M2-plan.md#D7
  - id: BR-CAP-COM-FUL-003-03
    proved_by: [ATS-COM-FUL-002-13, ATS-COM-FUL-003-02, ATS-COM-FUL-003-06, ATS-COM-FUL-004-08, TST-COM-FUL-023, TST-COM-FUL-046]
    statement: >-
      Successful membership delivery records each waiting dependent's
      prerequisite as satisfied, adds one corresponding history event and
      immediately re-evaluates its gate.
    kind: lifecycle
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      services-commerce:modules/fulfillment/tests/integration/services/register/prerequisite-settlement.integration.spec.js#records
      the registration’s prerequisite met, writes it on the history once, and
      opens its gate (authorized, queued); a repeat finds nothing waiting
    origin: >-
      COMM-M2 D7 (a), Andrew 2026-10-21:
      services-commerce:docs/milestones/plans/COMM-M2-plan.md#D7
  - id: BR-CAP-COM-FUL-003-04
    proved_by: [ATS-COM-FUL-003-03, TST-COM-FUL-023, TST-COM-FUL-046]
    statement: >-
      Permanent membership failure, resolution without delivery or cancellation
      blocks waiting dependents for staff attention and records the block and
      exception without duplication.
    kind: lifecycle
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      services-commerce:modules/fulfillment/tests/integration/services/register/prerequisite-settlement.integration.spec.js#blocks
      the registration prerequisite_failed with the membership named in its
      facts, writes the block on the history once, and raises the exception once
    origin: >-
      COMM-M2 D7 (a), Andrew 2026-10-21:
      services-commerce:docs/milestones/plans/COMM-M2-plan.md#D7
  - id: BR-CAP-COM-FUL-003-05
    proved_by: [ATS-COM-FUL-003-04, TST-COM-FUL-046]
    statement: >-
      Retryable failure and delivery still in progress do not settle dependents,
      and settlement excludes other orders.
    kind: policy
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      services-commerce:modules/fulfillment/tests/integration/services/register/prerequisite-settlement.integration.spec.js#a
      retryable failure, an obligation in flight, a line nothing depends on, and
      the dependents of another order
    origin: none
  - id: BR-CAP-COM-FUL-003-06
    proved_by: [ATS-COM-FUL-003-03, ATS-COM-FUL-003-07, ATS-COM-FUL-005-09, ATS-COM-FUL-008-07, TST-COM-FUL-023, TST-COM-FUL-046]
    statement: >-
      A placed dependent retains its price, leaving staff to cancel it or change
      the price through an amendment rather than silently charging a difference.
    kind: invariant
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      services-commerce:modules/fulfillment/tests/e2e/same-cart-grants.e2e.spec.js#leaves
      the T-shirt line priced as it was: nothing reprices a placed line (R-04)
    origin: >-
      COMM-M2 D7 (a), Andrew 2026-10-21:
      services-commerce:docs/milestones/plans/COMM-M2-plan.md#D7
  - id: BR-CAP-COM-FUL-003-07
    proved_by: [ATS-COM-FUL-003-05, ATS-COM-FUL-003-07, ATS-COM-FUL-005-09, ATS-COM-FUL-008-07, TST-COM-FUL-046]
    statement: >-
      Re-evaluation retains a failed-prerequisite block until the membership is
      later re-authorized and successfully delivered.
    kind: lifecycle
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      services-commerce:modules/fulfillment/tests/integration/services/register/prerequisite-settlement.integration.spec.js#keeps
      the registration blocked when the sweep evaluates it again, and opens it
      once the membership is re-authorized and completes (05 §4)
    origin: >-
      COMM-M2 D7 (a), Andrew 2026-10-21:
      services-commerce:docs/milestones/plans/COMM-M2-plan.md#D7
  - id: BR-CAP-COM-FUL-003-08
    proved_by: []
    statement: >-
      Settlement follows the prerequisite outcome's commit; an error is logged
      without undoing that outcome, and a later outcome can invoke settlement
      again.
    kind: policy
    enforced_at:
      - service
    must_prove: false
    provenance: observed
    source: >-
      services-commerce:modules/fulfillment/services/register/prerequisite-settlement.ts:settlePrerequisiteDependents
    origin: none
scenarios:
  - id: SC-CAP-COM-FUL-003-01
    given: One cart contains membership and a T-shirt at a provisional member price.
    when: Complete membership delivery.
    then: >-
      Commerce settles the T-shirt prerequisite and delivers the dependent
      purchase afterward.
    provenance: test
    source: >-
      services-commerce:modules/fulfillment/tests/e2e/same-cart-grants.e2e.spec.js#delivers
      the T-shirt in turn
edge_cases:
  - id: SC-CAP-COM-FUL-003-02
    given: Membership is cancelled before enrollment.
    when: Finish the cancellation.
    then: The dependent member-priced purchase requires staff attention.
    provenance: test
    source: >-
      services-commerce:modules/fulfillment/tests/integration/services/register/prerequisite-settlement.integration.spec.js#a
      cancelled membership (the order cancelled a line before it enrolled)
      blocks its dependents too
constraints: []
depends_on:
  - CAP-COM-FUL-002
related:
  - CAP-COM-FUL-005
  - CAP-COM-FUL-008
journeys: []
open_questions: []
evidence:
  - repository: services-commerce
    paths:
      - modules/fulfillment/tests/e2e/same-cart-grants.e2e.spec.js
      - >-
        modules/fulfillment/tests/integration/services/register/prerequisite-settlement.integration.spec.js
      - modules/fulfillment/services/register/prerequisite-settlement.ts
controls: [TC-IAM-006, 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-CRY-001, TC-DAT-001, TC-DAT-002, TC-DAT-003, TC-LOG-004, TC-LOG-005, TC-AVL-004, TC-MON-001, TC-MON-002, TC-MON-004, TC-PI-001, TC-PI-002, TC-PI-004, TC-PI-005, TC-PRV-001, TC-PRV-002]
exercised_by: [FAS-COM-FUL-01-02]
suites: [TST-COM-FUL-023, TST-COM-FUL-046]
---

# Protect a member-priced purchase until its membership arrives

## Purpose

A purchase receiving a provisional member price waits for the membership bought alongside it.

## How It Works

A buyer can join and buy another item in the same order. The dependent item's obligation retains the membership line it relies on. Commerce follows the membership application's delivery outcome and settles the dependent work afterward. Staff see a failed prerequisite as work needing a decision. They can cancel the purchase or agree a price change through an amendment. A later successful membership delivery allows eligibility to be reconsidered. The product should provide a clear explanation of this dependency wherever staff discuss the retained price.

## Relationships

- Authorize delivery from current order facts supplies or consumes related delivery records.
- Understand and intervene in an order's delivery supplies or consumes related delivery records.
- Review and resolve operations findings supplies or consumes related delivery records.
