Customers

One customer record for every vertical. Part of the business vertical. Legend: ✅ done · 🟡 in progress · ⬜ pending.

Checklist

✅ Patients

One customer record for every vertical.

✅ Contacts

Company-owned people over the ported contacts table; /v1/contacts CRUD live-proven.

✅ Segments

Named groups with explicit membership and counted lists; foreign companies see nothing.

✅ Referrals

Who sent each customer, without the dental table's one-per-patient unique; customer-to-customer loop closed.

✅ Identity resolution

Checkout email attribution to orders.customer_id with a pending-suggestion queue on no-match; /v1/identity-suggestions link updates order + invoices atomically (V08_10).

Evidence

One business-level customer record, written for real: the reference-geo resolver closed the name-to-id rule, inserts go through the customer graph and updates sync emails and addresses — live-proven on the dev catalog. Dental patients link to it through patients.customer_id. Contacts, segments (customer_groups + members) and referrals (generalized from the dental table) each have live-proven routes. Identity resolution is delivered at checkout: a cart email naming exactly one customer attributes the order (and its AR invoice) at submit, a no-match mints one pending identity_suggestions row (V08_10, idempotent per order), and the review queue behind /v1/identity-suggestions links order + invoices atomically or dismisses — live-proven end to end. Remaining: patient-side auto-suggest and merge review for dual records.