Uzoma
Lumina ClinicMobile appWeb dashboardSoloIn development

Designing both sides of a booking relationship.

I designed Lumina Clinic solo: a two-sided booking platform for aesthetics and wellness clinics, built to fix a real gap I saw in Toronto's clinic booking systems. It covers the client-facing app and the business-side dashboard with an AI scheduling assistant.

Role
Solo product designer, end to end on both sides
Product
Two-sided booking platform for aesthetics and wellness clinics
Users
Clients booking treatments, and the staff and owners running the clinic
Platforms
Mobile client app, web business dashboard
Status
In development. No public release, no user testing yet
AlertsHomeDay of the visit
One relationship, two sides. This is what the client sees: alerts, the booking flow, and the visit itself.
Context

Booking tools that only solve half the problem

Toronto has plenty of aesthetics and wellness clinics, but the booking systems behind them tend to be split in an unhelpful way. Either a convenient client-facing app that gives clinic staff little real control, or practice-management software built for staff that treats the client experience as an afterthought. Neither side gets designed with the other genuinely in mind.

Picture a clinic that loses a Friday afternoon slot to a late cancellation while eleven people sit on a waitlist for that exact treatment, and nobody closes the gap in time. Or a client who is unsure whether their $50 deposit is refundable, discovers a package of prepaid sessions is about to expire, or simply forgets to rebook the appointment their practitioner actually recommended. These are the same underlying problem, a gap between what a clinic could offer and what a client is actually shown, seen from two different sides.

Business dashboard: empty and error states
Business dashboard: empty and error states
Unused capacity on one side, an unclaimed waitlist on the other. The same gap, seen from the business side.
The challenge

A gap in the market, not a client brief

This was a new, solo build aimed directly at a gap I saw in how Toronto clinics handle booking. Not a rebrand, and not a client brief, but building the product I thought this market was missing.

Core question
How do you design a booking platform where the client side and the business side reinforce each other, so unused capacity, unpaid balances and expiring packages get surfaced to the right person at the right time on both ends of the relationship?
Client alerts, waitlist and confirmations
Client alerts, waitlist and confirmations
Upcoming, past and waitlisted
Upcoming, past and waitlisted
The client-facing half of the same coordination problem the dashboard solves from the other side.
My role

Solo across both products, and honest about the research

I designed Lumina Clinic solo, end to end: every screen on both the client app and the business dashboard, including the AI assistant's permission model.

Because this is a personal project built to address a gap I identified directly in the Toronto market, the direction came from that observation rather than a formal brief or user research. There is no user testing yet, since the product is still in development, and I am stating that plainly rather than implying otherwise.

Business dashboard overview
Business dashboard overview
A full practice-management surface: clients, appointments, staff, payments and stock, designed solo alongside the client app.
Strategy

Two views of one relationship

Hypothesis: if the client app and the business dashboard were designed as two views of the same underlying relationship, bookings, payments, waitlists and packages, rather than as separate products, both a clinic and its clients would get fewer missed opportunities. Fewer empty slots, fewer expiring credits, fewer forgotten rebookings.

The guiding principle was continuity across both sides. Anything that mattered to a client, a waitlist spot or a package expiring, needed a clear counterpart on the business side: who to offer that slot to, when a package needs a nudge. And anything the business automated, such as an assistant chasing a confirmation, needed to be visible and explicable to the client receiving it.

Ten-second sign-in
Ten-second sign-in
Recognised from a past call
Recognised from a past call
Days, times and how to reach you
Days, times and how to reach you
The client side opens with preferences the business side can act on later.
The five decisions
01–05
01

One alerts feed instead of scattered notifications

Situation

A client's relationship with a clinic involves several kinds of time-sensitive information: appointment confirmations, waitlist openings, expiring package credits, payment receipts. Most apps split these across separate screens or notification types.

Decision

I designed a single, prioritised Alerts feed as the client app's home screen, combining confirmation requests, waitlist offers, package status and payment receipts into one chronological stream, each with its own direct action: Confirm, Take it, Pass.

Why

A client should not have to check four different places to know what needs their attention. A unified feed, ordered by urgency and recency, means the most time-sensitive item, a same-day confirmation or a waitlist spot about to close, is never buried behind less urgent information.

Change

The client's home screen became a single source of what needs my attention, rather than a menu of separate features to check individually.

Alerts: confirm, take it, pass
Alerts: confirm, take it, pass
Home: next visit, package, membership
Home: next visit, package, membership
Every time-sensitive moment in one place, each with a direct action.
02

Cancellation flows that default to rescheduling

Situation

A cancellation is a lost booking for the clinic and often an awkward deposit conversation for the client. Most apps treat it as a single, final action.

Decision

I designed the cancellation flow to lead with a reschedule offer, Move it two weeks instead, generated automatically, with outright cancellation available but visually secondary, alongside an upfront statement of the deposit refund policy based on how much notice was given.

Why

Most cancellations are not really I never want this appointment. They are not this exact time. Leading with a concrete, one-tap reschedule addresses the client's actual need in most cases, and the transparent refund policy removes the uncertainty that might otherwise make someone hesitate to cancel honestly in the first place.

Change

A cancellation stopped being purely a lost booking and became, more often, a rescheduled one, with the deposit policy handled honestly either way.

Reschedule offered before cancelling
Reschedule offered before cancelling
Deposit moves with the appointment
Deposit moves with the appointment
Or just ask, in plain language
Or just ask, in plain language
Reschedule first, cancellation still available, refund policy stated upfront either way.
03

Feedback, rebooking and payment on one screen

Situation

After an appointment a client typically has to handle feedback, paying any remaining balance, and rebooking as three separate interactions. Three separate reasons to open the app, or three separate reasons not to.

Decision

I designed a single post-visit screen combining a private satisfaction rating, an optional note, a clear balance breakdown of treatment cost, member discount and deposit already paid, a practitioner-suggested rebooking interval, and the payment action.

Why

Bundling these means the client resolves the entire post-appointment relationship in one sitting, right when the visit is freshest in their mind, instead of leaving balance payment or rebooking as a task to remember later and possibly forget.

Change

Post-visit follow-through became a single completed action instead of three separate ones a client could drop at any point.

How was today?
How was today?
One balance to settle
One balance to settle
Visits, spend and notes over time
Visits, spend and notes over time
Feedback, balance and the next booking, resolved together while it is still top of mind.
04

An assistant with visible permission boundaries

Situation

An AI assistant that can act autonomously on scheduling, payments or client communication is genuinely useful, but also genuinely risky if a clinic cannot see or control exactly what it is allowed to do.

Decision

I designed a dedicated Assistant rules panel where staff toggle specific autonomous actions individually: book into open slots, reschedule on request, take deposits, chase unconfirmed clients, offer the waitlist a cancelled slot. Alongside it sits an explicit Never do this guardrail list and a stated escalation point after two failed attempts.

Why

Trust in an assistant does not come from it being capable. It comes from a business being able to see and set exactly where its autonomy ends. Naming specific, real risks in the guardrail list, rather than a generic disclaimer, shows the assistant was designed around actual failure modes a clinic would worry about.

Change

The assistant went from an opaque automation feature to something a clinic owner could configure and trust deliberately, action by action.

Assistant rules: what LC may do on its own
Assistant rules: what LC may do on its own
The assistant working inside the calendar
The assistant working inside the calendar
Needs you, and LC did this, kept separate
Needs you, and LC did this, kept separate
Autonomy, but only exactly as much as the clinic explicitly grants, and always visible after the fact.
05

Empty and error states that keep working

Situation

Empty states, no clients yet or an unbooked day, and error states such as a lost connection are often treated as dead ends: a blank message with nothing useful to do next.

Decision

I designed empty states that propose a specific next action tied to real context, importing a client spreadsheet with automatic deduplication, or opening unused Sunday hours directly to the eleven people already on a waitlist. The connection-loss state explicitly confirms nothing was lost, changes will sync, and the clinic can keep working offline meanwhile.

Why

A clinic running day-to-day operations cannot afford a dead end, whether that is an empty calendar or a lost connection. Turning both into a specific, actionable next step keeps the business moving instead of just informing them something is empty or broken.

Change

Empty and error states became functional parts of the product instead of the parts that quietly did nothing.

Empty, loading, thinking and offline, side by side
Empty, loading, thinking and offline, side by side
Even the dead ends point to a next action.
Implementation

Both sides, kept in step

As a solo project I designed every part of Lumina Clinic myself: the client app and the full business dashboard, including the assistant's permission model.

Keeping both sides consistent with each other was more direct to manage solo, since every client-facing feature could be checked against its business-side counterpart without coordinating across a handoff. The booking flow a client walks through is the same appointment a staff member creates in three steps from the calendar, and the flags and package credits on a client record are the same ones surfaced in the app.

Client side

Sign-in, preferences, booking, day-of check-in, post-visit, payments, history, alerts, profile

Business side

Overview, calendar, client records, appointment creation, staff and certifications, payments, stock, reporting, help, settings

Shared spine

One appointment, one client record, one set of package credits and flags, read from both sides

Status

In development

Lumina Clinic is currently in development. There is no public release yet, and no outcome or usage data to report at this stage. The evidence here is in the decisions themselves: what was combined, what was made secondary, what the assistant is not allowed to do, and why.

Reflection

Two audiences that affect each other

The clearest idea shaping this project is that a booking platform's two audiences, the client and the clinic, are usually designed as if they do not affect each other, when in practice every gap on one side, an empty slot or an unconfirmed appointment, is a missed opportunity on the other, a waitlisted client or a lost booking. Designing both sides together, solo, made it possible to trace that connection directly instead of guessing at it across a handoff.

The assistant's permission model in particular came out of thinking about trust from the business's side first. A clinic will not hand over scheduling autonomy to something it cannot see or limit, so the guardrails needed to be as concrete and visible as the automation itself.

Client record: history, flags, consents, credits
Client record: history, flags, consents, credits
Where enquiries land, and what the assistant recovered
Where enquiries land, and what the assistant recovered
Still in development: two sides of one booking relationship, designed together from the start.
Next
Back to all work
→