---
id: CAP-COM-CAT-012
title: Configure product purchasing and price adjustments
feature: FEAT-COM-CAT-03
product_area: commerce
module: catalog
revision: 1
status: draft
product_intent: proposed
implementation_evidence: observed
source_sha:
  services-commerce: c8b66a98e2490617aec38ba5c8165dd9bd0a8f9b
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
intent_sources:
  - 'services-commerce:docs/milestones/COMM-M1-set-up-what-you-sell.md#D4'
  - 'services-commerce:docs/milestones/COMM-M1-set-up-what-you-sell.md#D14'
  - >-
    services-commerce:docs/milestones/COMM-M1-set-up-what-you-sell.md#D-REC-9
    (to confirm)
  - 'services-commerce:docs/milestones/plans/COMM-M1-plan.md#2. Scope (item 5)'
purpose: >-
  Administrators choose how product prices are selected and which customer
  functions adjust them.
outcomes:
  - Staff can select rank-based pricing when imported configuration requires it.
  - >-
    Activating or deactivating the registered product function controls
    adjustment use through configuration.
concepts:
  - CON-COM-CAT-004
actors:
  - ACT-COM-001
  - ACT-COM-004
surfaces:
  - console
  - api
permissions:
  - key: commerce.product-purchasing-settings.read
    where_checked: api
    scope: tenant
  - key: commerce.product-purchasing-settings.update
    where_checked: api
    scope: tenant
  - key: commerce.product-purchasing-settings.create
    where_checked: api
    scope: tenant
  - key: commerce.product-purchasing-settings.delete
    where_checked: api
    scope: tenant
  - key: commerce.product-purchasing-settings.bulk
    where_checked: api
    scope: tenant
  - key: commerce.product-extensions.read
    where_checked: api
    scope: tenant
  - key: commerce.product-extensions.update
    where_checked: api
    scope: tenant
  - key: commerce.product-extensions.delete
    where_checked: api
    scope: tenant
  - key: commerce.product-extensions.create
    where_checked: api
    scope: tenant
  - key: commerce.product-extensions.bulk
    where_checked: api
    scope: tenant
rules:
  - id: BR-CAP-COM-CAT-012-01
    proved_by: []
    statement: >-
      Purchasing settings select the schedule, audience-price selection method,
      promotion exclusion, priced buyer or recipient, purchase or service
      qualification date, and allowed organization purchasing roles.
    kind: policy
    enforced_at:
      - api
      - service
    must_prove: false
    provenance: documented
    source: >-
      services-commerce:docs/milestones/plans/COMM-M1-plan.md#D4. Let staff see
      and set a product's purchasing settings
    origin: COMM-M1 D4 (docs/milestones/COMM-M1-set-up-what-you-sell.md)
  - id: BR-CAP-COM-CAT-012-02
    proved_by: [ATS-COM-CAT-012-01, TST-COM-CAT-065, TST-COM-CAT-079]
    statement: >-
      Absent settings use buyer pricing, lowest-price selection, promotion
      inclusion, purchase-date qualification, no roles and no schedule;
      replacement resets omitted settings to those defaults.
    kind: policy
    enforced_at:
      - service
      - database
    must_prove: true
    provenance: test
    source: >-
      services-commerce:modules/pricing/tests/e2e/product-purchasing-settings.e2e.spec.js#gives
      a setting the PUT leaves out its default, the whole record being stated
    origin: COMM-M1 D4 (docs/milestones/COMM-M1-set-up-what-you-sell.md)
  - id: BR-CAP-COM-CAT-012-03
    proved_by: [ATS-COM-CAT-010-09, ATS-COM-CAT-012-02, ATS-COM-CAT-012-08, ATS-COM-CAT-012-10, ATS-COM-CAT-013-18, TST-COM-CAT-065]
    statement: >-
      Lowest-price selection chooses the cheapest qualifying audience with lower
      rank breaking ties, while rank selection takes the first qualifying
      audience in rank order.
    kind: calculation
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      services-commerce:modules/pricing/tests/e2e/product-purchasing-settings.e2e.spec.js#prices
      the same buyer at the member price under rank, Member coming before
      Student members
    origin: >-
      COMM-M1 plan A4 (member pricing Q-09)
      (docs/milestones/plans/COMM-M1-plan.md)
  - id: BR-CAP-COM-CAT-012-04
    proved_by: [ATS-COM-CAT-011-10, ATS-COM-CAT-012-03, ATS-COM-CAT-012-09, TST-COM-CAT-065]
    statement: >-
      Unknown schedules or organization roles and unsupported setting values
      produce a refusal without changing purchasing settings.
    kind: validation
    enforced_at:
      - api
      - service
    must_prove: true
    provenance: test
    source: >-
      services-commerce:modules/pricing/tests/e2e/product-purchasing-settings.e2e.spec.js#refuses
      an unknown organization role id with 400 naming it, and stores nothing
      (COM-ACC-0799)
    origin: none
  - id: BR-CAP-COM-CAT-012-05
    proved_by: []
    statement: >-
      The product Pricing panel exposes its schedule read-only and edits
      audience selection, promotion exclusion and organization roles; other
      purchasing settings remain API-managed.
    kind: policy
    enforced_at:
      - console
    must_prove: false
    provenance: test
    source: >-
      react-console:components/commerce/pricing/__tests__/purchasing-settings-schedule.test.tsx#never
      offers a schedule choice, even when schedules exist
    origin: >-
      COMM-M1 walkthrough ruling R5
      (docs/debt/pricing-schedules-owned-by-event.md)
  - id: BR-CAP-COM-CAT-012-06
    proved_by: [ATS-COM-CAT-012-04, ATS-COM-CAT-012-10, ATS-COM-CAT-013-18, TST-COM-CAT-064]
    statement: >-
      Each product may reference one registered pricing handler rather than a
      web address, active by default and ignored when inactive.
    kind: policy
    enforced_at:
      - api
      - service
    must_prove: true
    provenance: test
    source: >-
      services-commerce:modules/pricing/tests/e2e/product-extensions.e2e.spec.js#keeps
      the row and ignores it when it is put inactive: back to $20.00
    origin: none
  - id: BR-CAP-COM-CAT-012-07
    proved_by: [ATS-COM-CAT-012-05, TST-COM-CAT-064]
    statement: >-
      Pricing-function requests reject mismatched products, workspaces or
      extension points, missing handler references and handler-owned properties
      without writing a record.
    kind: validation
    enforced_at:
      - api
    must_prove: true
    provenance: test
    source: >-
      services-commerce:modules/pricing/tests/e2e/product-extensions.e2e.spec.js#refuses
      an unknown property such as a timeout, which belongs to the handler
    origin: none
    note: >-
      The registration route’s recommendation remains pending Product
      confirmation.
  - id: BR-CAP-COM-CAT-012-08
    proved_by: [ATS-COM-CAT-012-06, TST-COM-CAT-010]
    statement: >-
      Any period-and-currency price grid containing prices requires Standard
      coverage, supplied directly, inherited from Always or explicitly
      prohibited.
    kind: validation
    enforced_at:
      - console
      - service
    must_prove: true
    provenance: test
    source: >-
      react-console:lib/commerce/pricing/__tests__/rules.test.ts#refuses a
      period with a Member price and no Standard price, naming the cell
    origin: COMM-M1 D6 (docs/milestones/COMM-M1-set-up-what-you-sell.md)
  - id: BR-CAP-COM-CAT-012-09
    proved_by: []
    statement: >-
      Grid warnings flag missing Member coverage, prices above Standard,
      prohibited Standard cells and entirely computed foreign-currency tabs
      without blocking a save.
    kind: policy
    enforced_at:
      - console
    must_prove: false
    provenance: test
    source: >-
      react-console:lib/commerce/pricing/__tests__/rules.test.ts#warns when a
      cell is dearer than Standard
    origin: none
  - id: BR-CAP-COM-CAT-012-10
    proved_by: [ATS-COM-CAT-012-07, TST-COM-CAT-064, TST-COM-CAT-065]
    statement: >-
      Reading purchasing settings and pricing functions requires their read
      permissions, while changes require their administrator permissions.
    kind: permission
    enforced_at:
      - api
      - console
    must_prove: true
    provenance: test
    source: >-
      services-commerce:modules/pricing/tests/e2e/product-purchasing-settings.e2e.spec.js#lets
      a read-only principal read, and refuses it the PUT, 403
      permission_missing, the settings as they were
    origin: COMM-M1 D4 (docs/milestones/COMM-M1-set-up-what-you-sell.md)
scenarios:
  - id: SC-CAP-COM-CAT-012-01
    given: The buyer qualifies for lower-ranked Member and cheaper Student pricing
    when: Compare lowest-price and rank selection
    then: Lowest uses Student and rank uses Member
    provenance: test
    source: >-
      services-commerce:modules/pricing/tests/e2e/product-purchasing-settings.e2e.spec.js#prices
      the same buyer at the member price under rank, Member coming before
      Student members
  - id: SC-CAP-COM-CAT-012-02
    given: The t-shirt’s price row is twenty dollars
    when: Register an active 2.50-dollar product adjustment
    then: The following quote returns 22.50 dollars
    provenance: test
    source: >-
      services-commerce:modules/pricing/tests/e2e/product-extensions.e2e.spec.js#adds
      the function’s $2.50 to the next quote: $20.00 price row and $2.50
      extension, $22.50
depends_on:
  - CAP-COM-CAT-010
  - CAP-COM-CAT-011
related:
  - CAP-COM-CAT-013
journeys:
  - JNY-COM-CAT-002
evidence:
  - >-
    Pinned service inputs:
    modules/pricing/aws/api/product-purchasing-settings.routes.ts,
    product-extensions.routes.ts and schemas;
    services/persistence/product-purchasing-settings.ts, product-extensions.ts;
    db/product-purchasing-settings.table.ts, product-extensions.table.ts; tests
    (e2e, persistence, queries, table)
  - >-
    Pinned console inputs: components/commerce/pricing/** (the product Pricing
    page, price grid, purchasing settings panel, Preview As),
    lib/commerce/pricing/** and tests
controls: [TC-IAM-006, 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-CRY-001, TC-DAT-001, TC-DAT-002, TC-DAT-003, TC-LOG-004, TC-LOG-005, TC-AVL-004, 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]
exercised_by: [FAS-COM-CAT-03-01, FAS-COM-CAT-03-02, FAS-COM-CAT-03-03, FAS-COM-CAT-03-05]
suites: [TST-COM-CAT-010, TST-COM-CAT-064, TST-COM-CAT-065, TST-COM-CAT-079]
---

# Configure product purchasing and price adjustments

## Purpose

Administrators choose how product prices are selected and which customer functions adjust them.

## How It Works

Staff open the product Pricing page and inspect its grid and Purchasing settings. The console exposes the supported setting subset and displays an existing schedule without offering a replacement picker. API clients manage the remaining settings and product pricing handlers. Grid validation distinguishes missing required coverage from advisory warnings. Registering an active function changes later calculations; deactivation retains its record while skipping the adjustment. Invalid references, mismatched function requests and insufficient permission prevent changes. The product should preserve clear ownership of handler configuration and schedule selection.

## Relationships

The configure qualifying price audiences capability supplies related configuration or assessment used in this work.

The maintain dated pricing periods capability supplies related configuration or assessment used in this work.

The calculate and explain a buyer’s item price capability supplies related configuration or assessment used in this work.
