---
id: CAP-MBR-MEM-012
title: Act on an application's decision
feature: FEAT-MBR-MEM-04
product_area: membership
module: memberships
revision: 1
status: draft
product_intent: confirmed
implementation_evidence: partially-observed
supersedes:
  - 'inventory:CAP-MBR-COM-012'
  - 'inventory:CAP-MBR-COM-013'
source_sha:
  services-membership: 5994c270e8a37a30f848e99ba5b5ee6b87c08893
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
intent_sources:
  - 'services-membership:README.md#2026-10-18 — Final acceptance'
  - 'services-membership:docs/migrations/participant/README.md (Andrew, 2026-10-17: build against contracts)'
purpose: >-
  When the Submissions engine decides a membership application, Membership records the decision once and
  carries it out: an approval orders the dues, and a rejection releases what was reserved.
outcomes:
  - An approved applicant receives exactly one dues order.
  - A rejected or withdrawn applicant holds nothing that was reserved for them.
  - The engine knows when Membership has acted on each decision.
concepts:
  - CON-MBR-MEM-004
  - CON-MBR-MEM-002
actors:
  - ACT-MBR-011
surfaces:
  - api
permissions: []
rules:
  - id: BR-CAP-MBR-MEM-012-01
    proved_by: [ATS-MBR-MEM-012-01, TST-MBR-MEM-003]
    statement: >-
      Membership takes decisions only about its own two subject kinds (a join, decided against a membership
      type; a renewal, reinstatement or change, decided against a membership) and refuses any other.
    kind: validation
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      services-membership:modules/applications/tests/unit/submissions-contracts.spec.ts#refuses a decision
      about a subject kind that is not Membership’s
    origin: none
  - id: BR-CAP-MBR-MEM-012-02
    proved_by: [ATS-MBR-MEM-012-02, TST-MBR-MEM-003]
    statement: >-
      A join's decision codes mean approved (enrol), rejected (decline), revision required (request changes)
      and withdrawn; a membership's renew, reinstate and change codes all mean approved.
    kind: policy
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      services-membership:modules/applications/tests/unit/submissions-contracts.spec.ts#maps a join’s codes
      onto the engine’s kinds
    origin: none
  - id: BR-CAP-MBR-MEM-012-03
    proved_by: [ATS-MBR-MEM-012-03, TST-MBR-MEM-003]
    statement: >-
      A decision is recorded once by its identifier: a redelivery is answered as already recorded, a decision
      that names the one it supersedes replaces it, and one that a later decision replaced is ignored.
    kind: invariant
    enforced_at:
      - service
      - database
    must_prove: true
    provenance: test
    source: >-
      services-membership:modules/applications/tests/unit/submissions-contracts.spec.ts#ignores a decision a
      later one has replaced
    origin: none
  - id: BR-CAP-MBR-MEM-012-04
    proved_by: [ATS-MBR-MEM-012-04, TST-MBR-MEM-003]
    statement: >-
      The delivered decision leaves the application decided, awaiting the applicant, withdrawn or closed
      according to the decision kind.
    kind: lifecycle
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      services-membership:modules/applications/tests/unit/submissions-contracts.spec.ts#leaves the application
      decided, awaiting the applicant or withdrawn by the decision’s kind
    origin: none
  - id: BR-CAP-MBR-MEM-012-05
    proved_by: [ATS-MBR-MEM-006-15, ATS-MBR-MEM-009-16, ATS-MBR-MEM-011-06, ATS-MBR-MEM-012-05, ATS-MBR-MEM-012-08, ATS-MBR-MEM-012-09, TST-MBR-MEM-002]
    statement: >-
      An approval of a purchase process prepares the dues order through Membership's own checkout preparation
      (the package and each planned chapter's dues line, naming the approved application) and places it once,
      keyed by the decision, recording the order on the application.
    kind: policy
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      services-membership:modules/applications/tests/integration/decision-handler.integration.spec.ts#records
      an approval, places the dues order through the port (package and chapter dues), and acknowledges it
    origin: none
  - id: BR-CAP-MBR-MEM-012-06
    proved_by: [ATS-MBR-MEM-006-15, ATS-MBR-MEM-009-16, ATS-MBR-MEM-011-06, ATS-MBR-MEM-012-05, ATS-MBR-MEM-012-08, ATS-MBR-MEM-012-09, TST-MBR-MEM-002]
    statement: The approved purchase stays pending in Membership until Commerce fulfils the order.
    kind: lifecycle
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      services-membership:modules/applications/tests/integration/decision-handler.integration.spec.ts#leaves
      the approved purchase pending in Membership until Commerce fulfils it
    origin: none
  - id: BR-CAP-MBR-MEM-012-07
    proved_by: [ATS-MBR-MEM-012-06]
    statement: >-
      A rejection, withdrawal or closing cancels the pending term of the application's membership, with its
      reservation, and keeps the membership.
    kind: lifecycle
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      services-membership:modules/applications/tests/integration/decision-handler.integration.spec.ts#cancels
      the pending term of a rejected application whose purchase was placed
    origin: none
  - id: BR-CAP-MBR-MEM-012-08
    proved_by: []
    statement: >-
      When the dues order's preparation or placement is refused, the decision is left unacknowledged so the
      engine delivers it again.
    kind: policy
    enforced_at:
      - service
    must_prove: true
    provenance: unknown
    source: FND-MBR-MEM-044
    origin: none
  - id: BR-CAP-MBR-MEM-012-09
    proved_by: [ATS-MBR-MEM-012-07, TST-MBR-MEM-002]
    statement: >-
      A decision about a submission Membership holds no application for is answered as unknown and not
      acknowledged.
    kind: validation
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      services-membership:modules/applications/tests/integration/decision-handler.integration.spec.ts#does not
      acknowledge a decision for a submission it holds no application of
    origin: none
  - id: BR-CAP-MBR-MEM-012-10
    proved_by: []
    statement: >-
      Membership registers its subject kinds with the engine for delivery to its decision function, to be
      acknowledged within a day of delivery.
    kind: policy
    enforced_at:
      - service
    must_prove: false
    provenance: test
    source: >-
      services-membership:modules/applications/tests/unit/submissions-contracts.spec.ts#declares the join and
      the membership kinds, delivered to membership_submission_decisions within a day
    origin: none
scenarios:
  - id: SC-CAP-MBR-MEM-012-01
    given: Nia applied to join with the Atlanta chapter and the engine approves her.
    when: 'The decision is delivered, then delivered again.'
    then: >-
      One dues order for the package and Atlanta's dues is placed and acknowledged; the redelivery calls
      neither Commerce nor the engine again.
    provenance: test
    source: >-
      services-membership:modules/applications/tests/integration/decision-handler.integration.spec.ts#answers
      a redelivered decision as recorded and calls neither port again
  - id: SC-CAP-MBR-MEM-012-02
    given: An applicant's purchase was placed and is awaiting review.
    when: The engine rejects the application.
    then: 'The reserved term is cancelled and its reservation released, and the membership remains with no status.'
    provenance: test
    source: >-
      services-membership:modules/applications/tests/integration/decision-handler.integration.spec.ts#cancels
      the pending term of a rejected application whose purchase was placed
edge_cases: []
constraints: []
depends_on:
  - CAP-MBR-MEM-011
  - CAP-MBR-MEM-009
related:
  - CAP-MBR-MEM-006
journeys:
  - JNY-MBR-MEM-003
open_questions: []
evidence:
  - repository: services-membership
    source_sha: 5994c270e8a37a30f848e99ba5b5ee6b87c08893
    paths:
      - modules/applications/services/decisions/decision-handler.ts
      - modules/applications/contracts
      - modules/applications/ports/submissions.ts
      - modules/applications/db/application-vocabularies.ts
      - modules/applications/aws/lambda/SUBMISSION_DECISIONS.handler.ts
      - modules/applications/tests/unit/submissions-contracts.spec.ts
      - modules/applications/tests/integration/decision-handler.integration.spec.ts
      - tests/acceptance/commerce
      - docs/migrations/participant/README.md
controls: [TC-AVL-002, TC-AVL-003, TC-AVL-004, TC-AZ-001, TC-AZ-003, TC-AZ-004, 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-007, TC-IAM-006, TC-LOG-001, TC-LOG-002, TC-LOG-003, TC-LOG-005, TC-MON-001, TC-MON-002, 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]
exercised_by: [FAS-MBR-MEM-04-01, FAS-MBR-MEM-04-02, FAS-MBR-MEM-04-03, FAS-MBR-MEM-04-04, FAS-MBR-MEM-04-05]
suites: [TST-MBR-MEM-002, TST-MBR-MEM-003]
---

# Act on an application's decision

## Purpose

When an association reviews applications, the decision is made in the Submissions engine. Membership must turn each decision into what it means for the membership: an approval becomes a dues order, and a rejection releases anything held.

## How It Works

The engine delivers each decision about Membership's two kinds of subject: a join, decided against a membership type, and a renewal, reinstatement or change, decided against a membership. Membership records it once by its identifier, ignores stale decisions, and lets a decision that names its predecessor replace it. The application becomes decided, awaiting the applicant, withdrawn or closed according to the delivered decision. An approval of a purchase process prepares the dues order through Membership's own checkout preparation, naming the approved application so the order needs no further approval. The order is placed once and recorded on the application. The membership stays pending until Commerce fulfils the order. A rejection, withdrawal or closing cancels any term reserved for the applicant. Membership then acknowledges the decision to the engine. A decision Membership cannot act on is left unacknowledged so the engine tries again. Neither the order placement nor the acknowledgement is connected to the real Commerce or engine yet.

## Relationships

- Depends on `CAP-MBR-MEM-011` because the process says what a decision drives.
- Depends on `CAP-MBR-MEM-009` because the dues order is prepared exactly as a checkout would be.
- Depends on the Submissions engine (`MOD-SUB-SUB`) for deliveries and acknowledgement, and on Commerce orders (`MOD-COM-ORD`) for placement.
