---
id: CAP-ACC-PRD-008
title: 'Configure prices by audience, period and currency'
feature: FEAT-ACC-PRD-02
product_area: accounting
module: products
revision: 4
status: draft
product_intent: proposed
implementation_evidence: observed
supersedes:
  - react-console acceptance inventory CAP-ACC-PRD-007
  - react-console acceptance inventory RUL-ACC-PRD-009
  - react-console acceptance inventory RUL-ACC-PRD-010
  - react-console acceptance inventory RUL-ACC-PRD-011
  - react-console acceptance inventory RUL-ACC-PRD-012
  - react-console acceptance inventory RUL-ACC-PRD-013
  - react-console acceptance inventory RUL-ACC-PRD-014
  - react-console acceptance inventory RUL-ACC-PRD-015
  - react-console acceptance inventory RUL-ACC-PRD-016
  - react-console acceptance inventory RUL-ACC-PRD-017
  - react-console acceptance inventory RUL-ACC-PRD-050
source_sha:
  services-accounting: f47cb263875bbc0c5640fba7dae6785ec32695f8
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
intent_sources:
  - 'services-accounting:docs/milestones/ACCT-M1-books-and-invoices.md#D4'
  - 'services-accounting:docs/migrations/accounting-modernization/products-a12-a13/README.md#Provenance'
purpose: An administrator fills the price grid for the audiences and currencies a product needs.
outcomes:
  - The grid supplies pricing configuration for eligible audiences.
concepts:
  - CON-ACC-PRD-002
actors:
  - ACT-ACC-006
  - ACT-ACC-010
  - ACT-ACC-011
surfaces:
  - console
  - api
permissions:
  - key: accounting.products.create
    where_checked: api
    scope: tenant
  - key: accounting.products.update
    where_checked: api
    scope: tenant
rules:
  - id: BR-CAP-ACC-PRD-008-01
    proved_by: [ATS-ACC-PRD-002-15, ATS-ACC-PRD-008-01, ATS-ACC-PRD-008-11, TST-ACC-PRD-014, TST-ACC-PRD-030, TST-ACC-PRD-040, TST-ACC-PRD-066]
    statement: A fixed-priced product requires a manually set standard price in its business unit’s base currency.
    kind: validation
    enforced_at:
      - service
      - console
    must_prove: true
    provenance: test
    source: >-
      services-accounting:modules/products/tests/integration/services/persistence/products.integration.spec.js#refuses
      an Accounting Product without a standard price in the base currency
    origin: 'services-accounting:docs/milestones/ACCT-M1-books-and-invoices.md#D4'
  - id: BR-CAP-ACC-PRD-008-02
    proved_by: [ATS-ACC-PRD-008-01, TST-ACC-PRD-014, TST-ACC-PRD-030, TST-ACC-PRD-040, TST-ACC-PRD-066]
    statement: A giver-priced product rejects price rows because the purchaser supplies the amount.
    kind: validation
    enforced_at:
      - service
      - console
    must_prove: true
    provenance: test
    source: >-
      services-accounting:modules/products/tests/integration/services/persistence/products.integration.spec.js#refuses
      a Donation Product with prices
    origin: 'services-accounting:docs/milestones/ACCT-M1-books-and-invoices.md#D4'
  - id: BR-CAP-ACC-PRD-008-03
    proved_by: [ATS-ACC-PRD-008-02, TST-ACC-PRD-040, TST-ACC-PRD-066]
    statement: >-
      Price currencies must belong to the unit, and supported foreign currencies require multicurrency to be
      enabled.
    kind: validation
    enforced_at:
      - service
      - database
    must_prove: true
    provenance: test
    source: >-
      services-accounting:modules/products/tests/unit/rules/product-rules.spec.js#refuses a supported currency
      when the unit has Enable Multicurrency off (1.0: off is a single-currency unit)
    origin: 'services-accounting:docs/milestones/ACCT-M1-books-and-invoices.md#D4'
  - id: BR-CAP-ACC-PRD-008-04
    proved_by: [ATS-ACC-PRD-008-03, TST-ACC-PRD-031, TST-ACC-PRD-040]
    statement: >-
      Each price cell selects an amount, a percentage of standard, conversion or prohibition and supplies only
      the values that mode requires, with percentages from zero to one hundred and at most two decimals.
    kind: validation
    enforced_at:
      - api
      - service
      - database
    must_prove: true
    provenance: test
    source: >-
      services-accounting:modules/products/tests/integration/services/persistence/products.integration.spec.js#refuses
      a percentage cell without a percent, and a set cell with one
    origin: 'services-accounting:docs/milestones/ACCT-M1-books-and-invoices.md#D4'
  - id: BR-CAP-ACC-PRD-008-05
    proved_by: [ATS-ACC-PRD-008-04, TST-ACC-PRD-040, TST-ACC-PRD-066]
    statement: Conversion and prohibition modes cannot apply to the base currency.
    kind: validation
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      services-accounting:modules/products/tests/unit/rules/product-rules.spec.js#refuses prohibiting the base
      currency
    origin: 'services-accounting:docs/milestones/ACCT-M1-books-and-invoices.md#D4'
  - id: BR-CAP-ACC-PRD-008-06
    proved_by: [ATS-ACC-PRD-008-05, TST-ACC-PRD-040, TST-ACC-PRD-066]
    statement: >-
      A percentage price cannot target the standard audience and requires a set standard price in the same
      currency from its own period or the always period.
    kind: calculation
    enforced_at:
      - service
      - database
    must_prove: true
    provenance: test
    source: >-
      services-accounting:modules/products/tests/integration/services/persistence/products.integration.spec.js#refuses
      a percentage cell on the standard audience, and one with no standard price to be a percentage of
    origin: 'services-accounting:docs/milestones/ACCT-M1-books-and-invoices.md#D4'
    examples:
      positive: A member price can be set to eighty percent of the standard euro price.
      negative: The member percentage has no basis when the corresponding standard euro price is absent.
  - id: BR-CAP-ACC-PRD-008-07
    proved_by: [ATS-ACC-PRD-008-06, TST-ACC-PRD-040, TST-ACC-PRD-066]
    statement: >-
      A converted price requires its own audience’s set or percentage base-currency price from the same period
      or the always period.
    kind: calculation
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      services-accounting:modules/products/tests/integration/services/persistence/products.integration.spec.js#refuses
      a calculated cell in the base currency, and one whose audience has no base-currency price to convert
    origin: 'services-accounting:docs/milestones/ACCT-M1-books-and-invoices.md#D4'
  - id: BR-CAP-ACC-PRD-008-08
    proved_by: [ATS-ACC-PRD-008-05, TST-ACC-PRD-040, TST-ACC-PRD-066]
    statement: >-
      Validation uses backing rows from the matching or always period and never another named period; Commerce
      owns actual price selection.
    kind: calculation
    enforced_at:
      - service
    must_prove: true
    provenance: observed
    source: 'services-accounting:modules/products/services/rules/product-rules.ts:rowsBacking'
    origin: 'services-accounting:docs/milestones/ACCT-M1-books-and-invoices.md#D4'
  - id: BR-CAP-ACC-PRD-008-09
    proved_by: [ATS-ACC-PRD-008-07, TST-ACC-PRD-030, TST-ACC-PRD-040, TST-ACC-PRD-066]
    statement: >-
      Rows sharing audience, currency and period cannot overlap in time, with opening instants included and
      closing instants excluded.
    kind: invariant
    enforced_at:
      - service
      - database
    must_prove: true
    provenance: test
    source: >-
      services-accounting:modules/products/tests/integration/services/persistence/products.integration.spec.js#refuses
      a dated price beside one that applies always, in the same audience and currency
    origin: 'services-accounting:docs/milestones/ACCT-M1-books-and-invoices.md#D4'
  - id: BR-CAP-ACC-PRD-008-10
    proved_by: [ATS-ACC-PRD-008-08, TST-ACC-PRD-035, TST-ACC-PRD-040]
    statement: >-
      Known audiences are standard, member and active Commerce audiences in the workspace; before that
      vocabulary exists, previously held audiences are also accepted.
    kind: validation
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      services-accounting:modules/products/tests/integration/services/persistence/pricing-audiences.integration.spec.js#refuses
      an inactive audience and an unknown one, naming the vocabulary
    origin: 'services-accounting:docs/milestones/ACCT-M1-books-and-invoices.md#D4'
  - id: BR-CAP-ACC-PRD-008-11
    proved_by: [ATS-ACC-PRD-008-10]
    statement: Price amounts use nonnegative integer minor units of their currency.
    kind: validation
    enforced_at:
      - api
      - database
    must_prove: false
    provenance: test
    source: >-
      services-accounting:modules/products/tests/integration/db/products.table.integration.spec.js#refuses a
      negative amount
    origin: none
  - id: BR-CAP-ACC-PRD-008-12
    proved_by: [ATS-ACC-PRD-004-11, ATS-ACC-PRD-008-09, ATS-ACC-PRD-010-05, ATS-ACC-PRD-016-09, TST-ACC-PRD-030, TST-ACC-PRD-040]
    statement: >-
      Each product accepts up to five hundred price cells and replaces the entire grid on creation or
      replacement.
    kind: validation
    enforced_at:
      - api
      - service
    must_prove: true
    provenance: test
    source: >-
      services-accounting:modules/products/tests/integration/services/persistence/products.integration.spec.js#refuses
      more than 500 prices (the bound of the grid)
    origin: none
  - id: BR-CAP-ACC-PRD-008-13
    proved_by: []
    statement: >-
      Documented pricing responsibility assigns missing foreign-currency cells to unit defaults and conversion
      with frozen rates to Commerce.
    kind: policy
    enforced_at: []
    must_prove: false
    provenance: documented
    source: 'services-accounting:docs/accounting/products.md#Prices (the grid: A12 and A13, 2026-10-17)'
    origin: 'services-accounting:docs/milestones/ACCT-M1-books-and-invoices.md#D4'
  - id: BR-CAP-ACC-PRD-008-14
    proved_by: []
    statement: >-
      The product API retains the deprecated audience alias in responses and accepts it instead of the current
      audience field.
    kind: policy
    enforced_at:
      - api
      - service
    must_prove: false
    provenance: test
    source: >-
      services-accounting:modules/products/tests/integration/services/persistence/products.integration.spec.js#accepts
      the deprecated alias audience in place of audience_id, answering both
    origin: none
  - id: BR-CAP-ACC-PRD-008-15
    proved_by: []
    statement: >-
      The console fills an empty standard foreign-currency cell with prohibition unless the unit default
      supplies conversion.
    kind: policy
    enforced_at:
      - console
    must_prove: false
    provenance: observed
    source: 'react-console:lib/accounting-config/product-form.ts:formToWrite'
    origin: none
scenarios:
  - id: SC-CAP-ACC-PRD-008-01
    given: A US-dollar product also supports euro and Canadian-dollar pricing.
    when: 'Staff set a dollar amount, member percentage, euro conversion and Canadian-dollar prohibition.'
    then: The saved grid contains those choices in minor units at the initial version.
    provenance: test
    source: 'react-console:acceptance/accounting/playwright/journeys/products/ACT-ACC-0100.spec.ts#ACT-ACC-0100'
edge_cases:
  - id: SC-CAP-ACC-PRD-008-02
    given: A standard dollar row has no date boundaries.
    when: An administrator adds another standard dollar row starting in January.
    then: The overlapping applicability rejects the save.
    provenance: test
    source: >-
      services-accounting:modules/products/tests/integration/services/persistence/products.integration.spec.js#refuses
      a dated price beside one that applies always, in the same audience and currency
constraints: []
depends_on:
  - CAP-ACC-PRD-002
related:
  - CAP-ACC-PRD-009
  - CAP-ACC-PRD-011
  - CAP-ACC-PRD-016
journeys:
  - JNY-ACC-PRD-001
  - JNY-ACC-PRD-003
open_questions: []
evidence:
  - 'react-console:acceptance/accounting/playwright/journeys/products/ACT-ACC-0100.spec.ts'
  - 'react-console:components/accounting-config/products/product-prices-section.tsx'
  - 'react-console:lib/accounting-config/product-form.ts'
  - 'services-accounting:docs/accounting/products.md'
  - 'services-accounting:docs/migrations/accounting-modernization/products-a12-a13/README.md'
  - 'services-accounting:docs/milestones/ACCT-M1-books-and-invoices.md'
  - 'services-accounting:modules/products/aws/api/products.schemas.ts'
  - 'services-accounting:modules/products/db/product-prices.table.ts'
  - 'services-accounting:modules/products/services/persistence/pricing-audiences.ts'
  - 'services-accounting:modules/products/services/persistence/products.ts'
  - 'services-accounting:modules/products/services/rules/product-rules.ts'
  - 'services-accounting:modules/products/tests/integration/db/products.table.integration.spec.js'
  - >-
    services-accounting:modules/products/tests/integration/services/persistence/pricing-audiences.integration.spec.js
  - 'services-accounting:modules/products/tests/integration/services/persistence/products.integration.spec.js'
  - 'services-accounting:modules/products/tests/unit/rules/product-rules.spec.js'
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-005, TC-AZ-006, TC-TEN-001, TC-TEN-002, TC-TEN-003, TC-TEN-004, TC-DAT-001, TC-LOG-001, TC-LOG-002, TC-LOG-003, TC-LOG-004, TC-PI-001, TC-PI-003, TC-PI-005]
exercised_by: [FAS-ACC-PRD-01-01, FAS-ACC-PRD-02-01, FAS-ACC-PRD-02-02, FAS-ACC-PRD-02-03, FAS-ACC-PRD-02-04, FAS-ACC-PRD-02-05]
suites: [TST-ACC-PRD-014, TST-ACC-PRD-030, TST-ACC-PRD-031, TST-ACC-PRD-035, TST-ACC-PRD-040, TST-ACC-PRD-066]
---

# Configure prices by audience, period and currency

## Purpose

An administrator fills the price grid for the audiences and currencies a product needs.

## How It Works

An administrator fills the price grid for the audiences and currencies a product needs. Fixed-priced kinds start with a standard base-currency amount. Donations instead let the giver supply an amount. A grid cell can hold money, a percentage, a conversion choice or a prohibition. Validation checks the required backing cells and rejects overlapping time windows. Named periods can refer back to the always period, but never a different named period. Commerce owns audience selection and conversion when a purchase is priced. Accounting supplies validated configuration. The console has stricter current-price expectations and different time-boundary handling that need a settled shared contract.

## Relationships

This outcome uses create a product with a permanent identity.
