---
id: CAP-COM-ORD-003
title: Review the price and resolve purchase blockers
feature: FEAT-COM-ORD-01
product_area: commerce
module: orders
revision: 1
status: draft
product_intent: confirmed
implementation_evidence: observed
supersedes:
  - CAP-COM-CHK-004
  - CAP-COM-BIL-018
  - CAP-COM-CHK-014
source_sha:
  services-commerce: c8b66a98e2490617aec38ba5c8165dd9bd0a8f9b
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
intent_sources:
  - 'services-commerce:docs/milestones/plans/COMM-M2-plan.md#2. Scope'
  - >-
    services-commerce:docs/milestones/COMM-M2-take-a-staff-order.md#Product purchase eligibility enforced
    (Platform PLAT-M11 D6; Andrew approved 2026-10-21)
  - 'services-commerce:docs/milestones/plans/COMM-realignment-2026-10-22.md#D-T4'
  - 'services-commerce:docs/milestones/COMM-M2-take-a-staff-order.md#M2-S1'
  - 'services-commerce:docs/milestones/plans/COMM-M2-plan.md#D9'
  - 'services-commerce:docs/milestones/COMM-M1-set-up-what-you-sell.md#D14'
purpose: Staff review a complete priced purchase and identify problems before committing it.
outcomes:
  - The displayed summary supplies the price reference used by placement.
  - The product should reveal foreseeable purchase blockers during preview.
concepts:
  - CON-COM-ORD-001
actors:
  - ACT-COM-014
  - ACT-COM-017
surfaces:
  - console
  - api
preconditions: []
postconditions: []
permissions:
  - key: commerce.checkouts.update
    where_checked: api
    scope: tenant
rules:
  - id: BR-CAP-COM-ORD-003-01
    proved_by: [ATS-COM-ORD-001-16, ATS-COM-ORD-001-19, ATS-COM-ORD-003-01, ATS-COM-ORD-003-12, ATS-COM-ORD-003-13, TST-COM-ORD-027]
    statement: >-
      Preview obtains advice from selling applications, calculates the cart price and saves the resulting
      snapshot and totals with a preview event.
    kind: calculation
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      services-commerce:modules/checkout/tests/e2e/checkouts.e2e.spec.js#stores the price snapshot on the
      checkout, with the totals, and leaves a previewed event
    origin: 'services-commerce:docs/milestones/plans/COMM-M2-plan.md#2. Scope'
  - id: BR-CAP-COM-ORD-003-02
    proved_by: [ATS-COM-ORD-003-02, TST-COM-ORD-027]
    statement: >-
      Application refusals, missing currency prices and prohibited price rows appear as item problems in a
      successful preview response and prevent placement.
    kind: validation
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      services-commerce:modules/checkout/tests/e2e/checkouts.e2e.spec.js#shows a participant’s refusal inline
      on the item rather than refusing the preview
    origin: none
  - id: BR-CAP-COM-ORD-003-03
    proved_by: [ATS-COM-ORD-003-03, ATS-COM-ORD-003-14, ATS-COM-ORD-012-13, TST-COM-ORD-034]
    statement: >-
      An application that cannot answer causes a retryable unavailable response for preview or placement,
      leaving the cart open.
    kind: policy
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      services-commerce:modules/checkout/tests/e2e/participant-unavailable.e2e.spec.js#refuses the preview 503
      participant_unavailable, retryable
    origin: none
  - id: BR-CAP-COM-ORD-003-04
    proved_by: [ATS-COM-ORD-003-04, TST-COM-ORD-036, TST-COM-ORD-052]
    statement: >-
      A product purchasing rule evaluates the purchaser, organization, acting contact and recipient context;
      ineligible or indeterminate results identify the blocked product, while an unbound product requires no
      evaluation.
    kind: policy
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      services-commerce:modules/checkout/tests/e2e/product-purchase-eligibility.e2e.spec.js#previews with a
      product_not_eligible problem on the bound line alone, naming it and the engine's sentence
    origin: >-
      services-commerce:docs/milestones/COMM-M2-take-a-staff-order.md#Product purchase eligibility enforced
      (Platform PLAT-M11 D6; Andrew approved 2026-10-21)
  - id: BR-CAP-COM-ORD-003-05
    proved_by: [ATS-COM-ORD-003-05, TST-COM-ORD-026]
    statement: >-
      A line that requires tax but lacks a tax address produces a blocking preview problem and prevents an
      order from being placed for either staff or portal buyers.
    kind: validation
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      services-commerce:modules/checkout/tests/e2e/checkout-tax.e2e.spec.js#refuses a buyer with no preferred
      address while a zone could tax the line: a no_tax_address problem on the preview, a 409 on the placement
    origin: 'services-commerce:docs/milestones/plans/COMM-realignment-2026-10-22.md#D-T4'
  - id: BR-CAP-COM-ORD-003-06
    proved_by: [ATS-COM-ORD-003-06, TST-COM-ORD-026]
    statement: >-
      The interim tax provider applies the most specific matching address zone to each item and saves the
      result; an unmatched address yields no tax and an explanatory warning.
    kind: calculation
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      services-commerce:modules/checkout/tests/e2e/checkout-tax.e2e.spec.js#taxes each line at the most
      specific zone: state and city on the T-shirts, state alone on the membership
    origin: none
    note: >-
      The observed calculation uses interim tax zones; the provider and ownership decision remains open in
      finding 005.
  - id: BR-CAP-COM-ORD-003-07
    proved_by: [ATS-COM-ORD-003-07, TST-COM-ORD-059]
    statement: >-
      Selecting a ship-to contact that no longer exists blocks the order and asks staff to choose a recipient
      again; buyer fallback applies only without a selected ship-to.
    kind: validation
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      services-commerce:modules/checkout/tests/unit/checkout/ship-to-not-found.spec.js#is a blocking problem
      with the code and the message Andrew decided
    origin: 'services-commerce:docs/milestones/COMM-M2-take-a-staff-order.md#M2-S1'
  - id: BR-CAP-COM-ORD-003-08
    proved_by: [ATS-COM-ORD-003-08, TST-COM-ORD-058]
    statement: >-
      A selected ship-to contact without an address blocks a cart containing shippable items, but does not
      block a cart whose items need no shipping.
    kind: validation
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      services-commerce:modules/checkout/tests/unit/checkout/ship-to-no-address.spec.js#is a blocking problem
      with the code and the message Andrew decided
    origin: none
    note: >-
      The build extended the recorded deleted-contact ruling to a missing address; finding 008 separates that
      assumption from the decision.
  - id: BR-CAP-COM-ORD-003-09
    proved_by: [ATS-COM-ORD-003-09, TST-COM-ORD-077]
    statement: >-
      An order fee uses the policy’s fee product and tax class, receives no discount, and blocks preview and
      placement when that product is missing.
    kind: calculation
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      services-commerce:modules/orders/tests/e2e/extension-line-adjustments.e2e.spec.js#previews the fee in
      the totals: $3.00 fee beside the line, nothing refused
    origin: 'services-commerce:docs/milestones/plans/COMM-M2-plan.md#D9'
  - id: BR-CAP-COM-ORD-003-10
    proved_by: [ATS-COM-ORD-003-10, TST-COM-ORD-021]
    statement: >-
      Store preprocessing modifies the cart before pricing; failure or an invalid response from a required
      extension stops preview and placement, while an optional failure is skipped and recorded.
    kind: policy
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      services-commerce:modules/checkout/tests/e2e/checkout-preprocessing.e2e.spec.js#refuses the preview and
      the placement with EXTENSION_UNAVAILABLE (503) when the required extension answers outside its contract,
      placing nothing
    origin: 'services-commerce:docs/milestones/COMM-M1-set-up-what-you-sell.md#D14'
  - id: BR-CAP-COM-ORD-003-11
    proved_by: []
    statement: >-
      Buying a qualifying membership in the cart provisionally enables Member pricing on other items, with an
      explanation that names the same-order dependency.
    kind: calculation
    enforced_at:
      - service
    must_prove: true
    provenance: documented
    source: 'services-commerce:docs/milestones/plans/COMM-M2-plan.md#D7'
    origin: 'services-commerce:docs/milestones/plans/COMM-M2-plan.md#D7'
    note: >-
      Catalog owns the pricing calculation. The audience-grant proof uses a stand-in application, and the live
      composer excludes Membership; findings 024 and 022 retain those limits.
  - id: BR-CAP-COM-ORD-003-12
    proved_by: [ATS-COM-ORD-003-11, TST-COM-ORD-018]
    statement: >-
      The staff composer presents the returned preview amounts, offers store products and waits for a customer
      selection before pricing.
    kind: policy
    enforced_at:
      - console
    must_prove: true
    provenance: test
    source: >-
      react-console:components/order-composer/__tests__/live-composer.test.tsx#shows exactly the figures
      Commerce's preview answered
    origin: >-
      services-commerce:docs/milestones/COMM-M2-take-a-staff-order.md#Andrew's note of 2026-10-22 (~11:10 ET):
      reuse the v0 New Order screen
scenarios:
  - id: SC-CAP-COM-ORD-003-01
    given: >-
      Jane has no membership and has a Richmond address; Style Guide costs one hundred dollars with
      five-percent Virginia tax.
    when: Staff add the book and request the cart summary.
    then: The documented example shows the Standard price and five dollars of tax without a blocker.
    provenance: documented
    source: 'services-commerce:docs/milestones/plans/COMM-M2-plan.md#3. How it works for the user'
edge_cases:
  - id: SC-CAP-COM-ORD-003-02
    given: Accounting refuses a tax quote for the cart’s supplied facts.
    when: Request a preview using the Accounting tax provider.
    then: The item reports a refused tax quote and placement creates no order.
    provenance: test
    source: >-
      services-commerce:modules/checkout/tests/e2e/accounting-tax.e2e.spec.js#is a tax_quote_refused problem
      on the preview and refuses the placement, placing nothing
constraints: []
depends_on:
  - CAP-COM-ORD-001
  - CAP-COM-ORD-002
related:
  - CAP-COM-ORD-004
  - CAP-COM-ORD-005
  - CAP-COM-ORD-012
journeys:
  - JNY-COM-ORD-001
  - JNY-COM-ORD-002
open_questions: []
evidence:
  - >-
    Examined reference: react-console:components/order-composer/__tests__/live-composer.test.tsx#shows exactly
    the figures Commerce's preview answered
  - 'Examined reference: services-commerce:docs/milestones/COMM-M1-set-up-what-you-sell.md#D14'
  - >-
    Examined reference: services-commerce:docs/milestones/COMM-M2-take-a-staff-order.md#Andrew's note of
    2026-10-22 (~11:10 ET): reuse the v0 New Order screen
  - 'Examined reference: services-commerce:docs/milestones/COMM-M2-take-a-staff-order.md#M2-S1'
  - >-
    Examined reference: services-commerce:docs/milestones/COMM-M2-take-a-staff-order.md#Product purchase
    eligibility enforced (Platform PLAT-M11 D6; Andrew approved 2026-10-21)
  - 'Examined reference: services-commerce:docs/milestones/plans/COMM-M2-plan.md#2. Scope'
  - 'Examined reference: services-commerce:docs/milestones/plans/COMM-M2-plan.md#3. How it works for the user'
  - 'Examined reference: services-commerce:docs/milestones/plans/COMM-M2-plan.md#D7'
  - 'Examined reference: services-commerce:docs/milestones/plans/COMM-M2-plan.md#D9'
  - 'Examined reference: services-commerce:docs/milestones/plans/COMM-realignment-2026-10-22.md#D-T4'
  - >-
    Examined reference: services-commerce:modules/checkout/tests/e2e/accounting-tax.e2e.spec.js#is a
    tax_quote_refused problem on the preview and refuses the placement, placing nothing
  - >-
    Examined reference:
    services-commerce:modules/checkout/tests/e2e/checkout-preprocessing.e2e.spec.js#refuses the preview and
    the placement with EXTENSION_UNAVAILABLE (503) when the required extension answers outside its contract,
    placing nothing
  - >-
    Examined reference: services-commerce:modules/checkout/tests/e2e/checkout-tax.e2e.spec.js#refuses a buyer
    with no preferred address while a zone could tax the line: a no_tax_address problem on the preview, a 409
    on the placement
  - >-
    Examined reference: services-commerce:modules/checkout/tests/e2e/checkout-tax.e2e.spec.js#taxes each line
    at the most specific zone: state and city on the T-shirts, state alone on the membership
  - >-
    Examined reference: services-commerce:modules/checkout/tests/e2e/checkouts.e2e.spec.js#shows a
    participant’s refusal inline on the item rather than refusing the preview
  - >-
    Examined reference: services-commerce:modules/checkout/tests/e2e/checkouts.e2e.spec.js#stores the price
    snapshot on the checkout, with the totals, and leaves a previewed event
  - >-
    Examined reference:
    services-commerce:modules/checkout/tests/e2e/participant-unavailable.e2e.spec.js#refuses the preview 503
    participant_unavailable, retryable
  - >-
    Examined reference:
    services-commerce:modules/checkout/tests/e2e/product-purchase-eligibility.e2e.spec.js#previews with a
    product_not_eligible problem on the bound line alone, naming it and the engine's sentence
  - >-
    Examined reference: services-commerce:modules/checkout/tests/unit/checkout/ship-to-no-address.spec.js#is a
    blocking problem with the code and the message Andrew decided
  - >-
    Examined reference: services-commerce:modules/checkout/tests/unit/checkout/ship-to-not-found.spec.js#is a
    blocking problem with the code and the message Andrew decided
  - >-
    Examined reference:
    services-commerce:modules/orders/tests/e2e/extension-line-adjustments.e2e.spec.js#previews the fee in the
    totals: $3.00 fee beside the line, nothing refused
controls: [TC-IAM-006, 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-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-ORD-01-01, FAS-COM-ORD-01-02, FAS-COM-ORD-01-03, FAS-COM-ORD-01-05, FAS-COM-ORD-04-01, FAS-COM-ORD-04-05]
suites: [TST-COM-ORD-018, TST-COM-ORD-021, TST-COM-ORD-026, TST-COM-ORD-027, TST-COM-ORD-034, TST-COM-ORD-036, TST-COM-ORD-052, TST-COM-ORD-058, TST-COM-ORD-059, TST-COM-ORD-077]
---

# Review the price and resolve purchase blockers

## Purpose

Staff review a complete priced purchase and identify problems before committing it. The summary connects the amounts to the items and decisions behind them.

## How It Works

The clerk asks Commerce to preview the assembled cart. Selling applications contribute their advice before the price summary is returned. The clerk sees item amounts, discounts, fees and tax alongside reported problems. Unavailable application advice requires a retry rather than an invented result. Shipping and purchasing issues direct attention to the affected facts. The live composer displays the returned figures so staff can review the same result that placement considers.

## Relationships

Cart construction supplies the facts, promotions contribute savings, and placement compares its fresh result with the reviewed summary.
