---
id: CAP-ACC-PRD-009
title: Preserve migrated special prices for Commerce
feature: FEAT-ACC-PRD-02
product_area: accounting
module: products
revision: 5
status: draft
product_intent: proposed
implementation_evidence: partially-observed
supersedes:
  - react-console acceptance inventory CAP-ACC-PRD-008
source_sha:
  services-accounting: f47cb263875bbc0c5640fba7dae6785ec32695f8
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
intent_sources:
  - 'services-accounting:docs/migrations/accounting-modernization/products-a12-a13/README.md#Provenance'
  - 'services-accounting:docs/milestones/ACCT-M1-books-and-invoices.md#D4'
purpose: Migration retains each former special price as a price row and a durable handover.
outcomes:
  - Migration retains pricing information for audience realization.
concepts:
  - CON-ACC-PRD-002
actors:
  - ACT-ACC-011
  - ACT-ACC-006
surfaces:
  - job
  - api
permissions:
  - key: accounting.products.update
    where_checked: api
    scope: tenant
rules:
  - id: BR-CAP-ACC-PRD-009-01
    proved_by: [ATS-ACC-PRD-009-01, ATS-ACC-PRD-009-04, TST-ACC-PRD-033]
    statement: >-
      Migration creates a product-local audience price for each former special price and preserves its name,
      criteria, amount, formula and ordering in a Commerce handover.
    kind: lifecycle
    enforced_at:
      - database
    must_prove: true
    provenance: test
    source: >-
      services-accounting:modules/products/tests/integration/db/special-prices-a12-migration.integration.spec.js#hands
      each special price over as a product-local audience: minted id, product, name, criteria, amount in the
      base currency, formula, rank
    origin: 'services-accounting:docs/migrations/accounting-modernization/products-a12-a13/README.md#Provenance'
  - id: BR-CAP-ACC-PRD-009-02
    proved_by: [ATS-ACC-PRD-009-02, TST-ACC-PRD-027]
    statement: The former special-price list is rejected; only an empty setting remains accepted for compatibility.
    kind: validation
    enforced_at:
      - api
    must_prove: true
    provenance: test
    source: >-
      services-accounting:modules/products/tests/e2e/product-features.e2e.spec.js#refuses a list of special
      prices, naming where the feature went (A12)
    origin: 'services-accounting:docs/migrations/accounting-modernization/products-a12-a13/README.md#Provenance'
  - id: BR-CAP-ACC-PRD-009-03
    proved_by: []
    statement: >-
      The migration record assigns audience realization to Commerce before a migrated audience can price a
      purchaser.
    kind: policy
    enforced_at: []
    must_prove: false
    provenance: documented
    source: 'services-accounting:modules/products/db/pricing-audience-handovers.table.ts'
    origin: none
  - id: BR-CAP-ACC-PRD-009-04
    proved_by: []
    statement: >-
      The handover record assigns realization marking to Commerce, with no Accounting route for editing
      handovers.
    kind: policy
    enforced_at: []
    must_prove: false
    provenance: documented
    source: 'services-accounting:modules/products/db/pricing-audience-handovers.table.ts'
    origin: none
  - id: BR-CAP-ACC-PRD-009-05
    proved_by: [ATS-ACC-PRD-008-11, ATS-ACC-PRD-009-03]
    statement: >-
      After Commerce’s audience table exists, an unrealized or inactive migrated audience blocks replacement
      that resubmits its price rows.
    kind: validation
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      services-accounting:modules/products/tests/integration/services/persistence/pricing-audiences.integration.spec.js#answers
      the built-ins and the tenant’s active audiences among the ids asked: not an inactive one, not another
      tenant’s, not the ids held
    origin: none
scenarios:
  - id: SC-CAP-ACC-PRD-009-01
    given: A migrated product formerly offered a life-member special price.
    when: Migration transfers its pricing information.
    then: 'A local audience row and Commerce handover retain the special price, with realization still required.'
    provenance: documented
    source: 'react-console:acceptance/accounting/journeys/products/ACT-ACC-0128.json'
edge_cases: []
constraints: []
depends_on:
  - CAP-ACC-PRD-008
related:
  - CAP-ACC-PRD-006
journeys:
  - JNY-ACC-PRD-003
open_questions:
  - OQ-ACC-PRD-002
evidence:
  - 'react-console:acceptance/accounting/journeys/products/ACT-ACC-0128.json'
  - '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/pricing-audience-handovers.table.ts'
  - 'services-accounting:modules/products/db/product-prices.table.ts'
  - 'services-accounting:modules/products/services/persistence/pricing-audiences.ts'
  - 'services-accounting:modules/products/tests/e2e/product-features.e2e.spec.js'
  - 'services-accounting:modules/products/tests/integration/db/special-prices-a12-migration.integration.spec.js'
  - >-
    services-accounting:modules/products/tests/integration/services/persistence/pricing-audiences.integration.spec.js
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-005, TC-AZ-006, TC-TEN-001, TC-TEN-002, TC-TEN-003, TC-DAT-001, TC-LOG-001, TC-LOG-002, TC-LOG-003, TC-LOG-004, TC-CHG-001, TC-CHG-002, TC-CHG-003, TC-CHG-004, TC-CHG-006, TC-CHG-007, TC-PI-001, TC-PI-003, TC-PI-005]
exercised_by: [FAS-ACC-PRD-02-02, FAS-ACC-PRD-02-03, FAS-ACC-PRD-02-04]
suites: [TST-ACC-PRD-027, TST-ACC-PRD-033]
---

# Preserve migrated special prices for Commerce

## Purpose

Migration retains each former special price as a price row and a durable handover.

## How It Works

Migration retains each former special price as a price row and a durable handover. The handover carries information Commerce needs to create the audience. It also retains formulas that need review elsewhere. Accounting does not provide an editor for these migration records. Commerce must realize the audience before its selection engine can use it. Once Commerce’s vocabulary exists, missing audiences can block ordinary product corrections. That admission behavior is observable, but its intended resolution remains open. The product should preserve staff access while settling the migration contract.

## Relationships

This outcome uses configure prices by audience, period and currency.
