---
id: ADR-COM-CAT-008
title: Atomic Promotion Usage Limits
product_area: commerce
module: catalog
revision: 1
status: proposed
design_intent: confirmed
source_sha:
  services-commerce: c8b66a98e2490617aec38ba5c8165dd9bd0a8f9b
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
decision: >-
  Placement conditionally acquires code and campaign capacity in stable campaign order and retains frozen
  redemption allocations within its transaction.
constrains:
  - DOM-COM-CAT-005
  - SVC-COM-CAT-promotions
  - WF-COM-CAT-014
  - STATE-COM-CAT-010
origin: COMM-M1 plan A15 (promotions D-05)
alternatives:
  - option: Hold campaign capacity during every preview
    why_not: Abandoned carts would retain scarce uses before a sale exists.
  - option: Increment counters after committing the order
    why_not: Concurrent sales could exceed capacity before the later count update.
consequences:
  - Conditional counter updates serialize contested capacity.
  - A refused acquisition prevents order placement from committing.
  - Use counters do not advance the staff configuration version.
supersedes: []
evidence:
  - >-
    services-commerce at c8b66a98: modules/promotions/services/persistence/promotion-redemptions.ts
    (recordRedemption); tests/integration/services/persistence/redemption-concurrency.integration.spec.js.
---

# Atomic Promotion Usage Limits

## Context

Concurrent buyers can compete for the last permitted code use. Capacity must be acquired at the point the sale commits.

## Decision

Placement conditionally acquires code and campaign capacity in stable campaign order and retains frozen redemption allocations within its transaction.

## Alternatives Considered

Hold campaign capacity during every preview. Abandoned carts would retain scarce uses before a sale exists.

Increment counters after committing the order. Concurrent sales could exceed capacity before the later count update.

## Consequences

Conditional counter updates serialize contested capacity. A refused acquisition prevents order placement from committing. Use counters do not advance the staff configuration version.
