Skip to the article
Aniq-UI

KinoraClients and rosters

Clients and rosters

How a coach takes on members, assigns workouts, reads weekly check-ins and messages each client, and what the member sees.

For the Full Stack package

Who coaches whom

A member has at most one active coach. Two permissions split the work:

PermissionHeld byWhat it opens
coaching.clientsHead Coach, Personal TrainerThe caller's own roster: My Clients, each client's plan, check-ins and messages. Nobody else's clients.
coaching.assignHead Coach, Coach, Gym ManagerThe gym side: moving any member to a coach, or off every roster.

The seed gives the Head Coach the fullest roster, gives the demo Personal Trainer (trainer@example.com) and every other Personal Trainer and Coach account a smaller one, and leaves the rest of the members (eleven on a fresh seed) without a coach, so a coach has people to take on. Only an account with coaching.clients sees My Clients: the Head Coach and the Personal Trainers. The seeded Coach role does not grant it, so an account holding it, such as john.smith@staff.com, has clients on its roster but never sees them.

What a coach sees

  • The coach overview at /en/dashboard: how many clients trained this week, who has gone quiet (nothing finished in 7 days), the check-ins waiting for a reply, and today's assigned work across the roster.
  • My Clients at /en/dashboard/clients: the roster with each client's last session, sessions and minutes this week, and how much of their plan is done. Add client searches the members who have no coach and takes one on.
  • A client's page at /en/dashboard/clients/<username>: their week, the assigned work marked done, missed or upcoming, their weekly check-ins with a reply box, and the message thread.

Assigning work

  • A coach gives a client a workout from the catalogue, a start date and an optional note. The workout appears on the member's Workouts page.
  • The member's own finished sessions are what mark assigned work done. Nothing is ticked by hand.
  • A coach removes an assignment from the client's page.

Weekly check-ins

  • From the Workouts page, a member files one check-in per week: how the week felt from 1 to 5, an optional weight and optional notes. Filing again that week replaces it.
  • The coach reads it on the client's page and on the overview, unanswered ones first, and replies. The member sees the reply under their check-in.
  • Filing a check-in and answering one each send the other side a notification.

Messages

Each coach and client share one private thread. A message holds up to 2,000 characters and up to 6 attachments (pictures, clips or files), which go through the upload route and need a media bucket. Each message sends the other side a notification.

Moving members between coaches

On a member's page under Gym, staff with coaching.assign choose the member's coach, or take them off every roster. The list offers the accounts that hold the role named Coach, with how many clients each has.

Give the Coach role a roster

The seeded Coach role does not grant coaching.clients, so an account that only holds it is not offered My Clients for the members assigned to it. Grant coaching.clients to the Coach role on the Coach Roles screen if your coaches should work their rosters. The Head Coach and Personal Trainers take members on themselves, from Add client.

The coaching routes

Every route is under /api/fitness/coaching and needs a bearer token. The roster routes answer for the account making the request and nobody else.

RoutesPermissionWhat they do
GET /clients, GET /clients/:username, GET /available-members, POST /clientscoaching.clientsThe roster, one client, the members with no coach, taking one on ({ username })
GET /workouts, GET|POST /clients/:username/plan, DELETE /plan/:idcoaching.clientsThe catalogue to assign from, a client's plan, assigning ({ workoutSlug, startsOn, note? }), removing
GET /roster/assigned-work, GET /roster/check-inscoaching.clientsToday's work and this week's check-ins across the roster
GET /clients/:username/check-ins, POST /check-ins/:id/replycoaching.clientsA client's check-ins, and a reply ({ body }, up to 2,000 characters)
GET|POST /clients/:username/messagescoaching.clientsThe thread with one client
GET /my-coach, GET /my-plan, GET /check-ins, GET /messagesfitness.viewThe member's side: their coach, plan, check-ins and thread
POST /check-ins, POST /messagesfitness.editFiling this week's check-in ({ energy, weightKg?, notes? }), writing to the coach
GET /coaches, GET /assignments/:username, POST /assignments, DELETE /assignments/:usernamecoaching.assignThe Coach-role accounts, who coaches a member, moving a member ({ coachUsername, memberUsername }), taking a member off

Errors come back as keys the dashboard translates, such as already_your_client, member_has_coach, not_a_coach, no_coach and message_required.

Stuck on a step?

Find a fix before you start over.

Troubleshooting

Cookie Preferences

We use cookies to enhance your browsing experience, analyze site traffic, and personalize content. By clicking "Accept All", you consent to our use of cookies for analytics and personalized advertising.