Nice. In that case I’ll give you the single, clean spec you can paste straight into Replit / Notion as “LIA UI v1 – Product & UX Brief”. You don’t need to edit this much – it’s written for devs/designers. ⸻ LIA UI v1 – Product & UX Brief (Dealer Pulse / Replit Implementation) 0. Overview LIA is a WhatsApp renewal assistant used at Lincoln Audi. This brief defines the manager-facing UI only: • No advisor logins. • Advisors exist only as profiles to assign appointments and track performance. • All behaviour logic (tiers, soft-no, escalation, complaints, deferral, opt-out) remains in the state machine / prompt, not editable in the UI. • Bespoke campaigns only change who LIA talks to and how the offer is described, not how LIA behaves on inbound. ⸻ 1. Navigation & Screens Left-hand nav items: 1. Dashboard – high-level KPIs & quick summary (can host Reporting view). 2. Conversations – LIA conversation inbox (manager’s queue). 3. Conversation detail – full thread + T-card + manager reply (separate route). 4. Campaign customers – list of customers in active bespoke campaigns. 5. Appointments – LIA Appointment Diary • Tabs: Today (default) and Calendar. 6. Data & campaigns – full-book upload + bespoke campaign creation & list. ⸻ 2. Roles & Permissions Only Managers log in. • Managers • Can view and manage: • Conversations • Campaign customers • Appointments Diary • Data & campaigns • Can: • Assign advisors to appointments. • Create / reschedule / cancel appointments. • Change conversation status (Active / Paused / Do not contact). • Resolve escalations. • Create / manage bespoke campaigns. • Add notes on T-cards. • Send manager replies in Conversation detail. • Advisors • No logins. • Exist as profiles only (name/ID) used to: • Assign appointments. • Display who the customer’s point of contact is. • Track who converts appointments. • Managers update LIA based on feedback from advisors offline. ⸻ 3. State → UI Mapping 3.1 Conversation statuses (dp_conversations) Backend values → UI label & behaviour: • active → Badge: Active • awaiting_customer → Badge: Awaiting customer → Banner in detail: “Awaiting customer – last message sent by LIA at .” • needs_review → Badge: Escalated → Banner (purple): Needs manager review – LIA is waiting for a human reply before continuing. • paused → Badge: Paused → Banner (amber): Paused – LIA is not sending messages to this customer. • dnc / opted_out → Banner (grey/red): Do not contact – customer has opted out. LIA is disabled for this conversation. • closed_lost → Badge: Lost • closed_sold → Badge: Sold 3.2 Appointment statuses Backend values → UI label: • INVITED → Invited • BOOKED → Booked • ATTENDED → Attended • NO_SHOW → No-show • CANCELLED → Cancelled ⸻ 4. HOT Flag Logic Per campaign: • hot_flag = true when: • true_equity >= campaign.min_equity AND • current_payment >= campaign.headline_payment. Display HOT (🔥 Hot): • In Conversations inbox rows. • In Campaign customers rows. • In the T-card finance panel with text: • “🔥 Hot match – meets equity & payment for this offer” (when true). ⸻ 5. Data & Upload Behaviour 5.1 Full book upload (monthly) • Uses existing Supabase schema and ingestion pipeline (as per current Q425 Prospecting DB). • Manager UI: • Card: Full book data • Button: Upload full data file (CSV/XLSX). • Shows: • Last successful upload date & time. • Row count imported. • Any errors (with “Download error report” link). • All chunking / rate-limiting / upserts handled server-side, not in the UI. 5.2 Bespoke campaign upload • Customers in bespoke campaigns are already in the full-book DB. • Upload file contains unique identifier only (REG is primary key you should use – aligned with existing DB logic). • System: • Matches reg against full-book records. • Creates campaign membership links (no duplication of customer rows). • Marks rows as: • Matched • Unmatched (wrong reg, etc.) • Already in another active campaign (see rule below). 5.3 Campaign exclusivity & cool-off • One active campaign per customer at a time (e.g. per month). • If a reg is already in an active campaign, new uploads must skip or warn, not create duplicate memberships. • 8-week cool-off after decline: • When customer declines a bespoke campaign: • Set campaign_suppressed_until = now + 8 weeks. • Customer must not be included in new outbound bespoke campaign sends until this date. • Does not block: • Normal renewal behaviour (unless also DNC). • Appointment confirmations / cancellations. ⸻ 6. List Behaviour & Default Filters 6.1 Pagination For large lists: • Conversations (inbox): paginated • Campaign customers: paginated Rules: • 25 rows per page. • Sorting default: Last activity descending (latest first). • UI: Previous / Next (page numbers optional but nice to have). 6.2 Default scope: Active & recent only By default, both lists should show: • Customers in active bespoke campaigns OR • Customers with recent activity, e.g.: • Last message OR • Last appointment within a recent window (e.g. ~60 days). This covers: • Current month campaign customers (100–300 typical). • Spillover activity: • Appointments booked into next month. • Late replies after a campaign “closed”. 6.3 Access to historical data • Global search bar (name/reg) must search entire history, not just filtered list. • Optional filter toggle: • Active & recent (default) • All time Clicking historical rows opens Conversation detail with full T-card and full chat history. ⸻ 7. T-Card – Customer Detail T-card is visible: • Inline when expanding a customer in Campaign customers. • In the left panel (or top on mobile) in Conversation detail. 7.1 Top summary • Customer name • Car reg / model • Current mileage • Stage badge (18/12/9/6/3) • True equity • Equity trend chips: • 1m / 3m / 6m with up/flat/down indicators • Current payment • TCO payment • HOT flag / offer match text • Advisor allocated (profile only, not a user) 7.2 Appointments block • Next / upcoming appointment: • Date & time, channel (visit/phone), status, advisor. • Past appointments list: • Rows like: Date • Visit/Call • Status (Attended / No-show / Cancelled). • Most recent first. 7.3 Tabbed area Three tabs at bottom of T-card: 1. Overview (default) • Short summary of current campaign/session. • Key flags (e.g. money concern raised, deferral requested). 2. Notes / Comments • Manager-only internal log: • Time-stamped notes (who added, when). • Text area to add/edit comments. • Never sent to customer. 3. Full chat history • Read-only timeline of all historic LIA conversations with this customer. • Filter chips: • All / Current campaign / Previous campaigns. ⸻ 8. Conversations – Inbox Route: /conversations 8.1 Filters & search Top row: • Tabs / chips: • Active & recent (default) • Escalated • Awaiting customer • Paused / DNC • All time (optional chip or dropdown) • Filter dropdowns: • Stage: All / 18 / 12 / 9 / 6 / 3 • Campaign: All campaigns / [list] • Status: All / Active / Lost / Sold • Search: • Input: “Search by name or reg…” • Searches full DB, not just current page. 8.2 Row content (per conversation) For each row (25 per page): • Customer name (bold) • Vehicle + reg (e.g. Audi A3 Sportback • AB12 CDE) • Stage chip (18/12/9/6/3) • Campaign name (if any) • Conversation status badge: • Active / Awaiting customer / Needs manager review (Escalated) / Paused / Do not contact / Lost / Sold • Appointment status: • None / Invited / Booked • 🔥 Hot flag (if hot_flag = true) • Last message snippet • Last message time (e.g. 2h ago, Yesterday 15:10) Clicking a row → opens Conversation detail. ⸻ 9. Conversation Detail Route: /conversations/ 9.1 Top banner (one at a time) • Booked appointment (green): • “Appointment booked: • Advisor: ” • Needs manager review (purple): • “Needs manager review – LIA is waiting for a human reply before continuing.” • Awaiting customer (blue): • “Awaiting customer – last message sent by LIA at .” • Paused (amber): • “Paused – LIA is not sending messages to this customer.” • Do not contact (grey/red): • “Do not contact – customer has opted out. LIA is disabled for this conversation.” Right side can include contextual actions: • Mark escalation as resolved (when escalated). • Resume LIA (when paused). • Open in appointments diary (when booked). 9.2 Header strip • Customer name • Vehicle + reg • Stage chip • Campaign name (if any) • 🔥 Hot pill (if hot) • Conversation status badge • Appointment status badge • Advisor profile name 9.3 Main layout Two columns on desktop: • Left: T-card (as defined in section 7). • Right: Message timeline + Manager reply box. On mobile: stack T-card above timeline. 9.4 Message timeline • Chronological, newest at bottom. • Bubbles: • LIA: • Left-aligned • Light background • Label: LIA • Customer: • Right-aligned • Slightly darker bubble • Label: initials (e.g. JS) • Manager: • Highlighted bubble • Label: Manager • System markers (centre-aligned strips): • Appointment invited / booked / cancelled. • Escalation raised / resolved. • Deferral confirmed. • Customer opted out (DNC). 9.5 Manager reply box At bottom of right column: • Label: Manager reply • Text area for free text. • Controls: • Primary button: Send as manager. • Toggle (segmented control): • Send & let LIA continue • Send & pause LIA • Checkbox (when needs_review): • Mark escalation as resolved. Sending a reply: • Inserts Manager message into timeline. • Updates state: • If marked resolved → remove escalated banner/badge. • If “pause” selected → set conversation status to paused. ⸻ 10. Campaign Customers Route: /campaign-customers 10.1 Filters & default • Default filter: Active & recent campaign customers (25 per page). • Filters: • Campaign: All / [active campaigns] • Stage: All / 18 / 12 / 9 / 6 / 3 • Status: All / Contacted / Responded / Booked / Declined / Sold • HOT: optional chip Hot only • Search: by name/reg, searching entire history. 10.2 Row content (per customer) Each row shows: • Customer name • Vehicle + reg • Stage chip • Campaign name • Status: • Contacted (LIA sent outbound, no reply) • Responded (customer replied, no appointment / decline / sold yet) • Booked (appointment booked) • Declined (declined campaign) • Sold (marked sold) • 🔥 Hot flag (if true) • Last activity (e.g. “Responded 2h ago”, “Booked appointment yesterday”) • Advisor profile name (if assigned) • Clickable to expand T-card. 10.3 T-card inline expansion • Clicking row expands T-card inline (same T-card spec as section 7). • Includes: • Finance & payments • Appointments (past + upcoming) • Tabs: Overview / Notes / Full chat history • Open conversation link → Conversation detail. ⸻ 11. Appointments – LIA Appointment Diary Route: /appointments Tabs: Today (default) | Calendar 11.1 Roles • Manager view: • Can assign advisors. • Can change status (Invited / Booked / Attended / No-show / Cancelled). • Can reschedule within allowed hours. • Can cancel with confirmation. • Advisors: no direct access (manager-only UI). 11.2 Time & capacity rules Showroom visits: • Mon–Sat: 10:00–16:00 (start times) • Sun: 12:00–14:00 Phone calls: • Mon–Sat: 10:00–17:00 • Sun: 12:00–15:00 Capacity: • Max 6 appointments per time slot (across visits + calls). • If count >= 6, slot is full: • e.g. 6 / 6 in red + “Full”. • UI must block creating/rescheduling into a full slot. 11.3 Today view • Header: • Today – • Summary: • X showroom appointments • Y phone calls • Next available showroom slot: hh:mm • Next available call slot: hh:mm • Below: time-slot table for today: | Time | Total / 6 | Showroom | Calls | Advisors | Status | • Total / 6: uses colour: • 0–2 → green • 3–5 → amber • 6 → red + “Full” • Advisors: comma-separated names for booked slots (or “Unassigned”). • Clicking a slot row expands appointment cards for that slot. 11.4 Appointment card content Shown in any day view (Today or Calendar day): • Customer name • Channel: Showroom visit / Phone call • Date & time (e.g. Fri 05/12/2025, 11:00) • Location: “Lincoln Audi” • Advisor assigned: • Manager view: dropdown (Unassigned + advisors) • Display only text otherwise • Status chip: Invited / Booked / Attended / No-show / Cancelled • Small text: “Booked via LIA on ” • Action buttons (manager view only): • Change status (dropdown or chip selector) • Reschedule (modal with date + time picker obeying rules) • Cancel (confirmation modal) • Link: Open conversation → Conversation detail. 11.5 Calendar view • Month grid similar to iPhone Calendar: • Each day tile: • Date number • Dots under the date: • Dots indicate number of LIA appointments (density/colour for load). • Small text, e.g.: 4v / 2c for that day. • Clicking a day: • Opens that day’s time-slot view, same layout as Today: • Header: • X showroom / Y calls • Next available slot… • Time-slot table + expandable appointment cards. • “Jump to Today” button to quickly return. 11.6 Behaviour with LIA • When LIA books an appointment: • Diary creates entry with: • Status = Booked • Advisor = Unassigned • Slot counts update. • When manager cancels: • Status = Cancelled • Backend triggers LIA’s cancellation messaging. • When manager reschedules: • Move appointment to new slot within rules. • Backend triggers LIA’s reschedule message logic. • Customer saying “Thanks” after booking: • No new appointment created; diary unchanged. • Only conversation timeline updated. ⸻ 12. Data & Campaigns Route: /data-campaigns 12.1 Full book card (top) • Title: Full book data – monthly upload • Button: Upload full data file (CSV/XLSX). • Status text: • Last upload: date/time. • Rows processed. • Error count with “Download error report”. 12.2 Campaigns card (bottom) • List of campaigns: • Columns: • Name • Offer style • Vehicle focus • Start / end date • Status (Active / Scheduled / Ended) • Key stats (e.g. customers, sent, engaged, appointments, HOT matches) • Button: Create new campaign Create Campaign – Step 1: Basics • Campaign name: • e.g. A5 → A5 Same Payment • Offer style (dropdown): • Stay in same model for similar payment • Upgrade to newer model / shape • Downsize to lower payment • Move from diesel to petrol/hybrid • Stock push (specific models) • Other (free text) • Vehicle focus: • e.g. Audi A5 range • Start & end dates. Step 2: Upload customers • Upload CSV/XLSX with reg (and optional advisor/notes). • Backend matches regs to existing full-book rows and creates campaign membership. • UI shows: • Matched: X • Unmatched: Y (download error file) • Already in another active campaign: Z (handled per your rules). Step 3: Offer & messaging (content only) Managers guide content, not behaviour. Fields: • Headline payment: • e.g. Headline from: £499 / month • Minimum true equity: • e.g. £2,000 (used for HOT + internal filtering). • Internal conditions: • e.g. “Based on 8k pa, 49 months, £3k deposit. Do not promise exact figure.” • Customer-facing description (1–2 sentences): • e.g. “We’re inviting a small group of A5 customers to look at changing into a newer A5 for a similar monthly payment.” • Emphasis checkboxes: • Keep similar monthly payment • Lower monthly payment • Upgrade model/spec • Avoid end-of-term costs • Words to avoid (compliance): • e.g. “Don’t say ‘guaranteed saving’ or ‘free upgrade’.” UI can show a preview outbound message generated from these fields, but: All inbound behaviour, escalation, soft-no rules, complaints handling, deferrals, and opt-out behaviour remain controlled by the central state machine / prompt, not by campaign settings. ⸻ This is your LIA UI v1 Product & UX Spec. You can paste this into Replit/Notion as-is and let the team ask code-level questions on top, but from a UX/behaviour point of view, this is “the thing we’re building”.