A Contact (a deliberately shallow Customer type: just email and first
name, no property required, per the glossary)
can be promoted into a full Customer or Company record. The
Promote button on the customer detail page
(apps/web/src/app/(authenticated)/customers/[id]/customer-detail.tsx)
opens PromoteCustomerDialog
(apps/web/src/components/customers/promote-customer-dialog.tsx), which
posts to POST /api/customers/[id]/promote
(apps/web/src/app/api/customers/[id]/promote/promote.ts) with a
targetType of CUSTOMER or COMPANY and, for a Customer target, a
property address.
TODO(owner, likely product): write the full guide from
promote-customer-dialog.tsx and promote.ts, covering what's
irreversible about promotion, what happens to existing relationships
(Opportunities, Leads) tied to the Contact record, and whether this is the
same flow project memory tracks as "contact-promote-inline" (an inline
promote redesign, not yet built as of this writing) or a separate,
already-shipped path.