Professional account
Besides schedules and bookings, the professional Mini App needs a small set of account-level records. They are owned by the signed-in professional, read on every launch, and never shared with another owner. Two slices serve them:
- the
usersslice owns the professional profile; - the
professional-accountslice owns blocked phones, notification preferences and inbox state, onboarding progress, and the entitlement status read.
All of these act on the application user resolved from the caller's Supabase session and professional enrollment; see Authentication. An item ID that belongs to another owner gives the same not-found result as a missing one.
Profile
The profile holds a display name, a description, a phone, an Instagram handle, a Telegram handle, and an optional photo. A save replaces the whole profile. The API normalizes and validates it:
| Field | Rule |
|---|---|
| Display name | Required, 1 to 100 characters after trimming |
| Description | Optional, up to 1,000 characters |
| Phone | Optional, E.164, such as +380671234567 |
| Instagram handle | Optional. A full instagram.com link or a leading @ is reduced to the handle |
| Telegram handle | Optional. A t.me link or a leading @ is reduced to the handle |
| Photo | Optional reference to a media item the professional owns |
The photo is uploaded through the professional media routes of the media library, and only the resulting media item ID is stored with the profile. A media item owned by someone else is rejected and the profile stays unchanged. Profile edits do not alter client contact details already copied onto appointments.
Blocked phones
A professional can block a client phone number in E.164 form and later remove the block. Removal keeps the history row; blocking the same number again reactivates it. Public booking checks active blocks before it accepts a client; see Public booking. Manual bookings by the professional are not checked against blocks.
Notification preferences and inbox
The professional has four switches, all on by default until first saved: new-booking notices, cancellation notices, the inbox channel, and the Telegram channel. Each switch can be changed on its own.
The inbox lists the professional's notices, newest first, with the event kind, the related appointment, and read and dismissal times. Marking an item read or dismissing it records the time once; repeating it changes nothing. Dismissed items are no longer listed. Neither action changes the appointment. How notices are recorded is described in Booking notifications.
Onboarding progress
Onboarding progress combines stored choices with milestones derived from existing records:
- Choices: the professional can defer, resume, skip, or complete onboarding. Resuming clears a deferral or skip.
- Milestones: whether the professional has an active service, offered availability on an active schedule, and any booking. They come from the booking records, so a real manual booking satisfies the booking milestone.
Entitlement status
The entitlement read reports the trial window, whether the trial or paid access is active, whether public bookings are accepted, the allowed and current number of active schedules, and the renewal intent. Before the first schedule exists, it reports no trial, no access, and an allowance of one schedule.
The status comes from the database's eligibility view; the professional cannot change it. The only write is the renewal intent flag, which records a wish and never grants access or extra schedules. There is no payment flow in the API. See Booking persistence schema.