---
id: WF-MBR-MEM-013
title: Release the reservation of a voided order
trigger: Commerce voids an order with Membership reservations.
product_area: membership
module: memberships
revision: 1
status: draft
design_intent: proposed
implementation_evidence: partially-observed
inference: []
source_sha:
  services-membership: 5994c270e8a37a30f848e99ba5b5ee6b87c08893
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
implements:
  - CAP-MBR-MEM-010
moves:
  - STATE-MBR-MEM-004
crosses:
  - SVC-MBR-MEM-commerce-participant
  - SVC-MBR-MEM-memberships
idempotency: >-
  Closed reservations are not released again; a repeated release finds no open
  pending claim to remove.
concurrency: >-
  The owner function operates in Commerce’s transaction and locks affected
  memberships.
hops:
  - 'n': 1
    actor_or_service: Commerce void transaction
    action: Invoke the owner release function for the voided order.
    anchor: >-
      services-membership:db/migrations/20261018044117_commerce_participant.sql:commerce_release_claims
    seam: sync
    on_failure: The owner-function failure also aborts the void transaction.
    left_inconsistent: No partial local change remains.
    observer: Commerce order result
    provenance: test
    source: >-
      services-membership:modules/commerce-participant/tests/integration/participant.integration.spec.ts#releases
      a voided order: the pending term and the membership
  - 'n': 2
    actor_or_service: Owner function
    action: >-
      Remove pending terms and otherwise empty holdings created by those
      reservations, then mark claims released.
    anchor: >-
      services-membership:db/migrations/20261018044117_commerce_participant.sql:commerce_release_claims
    seam: sync
    on_failure: The release error rolls back Commerce’s void transaction.
    left_inconsistent: No partial local change remains.
    observer: Claim audit record
    provenance: observed
    source: >-
      services-membership:modules/commerce-participant/db/commerce-claims.table.ts
      (created_membership)
  - 'n': 3
    actor_or_service: Owner function
    action: >-
      Leave fulfilled coverage unchanged; the release response does not report
      why it was retained.
    anchor: >-
      services-membership:db/migrations/20261018044117_commerce_participant.sql:commerce_release_claims
    seam: sync
    on_failure: This step has no separate failure outcome.
    left_inconsistent: >-
      Fulfilled coverage remains, without a specific retained-claim explanation
      in the release answer.
    observer: No distinct branch-specific signal
    provenance: unknown
    source: FND-MBR-MEM-034
branches: []
waits: []
evidence:
  - >-
    services-membership at 5994c270:
    db/migrations/20261018044117_commerce_participant.sql;
    modules/commerce-participant/db/commerce-claims.table.ts
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-004, 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]
---

# Release the reservation of a voided order

## What It Does

Voiding an unfulfilled order frees its reserved coverage. The claim survives as evidence even when the pending term and its otherwise empty new holding are removed.

## The Flow

```mermaid
flowchart TD
  H1["Invoke the owner release function for the voided order"]
  H2["Remove pending terms and otherwise empty holdings created by those reservations, then mark claims released"]
  H1 --> H2
  H3["Leave fulfilled coverage unchanged; the release response does not report why it was retained"]
  H2 --> H3
```

## When Something Fails

Failure rolls back with the Commerce void. Already-fulfilled coverage stays intact, but the response does not explain that the line was retained because it had committed.
