Patient Inquiries
Your lead inbox: filter, open and respond to new quote requests.
| Area | Clinic console |
| Route | /clinic/inquiries (exact match) |
| Roles | Clinic admin, Clinic staff |
| Doc key | clinic-inquiries |
<!-- GENERATED FILE. Do not edit by hand. Source: components/help/content/. Run npm run gen:docs. -->
Purpose & Business Context
Patient Inquiries is the clinic's lead inbox, the top of the revenue funnel. Every prospective international patient who asks for an estimate lands here as a row, and the clinic's job is to open the message, understand the request, and respond with a quote, an acceptance or a decline before the lead goes cold.
Commercially this is where cases are won or lost. A fast, well-judged quote turns an inquiry into an active case and, eventually, an escrow-protected booking, so the screen is built around triage: filter by status, read the full message, then act in one click.
Screen Overview
A single card holds a row of status filter chips over the inquiry list. Each list row shows the patient, country and flag, the procedure of interest, an indicative budget, the received date and a status Badge. Clicking a row opens a right-side detail drawer (modelled on the patient app's stage drawer) with the full message and the response actions.
Six inquiries are seeded for the demo, spanning every status, for example Aisha Mohammed (Kenya, Total Knee Replacement, New) and Sarah Thompson (United States, Accepted). Acting on one updates its status for the session and fires a confirmation toast.
Controls & Components
- Filter chips: All, New, Quoted, Accepted, Declined; each shows a live count and the active chip is filled teal.
- Inquiry rows: patient name and flag, country, procedure, indicative budget (or a dash when not stated), received date and a status Badge. The whole row is a button that opens the drawer.
- Detail drawer: a slide-in panel with the patient header, a status Badge, a facts table (Procedure, Indicative budget, From, Received) and the full inquiry Message.
- Drawer actions: Send quote (sets status to Quoted), Accept (sets Accepted) and Decline (sets Declined). Once an inquiry is Accepted or Declined the actions are replaced by a closed-state note.
- Empty state: when a filter has no matches, the list shows a 'No <status> inquiries.' message.
Field Definitions
- Patient / Country: Who sent the inquiry and their source country (with flag), for example Rashid Karim, Bangladesh.
- Procedure: The treatment the patient is asking about, a display string such as Coronary Bypass (CABG).
- Indicative budget: The patient's stated budget in USD, shown on the row and in the drawer; renders as a dash or 'Not stated' when absent.
- Received / Date: The short date the inquiry arrived, for example 3 Jun.
- Status: The inquiry's lifecycle state: New (amber), Quoted (blue), Accepted (green) or Declined (gray).
- Message: The patient's free-text request, shown in full in the drawer, often mentioning visa support, dates or attendant needs.
User Actions & Workflows
- Pick a status filter (start with New) to focus the list on what needs a reply.
- Click an inquiry row to open the detail drawer and read the full message and budget.
- Press Send quote to move the lead to Quoted, or Accept to confirm you will treat them, or Decline to bow out.
- Read the confirmation toast and watch the row's status Badge update.
- Close the drawer and repeat down the list; switch filters to review Quoted, Accepted or Declined items.
Navigation & Relationships
Reached from: the sidebar Inquiries item, the dashboard New inquiries tile, and every Respond button in the dashboard's Needs attention list.
Feeds: the Cases board. An accepted inquiry is the conceptual precursor to an active case (the demo seeds the corresponding cases separately, for example Sarah Thompson appears in both).
Reflected by: the dashboard. New and Quoted counts here drive the dashboard New inquiries tile and Needs attention list.
Business Rules & Constraints
- Clinic-only screen; gated by RequireAuth with role "clinic".
- Status changes are held in local component state, so they persist for the session but reset on reload (this is a front-end prototype).
- Accepted and Declined inquiries are terminal in the drawer: their action buttons are replaced by a closed-state note.
- Send quote, Accept and Decline each fire a toast; Decline uses a teal (neutral) toast, the others green.
- The All filter count equals the total inbox; each status chip counts only its own items.
Data Dependencies
Seeds local state from clinicInquiries in lib/data (backed by data/clinicInquiries.json). Toasts come from the shared useToast host. No data is written back to the source in the prototype.
clinicInquiries: the seeded inbox (patient, country, procedure, budget, status, message)useToast: confirmation feedback on quote/accept/decline- local
itemsstate: the per-session source of truth after edits
Error Handling & Edge Cases
- Empty filter: a status with no inquiries shows a tailored empty message rather than a blank list.
- Missing budget: rows and the drawer fall back to a dash or 'Not stated' so the layout never breaks.
- Closing the drawer: clicking the dark scrim or the X dismisses it without changing status.
- Terminal status: re-opening an Accepted or Declined inquiry shows the closed-state note, preventing a double action.
- Mobile: the drawer narrows to fit the viewport and the filter chips wrap.
User Roles & Permissions
- Clinic admin: Full triage: filter, open, and send quotes, accept or decline any inquiry.
- Clinic staff: Same inbox capabilities; responding to leads is core day-to-day staff work in the console.
- Patient / other roles: No access. Patients submit inquiries from the public marketplace; they never see the clinic inbox.
Related Features & Functionalities
The dashboard (New inquiries tile and Needs attention list), the Cases board (where accepted patients are delivered), the Pricing screen (the indicative prices a quote is built from) and the topbar notifications bell, which announces new inquiries as they arrive.
Flow & Screenshots
flowchart LR Inbox[Patient Inquiries] --> Filter[Status filter] Filter --> Row[Inquiry row] Row --> Drawer[Detail drawer] Drawer -->|Send quote| Quoted[Status: Quoted] Drawer -->|Accept| Accepted[Status: Accepted] Drawer -->|Decline| Declined[Status: Declined] Accepted --> Cases[Becomes an active case]
Guided Walkthrough Steps
The in-app walkthrough for this screen has 6 steps (auto-advances every 5 seconds; Prev / Pause / Next; click outside to exit):
- Patient Inquiries (
[data-tour="nav.inquiries"])
Your lead inbox. Every prospective patient who asks for an estimate lands here. You are on the Inquiries tab now.
- Filter by status (
[data-tour="inquiries.filters"])
Focus the list by status: All, New, Quoted, Accepted or Declined. Each chip shows a live count, so start with New.
- Your inquiries (
[data-tour="inquiries.list"])
Each row shows the patient, procedure, budget and status. Click a row to open the full request.
- Read and respond (
[data-tour="inquiries.drawer"])
The detail drawer shows the full message and facts. From here you can Send quote, Accept or Decline in one click. Open an inquiry to see it.
- Where accepted leads go (
[data-tour="nav.cases"])
Accept an inquiry and the patient becomes an active case. Track delivery on the Cases board.
- Help is always here (
[data-tour="topbar.help"])
Open Help on any console screen for documentation, or press Play to replay this walkthrough.