---
id: CAP-COM-CAT-010
title: Configure qualifying price audiences
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#D1'
  - 'services-commerce:docs/milestones/COMM-M1-set-up-what-you-sell.md#D7'
  - 'services-commerce:docs/milestones/COMM-M1-set-up-what-you-sell.md#D10'
  - 'services-commerce:docs/milestones/plans/COMM-M1-plan.md#2. Scope (item 4)'
  - >-
    services-commerce:docs/milestones/plans/COMM-M1-plan.md#4. Assumptions (A4,
    A8)
purpose: Administrators maintain the buyer groups used to select product pricing.
outcomes:
  - Audience naming and ordering avoid conflicting selections.
  - No group of customers silently edits price because an audience was deleted.
concepts:
  - CON-COM-CAT-004
actors:
  - ACT-COM-001
  - ACT-COM-004
surfaces:
  - console
  - api
permissions:
  - key: commerce.pricing-audiences.read
    where_checked: api
    scope: tenant
  - key: commerce.pricing-audiences.create
    where_checked: api
    scope: tenant
  - key: commerce.pricing-audiences.update
    where_checked: api
    scope: tenant
  - key: commerce.pricing-audiences.delete
    where_checked: api
    scope: tenant
  - key: commerce.pricing-audiences.bulk
    where_checked: api
    scope: tenant
rules:
  - id: BR-CAP-COM-CAT-010-01
    proved_by: [ATS-COM-CAT-010-01, ATS-COM-CAT-010-11, ATS-COM-CAT-010-12, ATS-COM-CAT-019-09, TST-COM-CAT-061]
    statement: >-
      Standard and Member are built-in audiences at ranks zero and ten,
      respectively, with Standard covering everyone and Member using eligibility
      and public display; neither can be removed or change kind.
    kind: invariant
    enforced_at:
      - service
      - database
    must_prove: true
    provenance: test
    source: >-
      services-commerce:modules/pricing/tests/e2e/pricing-audiences.e2e.spec.js#lists
      standard for everyone at rank 0 and member by eligibility at rank 10,
      built in, member shown to visitors, with no binding yet
    origin: none
  - id: BR-CAP-COM-CAT-010-02
    proved_by: [ATS-COM-CAT-010-02, ATS-COM-CAT-010-12, TST-COM-CAT-061, TST-COM-CAT-073]
    statement: Audience ranks are nonnegative and unique within a workspace.
    kind: validation
    enforced_at:
      - service
      - database
    must_prove: true
    provenance: test
    source: >-
      services-commerce:modules/pricing/tests/e2e/pricing-audiences.e2e.spec.js#answers
      400 with the problem code audience_rank_taken to a rank another audience
      holds, creating nothing
    origin: none
  - id: BR-CAP-COM-CAT-010-03
    proved_by: [ATS-COM-CAT-010-02, TST-COM-CAT-061, TST-COM-CAT-073]
    statement: >-
      Audience names, including built-ins, remain unique after case and spacing
      normalization; creation or renaming onto an occupied name identifies the
      existing audience in a refusal.
    kind: validation
    enforced_at:
      - service
      - database
    must_prove: true
    provenance: test
    source: >-
      services-commerce:modules/pricing/tests/integration/services/persistence/pricing-audiences.integration.spec.js#refuses
      a create to the same name in other letter case and spacing, 409
      audience_name_taken naming the existing audience
    origin: none
    note: The name-uniqueness recommendation awaits Product confirmation.
  - id: BR-CAP-COM-CAT-010-04
    proved_by: [ATS-COM-CAT-010-03, TST-COM-CAT-066]
    statement: >-
      An audience covers everyone, eligible subjects or selected membership
      operations; operation audiences require operations and eligibility
      bindings belong only to eligibility audiences.
    kind: validation
    enforced_at:
      - api
      - database
    must_prove: true
    provenance: test
    source: >-
      services-commerce:modules/pricing/tests/integration/db/member-pricing-tables.table.integration.spec.js#refuses
      an operation audience without an operation, and operations on another
      kind, by pricing_audiences_operations_check
    origin: none
  - id: BR-CAP-COM-CAT-010-05
    proved_by: [ATS-COM-CAT-010-04, ATS-COM-CAT-010-13, TST-COM-CAT-061, TST-COM-CAT-070]
    statement: >-
      Price references prevent audience deletion, with the refusal reporting the
      product count and up to five products so staff can deactivate the audience
      instead.
    kind: lifecycle
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      services-commerce:modules/pricing/tests/integration/services/persistence/pricing-audiences.integration.spec.js#refuses
      409 audience_in_use, naming the products and their count, and keeps the
      audience
    origin: COMM-M1 D7 (docs/milestones/COMM-M1-set-up-what-you-sell.md)
  - id: BR-CAP-COM-CAT-010-06
    proved_by: [ATS-COM-CAT-010-04, ATS-COM-CAT-010-09, ATS-COM-CAT-012-08, TST-COM-CAT-061, TST-COM-CAT-070]
    statement: >-
      Deactivation removes an audience from price selection without deleting its
      prices, which become usable again after reactivation.
    kind: lifecycle
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      services-commerce:modules/pricing/tests/integration/services/inputs/pricing-inputs.integration.spec.js#loads
      the active audiences in rank order, the inactive left out, and the period
      each schedule is in at the instant
    origin: COMM-M1 D7 (docs/milestones/COMM-M1-set-up-what-you-sell.md)
  - id: BR-CAP-COM-CAT-010-07
    proved_by: [ATS-COM-CAT-010-05, ATS-COM-CAT-010-10, ATS-COM-CAT-013-16, TST-COM-CAT-085]
    statement: >-
      An eligibility audience without a selected rule qualifies no buyer and
      produces a warning.
    kind: policy
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      services-commerce:modules/pricing/tests/unit/engine/step-2-audience-resolution.spec.js#warns
      of an audience with no binding, and holds nobody for it; a binding the
      batch did not answer is simply not held
    origin: none
  - id: BR-CAP-COM-CAT-010-08
    proved_by: []
    statement: >-
      Public-display selection exposes an audience’s price beside Standard
      pricing to anonymous visitors.
    kind: policy
    enforced_at:
      - service
      - console
    must_prove: false
    provenance: test
    source: >-
      services-commerce:modules/pricing/tests/e2e/price-quote-public-display.e2e.spec.js#shows
      the Standard price 2500 with the Members price 2000 beside it when the
      Member audience is marked public, and the sign-in notice
    origin: COMM-M1 D10 (docs/milestones/COMM-M1-set-up-what-you-sell.md)
  - id: BR-CAP-COM-CAT-010-09
    proved_by: []
    statement: >-
      Accounting’s imported special-price handovers become product-scoped
      audiences once, while rank conflicts retain an unresolved handover with
      its reason.
    kind: lifecycle
    enforced_at:
      - service
    must_prove: false
    provenance: test
    source: >-
      services-commerce:modules/pricing/tests/integration/services/handovers/audience-handover-realization.integration.spec.js#leaves
      a handover whose rank another audience of the tenant holds, naming the
      rank
    origin: none
  - id: BR-CAP-COM-CAT-010-10
    proved_by: [ATS-COM-CAT-010-06, TST-COM-CAT-061, TST-COM-CAT-062]
    statement: >-
      Audience inspection requires read permission and audience changes require
      administrator write permissions.
    kind: permission
    enforced_at:
      - api
      - console
    must_prove: true
    provenance: test
    source: >-
      services-commerce:modules/pricing/tests/e2e/pricing-configuration-security.e2e.spec.js#is
      refused the creates, replacements and deletes, 403 permission_missing,
      each leaving the record as it was
    origin: none
  - id: BR-CAP-COM-CAT-010-11
    proved_by: [ATS-COM-CAT-010-06, TST-COM-CAT-061, TST-COM-CAT-062]
    statement: >-
      Audience replacement sends the complete record at the read version and
      refuses a stale version.
    kind: invariant
    enforced_at:
      - api
      - service
    must_prove: true
    provenance: test
    source: >-
      services-commerce:modules/pricing/tests/e2e/pricing-audiences.e2e.spec.js#answers
      409 to a stale version, 400 to a body whose id is not the path’s, and 400
      to a replacement without its version
    origin: none
  - id: BR-CAP-COM-CAT-010-12
    proved_by: [ATS-COM-CAT-010-08]
    statement: >-
      A full lock prevents replacing an audience, and either full or
      deletion-only locking prevents removing it.
    kind: policy
    enforced_at:
      - service
    must_prove: true
    provenance: observed
    source: >-
      services-commerce:modules/pricing/services/persistence/pricing-audiences.ts
    origin: none
scenarios:
  - id: SC-CAP-COM-CAT-010-01
    given: Product prices reference Retiree
    when: Attempt audience deletion and then deactivation
    then: >-
      Deletion reports the dependent product count and references; deactivation
      succeeds
    provenance: test
    source: >-
      services-commerce:modules/pricing/tests/e2e/pricing-audiences.e2e.spec.js#refuses
      the delete 409 audience_in_use with the sentence and the details
  - id: SC-CAP-COM-CAT-010-02
    given: The Member name is already occupied
    when: Create an audience under a spaced case variant of that name
    then: Normalized-name validation identifies the existing audience
    provenance: test
    source: >-
      services-commerce:modules/pricing/tests/e2e/pricing-audiences.e2e.spec.js#answers
      409 audience_name_taken to a rename onto the built-in’s name, and 200 to
      the audience keeping its own
depends_on: []
related:
  - CAP-COM-CAT-012
  - CAP-COM-CAT-013
journeys:
  - JNY-COM-CAT-002
evidence:
  - >-
    Pinned service inputs: modules/pricing/aws/api/pricing-audiences.routes.ts
    and .schemas.ts; services/persistence/pricing-audiences.ts;
    services/handovers/**; db/pricing-audiences.table.ts; tests (audiences e2e,
    persistence, queries, table, handovers, security)
  - >-
    Pinned console inputs: components/commerce/audiences/**,
    lib/commerce/audiences/** and tests,
    e2e/mock/commerce-view-edit.mock.spec.ts (Pricing Audiences)
controls: [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-CRY-001, TC-DAT-001, TC-DAT-002, TC-DAT-003, TC-DAT-004, TC-LOG-004, TC-LOG-005, TC-CHG-001, TC-CHG-002, TC-CHG-003, TC-CHG-004, TC-CHG-007, TC-AVL-005, TC-PI-001, TC-PI-002, TC-PI-003, TC-PI-005, TC-VEN-001, TC-VEN-002, TC-VEN-003, 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-061, TST-COM-CAT-062, TST-COM-CAT-066, TST-COM-CAT-070, TST-COM-CAT-073, TST-COM-CAT-085]
---

# Configure qualifying price audiences

## Purpose

Administrators maintain the buyer groups used to select product pricing.

## How It Works

Staff inspect the built-in audiences and add customer-specific groups. They choose the qualification kind and rank before reviewing product prices that use the audience. Qualification depends on the selected rule or operation context rather than the display name. Referenced audiences can be deactivated while retaining the price rows that use them. Conflicting names, ranks and stale versions prevent replacement. Public-display selection affects visitor presentation separately from qualification. The product should complete real membership qualification and record the outstanding name-normalization recommendation.

## Relationships

The configure product purchasing and price adjustments 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.
