Product Guide · Part 3

One station. Many doctors. One brain.

Station Mode is what Solo Mode grows into. A single admin runs the clinic, multiple doctors run their specialties, and reception routes patients through both. Same data model, more knobs.

12-minute read Entry surface · admin layer Specialties · routing · oversight
Al Nour Medical
Station admin
Cardiology
2 doctors
Pediatrics
3 doctors
Internal Med
2 doctors
7 doctors · 3 reception staff
AHSMOKFAYIMAKS
Part 2 · Solo PagesPart 4 · Station Doctor & Reception
The shift

What changes when you switch from Solo to Station.

Most of the product stays the same — same data model, same dashboards, same prescription pipeline. A handful of concepts get added, and a handful of decisions become explicit instead of implicit.

Solo

Parts 1–2

One doctor, one practice

  • 1 doctor

    The owner is the practitioner. No assignment needed.

  • No specialties

    Visit type is the only routing dimension.

  • Implicit routing

    Reception adds patients; the doctor takes them in order.

  • Self-managed

    The doctor owns the clinic, the master lists, the brand.

Station

Parts 3–4

Many doctors, one organisation

  • Station admin role

    A non-clinical owner runs the station. Doctors don't manage themselves.

  • Specialties as a unit

    Cardiology, Pediatrics, Internal Med — every doctor belongs to exactly one.

  • Explicit routing

    Every queue item carries a specialtyId. Optionally an assignedDoctorId.

  • Centralised oversight

    Suspension, password reset, audit logs — admin sees the whole station from one panel.

Section 01 · Station Dashboard

The view from the top.

The first screen the station admin sees on every login. Six headline numbers and one queue breakdown — enough to know whether the day is on track without drilling anywhere.

At a glance
  • WhoStation admin
  • OutcomeDay-shape, in 5 seconds
myclinic-system.com/station/dashboard
Al Nour Medical
Station admin
Dashboard
Doctors
Reception
Archive
Medications
Performance
Med analytics
Settings
Chat audit
14:32:07
Station dashboard
Live view of the multi-doctor station: who's working, what's queued, and where the day stands.
refreshes every 15s
7
Active doctors
3
Reception staff
4
Specialties
11
In queue
42
Visits today
28
Appointments
Queue by specialty
11 active items
Cardiology2 doctors6
Pediatrics3 doctors3
Internal Medicine2 doctors1
Dermatology1 doctors1
Quick links
Manage doctors7
Reception staff3
Performancetoday
Settings
When the queue clears: "No active queue items right now." — not an empty table.
Floating comments

Numbered annotations on the mockup.

1
Why

Six stats, refreshed every 15 seconds

Active doctors, reception staff, specialties, queue, completed today, appointments today. The smallest number that captures the day.

2
Why

Queue by Specialty — the bottleneck spotter

If Cardiology is 8 deep and Pediatrics is empty, you don't need a chart. The breakdown is the chart.

3
Why

No editing here

The dashboard is read-only. Every number links into the page where you'd act on it — Doctors, Queue, Performance.

4
Why

'Active' means status=active AND not soft-deleted

Suspended doctors don't count. Reception sees a separate count that reflects who is actually on shift.

5
Why

Empty state is its own state

When the queue is empty, the breakdown card swaps to a calm 'No active queue items right now.' message — not a blank table.

Components

Building blocks.

<StationStats/>

StationStats

The six headline counters: doctors, reception, specialties, queue, visits today, appointments today.

BehaviourPolls /api/station/dashboard every 15s. Keeps the previous value during fetch to avoid flicker.
DoUse icons consistent with the page each stat links to (Stethoscope = Doctors, etc.). Visual continuity matters.
Don'tAdd a seventh stat. Past six, the row visually fragments and admin scan-time goes up.
<QueueBySpecialty/>

QueueBySpecialty

Breakdown of waiting/in-progress queue items grouped by specialty.

BehaviourServer-aggregates by `specialtyId`. Counts include both waiting and in_progress.
DoSort by descending count. Bottlenecks should always be at the top.
Don'tInline a chart. The list is the chart at this scale.
<Today vs. last-week delta (missing)/>

Today vs. last-week delta (missing)

Currently absent. Worth adding: each stat with a small delta vs. same weekday last week.

BehaviourSame shape as Solo Doctor's stat row. Server-computes the comparison.
DoMirror the Solo Doctor implementation — proven UX, free copy.
Don'tCompare to yesterday. Day-of-week seasonality is too strong.
User flow

A station admin's morning, in four glances.

01

Open Dashboard

Six numbers and a queue breakdown — the day is or isn't on track.

02

Spot a bottleneck

Cardiology is 8 deep. Click into Doctors or Performance.

03

Check coverage

Active doctors stat reads 5/7. Two are on leave. Confirm reception is staffed.

04

Drill where needed

Most days, the dashboard is the only page admin opens.

Pro tips

Get more out of this surface.

Speed

Make Dashboard the post-login redirect

Station admins land here by default. If you've changed the redirect to a Performance page or a custom report, you've added a click for the most-frequent action.

Habit

Pin Dashboard as a tab, not a bookmark

It's a live screen — keep it open all day. The 15s poll keeps the numbers current; closing it loses the operational context.

Improvement

Drill-down by clicking stats

Improvement: every stat could be a link to the page with a relevant filter applied (e.g. 'Active doctors → /station/doctors?status=active'). Saves a second per inspection.

Section 02 · Doctors & Specialties

Where the org chart actually lives.

Specialties and doctors share one page because every doctor must belong to exactly one specialty. The flow is non-negotiable: create the specialty first, onboard the doctor second. The UI enforces it by disabling 'Add doctor' until at least one specialty exists.

At a glance
  • WhoStation admin
  • OutcomeA complete, current roster
myclinic-system.com/station/doctors
Al Nour Medical
Station admin
Dashboard
Doctors
Reception
Archive
Medications
Performance
Med analytics
Settings
Chat audit
14:32:07
Doctors
Doctors at this station are tagged with a specialty. Reception routes patients by specialty (and optionally to a specific doctor).
Specialties4
e.g.Pediatrics
Cardiology· 2
Pediatrics· 3
Internal Medicine· 2
Dermatology· 1
DoctorSpecialtyStatusActivityActions
dr-ahmed
ahmed@al-nour.eg
CardiologyActiveOnline
dr-sara
sara@al-nour.eg
PediatricsActiveOnline
dr-omar
omar@al-nour.eg
CardiologyActive2m ago
dr-fatma
fatma@al-nour.eg
PediatricsActive11m ago
dr-yousef
yousef@al-nour.eg
Internal MedicineActive1h ago
dr-mona
mona@al-nour.eg
DermatologySuspended3d ago
dr-karim
karim@al-nour.eg
PediatricsActiveNever
Floating comments

Numbered annotations on the mockup.

1
Why

Specialties as a top card, doctors below

Specialties are the smaller list (typically 3–8); doctors are larger. Visual hierarchy mirrors quantity.

2
Why

Specialty pills are inline-editable

Add, rename, delete from the same row. No modal for the simplest action; a tiny dialog for rename and a confirm for delete.

3
Why

Add doctor disabled until you have a specialty

Reduces the most common onboarding mistake — adding a doctor before there's anywhere to put them.

4
Why

Activity column = real-time presence

Online (green dot) if last seen <90s ago; otherwise relative time. Helps admin spot who's actually on shift.

5
Why

Suspend, don't delete

Suspending preserves the audit trail and the visit history. Deletion is for genuinely-bad-data only — wrong username, test account.

Components

Building blocks.

<SpecialtiesCard/>

SpecialtiesCard

Inline CRUD for specialties — add, rename, delete.

BehaviourPills are inline; rename uses a tiny dialog; delete uses a confirm. 80-char name limit.
DoShow 'X doctors' on each pill. Drives quick coverage decisions.
Don'tAllow deleting a specialty that has doctors assigned. Server returns 409.
<DoctorsTable/>

DoctorsTable

Roster: doctor, specialty, status, activity, actions.

BehaviourLive activity column updates from server-pushed presence; relative time strings auto-rebuild.
DoGroup visually by specialty when sorted. Scanning by team is a frequent admin pattern.
Don'tHide suspended doctors by default. Admin needs to see them to reactivate.
<DoctorDialog (Add/Edit)/>

DoctorDialog (Add/Edit)

Single dialog for create and update — specialty, username, email, password.

BehaviourUsername is unique per clinic. Password optional on edit ('leave blank to keep').
DoValidate username server-side; show duplicates inline.
Don'tAllow specialty change to leave the doctor unassigned. Specialty is required, never null.
<PasswordResetDialog/>

PasswordResetDialog

Targeted password reset for a single doctor.

BehaviourSeparate from Edit so the action is intentional. 6-char minimum.
DoForce a password change on the doctor's next login (improvement).
Don'tShow the new password back to admin. Send via secure channel; never via UI.
<Suspend / Activate toggle/>

Suspend / Activate toggle

Lock a doctor out without deleting their record.

BehaviourConfirm dialog ('Suspend dr-smith?'). Suspended doctors can't log in; their visits stay searchable.
DoUse suspend for departures. Locks access; preserves history.
Don'tTreat as a soft-delete. Suspension is a status, not a tombstone.
<Delete confirmation/>

Delete confirmation

Hard delete with explicit warning.

BehaviourConfirm: 'Delete dr-smith? This cannot be undone.' Soft-cascades to the doctor's data.
DoReserve for test accounts and typos. Always.
Don'tUse for staff turnover. Suspend instead.
User flow

Onboarding a doctor, in four steps.

01

Create specialty

Pediatrics. (Skip if it already exists.)

02

Add doctor

Pick the specialty, set username, email, initial password.

03

Hand over credentials

Outside the app — secure channel. The doctor signs in.

04

Watch them go online

Activity column flips to 'Online' the moment they hit Dashboard.

Pro tips

Get more out of this surface.

Hygiene

Suspend over delete, always

Suspended doctors keep their visit history attached. Deleted doctors' visits live on as orphans. Suspend the moment they leave; only delete genuine bad data.

Hygiene

Don't reuse usernames

Username uniqueness is per-clinic and historical. If 'dr-ahmed' leaves and a new Dr Ahmed joins, give the new one 'dr-ahmed-2' — it preserves the audit trail.

Discipline

One specialty per doctor — by design

Multi-specialty doctors are rare and complicate routing. If you genuinely need it, model it as two doctor accounts under one person.

Improvement

Force password change on first login

Improvement: the initial password is admin-set, which is fine. A 'must change on next login' flag would close the credential-handover gap.

Missing

Per-specialty admin roles

Improvement: a head-of-cardiology role with scope limited to one specialty would let larger stations delegate without giving full admin access.

Improvement

Bulk import via CSV

Improvement: stations onboarding 20+ doctors hit a friction wall at the dialog. A CSV import (specialty, username, email) would compress the first hour.

Section 03 · Reception staff

The desk-side roster, lighter than doctors.

Reception staff are scoped to the station, not to specialties. A receptionist sees every queue, every appointment, every patient. The page is a slimmer cousin of Doctors — same interaction model, fewer fields.

At a glance
  • WhoStation admin
  • OutcomeA staffed front desk
myclinic-system.com/station/users
Al Nour Medical
Station admin
Dashboard
Doctors
Reception
Archive
Medications
Performance
Med analytics
Settings
Chat audit
14:32:07
Reception staff
Front-desk accounts with full station access.
UserStatusActivityActions
reception-mai
mai@al-nour.eg
ActiveOnline
reception-hany
hany@al-nour.eg
ActiveOnline
reception-noha
noha@al-nour.eg
Active8m ago
reception-fares
fares@al-nour.eg
Suspended12d ago
Floating comments

Annotations on the mockup.

1
Why

No specialty column

Reception is station-wide by design. Adding a 'specialty scope' would fragment routing without solving a real problem.

2
Why

Username + email is the whole identity

Reception accounts are simpler than doctor accounts. No prescription footer, no clinical metadata.

3
Why

Activity uses the same presence engine

Same green dot, same relative time. Visual consistency with the Doctors page.

4
Why

Suspend on shift change is overkill

Don't suspend overnight; reception accounts are session-scoped. Suspend only when someone leaves the role.

Components

Building blocks.

<ReceptionTable/>

ReceptionTable

User · Status · Activity · Actions — same shape as DoctorsTable, minus the specialty column.

BehaviourReuses the activity-presence engine; status badges identical to doctors.
DoVisually align column widths with the Doctors page. Admin scans both tables in the same shape.
Don'tAdd a 'shifts' column here. Shift management is a separate feature, not a column.
<ReceptionDialog (Add/Edit)/>

ReceptionDialog (Add/Edit)

Three fields: username, email, password.

BehaviourUsername uniqueness checked across all roles in the clinic (no doctor and reception sharing 'ahmed').
DoPre-fill nothing. Reception accounts are quick — typing 3 fields is faster than confirming auto-suggestions.
Don'tSkip email. Without it, password resets require admin every time.
User flow

Adding a receptionist.

01

Click Add account

No specialty pre-requisite — unlike Doctors.

02

Set username

e.g. 'reception-mai'. Lowercase, hyphenated convention.

03

Set initial password

Hand over via secure channel; force change on first login (improvement).

04

Watch them log in

Activity column flips to Online.

Pro tips

Get more out of this surface.

Hygiene

One account per receptionist

Shared accounts kill audit trails. If two staff share a desk, give them two accounts and let them switch — sign-out is one click.

Security

Suspend immediately on departure

Reception accounts have full patient and queue access. Suspend the moment someone leaves — even mid-day — to keep the audit clean.

Missing

Per-clinic reception (multi-clinic stations)

Improvement: a station with two physical clinics likely wants reception scoped to one location. Today they all see everything.

Section 04 · The routing model

How a patient finds the right doctor — without anyone shouting.

Station Mode adds two routing dimensions to every queue item: specialty (always required) and assigned doctor (optional). Together they're enough to support specialty-pool, doctor-pinned, and walk-in flows from the same data shape.

At a glance
  • WhoReception decides · Admin oversees
  • OutcomePredictable routing, no ambiguity
Step A · Intake
AH
Adham Saad
6y · walk-in
Specialty: Pediatrics ✓
Pinned doctor: — (any)
Step B · Pool
Pediatrics queue3
Adham Saad
shared
Lara Magdy
shared
Tarek Helal
→ dr-sara
Step C · Doctors
dr-saraidle
Sees: 3 items
dr-fatmabusy
Sees: 2 items
dr-karimidle
Sees: 2 items
Tarek Helal pinned to dr-sara — invisible to dr-fatma & dr-karim.
Same model for appointments. When an appointment is marked Arrived, its specialtyId and assignedDoctorId carry into the queue item — continuity is free.
Floating comments

What each numbered region of the diagram is doing.

1
Why

Specialty is always required

A queue item without a specialty is unroutable. The form blocks submission until one is picked.

2
Why

Assigned doctor is optional

Empty = 'any doctor of this specialty'. Set = pinned to a specific doctor. The same queue table holds both.

3
Why

Doctor pulls from their specialty pool

When a doctor's queue is empty, they see waiting patients in their specialty without an assigned_doctor — claim by Start.

4
Why

Pinned items show only to their doctor

A patient pinned to dr-ahmed never appears in dr-omar's queue, even if dr-omar is idle and Cardiology is busy.

5
Why

Same model for appointments

Appointment also carries (specialtyId, assignedDoctorId). On arrival, the queue item inherits both. Continuity is free.

Components

Building blocks.

<SpecialtyPicker (reception)/>

SpecialtyPicker (reception)

Required dropdown on Quick Add and the queue-add form in station mode.

BehaviourHidden in solo mode (clinic.kind === 'solo'). Required in station mode.
DoDefault to the most-used specialty. Saves a click on busy mornings.
Don'tAuto-pick when there's only one specialty. Make the requirement explicit so admin knows to add more.
<DoctorPicker (reception, station)/>

DoctorPicker (reception, station)

Optional dropdown — appears once specialty is chosen.

BehaviourFiltered by `specialtyId`. First option is 'Any (shared)' — the empty/null assignment.
DoDefault to 'Any'. Pinned routing should be a deliberate choice.
Don'tShow all doctors regardless of specialty. Cross-specialty pinning is invalid by design.
<QueueFilter (reception, station)/>

QueueFilter (reception, station)

Filter the queue view by specialty + doctor.

BehaviourTwo-step filter: specialty narrows the doctor list; 'Unassigned only' surfaces shared-pool items.
DoPersist the filter in URL. Reception comes back to the same view all day.
Don'tRemove the 'Clear filters' shortcut. Sticky filters break trust silently.
<Doctor's queue claim/>

Doctor's queue claim

Doctor's view of their queue + their specialty pool.

BehaviourDoctor sees: items where assignedDoctorId === self, + unassigned items in their specialty.
DoVisually distinguish 'pinned to me' from 'specialty pool'. Different responsibility levels.
Don'tAllow a doctor to claim items pinned to a different doctor. Server enforces this.
User flow

Walk-in to consultation, station-mode.

01

Reception picks specialty

Required. Pediatrics for a 6-year-old.

02

Optional pin

Pin to dr-sara if the family always sees her, or leave shared.

03

Queued

Lands in dr-sara's queue (if pinned) or the Pediatrics shared pool (if not).

04

Doctor claims

First idle Pediatrics doctor with capacity hits Start. Pinned items are claimable only by their pin.

Pro tips

Get more out of this surface.

Discipline

Default to shared, pin sparingly

Pinning is great for continuity (chronic patients, family doctors). Pinning by default kills load-balancing. Reception trains 'shared first' as the rule.

Insight

Watch the per-specialty queue depth

If Cardiology is at 8 and the other specialties are empty, you have a coverage problem — not a software problem. Hire, don't reroute.

Missing

Cross-specialty consults

Improvement: a 'request consult' action from a doctor's screen would let one doctor pull a colleague mid-visit. Currently a chat-and-shout flow.

Improvement

Auto-rebalance pinned overflow

Improvement: when a pinned doctor is more than 6 deep and others in their specialty are idle, surface a one-click 'release pin' for late-arriving entries.

Compliance

Routing is auditable

Every routing change (pin, unpin, specialty edit) is in /station/audit-logs. Compliance asks; the answer is one query away.

Insight

Use Performance to find pinning bias

Performance breaks down visits per doctor and per specialty. Drift over a month tells you whether one doctor is silently absorbing all walk-ins.

What’s next

Station mode admin is covered. Now the doctors and the front desk.

Part 4 walks the per-doctor and per-receptionist screens — how the routing model from this page actually plays out in their workflow. Part 5 is the admin layer: audit, billing, suspension.

Part 4 · live

Station Doctor & Reception

How the doctor and reception screens shift in station mode — what stays the same, what changes, and why.

Read it
Part 5

Audit & compliance

Every login, every edit, every prescription — searchable, exportable, regulator-ready.

Part 5

Performance & lifecycle

Analytics dashboards, suspension flows, data retention — the unglamorous load-bearing layer.