---
id: CAP-ACC-TRX-013
title: Record receipts that were voided or returned
feature: FEAT-ACC-TRX-04
product_area: accounting
module: transactions
revision: 1
status: draft
product_intent: proposed
implementation_evidence: inconsistent
supersedes:
  - CAP-ACC-PAY-006
  - CAP-ACC-PAY-007
  - CAP-ACC-PAY-009
source_sha:
  services-accounting: f47cb263875bbc0c5640fba7dae6785ec32695f8
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
intent_sources:
  - 'services-accounting:docs/milestones/plans/ACCT-M2-plan.md#D4'
  - 'services-accounting:docs/milestones/plans/ACCT-M2-plan.md#D5'
  - 'services-accounting:docs/milestones/plans/ACCT-M2-plan.md#D6'
  - 'services-accounting:docs/milestones/plans/ACCT-M2-plan.md#D7'
  - 'services-accounting:docs/architecture/accounting-2.0/02-decisions.md#M2-4'
  - 'services-accounting:docs/architecture/accounting-2.0/02-decisions.md#A-8'
  - 'services-accounting:docs/architecture/accounting-2.0/02-decisions.md#A-13'
purpose: Staff explain money that did not remain collected and restore the affected debt.
outcomes:
  - Staff explain money that did not remain collected and restore the affected debt.
  - >-
    Disputes track inquiry or chargeback outcomes and can trigger reversal when a chargeback is lost. The
    product should settle the amount policy for partial chargebacks before design approval.
concepts:
  - CON-ACC-TRX-003
actors:
  - ACT-ACC-012
  - ACT-ACC-022
  - ACT-ACC-024
surfaces:
  - console
  - api
  - job
permissions:
  - key: accounting.payments.void
    where_checked: api
    scope: tenant
  - key: accounting.payments.reverse
    where_checked: api
    scope: tenant
  - key: accounting.payments.read
    where_checked: api
    scope: tenant
  - key: accounting.disputes.create
    where_checked: api
    scope: tenant
  - key: accounting.disputes.read
    where_checked: api
    scope: tenant
  - key: accounting.disputes.update
    where_checked: api
    scope: tenant
rules:
  - id: BR-CAP-ACC-TRX-013-01
    proved_by: [ATS-ACC-TRX-013-01, TST-ACC-TRX-011, TST-ACC-TRX-012]
    statement: Payment void and reversal use separate sensitive authorities and both require an explanation.
    kind: permission
    enforced_at:
      - api
    must_prove: true
    provenance: test
    source: >-
      services-accounting:modules/transactions/tests/e2e/payment-reversals.e2e.spec.js#it is refused the
      reverse route without accounting.payments.reverse and the reversals read without .read (403)
    origin: none
    note: >-
      The cited build recommendation does not establish Product approval; the authority gap remains open in
      FND-ACC-TRX-035.
  - id: BR-CAP-ACC-TRX-013-02
    proved_by: [ATS-ACC-TRX-013-02, TST-ACC-TRX-078, TST-ACC-TRX-080]
    statement: >-
      Reversal type follows the payment behavior: offline receipts allow void and, if bounce-enabled, bounced
      check; processor receipts allow void, bank return and chargeback.
    kind: validation
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      services-accounting:modules/transactions/tests/integration/services/payments/payment-reversals.integration.spec.js#it
      refuses a kind the method does not allow (reversal_kind_mismatch): an ACH return of a check, a bounced
      check of a card
    origin: none
    note: >-
      The cited build recommendation does not establish Product approval; the authority gap remains open in
      FND-ACC-TRX-035.
  - id: BR-CAP-ACC-TRX-013-03
    proved_by: [ATS-ACC-TRX-006-10, ATS-ACC-TRX-007-12, ATS-ACC-TRX-013-03, ATS-ACC-TRX-013-04, ATS-ACC-TRX-013-10, ATS-ACC-TRX-020-09, TST-ACC-TRX-070, TST-ACC-TRX-080, TST-ACC-TRX-243, TST-ACC-TRX-244]
    statement: >-
      A successful reversal negates live allocations, restores invoice debt and leaves the payment voided,
      returned or charged back with no available value.
    kind: lifecycle
    enforced_at:
      - service
      - database
    must_prove: true
    provenance: test
    source: >-
      services-accounting:modules/transactions/tests/integration/services/payments/payment-reversals.integration.spec.js#it
      reverses the live allocation so the line owes again, and the payment item’s facts sum to zero (FC-16)
    origin: 'services-accounting:docs/architecture/accounting-2.0/02-decisions.md#M2-4'
  - id: BR-CAP-ACC-TRX-013-04
    proved_by: [ATS-ACC-TRX-006-10, ATS-ACC-TRX-013-03, ATS-ACC-TRX-013-10, TST-ACC-TRX-080, TST-ACC-TRX-244]
    statement: 'A payment permits at most one nonfailed reversal, and voiding preserves the payment record.'
    kind: invariant
    enforced_at:
      - service
      - database
    must_prove: true
    provenance: test
    source: >-
      services-accounting:modules/transactions/tests/integration/services/payments/payment-reversals.integration.spec.js#it
      refuses reversing it again (payment_not_live) and replays the same key as the same reversal
    origin: 'services-accounting:docs/architecture/accounting-2.0/02-decisions.md#A-8'
  - id: BR-CAP-ACC-TRX-013-05
    proved_by: [ATS-ACC-TRX-011-10, ATS-ACC-TRX-013-04, ATS-ACC-TRX-013-10, TST-ACC-TRX-070, TST-ACC-TRX-080, TST-ACC-TRX-243]
    statement: 'Any nonvoid credit derived from a payment blocks its reversal, including a fully used credit.'
    kind: validation
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      services-accounting:modules/transactions/tests/integration/services/payments/payment-reversals.integration.spec.js#it
      refuses a payment with a credit made from it that is not void (payment_has_credit)
    origin: none
    note: >-
      The cited build recommendation does not establish Product approval; the authority gap remains open in
      FND-ACC-TRX-035.
  - id: BR-CAP-ACC-TRX-013-06
    proved_by: [ATS-ACC-TRX-007-12, ATS-ACC-TRX-009-12, ATS-ACC-TRX-012-12, ATS-ACC-TRX-013-05, ATS-ACC-TRX-013-10, TST-ACC-TRX-080, TST-ACC-TRX-245]
    statement: 'Processor void precedes local reversal, and a settled charge rejects voiding in favor of refunding.'
    kind: lifecycle
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      services-accounting:modules/transactions/tests/integration/services/payments/payment-reversals.integration.spec.js#it
      fails a void the processor says is already settled (payment_settled): the reversal failed, the payment
      untouched
    origin: none
    note: >-
      The cited build recommendation does not establish Product approval; the authority gap remains open in
      FND-ACC-TRX-035.
  - id: BR-CAP-ACC-TRX-013-07
    proved_by: [ATS-ACC-TRX-013-05, TST-ACC-TRX-080, TST-ACC-TRX-245]
    statement: A completed processor reversal adds its negative reconciliation item.
    kind: invariant
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      services-accounting:modules/transactions/tests/integration/services/payments/payment-reversals.integration.spec.js#it
      records the void’s settlement item beside the capture: kind void, minus 2000
    origin: none
    note: >-
      The cited build recommendation does not establish Product approval; the authority gap remains open in
      FND-ACC-TRX-035.
  - id: BR-CAP-ACC-TRX-013-08
    proved_by: [ATS-ACC-TRX-013-06, TST-ACC-TRX-122]
    statement: Reversing payment of a processing-fee invoice credits that fee invoice in full.
    kind: calculation
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      services-accounting:modules/transactions/tests/integration/services/settlements/card-fees.integration.spec.js#it
      credits the fee invoice whole once the void reopens it: no money, no fee; the invoice owes again
    origin: 'services-accounting:docs/architecture/accounting-2.0/02-decisions.md#A-17'
  - id: BR-CAP-ACC-TRX-013-09
    proved_by: [ATS-ACC-TRX-013-07, TST-ACC-TRX-080]
    statement: >-
      A dispute requires a live card or bank payment and an amount no greater than its total, and can close
      once with a won, lost or closed outcome.
    kind: validation
    enforced_at:
      - service
      - database
    must_prove: true
    provenance: test
    source: >-
      services-accounting:modules/transactions/tests/integration/services/payments/payment-reversals.integration.spec.js#it
      refuses closing a closed dispute (dispute_not_open), a dispute of a check (reversal_kind_mismatch) and
      an amount beyond the payment
    origin: none
    note: >-
      The cited build recommendation does not establish Product approval; the authority gap remains open in
      FND-ACC-TRX-035.
  - id: BR-CAP-ACC-TRX-013-10
    proved_by: [ATS-ACC-TRX-013-08, TST-ACC-TRX-011, TST-ACC-TRX-073, TST-ACC-TRX-080]
    statement: >-
      Losing a chargeback closes the dispute and reverses the payment together; losing an inquiry alone leaves
      the payment untouched.
    kind: lifecycle
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      services-accounting:modules/transactions/tests/integration/services/payments/dispute-inquiry-lost.integration.spec.js#it
      writes no payment reversal and leaves the payment succeeded, nothing reversed
    origin: none
    note: >-
      The cited build recommendation does not establish Product approval; the authority gap remains open in
      FND-ACC-TRX-035.
  - id: BR-CAP-ACC-TRX-013-11
    proved_by: [ATS-ACC-TRX-013-09]
    statement: >-
      The product should restrict lost-chargeback reversal to the disputed amount; the current implementation
      reverses the whole payment.
    kind: calculation
    enforced_at:
      - service
    must_prove: true
    provenance: unknown
    source: OQ-ACC-TRX-003
    origin: none
    note: >-
      The cited build recommendation does not establish Product approval; the authority gap remains open in
      FND-ACC-TRX-035.
  - id: BR-CAP-ACC-TRX-013-12
    proved_by: []
    statement: >-
      Processor events can create and close disputes, with repeat delivery prevented from applying the outcome
      twice.
    kind: policy
    enforced_at:
      - service
    must_prove: false
    provenance: test
    source: >-
      services-accounting:modules/transactions/tests/integration/services/stripe/stripe-webhooks.integration.spec.js#it
      opens a chargeback from charge.dispute.created, reading the tenant through the PaymentIntent, once
    origin: none
    note: >-
      The cited build recommendation does not establish Product approval; the authority gap remains open in
      FND-ACC-TRX-035.
scenarios:
  - id: SC-CAP-ACC-TRX-013-01
    given: The bank returns a member’s paper check.
    when: Record a bounced-check reversal.
    then: Returned payment standing accompanies reopened debt and the retained reversal record.
    provenance: test
    source: 'react-console:acceptance/accounting/playwright/journeys/payments/ACT-ACC-0306.spec.ts#ACT-ACC-0306'
  - id: SC-CAP-ACC-TRX-013-02
    given: A check receipt was assigned to the wrong member.
    when: Void it from the receipt page.
    then: The receipt remains visible as voided and its paid invoices become outstanding again.
    provenance: test
    source: 'react-console:acceptance/accounting/playwright/journeys/payments/ACT-ACC-0305.spec.ts#ACT-ACC-0305'
  - id: SC-CAP-ACC-TRX-013-03
    given: A dispute claims one cent from an 80.00 card receipt.
    when: Close the chargeback dispute as lost.
    then: 'Current behavior reverses the full 80.00, preserving the discrepancy for Product review.'
    provenance: test
    source: 'react-console:acceptance/accounting/playwright/journeys/payments/ACT-ACC-0330.spec.ts#ACT-ACC-0330'
edge_cases: []
depends_on:
  - CAP-ACC-TRX-006
  - CAP-ACC-TRX-007
related:
  - CAP-ACC-TRX-011
  - CAP-ACC-TRX-012
  - CAP-ACC-TRX-020
journeys:
  - JNY-ACC-TRX-002
open_questions:
  - OQ-ACC-TRX-003
evidence:
  - >-
    services-accounting at f47cb263875bbc0c5640fba7dae6785ec32695f8:
    modules/transactions/aws/api/payments.routes.ts (voidPayment, listPaymentActions, performPaymentAction),
    payment-reversals.routes.ts (reversePayment, listPaymentReversals, openDispute, getDispute,
    listPaymentDisputes, closeDispute); services/payments/payment-reverse.ts, payment-reversal-reads.ts;
    services/actions/payment-actions.ts; services/persistence/payment-reversals.ts, disputes.ts;
    db/payment-reversals.table.ts, disputes.table.ts; docs/accounting/payments.md; tests
    e2e/payment-reversals.e2e.spec.js, integration/services/payments/payment-reversals, dispute-inquiry-lost,
    allocate; integration/services/stripe/stripe-webhooks.
  - >-
    react-console at baf6dae382d6f41dce976c7f848667ccc37e076f:
    components/accounting/payments/payment-detail-screen.tsx (Void, Record Reversal, Open Dispute);
    app/(console)/console/[tenantId]/accounting/reversals/[reversalId] (the billing reversal record); journeys
    ACT-ACC-0305 to 0308, 0330, 0341; inventory rules RUL-ACC-PAY-018 to 026.
controls: [TC-IAM-001, TC-IAM-002, TC-IAM-004, TC-IAM-005, 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-002, TC-LOG-003, TC-LOG-004, TC-LOG-005, TC-PI-001, TC-PI-003, TC-PI-005, TC-VEN-001, TC-VEN-002, TC-VEN-003, TC-PRV-001, TC-PRV-002]
exercised_by: [FAS-ACC-TRX-04-01, FAS-ACC-TRX-04-02, FAS-ACC-TRX-04-04]
suites: [TST-ACC-TRX-011, TST-ACC-TRX-012, TST-ACC-TRX-070, TST-ACC-TRX-073, TST-ACC-TRX-078, TST-ACC-TRX-080, TST-ACC-TRX-122, TST-ACC-TRX-243, TST-ACC-TRX-244, TST-ACC-TRX-245]
---

# Record receipts that were voided or returned

## Purpose

Staff explain money that did not remain collected and restore the affected debt.

## How It Works

Staff choose a reversal type consistent with the original receipt’s behavior. The operation requires sensitive authority and an explanation. A successful reversal negates live applications while retaining the receipt. Processor voids first establish whether the charge can still be voided. Settled charges require refunding instead. Disputes track inquiry or chargeback outcomes and can trigger reversal when a chargeback is lost. The product should settle the amount policy for partial chargebacks before design approval.

## Relationships

- Record receipts collected outside Rhythm supplies or continues the related financial work.
- Collect processor payments and resolve uncertainty supplies or continues the related financial work.
- Provide and spend customer credit supplies or continues the related financial work.
- Return customer money with accountable refunds supplies or continues the related financial work.
- Coordinate financial commands across applications supplies or continues the related financial work.
