---
id: JNY-MBR-MEM-002
title: "A new member joins through checkout with a chapter"
feature: FEAT-MBR-MEM-03
product_area: membership
module: memberships
revision: 1
status: draft
product_intent: confirmed
implementation_evidence: partially-observed
supersedes:
  - "inventory:MBR-ACC-0330"
  - "inventory:MBR-ACC-0331"
  - "inventory:MBR-ACC-0333"
  - "inventory:MBR-ACC-0334"
source_sha:
  services-membership: 5994c270e8a37a30f848e99ba5b5ee6b87c08893
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
actor: ACT-MBR-010
goal: "Buy a first membership with a chapter in the checkout and hold it, numbered and placed in the chapter, as soon as the payment is authorized."
capabilities:
  - CAP-MBR-MEM-009
  - CAP-MBR-MEM-007
  - CAP-MBR-MEM-010
  - CAP-MBR-MEM-017
screens: []
steps:
  - 'n': 1
    surface: "prepare_purchase (advise)"
    action: "Add the Regular package and Atlanta's dues to the cart."
    capability: CAP-MBR-MEM-009
    expected: "Commerce is told an enrolment with Atlanta and its dues product, priced as new, and nothing is written."
    provenance: test
    source: "services-membership:tests/e2e/commerce-purchase.e2e.spec.ts#plans the chapter with its dues product when its dues line is in the checkout"
  - 'n': 2
    surface: "commerce_commit_claims"
    action: "Place the order."
    capability: CAP-MBR-MEM-009
    expected: "A pending, unnumbered membership and term are reserved for the buyer."
    provenance: test
    source: "services-membership:tests/e2e/commerce-purchase.e2e.spec.ts#claims the pending term at placement"
  - 'n': 3
    surface: "fulfill"
    action: "Commerce authorizes fulfilment after payment."
    capability: CAP-MBR-MEM-009
    expected: "The term is committed, the membership numbered, and Atlanta written with its dues product."
    provenance: test
    source: "services-membership:tests/e2e/commerce-purchase.e2e.spec.ts#writes the chapter from the frozen payload at fulfilment"
  - 'n': 4
    surface: "listMemberships"
    action: "Atlanta's roster is read."
    capability: CAP-MBR-MEM-007
    expected: "The new member is on it."
    provenance: test
    source: "services-membership:tests/acceptance/commerce/MBR-ACC-0331.acceptance.ts#MBR-ACC-0331"
  - 'n': 5
    surface: "getMyMemberships"
    action: "The member opens their memberships in the portal."
    capability: CAP-MBR-MEM-017
    expected: "They see the new membership, its term and Atlanta."
    provenance: test
    source: "services-membership:tests/acceptance/commerce/MBR-ACC-0330.acceptance.ts#MBR-ACC-0330"
alternates:
  - from_step: 2
    condition: "The same person's first membership is placed from a second browser tab at the same moment."
    path: "Only one placement reserves the term."
    outcome: "The other order is refused as pending."
    provenance: test
    source: "services-membership:tests/e2e/commerce-purchase.e2e.spec.ts#lets one of two concurrent placements claim the person’s term and refuses the other term_pending"
  - from_step: 3
    condition: "Commerce delivers the same authorization again after a lost acknowledgement."
    path: "Membership answers the same records."
    outcome: "Still one membership and one term."
    provenance: test
    source: "services-membership:tests/e2e/commerce-purchase.e2e.spec.ts#answers a redelivered authorization after a lost acknowledgement with the same records (A17)"
failures:
  - from_step: 1
    condition: "The buyer chooses a zone instead of a chapter, or leaves out Atlanta's dues line."
    path: "The package line is refused inline."
    outcome: "Nothing is reserved."
    provenance: test
    source: "services-membership:tests/e2e/commerce-purchase.e2e.spec.ts#refuses a chapter the package does not allow, inline, writing nothing"
  - from_step: 2
    condition: "The buyer abandons the order and Commerce voids it."
    path: "The reservation is released."
    outcome: "The pending term and membership are gone."
    provenance: test
    source: "services-membership:modules/commerce-participant/tests/integration/participant.integration.spec.ts#releases a voided order: the pending term and the membership the claim created are deleted"
  - from_step: 2
    condition: "Commerce's placement transaction commits with Membership's history capture."
    path: "The commit is refused because Commerce's writes name a source the history does not accept."
    outcome: "Today no placement can commit."
    provenance: unknown
    source: "FND-MBR-MEM-030"
rules_in_play:
  - BR-CAP-MBR-MEM-009-03
  - BR-CAP-MBR-MEM-009-07
  - BR-CAP-MBR-MEM-009-10
  - BR-CAP-MBR-MEM-009-12
  - BR-CAP-MBR-MEM-010-07
  - BR-CAP-MBR-MEM-007-12
assertions:
  - id: AS-JNY-MBR-MEM-002-01
    statement: "Exactly one membership exists for the buyer, numbered at fulfilment."
    provenance: test
    source: "services-membership:tests/e2e/commerce-purchase.e2e.spec.ts#fulfils into a numbered membership holding the authorization id"
  - id: AS-JNY-MBR-MEM-002-02
    statement: "The Atlanta affiliation carries Atlanta's dues product."
    provenance: test
    source: "services-membership:tests/e2e/commerce-purchase.e2e.spec.ts#writes the chapter from the frozen payload at fulfilment"
  - id: AS-JNY-MBR-MEM-002-03
    statement: "Nothing is written before the order is placed."
    provenance: test
    source: "services-membership:tests/e2e/commerce-purchase.e2e.spec.ts#advises ok and writes nothing"
e2e_policy: none
e2e_reason: "The checkout screens are Commerce's and the portal's; Membership's part is a service exchange with no screen of its own, proved at API level through the participant."
evidence:
  - "services-membership at 5994c270e8a37a30f848e99ba5b5ee6b87c08893: the cited end-to-end, integration and acceptance specs and the capabilities they exercise."
  - "react-console at baf6dae382d6f41dce976c7f848667ccc37e076f: acceptance/membership/journeys (the absorbed journeys and their recorded execution)."
---

# A new member joins through checkout with a chapter

## Story

A new member adds the Regular package and Atlanta Chapter's dues to their cart. Commerce asks Membership what the purchase would be and is told it is an enrolment with Atlanta. When the order is placed, Membership reserves the membership so no second checkout can take it. After payment Commerce authorizes fulfilment, and the member holds a numbered membership in Atlanta, sees it in the portal and appears on Atlanta's roster.
