9:30●●●● 🔋
April 2026
06:00
07:00
08:00
09:00
10:00
11:00
12:00
13:00
14:00
15:00
16:00
17:00
18:00
19:00
20:00
21:00
22:00
Dentist appointment
15:00 - 16:00 · Google
Quick Stretch · 07:15 Missed
Express Boxing Review
Anna K. · 08:00 - 08:30
Morning HIIT
09:00 - 09:45
5/10
HIIT Group Session
10:00 - 11:00
7/10
Basketball Training
Mark S. · 12:00 - 13:00
Yoga Morning Flow
13:00 - 14:30
📍 GYM Bro
15/15
Padel Training Awaiting
Julia D. · 16:00 - 17:00
HIIT Group Session
18:00 - 19:00
3/10
Boxing Training Request
Tom N. · 19:30 - 20:30
Can’t move to this time — slot occupied
Create Event
Personal Event
Group Event
Custom Event
Confirmed session
AK
Anna K.
Basketball Training
08:00 – 09:00
TNT Studio
€50 Card
Confirmed group session
HIIT Group Session
10:00 – 11:00
TNT Studio
€25/person 7/10
Reschedule
HIIT Group Session · Thu, Apr 10
This session will be moved. 7 participants will be notified.
Cancel Training
HIIT Group Session · Thu, Apr 10
This session will be cancelled. 7 participants will be notified and refunded.
Dentist appointment
External event
Google
Thu, Apr 10 · 15:00 – 16:00
This event is managed in Google Calendar. Open the Google Calendar app to edit or delete it.
Reschedule HIIT Group Session?
Thu, Apr 10 · 10:0014:00
2 of 7 participants have a conflict at this time.
JD
Julia Dent
Booked: Padel Training · 14:00
TN
Tom Novak
Unavailable: 13:00 – 15:00
Conflicted participants will be notified and refunded. Remaining 5 participants will be rescheduled.
HIIT Group Session
Tomorrow · 10:00 · 22h remaining
Minimum not reached
2 of 5 athletes joined. You can still run the session with current participants or cancel.
Participants 2 / 5 min · 10 max
9:30●●●● 🔋
HIIT Group Session
HIIT Group Session
Thu, Apr 10 · 10:00 — 11:00
€25
/person
TNT Studio Card
Participants 7 / 10
Note to athletes
Please bring a yoga mat, water, and a small towel. Session starts at 10:00 sharp — arrive 5-10 min early to warm up. Lockers + showers available. Park on the south lot (free). See you!
Participants (7)
No athletes joined yet
Share the link to let athletes book this session.
AK
Anna Kowalski
fitness
Remove
MS
Mark Schmidt
fitness, crossfit
Remove
JD
Julia Dent
fitness
Remove
TN
Tom Novak
fitness
Remove
LR
Lena Roth
yoga, fitness
Remove
PW
Paul Weber
fitness
Remove
SK
Sara Kim
fitness
Remove
View Profile
Send Message
Note to athletes
Visible to everyone joining this session.
Athletes will be notified of changes. 184 / 200
Invite athletes
Reschedule
Cancel training
Invite athletes
Share a link to this session
Join my HIIT Group Session — Thu, Apr 10 at 10:00
TNT Studio · €25 · 3 spots left
321.fit/e/xK3aB
WhatsApp
Telegram
Instagram
Messages
More
1 athlete removed Undo
9:30●●●● 🔋
Event completion
HIIT Group Session
Tue, Apr 7 · 10:00 — 11:00
€25
/person
TNT Studio 5 participants
Paid:4 / 5card auto · tap cash to confirm
JD
Julia Dent
fitness
Cash
Paid
Remove
Mark as Paid
View Profile
Remove from Training
Coach

Coach Calendar

Behavior details

Day Navigation

Tap day on strip = instant switch. Swipe day strip = scroll. Swipe content left/right = page transition (Apple Calendar). Day strip auto-scrolls to selected day.

Month View Toggle

"April 2026 ▼" — tap title + chevron expands month grid. Day strip replaced by full month calendar. Tap a day = collapse back to day strip with selected day. Same component across all calendar screens (Coach, Athlete, Booking, Invite).

Drag & Drop

Long press event → event lifts, enters drag mode. Drag within same day only. Coach's own slot occupied → blocked. Unavailable zone → blocked. Participant conflicts → warning dialog "2 of 7 have conflicts. Move anyway?" Coach decides. Drop releases event at new time.

Day Strip Dots

p=personal (green), g=group (cyan), e=external (gray). At-a-glance overview.

Unavailable Zones

Hatched diagonal pattern = outside coach's available hours OR blocked by external calendar.

External Events

Imported from Google/Apple Calendar. Full-width, opacity 0.7, anonymized (title only).

Event Status System (6 states)

All non-Planned states share the same visual grammar: colored 10% bg tint + 1px perimeter + 3px left stripe + inline pill next to title. Pill appears inline (not absolute-positioned) — reads as part of the title. Colors map to semantic roles, not to coach/athlete roles.

  • Planned — teal (dark: teal-400 / light: teal-600) for personal, blue-400/600 for group. Base surface, no perimeter. No pill.
  • Request (incoming, pre-event) — yellow-600 perimeter + 10% yellow bg + yellow pill "Request". Athlete asked, coach needs to Accept/Decline.
  • Awaiting (outgoing, pre-event) — gray perimeter + subtle bg + gray pill "Awaiting". Coach sent request, waiting for athlete response. Muted because passive.
  • Review (post-event, unfinalized) — same yellow visual as Request. Event ended, coach hasn't opened Completion screen yet. Yellow because coach action needed — consistent lane with Request.
  • Missed — red-400 perimeter + 10% red bg + red pill "Missed". Explicit no-show or auto after N days without coach review.
  • Finished — base card at opacity 0.5, no pill, no perimeter. Past events that coach confirmed via Completion flow. Time + fade are sufficient signal; pill would be redundant.

Group events use only 4 of these states: Planned, Review, Missed, Finished. Request and Awaiting don't apply — group is a template, athletes join without approval.

Cancelled events disappear from calendar entirely (not a visible state). All visible statuses retained for 2 months, then archived.

API

GET {role}/training-events/?startDate&endDate
GET coach/training-events/allowed-hours/
PATCH {role}/training-events/{id}/change-status/

24-hour vertical timeline, 15-min grid snap.

Coach

Group Event Detail

Invite & deep-link

Share link

Generated on-demand via Appsflyer OneLink when coach taps Invite — not pre-generated for all future events. Short URL (321.fit/e/xK3aB) carries event_id in attribution params.

Rescheduled/cancelled events

Deep link resolves by event_id, so reschedule doesn't break it. If event cancelled before athlete opens → app shows "Event unavailable" and redirects to coach profile.

Caching

Backend caches short URL per event_id (1 Appsflyer call per event lifetime). Client caches per session.

"Ticket card" layout — compact summary + note + participants.

Coach

Event Completion

Entry & flow

Entry point

Push notification after event end time: "Training ended. Tap to review and complete." Deep links to this screen.

Unpaid cash

Does NOT block completion. Stays as cash_pending record. Coach can see unpaid athletes in training history.

Post-training screen. Coach reviews payments and completes training.