Agent rule
All DTD leads/submissions funnel into crm_contacts (unique by lowercased email) + crm_events timeline. Stage pipeline: new → contacted → qualified → enrolled → placed / lost. Owner UI at /owner CRM tab; API on /api/todo?scope=crm and action=crm_update — no new Vercel function. Form handlers call recordCrmTouchpoint fire-and-forget after success. Honest Shelf product_requests (client-side Supabase insert) syncs via DB trigger. Resend email + audience stay; CRM is source of truth for people.
Status: Accepted
Context: Leads were split across email-only forms, scattered Supabase tables, and the partial owner inbox.
Decision: Build CRM on existing platform Supabase; backfill historical rows on migration 021_crm_contacts_events.sql.
Consequences: Do not add HubSpot/Twenty install. Phone is secondary field only — dedup is email-only. Reflections without email stay outside CRM until we add email field.