Add an athlete to start tracking sessions, payments, and notes.
Add Client
Create athlete profile
Invite to app
Invite to training
9:30●●●● 🔋
Requests
TN
Tom N.
wants to book a session
Boxing Training
Thu, Apr 17 · 19:30 – 20:30
GYM Bro
€40Cash
SK
Sara K.
wants to book a session
Basketball Training
Fri, Apr 18 · 10:00 – 11:00
TNT Studio
€50Card
LR
Lena R.
wants to book a session
Yoga Morning Flow
Mon, Apr 21 · 08:00 – 09:30
GYM Bro
€15Cash
All caught up
New training requests from athletes will appear here.
Request handled
9:30●●●● 🔋
AK
Anna KowalskiCRM
Warsaw, Poland
basketballfitness
This client is archived
This athlete is blocked
This account was deleted · Apr 18
12
Sessions
3
Upcoming
€580
Revenue
€75
Owed
Pending Payments2
Basketball Training€50
Apr 14 · Cash
HIIT Group Session€25
Apr 10 · Cash
Upcoming Sessions
Basketball Training
Mon, Apr 21 · 08:00 - 09:00
TNT Studio€50
Basketball Training
Wed, Apr 23 · 08:00 - 09:00
TNT Studio€50
HIIT Group Session
Thu, Apr 24 · 18:00 - 19:00
GYM Bro€25
Notes
Knee injury (left) — avoid high impact jumping. Prefers morning sessions. Pays cash usually.
Training History
12 sessions
0
Sessions
0
Upcoming
€0
Revenue
€0
Owed
Upcoming Sessions
No upcoming sessions yet.
Notes
Add notes
Payment recorded
Schedule training
Invite to app
Invite to training
Edit info
Archive client
Block athlete
Archive Anna Kowalski?
Hides Anna from your active clients list. All training history, stats, and notes stay saved — you can restore her anytime from Archived list.
Anna will still be able to book sessions with you — a new request will bring her back to active clients.
Block Anna Kowalski?
Anna won't be able to book new sessions with you and your profile won't appear in her search results. Past history and stats are preserved — you can unblock her anytime.
Upcoming sessions stay scheduled — you'll need to cancel them manually if needed.
9:30●●●● 🔋
Training history
AK
Anna Kowalski· 12 sessions
Basketball Training
€50
Mon, Apr 14 · 08:00 - 09:00 · TNT Studio
Completed · Paid
Basketball Training
€50
Wed, Apr 9 · 08:00 - 09:00 · TNT Studio
Completed · Paid
HIIT Group Session
€25
Thu, Apr 3 · 18:00 - 19:00 · GYM Bro
Completed · Paid
Basketball Training
€50
Mon, Mar 31 · 08:00 - 09:00 · TNT Studio
Cancelled by athlete
Basketball Training
€50
Wed, Mar 26 · 08:00 - 09:00 · TNT Studio
Completed · Paid
No sessions yet
Completed sessions with this athlete will appear here.
9:30●●●● 🔋
Archived & Blocked
JD
Julia D.
Archived Apr 18 · 5 sessions
KL
Karl L.Deleted
Archived Mar 30 · 18 sessions
SV
Sofia V.
Archived Feb 12 · 2 sessions
DM
David M.
Blocked Mar 22 · repeated no-shows
RV
Roman V.
Blocked Jan 8
Restored
9:30●●●● 🔋
Notes
Knee injury (left) — avoid high impact jumping. Prefers morning sessions. Pays cash usually.
9:30●●●● 🔋
New client
First name
Last name
Phone or Email (optional)
Sport
Basketball
Notes (optional)
Injuries, preferences, payment habits...
Please fill in required fields
Coach
Clients
CRM-style client list. Root tab screen (no back arrow).
Bell icon with red badge (3) → Requests inbox
"+" icon → sheet with 3 options
"€50 owed" red badge (Mark S.) — client has unpaid cash session
"Deleted" badge (Ivan K.) — athlete removed their account. Muted avatar + text-tertiary name. History intact, tappable to Client Detail.
"CRM" badge (Marta V.) — coach-created contact without app account. Teal-tinted pill, normal avatar color. Coach tracks sessions/cash manually; can later Invite to app to upgrade.
Tap client → Client Detail
"+" sheet actions: • Create athlete profile → CRM form (New Client screen) • Invite to app → opens native iOS share sheet directly. Prefilled: "Join me on 321Fit: https://321.fit/invite/coach_id". No intermediate screen. • Invite to training → intermediate screen to select training template, then generates deep link with event attached.
Empty: fresh coach — «Add first client» CTA opens the same add-client sheet. Loading: 4 skeleton rows during initial fetch. Archived row at bottom is hidden when 0 archived+blocked — appears only after first use.
Coach
Requests
Full-screen inbox for pending booking requests.
Cards with unified layout: avatar + name + training + time + location + price + payment badge
[Decline] [Accept] buttons per card
Avatar row tappable → athlete profile
After accept: event created, athlete added to clients if new
Empty: inbox-zero — no CTA (nothing to act on, requests arrive asynchronously). Loading: 3 skeleton cards matching request layout (avatar + text + button row).
Accept → card fade-out, snackbar «Request accepted — event added to calendar», bell badge decrements. Decline → fade-out, snackbar «Request declined». When last card is handled, screen auto-transitions to Empty (inbox-zero) and bell badge hides.
Coach
Client Detail
Full athlete profile from coach's perspective.
Header: avatar, name, location, sport chips — always visible (instant header, reused from list)
Stats card: Sessions | Upcoming | Revenue | Owed. Fresh = all zeros in muted color.
Pending Payments: section appears only when unpaid exists (hidden at 0). Tap Mark Paid → card fades, snackbar confirms, Owed/Revenue stats update, badge decrements. Last card cleared → whole section collapses.
Upcoming Sessions: carousel of cards; when empty → outline card with Schedule training CTA
⋯ menu (header right): floating iOS UIMenu pattern. Menu items scoped per client state: • Normal → Schedule training / Edit / Archive / Block • Deleted → Archive only (can't act on a gone account) • CRM → Invite to app / Invite to training / Edit / Archive (no Schedule — no push target; no Block — not in app anyway)
Status banners at top: Archived (gray, Restore) / Blocked (red, Unblock) / Deleted (gray, date-stamped, no action).
CRM indicator: small teal CRM pill inline next to name (same pattern as in Clients list). No banner — less visual noise. «Invite to app» action lives in ⋯ menu.
Schedule training (⋯ menu + fresh-state Upcoming CTA) → navigates to invite.html?mode=schedule&origin=s-client-detail. Reuses Select Training + Date/Time screens with Request-badge review instead of Invitation-badge. Send Request → back to Client Detail.
Coach
Client History
Full training history with athlete.
All past events: name, date/time, location, price, status
Completed + Paid: green label
Cancelled: red label, price struck through
Sorted newest first
Empty: brand-new client with 0 past sessions — no CTA (coaches initiate training from Client Detail, not here).
Coach
Archived & Blocked
List of clients removed from active Clients tab — by archive (soft) or block (hard).
Segmented tabs: Archived / Blocked with counts
Muted cards (opacity avatar) — signals inactive status
Restore / Unblock buttons: single-tap (no confirm) → snackbar feedback
Tap card → Client Detail with status banner (see banner preview in Client Detail annotation)
Archive = soft, reversible, athlete unaffected — a new request brings them back
Deleted badge (Karl L.) — athlete who deleted their account AND was archived by coach. Compound state. Restore still works: returns to active list with Deleted badge intact.
Entry: "Archived & Blocked" row at bottom of Clients list (iOS Mail "Trash" pattern).
Coach
Client Notes Editor
Full-screen editor for coach's private notes about an athlete. Same pattern as About Me editor — Cancel / title / Save header, contenteditable body, no character counter.
Opens from Notes card on Client Detail (tap whole card — filled or empty variant)
Accumulating journal: injuries, preferences, payment habits, personal reminders
No length limit — notes grow over months of coaching
Keyboard auto-opens; Save pops back to Client Detail
Distinct from event note (group training, per-session, 200 char limit) — client notes are long-lived and persistent.
Coach
Create Client
CRM card for athletes without app account.
First name / Last name — required
Phone or Email — optional, but if filled validates format (must contain @ for email, or start with + / digit for phone)
Sport — dropdown from coach's sports
Notes — tap opens full-screen editor (injuries, preferences)
Validation: tap Create Client → red border + red label on missing/invalid fields (all at once) + auto-scroll to first error + snackbar «Please fill in required fields» for 2.5s. Error styles auto-clear after 3s so user can retype. Mirrors Create Session pattern.
Created athlete appears in Clients list. Coach can track sessions/payments.