---
id: ADR-CRM-REG-002
title: Placement Follows the Committed Address Asynchronously
product_area: crm
module: regions
revision: 2
status: proposed
design_intent: confirmed
source_sha:
  services-crm: a8d1364f1dd44b723bb5f9acba12f983e9ec8d69
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
decision: >-
  Committed address and override changes trigger asynchronous reconciliation from current input under record
  locks, rather than calculating geographic placement inside the save.
constrains:
  - DOM-CRM-REG-003
  - STATE-CRM-REG-003
  - WF-CRM-REG-001
  - WF-CRM-REG-002
  - SVC-CRM-REG-regions
origin: >-
  Andrew, 2026-10-11 (the region follows an address change after the save, through the change-event queue),
  cited in services-crm:docs/migrations/crm-regions/README.md#2026-10-12 — Final acceptance (second pass)
alternatives:
  - option: Calculate the regional value synchronously when saving.
    why_not: >-
      The recorded product choice requires post-save processing, and synchronous matching would couple record
      writes to geographic policy.
  - option: Use the address snapshot carried by the event.
    why_not: Older deliveries could apply outdated input; current-state reads avoid that delivery-order dependency.
consequences:
  - A successful record response does not guarantee that geographic reconciliation has already occurred.
  - >-
    Equal deciding fingerprints suppress ordinary duplicate writes, subject to later input changes and
    policy-read limitations.
  - Queue failures rely on redelivery; exhausted messages need redrive or another applicable trigger.
  - >-
    Organization address changes need linked-contact processing because resolved links do not save each
    contact.
supersedes: []
evidence:
  - >-
    services-crm at a8d1364f: modules/regions/services/region-assignment/region-assignment.ts;
    aws/crm.change-events.ts; docs/change-events.md.
---

# Placement Follows the Committed Address Asynchronously

## Context

The port originally calculated placement during saving. The recorded product choice moved this work to committed-change processing.

## Decision

Address, override and linked-contact handlers share reconciliation. Processing reads policy, then locks eligible records and compares current deciding input with its remembered fingerprint. Those record locks do not supply a consistent policy snapshot.

## Alternatives Considered

Calculate the regional value synchronously when saving. The recorded product choice requires post-save processing, and synchronous matching would couple record writes to geographic policy.

Use the address snapshot carried by the event. Older deliveries could apply outdated input; current-state reads avoid that delivery-order dependency.

## Consequences

A successful record response does not guarantee that geographic reconciliation has already occurred. Equal deciding fingerprints suppress ordinary duplicate writes, subject to later input changes and policy-read limitations. Queue failures rely on redelivery; exhausted messages need redrive or another applicable trigger. Organization address changes need linked-contact processing because resolved links do not save each contact.
