People and roles
Who someone is at a club. A role is club-wide; everything else is a relationship to particular records.
- Owner
- The person who registered the club. Everything an admin can do, plus deleting the club, transferring ownership and exporting a child's data. A club always has exactly one.
owner- Admin
- Runs the club's office: members, sponsors, supporters, tickets, audit log, and all the football.
admin- Technical director
- Runs the football across every team: seasons, teams, players, assessments, training, matches, notes, exercises, and the documents attached to a session. Not members, guardians or money. The API's word for the role is `director`.
director- Staff
- A club member with no appointment yet. Can see the club exists and its seasons — nothing else until appointed to a team.
staff- Member
- Anyone in one of the four club roles. Parents, players, sponsors and supporters are never members.
member- Coach
- Appointed to one team season — the one team role. Assesses, plans team training, assigns personal training, writes notes, manages the players; sees the staff list.
COACH- Guardian
- A parent or carer who follows one child. Not a member. Reads the child's development and family-visible notes, records the child's personal training.
guardian- Player (own login)
- A child whose record is linked to their own account. Sees themself only: their development and My training — their personal routine, which they can mark done.
self- Sponsor representative
- Represents a sponsor company. Sees the sponsor's page and counts across the clubs it backs — never a player. Admin representatives invite colleagues.
SPONSOR_ADMIN · SPONSOR_MEMBER- Supporter
- Anyone who chose to follow a club. Sees the club's public face and what is on sale.
supporter- Ticket owner
- The account a season ticket was issued to. Reaches that ticket and the club's public listings.
ticket-owner
The club
The container everything else lives in.
- Club
- A football club or academy. In the system it is a Better Auth organization; its profile (country, timezone, badge) is ClubHub's.
club · organization- Season
- A named period at a club, e.g. 2026. One is current.
season- Team
- A team as an identity that outlives a season — U10 Tigers.
team- Team season
- A team entered into one season. Staff are appointed to it and players assigned to it. Most coaching screens are about a team season.
team season- Appointment
- A staff member's role on one team season. Ended, never deleted.
team staff assignment- Roster (team)
- The players assigned to a team season for the season, through `TeamPlayerAssignment` — on screen the team's **Roster** ("17 on the roster"). A team season *has* a roster; it does not own the players — a **Player** is a durable person. Not the **matchday squad**, which is picked from it.
players- Roster (club)
- A player on a club's roster for a season. This is what puts a child inside a club's boundary. On screen it is the **ClubHub season roster** — the club's own record, never a Football NSW registration or clearance. Taken off, not deleted.
player registration- Transfer
- Moving a player to another team season. The old assignment is marked transferred and a new one opens.
TRANSFERRED- Staff invitation
- The club office inviting someone to become a member in a role. Accepted on a confirmed address.
invitation
The player
A person, not a club's record.
- Player
- A child (or adult) who plays. Has a profile, may have an account, may be registered with more than one club.
player- Position
- Primary position, plus optional secondary positions.
GOALKEEPER · DEFENDER · MIDFIELDER · FORWARD- Preferred foot
- —
LEFT · RIGHT · BOTH- Player status
- Active, inactive (paused) or archived (kept, hidden).
ACTIVE · INACTIVE · ARCHIVED- Has account
- Whether the player's record is linked to their own login.
linkedUserId
The development loop
The heart of the product: review the player, choose a focus, assign personal training, review again.
- Skill
- One thing to be good at — first touch, positioning, resilience. Scored in whole levels, 1 to 5.
skill- Skill category / Domain
- An area of the game. On screen: Technical, Game IQ, Physical, Mental, Team & Social (the default; a club can have its own).
skill category- Taxonomy
- The club's full set of categories and skills — its vocabulary. Seeded when the club is created. No template ever mirrors all of it.
taxonomy- Assessment
- One coach's scoring of a player's skills — a **Player development review**, never a verdict on one evening. Never edited or overwritten; a new assessment is a new record.
assessment- Player development review
- What every assessment is: the broader look at how a player is doing, taken on purpose. It carries no session and no fixture — a session's own record (register, plan, result, the player's reflection) describes the occasion; the review describes the player.
assessment- Development stage
- The age band a template is shaped for: Foundation U6–U9, Developing U10–U12, Youth U13–U16, Performance U17–U18.
age groups- Assessment template
- What a coach is asked, per development stage: the criteria worth observing then, core first, with position criteria where useful. It shapes the sheet, never forces a write.
assessment template- Core criteria
- The criteria always included for every player at that stage. The rest are used when appropriate; criteria a position owns are asked only of its players.
core- Coach's picks
- On one assessment: the strength highlight, the next focus, and a one-line note — the words the family reads.
strength · next focus · comment- Not observed
- A criterion left blank. Never forced, never recorded — the analytics only hold what a coach actually saw.
omitted- Self-assessment / In their own words
- The player's answer after training or a match: what went well, what was hard, what to improve, plus effort · confidence · fun. Written by the player or a guardian; read beside the coach's picture, never averaged into it.
player self assessment- Assessment sheet
- The team's players against the criteria resolved for their stage, last scores beside each skill — so a coach can review a team in minutes.
assessment sheet- Bulk assessment
- Saving the sheet: all players at once, all or nothing.
bulk- Score / Level
- Whole levels 1–5, each with a name: Needs Support, Developing, Competent, Strong, Excellent. Children and families see the name and dots, never the number.
1–5- Development Engine
- The one place strengths, improvements, category averages and consistency are computed from the evidence. Every screen renders its answer; none recompute it. It suggests — the coach's chosen focus outranks its arithmetic.
engine- Strength / Superpower
- A skill the player is already strong in. Superpower is the child's word.
strength- Next focus
- The coach's deliberate choice of what a player works on next. ClubHub suggests from the review's own evidence; the coach decides — a low score never becomes the focus by itself. Blank is a valid answer.
next focus- Current focus / Work on next
- The focus in force now — the coach's most recent pick. It drives the player's personal training. Work on next is the player's word for it.
current focus- Improvement / Getting better
- A skill that went up between the two most recent assessments.
improvement- Progress
- The summary for one player: strengths, current focus, improvements, category averages, consistency, match form.
progress- Development framework
- What the club develops and assesses for a team's stage — its resolved templates in one readable view (in the iOS app today).
development framework- Trend
- A skill's full score series over time, for charts.
trend- Goal
- A target score on one skill, set by a coach with the player. Achieved is stamped once.
ACTIVE · ACHIEVED · ARCHIVED- Observation / Coach note
- Something a coach wrote about a player, with an explicit audience.
observation- Visibility
- Who a note (or other record) is for. Private is the author's alone — even from the club office.
PRIVATE · COACHING_STAFF · CLUB · FAMILY
Events
What happens at a time. Three kinds — a team training session, a match, and a day of a player's personal training — share one stage ladder and one read model; they stay three records underneath. Events is what the API calls that read model. It is **not a door**: a reader is offered **Games** and **Sessions**, one kind of thing each.
- Event
- A team training session, a match, or a personal training day: when, what, and where it stands. The kind is named in full — never the bare word "training". Events is a read model: it owns no record of its own, and no screen is called Events.
TEAM_TRAINING · MATCH · PERSONAL_TRAINING- Games
- The door onto the matches, and only the matches: the club's, one team's, or one player's — a day at a time by default, or a week or a month. A door name — the thing behind it is still a match, still added with **Add a fixture**.
/clubs/:id/games`, `?types=MATCH- Sessions
- The door onto team training: the sessions a coach plans, runs and reviews. A player's **personal training** days ride along — one toggle away for a coach or the office, there from the start in a player's or a family's own Sessions. Rows say which kind each is.
/clubs/:id/sessions`, `?types=TEAM_TRAINING[,PERSONAL_TRAINING]- Event key
- An event's identity across the sources its ids come from: the kind, then the id — and for a personal training day, the plan and the club-local day, since nothing is stored for it. The key for any mixed list, cache, cursor or deep link — never the bare id.
TEAM_TRAINING:<id> · MATCH:<id> · PERSONAL_TRAINING:<planId>:<YYYY-MM-DD>- Event source
- Where one kind of event is read from: the training sessions, the matches, or the training plans. Events composes the sources and pages the merge; a source answers in the calendar's shape and never reaches into another domain's rules.
TeamTrainingEventSource · MatchEventSource · PersonalTrainingEventSource- Next event
- The soonest event still ahead, whichever kind — a session, a match, or the player's own routine day. A "Next up" row names the kind and opens that event.
upcoming[0]- Stage
- Where an event sits in its life, judged by the API on the club's own calendar day — the same rule wherever an event is shown. A session: **Upcoming · plan it**, **Today · run it**, **Held · review it**, **Reviewed**, or **Cancelled**. A match: **Upcoming**, **Today · record it**, **Played · record the result** (its day has passed and nobody recorded it), **Played · review it**, **Reviewed**, or **Cancelled**. A personal training day: **Upcoming**, **Today**, **Done**, or **Missed** — never reviewed, recorded or cancelled; nothing is presumed of a routine. Derived, never stored — and the API refuses any transition the ladder does not allow.
PLAN · RUN · RECORD · REVIEW · DONE · CANCELLED · MISSED- Schedule
- A view inside a door, never a door of its own: the club's calendar by window (a day, a week, a month), every team at once, with collisions marked. The office's operational view; behind Sessions it shows team training, behind Games the fixtures, and personal training only when asked.
GET /clubs/:clubId/events/schedule- Location
- Where an event is held, in the club's own words — a pitch, a hall, a park. The one fact two events can collide on. "Pitch 2" and "pitch 2" are one place.
location- Conflict
- One team with two events whose times overlap, wherever they are. Two different teams sharing a pitch is not a conflict. A state of the schedule, not a screen: marked where it happens, and answered before it happens — "is this team free at 17:30?" — with a way out: the time the team is free again. A personal training day belongs to no team and is never a conflict.
conflictsWith · GET …/events/conflicts- Reviewed
- The closed stage. A match reaches it with the coach review; a session when the coach taps **Mark review complete**. An assessment referencing a session proves evidence exists, never that the review is done — partial reviews are allowed on purpose.
DONE- Held
- A session was held: the register was taken, an assessment landed, or the coach said so. Stamped on the session, never inferred from the calendar alone — and never before the session's own club-local day. Once evidence references the session it cannot be un-held: the evidence proves it happened.
completedAt- Event video
- One recording of one event — a team training session or a match, and nothing else. Stored in object storage; the bytes never pass through the API, and every URL to them is signed and short-lived.
EventVideo- Ready
- A recording ClubHub has read and can play: the object was found, its streams were probed, and the video is H.264 with sound a browser decodes. Not "the upload finished" — a container is not a codec, and a `.mov` holding ProRes is **Failed** with a reason a coach can act on. The length, size and dimensions are all measured here and never reported by a client.
EventVideoStatus.READY- Failed
- Terminal. A recording that could not be read or cannot be played stays failed: "try again" is a fresh upload to a fresh key, not a second attempt at the same object.
EventVideoStatus.FAILED- Clip
- A moment a coach cut out of a recording: a start, an end, a title, and the players and skills it is evidence of. Saving is instant; ClubHub then cuts it into **its own short video file**, frame-exact, and that file is what families watch — never the recording it came from. Staff can watch it on the recording while the file is being made.
VideoClip- Clip file
- A clip's own video, cut by the server after the clip is saved or its start or end moves. **Preparing** until it is made; a shared clip is not watchable by families until then. See ADR 0022.
rendition- Clip visibility
- Who may see a clip. **Staff only** is a coach's working note and the default; **Shared** reaches the players tagged in the clip and their guardians — never the rest of the team. The same visibility vocabulary the coach notes and the timeline use.
COACHING_STAFF · FAMILY- Video evidence
- A clip on a player's own development record, beside their assessments and named in the club's own skills. Nothing is copied onto the player: the clip is found by the tag it already carries.
video-clips- Evidence for a score
- The clips behind one skill's level. **Derived, never stored** — a clip already carries the skills it was tagged with and a score is already about a skill, so there is no link to keep in step: retag a clip and its evidence moves, archive one and it leaves. Narrowing to a skill narrows **within** the reader's reach and never around it, so a family still sees only what a coach shared.
?skillId=- Cancelled
- A session that was called off. It stays on the calendar — "we did not train that week" is history a club wants — and takes no register and no evidence. Only possible while the session has not happened; reopening it returns it to the rung its date deserves.
cancelledAt- Club time
- A date and a time a coach enters mean that wall clock **at the club**: the API converts them with the club's own IANA timezone. Never the browser's, the device's or the server's, and never a guessed noon UTC.
heldOn · startsAt · kickOffOn · kickOffTime- Team
- The state of the team rather than its calendar: players, staff, the team picture and attendance — and its own **Sessions** and **Games** faces, which are the club's doors with that team chosen.
team season
Team training
One kind of event: the team on the pitch. A coach plans it, runs it and reviews it. The other kind of training — personal — is what one player does between sessions; the two are never called by the same bare word.
- Training
- Avoided as a standalone label wherever the kind could be ambiguous — a tab, a heading, a button, a "Next up" row. Always say **Team training** or **Personal training**.
—- Team training
- The team's sessions for the season: planned, held, reviewed. Listed under **Sessions**; families see when the next one is and what it is about.
training sessions- Training session / Session
- One team session on the pitch: its date, focus, plan and register. Never "played" — a match is played, a session is held.
training session- Session focus
- The 2–4 skills a session works on — what the evening is about, on the plan and on the night.
focusSkillIds- Session plan
- The session's ordered blocks: what runs, for how long, and the coaching point that matters. Written on the web, run from the phone. Locked, with the focus, once a player's reflection references the session **or** the coach closes its review — what the session was about stops being editable when the record becomes history. The title and the note stay editable: correcting a spelling is administration, not rewriting history.
blocks · assessedAt · reviewedAt- Block
- One step of a session plan: a library exercise or a custom activity, its minutes, and the skills it works on. Snapshotted, so history keeps what was planned.
block- Plan · Run · Review
- A session's stages, judged by the API on the club's own day: Upcoming, Today, Held · review it, Reviewed — or Cancelled. **Planning a session creates no register and marks nothing held**: a future session is not evidence that anyone attended. Held comes from the register, a reflection or the coach's word; Reviewed only from **Mark review complete** — evidence is not completion.
PLAN · RUN · REVIEW · DONE · CANCELLED- RSVP
- A player's "coming / not sure / can't come" before a session or fixture, given by the player or recorded by a coach; a family reads it. Who to expect — never attendance.
rsvp- Register
- Who was at the session, taken on the night. It opens on the session's own club-local day and never before, and saving it is what marks the session held. Everyone defaults to present.
attendance- Attendance
- One player's status at a session.
PRESENT · LATE · ABSENT · EXCUSED- Availability
- Whether a player can make sessions and matches; managed by the family and the team's staff.
availability
Personal training
What one player does between team sessions, aimed at their current focus. The family's word for it is **My training**.
- Personal training
- A coach's weekly routine for one player, aimed at the current focus. Assigned by the coach; done and recorded by the family or the player. It lives under the player — **My training** is the deep experience: what to work on and how — and its scheduled days appear on the calendar under **Events**: when to do it.
training plan- Routine
- The routine itself: a few drills, each so many times a week, and the days of the week it is done on. Assigning a new one retires the old; adjusting keeps the week's completions counting. A routine reserves no pitch and no coach.
ACTIVE · COMPLETED · ARCHIVED- Schedule (routine)
- When a routine is done: its weekdays — their number is the sessions per week — how long a go takes, and, when the family keeps to one, the time of day on the club's clock. Simple youth-sport scheduling; no recurrence engine. Defaults to weekdays spread to match the busiest drill.
daysOfWeek · estimatedMinutes · preferredTime- Personal training day
- One day the routine lands on, projected from the plan on the club's own calendar — nothing is stored per day. It is **Done** the moment any of its drills is recorded that day, **Missed** once the day has passed with nothing recorded. A day the player trained off-schedule is on the calendar too, as done.
PERSONAL_TRAINING:<planId>:<day>- Exercise / Drill
- An entry in the club's drill library, linked to the skills it develops. The one library feeds both routines and session plans.
exercise- Activity
- One drill inside a routine, with its times-per-week target.
training activity- Completion / Mark done
- The family's — or the player's own — record that an activity was done. The one thing a family writes; a coach never can.
training completion- This week
- The last seven days, not the calendar week.
rolling 7 days- Weekly target
- The sum of every activity's times-per-week.
target- Streak
- Consecutive weeks that met the target. The current week never breaks it.
streak- Consistency
- Per-week completions capped at the target, summed, over what was expected. Null with no routine; 0 with a routine and nothing done.
0–1- Works on
- Whether a routine actually develops a skill: at least one of its drills is linked to it. A focus with no routine that works on it is the loop's most common break.
planWorksOn
Matches
The other kind of event. Context beside the development picture — never a skill score.
- Match / Fixture
- A team season's game: opponent, kick-off, venue, result. Added with **Add a fixture**, and listed under **Games** — the door's name, never the object's.
SCHEDULED · PLAYED · CANCELLED- Record · Review
- A match's stages, the match's words for the shared event stage: Upcoming, Today · record it, Played · record the result, Played · review it, Reviewed — or Cancelled. There is no "prepare" step until squad selection and availability exist; the app does not pretend there is.
PLAN · RUN · RECORD · REVIEW · DONE · CANCELLED- Venue
- —
HOME · AWAY · NEUTRAL- Matchday squad
- The players picked from the team for one fixture, and who starts. Named on the fixture page. The team's **roster** is the season-long list it is picked from — the two are not the same list, and the page says "squad" only for this one (and for a team itself). Every player on the team is in one of four states for a fixture: **starting**, on the **bench** (a sub), on **standby**, or not selected. The first two are the lineup and the third is an assignment; not selected is the absence of all of them, not a mark against a child.
lineup- Starting eleven
- The eleven who start. ClubHub is an eleven-a-side app and the picker counts against it — but it is advice, never a rule: a team that turns up with nine still plays, and a short squad saves.
started: true- Formation slot
- One place in a shape — `lcb`, `rw` — with the position it asks for. The editable board is drawn from the slots first and the players are put into them, so a 4-3-3 with the right winger missing shows `LW — ST — [empty RW]` rather than closing up into a front two. Recorded on the fixture with the shape; a fixture from before this reads its positions into the shape they fill.
formation`, `slot- Standby
- Named as a reserve: not in the squad, and the first called if someone drops out. Recorded on the **match assignment**, not the lineup, because it is something a coach asked of a child rather than a place in the team. The design's fourth state is "Out / Injured" over a physio note; this is the half of it ClubHub will keep.
assignments[].standby- Bench
- Picked, and not starting. A bench player who never gets on is still in the lineup at zero minutes, because being named is a fact about the match.
started: false- Position
- Where a player stands for one fixture, in football's own abbreviations: GK; LB, LWB, CB, RWB, RB; CDM; LM, CM, RM; LAM, CAM, RAM; LW, CF, ST. Different from the **team position** a club records about a child for a season, which is one of four broad ones — a defender with nothing more said about them stands at centre back.
position- Line
- The row of the pitch a position stands in: in goal, defence, holding midfield, midfield, attacking midfield, forwards. The board draws one row per line and reads each left to right, so a back four comes out LB, CB, CB, RB however it was picked.
LINES- Formation
- Read off the board, never chosen: the shape is what the lines add up to, and only once eleven are placed with one of them in goal. Picking a shape fills its eleven places — a 4-3-3 asks for a left back, two centre backs and a right back, not for four defenders — and every one of them stays the coach's to change.
FORMATIONS- Match assignment
- What a coach asks of one player for one fixture: the armband, a set-piece duty, expected minutes, a defensive base, and instructions their family reads. Separate from the lineup, so replacing who plays never deletes what was asked of them.
assignments- Lineup
- Who played, started, minutes, goals, assists, and the coach's rating.
lineup- Match log
- What happened in one match, minute by minute: goals, cards, substitutions, corners and staff notes, written on the touchline and correctable afterwards. Staff only. Its minute is written down, not clocked — there is no live match status — and it never writes the fixture's score; the page shows the log's own count beside the recorded result so the two can be seen to disagree.
MatchLogEntry · match_log_entries- A player's match log
- A different thing with the same name: one child's list of the matches they appeared in, on their profile. The match log above belongs to a fixture; this one belongs to a player.
matchLog.items- Match form
- A player's last 90 days of matches in one number and a few counts. Context only.
form- Played for
- How long a fixture was actually played — 70, 80 or 90 minutes depending on the age group, which is why it sits on the fixture rather than in a constant. Null means nobody said, which readers treat as no evidence rather than assuming any of them. Minutes worked out from the match log are measured against it, so a fixture without one can derive nobody's.
Match.regulationMinutes- Holds the ground for
- How long the ground is booked, kick-off to the pitch being free again. A booking, not a match length: it has to cover the longest game plus half-time and packing up, so it is never the number minutes are counted from.
Match.durationMinutes- Coach review
- The coach's notes on a match after it was played.
review
The story
One feed, written as things happened.
- Story / Timeline
- Every moment in a player's development, newest first, in chapters by month.
timeline- Moment / Event
- One entry in the story.
ASSESSMENT_COMPLETED · GOAL_CREATED · GOAL_ACHIEVED · TRAINING_ACTIVITY_COMPLETED · COACH_OBSERVATION · MATCH_PLAYED · PLAYER_SCORED · DEVELOPMENT_PRIORITY_CHANGED- Highlights
- What the story is made of: counts of drills done, assessments, matches, goals.
highlights- Big moment
- An assessment, a goal reached, a goal scored — outlined in the story.
big
Families and invitations
How anyone who is not staff gets in.
- Relationship invitation
- An email link to one address that opens one relationship: a guardian to a child, a player to their own login, a representative to a sponsor. Never club membership.
GUARDIAN · PLAYER · SPONSOR_MEMBER- Accept
- Signed in on the invited address, the person accepts — the moment the relationship exists.
accept- Access grant
- A guardian's reach into one child at one club. What the API reads. Revoked, never deleted.
ACTIVE · REVOKED- Relationship kind
- How a guardian relates to the child.
MOTHER · FATHER · PARENT · LEGAL_GUARDIAN · CARER · OTHER- Family
- The child's guardians and, when linked, the child's own login. The Family tab on the phone; the Family card on the web.
family- Give a login / Account invitation
- Inviting a player to their own account. Links only when accepted on the address.
account-invitation- Link account
- Tying an existing account to a player, for an address that already has one. Fresh sign-in required.
link-account- Add guardian
- The office adds an adult to a child by name, address and relationship. An address with an account is linked at once; one without is invited, and the link is its first login — they choose their own password on it. No temporary password exists. Fresh sign-in required.
POST players/:id/guardians` → `LINKED · INVITED- Resend access
- A fresh set-up link for an invited guardian whose email did not arrive, or whose link has expired. The old link closes. Never for an account that has accepted: there is nothing to regenerate.
resend- End access / Unlink
- Revoking a guardian's grant. The account stays, and so do their other children. The record stays.
revoke
Sponsors, supporters and tickets
Relationships with a club that are not membership and reach no child.
- Sponsor
- A company that backs one or more clubs.
sponsor- Sponsorship
- A sponsor backing a club, or one team season: tier and dates.
ACTIVE · ENDED- Sponsor analytics
- Counts across the clubs a sponsor backs — teams, players on the roster, matches, sessions. Nothing names a child.
analytics- Follow / Supporter membership
- Choosing to follow a club. Anyone signed in can.
ACTIVE · CANCELLED- Ticket product
- What a club sells for a season: name, price, seats per ticket.
season ticket product- Season ticket
- A ticket issued to an account. Ownership reaches that ticket, nothing else.
ACTIVE · CANCELLED- Holder
- A person a ticket admits, named by its owner within the seats.
holder- Entitlement
- What a ticket admits to, and whether it was used.
HOME_MATCH · EVENT
Sign-in and security
- Session
- Being signed in on one device. Listed under Security; any one can be ended.
session- Sign out everywhere
- End every session, on every device — a lost phone.
revoke sessions- Session document
- A file attached to a training session — the PDF a technical director planned it on. Staff only: the office, the technical director and the team's coaches. A family never sees one.
training.document.read- Authenticator app / Two-factor
- A six-digit code from an app, after the password. Required for owners, admins and directors in production.
TWO_FACTOR_REQUIRED- Backup code
- One-time codes for when the authenticator is lost. Shown once at enrolment.
backup code- Fresh sign-in
- Some actions need a session younger than 15 minutes: transferring ownership, removing an admin, linking an account, turning off two-factor.
FRESH_AUTH_REQUIRED- Confirmed address
- An email address proven by clicking its link. Needed to accept staff invitations.
emailVerified- Permission
- A named ability, e.g. player.read. Nobody has one; a relationship carries it over what it is held over.
player.read · development.read …- Not found
- What anyone outside a record's reach is told — the same answer as for a record that does not exist.
404- Audit event
- A record of a sensitive change or security event: who, what, when. Children are involved.
audit
