# ADR 0011: Lead and Enquiry Ownership Model ## Status Accepted ## Context The CRM module originally used a mixed terminology model where: - `Lead` meant an unassigned enquiry - `Opportunity` meant an assigned enquiry That model no longer matched the business process. The business now distinguishes ownership by function: - `Lead` is marketing-owned - `Enquiry` is sales-owned The system must preserve the single-source-of-truth table `crm_enquiries` while refining lifecycle, permissions, monitoring visibility, and KPI semantics. ## Decision ### 1. Single record model - `crm_enquiries` remains the single source of truth - no `crm_leads` table is introduced - no split lead form or split enquiry API is introduced ### 2. Pipeline stage model `crm_enquiries.pipeline_stage` is the lifecycle discriminator with allowed values: - `lead` - `enquiry` - `closed_won` - `closed_lost` ### 3. Ownership model - `lead` is marketing-owned - `enquiry` is sales-owned - assignment converts a lead into an enquiry ### 4. Assignment behavior On assign: - `assignedToUserId` is set - `assignedAt` is set - `assignedBy` is set - `pipelineStage` becomes `enquiry` On reassign: - assignee metadata is updated - `pipelineStage` remains `enquiry` ### 5. Create behavior - marketing-created records default to `pipelineStage = lead` - sales-created records default to `pipelineStage = enquiry` ### 6. Closure behavior - lost or cancelled enquiry status resolves to `pipelineStage = closed_lost` - accepted or lost/rejected quotation outcomes may synchronize the linked enquiry to: - `closed_won` - `closed_lost` ### 7. Visibility policy Marketing can monitor: - leads - enquiries - follow-ups - status - pipeline stage - enquiry owner - won/lost result Marketing cannot access: - quotation pricing - quotation items - cost, discount, or margin views - approval analytics or approval workflow data Sales scope remains ownership-based: - `sales` and `sales_support` are limited server-side to enquiries they created or are assigned to - managers and admins retain wider organization visibility ### 8. KPI terminology User-facing dashboard terminology replaces `Opportunity` with `Enquiry`. Count definitions: - `Lead Count` = `pipelineStage = lead` - `Enquiry Count` = `pipelineStage = enquiry` - `Won Count` = `pipelineStage = closed_won` - `Lost Count` = `pipelineStage = closed_lost` ### 9. Navigation Separation - `Lead` and `Enquiry` are separate UX workspaces - `Lead` and `Enquiry` are not separate domain entities - both workspaces continue to use the same `crm_enquiries` records - `pipelineStage` determines whether a record appears in the Leads or Enquiries workspace - the navigation split reduces user confusion without duplicating schema, API, or service layers ## Consequences ### Positive - matches the real business handoff from marketing to sales - keeps backward-compatible storage in `crm_enquiries` - removes ambiguous `opportunity` wording from user-facing CRM surfaces - gives marketing monitoring visibility without exposing commercial data - enforces own-or-assigned visibility server-side for sales roles ### Tradeoffs - lifecycle still depends partly on status mapping and quotation outcome synchronization - the model does not yet include dedicated timestamps such as `closedWonAt` or `closedLostAt` - reporting still relies on current-state lifecycle fields rather than effective-dated snapshots ## Supersedes This ADR supersedes the opportunity terminology frozen in `docs/implementation/task-j0-kpi-definition-freeze.md` for user-facing CRM ownership and KPI language.