Skip to content

0003. Model customer identity as linkage, not a golden record

Date: 2026-07-10 Status: Accepted

Context

Customer, Order, and Product rows hang off system_connection_id, not off Tenant. The same real customer present in two connected systems (e.g. Acme's WooCommerce shop and Acme's User Platform account) today produces two independent Customer rows with no link between them. Two prior internal design notes — the "Identity Layer" and the "Bridge" — each proposed a way to close this gap; this decision consolidates them into one model.

Decision

The same real customer across systems is represented by linking existing per-connection Customer rows via a new CustomerIdentity entity, matched on normalised email (match_key), scoped by Tenant — not by merging them into a golden record. No merge means no merge-conflict machinery. The "Bridge" correlation builds on this same link instead of duplicating it.

CustomerIdentity is a separate linking entity (id, tenant_id, match_key), not an identity_id column bolted onto Customer. Uniqueness is unique(['tenant_id','match_key']), so one real person maps to one identity per tenant. See Cross-System Identity for the mechanism detail — how Customer joins to it, why the correlation layer sits below the connection.

Consequences

Whether Conflux still writes a custom_id (a Conflux-generated UUID) back into connected systems as the correlation key — as the "Bridge" did — or adopts the email match_key as the id everywhere (which may make the Bridge resolver largely redundant) is a separate downstream question, not resolved by this decision. It only becomes relevant once push-out (see ADR-0004) is implemented.