---
id: CAP-ACC-TRX-003
title: Adjust billed value with memos
feature: FEAT-ACC-TRX-02
product_area: accounting
module: transactions
revision: 1
status: draft
product_intent: proposed
implementation_evidence: observed
supersedes:
  - CAP-ACC-INV-016
  - CAP-ACC-INV-017
  - CAP-ACC-INV-024
  - CAP-ACC-INV-027
source_sha:
  services-accounting: f47cb263875bbc0c5640fba7dae6785ec32695f8
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
intent_sources:
  - 'services-accounting:docs/milestones/ACCT-M1-books-and-invoices.md#D5'
  - 'services-accounting:docs/milestones/ACCT-M1-books-and-invoices.md#D7'
  - 'services-accounting:docs/milestones/ACCT-M1-books-and-invoices.md#D8'
  - 'services-accounting:docs/milestones/ACCT-M1-books-and-invoices.md#D12'
  - 'services-accounting:docs/architecture/accounting-2.0/02-decisions.md#A-5'
purpose: Staff change an invoice’s debt without replacing its issued commercial record.
outcomes:
  - Staff change an invoice’s debt without replacing its issued commercial record.
  - >-
    Invalid or excessive adjustments leave the original position intact. Voiding retains the memo and adds
    opposing lines rather than erasing it.
concepts:
  - CON-ACC-TRX-001
  - CON-ACC-TRX-003
actors:
  - ACT-ACC-012
  - ACT-ACC-021
surfaces:
  - console
  - api
permissions:
  - key: accounting.credit-memos.create
    where_checked: api
    scope: tenant
  - key: accounting.credit-memos.read
    where_checked: api
    scope: tenant
  - key: accounting.credit-memos.update
    where_checked: api
    scope: tenant
  - key: accounting.debit-memos.create
    where_checked: api
    scope: tenant
  - key: accounting.debit-memos.read
    where_checked: api
    scope: tenant
  - key: accounting.debit-memos.update
    where_checked: api
    scope: tenant
rules:
  - id: BR-CAP-ACC-TRX-003-01
    proved_by: [ATS-ACC-TRX-003-01, TST-ACC-TRX-034, TST-ACC-TRX-220, TST-ACC-TRX-237]
    statement: >-
      Memos target an issued real invoice and its own lines; drafts, void invoices and unconverted quotes are
      ineligible.
    kind: validation
    enforced_at:
      - service
      - database
    must_prove: true
    provenance: test
    source: >-
      services-accounting:modules/transactions/tests/integration/services/change-memos/credit-memos.integration.spec.js#it
      is refused 400 business_unit_mismatch for a line of another invoice of the unit (the ledger trigger’s
      check)
    origin: 'services-accounting:docs/milestones/ACCT-M1-books-and-invoices.md#D12'
  - id: BR-CAP-ACC-TRX-003-02
    proved_by: [ATS-ACC-TRX-002-11, ATS-ACC-TRX-003-02, TST-ACC-TRX-034, TST-ACC-TRX-035, TST-ACC-TRX-225]
    statement: >-
      Saving a memo issues it immediately using its kind’s numbering sequence beginning at one million; no
      draft stage is available.
    kind: lifecycle
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      services-accounting:modules/transactions/tests/integration/services/change-memos/credit-memos.integration.spec.js#it
      answers the memo whole: issued, numbered from 1,000,000, its line and total, the invoice’s bill-to
    origin: 'services-accounting:docs/milestones/ACCT-M1-books-and-invoices.md#D5'
  - id: BR-CAP-ACC-TRX-003-03
    proved_by: [ATS-ACC-TRX-002-11, ATS-ACC-TRX-003-03, TST-ACC-TRX-022, TST-ACC-TRX-034, TST-ACC-TRX-229]
    statement: >-
      Credit cannot exceed the line’s outstanding value plus releasable paid money, and an excessive credit
      rolls back every associated write.
    kind: validation
    enforced_at:
      - service
      - database
    must_prove: true
    provenance: test
    source: >-
      services-accounting:modules/transactions/tests/integration/services/change-memos/credit-memos.integration.spec.js#it
      writes nothing: no memo, no ledger line, no fact, no event
    origin: 'services-accounting:docs/milestones/ACCT-M1-books-and-invoices.md#D12'
  - id: BR-CAP-ACC-TRX-003-04
    proved_by: [ATS-ACC-TRX-003-04, ATS-ACC-TRX-003-12, ATS-ACC-TRX-008-09, ATS-ACC-TRX-011-10, ATS-ACC-TRX-012-12, ATS-ACC-TRX-014-09, TST-ACC-TRX-033, TST-ACC-TRX-230]
    statement: >-
      Crediting paid value releases only the needed allocations, starting with the newest payment, and retains
      that value as unapplied money rather than paying a refund.
    kind: calculation
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      services-accounting:modules/transactions/tests/integration/services/change-memos/credit-memo-allocations.integration.spec.js#it
      frees the newest check’s remaining 15.00 first, then 15.00 of the older check, each holding what was
      freed from it
    origin: 'services-accounting:docs/architecture/accounting-2.0/02-decisions.md#A-5'
  - id: BR-CAP-ACC-TRX-003-05
    proved_by: []
    statement: The memo form always releases paid value under the freeing rule and offers no alternative treatment.
    kind: policy
    enforced_at:
      - console
    must_prove: false
    provenance: observed
    source: 'react-console:components/accounting/memos/memo-editor-screen.tsx:MemoEditorForm'
    origin: 'services-accounting:docs/milestones/ACCT-M1-books-and-invoices.md#D8'
  - id: BR-CAP-ACC-TRX-003-06
    proved_by: [ATS-ACC-TRX-003-05, ATS-ACC-TRX-003-12, TST-ACC-TRX-034]
    statement: >-
      Fully credited lines become cancelled; the invoice becomes cancelled when memos eliminate its total,
      while a partial reduction remains open until settled.
    kind: calculation
    enforced_at:
      - database
    must_prove: true
    provenance: test
    source: >-
      services-accounting:modules/transactions/tests/integration/services/change-memos/credit-memos.integration.spec.js#it
      makes the credited line cancelled and leaves the invoice open with the other line’s 80.00
    origin: 'services-accounting:docs/milestones/ACCT-M1-books-and-invoices.md#D7'
  - id: BR-CAP-ACC-TRX-003-07
    proved_by: [ATS-ACC-TRX-003-06, TST-ACC-TRX-035, TST-ACC-TRX-227]
    statement: >-
      A debit memo creates zero-priced invoice lines carrying the added charge, increasing the balance beyond
      the invoice’s original total.
    kind: calculation
    enforced_at:
      - service
      - database
    must_prove: true
    provenance: test
    source: >-
      services-accounting:modules/transactions/tests/integration/services/change-memos/debit-memos.integration.spec.js#it
      raises the header’s balance by the memo, its totals its own
    origin: 'services-accounting:docs/milestones/ACCT-M1-books-and-invoices.md#D12'
  - id: BR-CAP-ACC-TRX-003-08
    proved_by: [ATS-ACC-TRX-003-07, TST-ACC-TRX-036]
    statement: >-
      Credit tax is apportioned from the gross reduction using the original tax proportions, while debit tax
      is calculated anew and added to the requested charge.
    kind: calculation
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      services-accounting:modules/transactions/tests/integration/services/change-memos/memo-tax.integration.spec.js#it
      apportions the dues line’s credit between the net and each tax line as the line was taxed, each row
      naming the invoice tax line it reverses
    origin: none
  - id: BR-CAP-ACC-TRX-003-09
    proved_by: [ATS-ACC-TRX-003-08, TST-ACC-TRX-003, TST-ACC-TRX-034, TST-ACC-TRX-226]
    statement: >-
      Voiding requires a reason and adds dated negating lines restoring the invoice’s position; repeated voids
      and memo deletion are unavailable.
    kind: lifecycle
    enforced_at:
      - service
      - database
    must_prove: true
    provenance: test
    source: >-
      services-accounting:modules/transactions/tests/integration/services/change-memos/credit-memos.integration.spec.js#it
      returns the invoice’s balances to what they were before the memo
    origin: 'services-accounting:docs/milestones/ACCT-M1-books-and-invoices.md#D12'
  - id: BR-CAP-ACC-TRX-003-10
    proved_by: [ATS-ACC-TRX-003-09, TST-ACC-TRX-035]
    statement: A debit memo cannot be voided for more than its added line still owes after later credits.
    kind: validation
    enforced_at:
      - service
      - database
    must_prove: true
    provenance: test
    source: >-
      services-accounting:modules/transactions/tests/integration/services/change-memos/debit-memos.integration.spec.js#it
      is refused 400 over_application
    origin: 'services-accounting:docs/milestones/ACCT-M1-books-and-invoices.md#D12'
  - id: BR-CAP-ACC-TRX-003-11
    proved_by: [ATS-ACC-TRX-003-10, TST-ACC-TRX-034]
    statement: >-
      A memo defaults to today, uses an open period no earlier than the invoice’s accounting date, and enters
      an explicitly selected or assigned batch.
    kind: validation
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      services-accounting:modules/transactions/tests/integration/services/change-memos/credit-memos.integration.spec.js#it
      refuses no batch in a unit without batch assignment settings 409 batch_required
    origin: 'services-accounting:docs/milestones/ACCT-M1-books-and-invoices.md#D12'
  - id: BR-CAP-ACC-TRX-003-12
    proved_by: [ATS-ACC-TRX-003-11, TST-ACC-TRX-003]
    statement: >-
      Creating and voiding use the memo kind’s create and update authorities respectively; read access grants
      inspection without actions.
    kind: permission
    enforced_at:
      - api
    must_prove: true
    provenance: test
    source: >-
      services-accounting:modules/transactions/tests/e2e/change-memos.e2e.spec.js#it is refused the create,
      the void, the details and the batch routes 403 permission_missing
    origin: 'services-accounting:docs/milestones/ACCT-M1-books-and-invoices.md#D12'
scenarios:
  - id: SC-CAP-ACC-TRX-003-01
    given: Older and newer checks contributed 35.00 and 25.00 to one line.
    when: Reduce the line by 10.00 with a credit memo.
    then: Only the newer receipt regains 10.00 of unapplied value.
    provenance: test
    source: >-
      services-accounting:modules/transactions/tests/integration/services/change-memos/credit-memo-allocations.integration.spec.js#it
      frees 10.00 from the newest check alone, back on that check as unapplied cash, the older check
      untouched; the line credited 10.00 and owing nothing
  - id: SC-CAP-ACC-TRX-003-02
    given: Dues have been billed on a real invoice.
    when: Issue a debit memo for a late charge.
    then: A zero-priced late-charge line increases the invoice’s outstanding amount.
    provenance: test
    source: 'react-console:acceptance/accounting/playwright/journeys/invoices/ACT-ACC-0194.spec.ts#ACT-ACC-0194'
  - id: SC-CAP-ACC-TRX-003-03
    given: Two requests compete to credit the same remaining dollar.
    when: Submit the memo requests concurrently.
    then: One memo succeeds and the rejected request leaves no associated records.
    provenance: test
    source: 'react-console:acceptance/accounting/playwright/journeys/invoices/ACT-ACC-0196.spec.ts#ACT-ACC-0196'
edge_cases: []
constraints:
  - A memo contains no more than two hundred and fifty lines.
depends_on:
  - CAP-ACC-TRX-001
related:
  - CAP-ACC-TRX-008
  - CAP-ACC-TRX-014
  - CAP-ACC-TRX-015
journeys:
  - JNY-ACC-TRX-005
evidence:
  - >-
    services-accounting at f47cb263875bbc0c5640fba7dae6785ec32695f8:
    modules/transactions/aws/api/change-memos.routes.ts (createCreditMemo, getCreditMemo, listCreditMemos,
    voidCreditMemo, listCreditMemoActions, performCreditMemoAction and the six debit memo operations);
    services/change-memos/memo-commands.ts, memo-reads.ts, memo-answers.ts;
    services/payments/free-paid-money.ts; services/actions/change-memo-actions.ts; db/credit-memos.table.ts,
    credit-memo-lines.table.ts, debit-memos.table.ts, debit-memo-lines.table.ts, memo-tax-lines.table.ts;
    docs/accounting/credit-memos.md, debit-memos.md; docs/debt/memo-on-partly-recognised-line.md; tests
    e2e/change-memos.e2e.spec.js, integration/services/change-memos/*.
  - >-
    react-console at baf6dae382d6f41dce976c7f848667ccc37e076f:
    app/(console)/console/[tenantId]/accounting/creditMemos/**, debitMemos/**;
    components/accounting/memos/memo-editor-screen.tsx, memo-detail-screen.tsx, memo-issue-dialog.tsx;
    journeys ACT-ACC-0192 to 0197, 0215; inventory rules RUL-ACC-INV-015 to 021, 042.
controls: [TC-IAM-001, TC-IAM-002, TC-IAM-004, TC-IAM-005, 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-DAT-001, TC-DAT-002, TC-DAT-003, TC-DAT-004, TC-LOG-004, TC-LOG-005, TC-PI-001, TC-PI-002, TC-PI-003, TC-PI-005, TC-PRV-001, TC-PRV-002]
exercised_by: [FAS-ACC-TRX-02-01, FAS-ACC-TRX-02-02, FAS-ACC-TRX-02-03, FAS-ACC-TRX-02-04, FAS-ACC-TRX-02-05]
suites: [TST-ACC-TRX-003, TST-ACC-TRX-022, TST-ACC-TRX-033, TST-ACC-TRX-034, TST-ACC-TRX-035, TST-ACC-TRX-036, TST-ACC-TRX-220, TST-ACC-TRX-225, TST-ACC-TRX-226, TST-ACC-TRX-227, TST-ACC-TRX-229, TST-ACC-TRX-230, TST-ACC-TRX-237]
---

# Adjust billed value with memos

## Purpose

Staff change an invoice’s debt without replacing its issued commercial record.

## How It Works

Staff select invoice lines and the credit or debit treatment needed. Saving issues a numbered memo immediately. A credit reduces billed value and can free money no longer needed by the line. That money remains on the contributing receipt until another operation uses it. A debit adds a separate charge to the invoice. Invalid or excessive adjustments leave the original position intact. Voiding retains the memo and adds opposing lines rather than erasing it.

## Relationships

- Issue customer bills and numbered quotes supplies or continues the related financial work.
- Allocate and relocate received money supplies or continues the related financial work.
- Unwind billed purchases and their collected value supplies or continues the related financial work.
- Keep transaction batches and details correct supplies or continues the related financial work.
