Add athletes, import a CSV, invite them to sign in, and the under-13 guardian flow
Roster, Invites & Guardians
Your roster lives under Athletes (/athletes). Adding an athlete records them; inviting them gives them a login. Athletes only ever join by coach invite.
The roster page
- Search, skill-level pills (all / beginner / intermediate / advanced / pro) and an Only mine toggle.
- The table lists Athlete / Level / Stance / Age / Sessions; click a row to open the profile.
- Add Athlete opens the wizard; Import CSV opens the importer; Merge duplicates appears for coaches who may delete athletes.
Add an athlete
The wizard is sized to your workspace tier:
- Instructor workspaces — two steps: Who are they? (name, and optionally email, age, stance, skill level) → Details (country, gender, years surfing, home break, bio).
- Pro Coach workspaces — three steps: Who are they? → How will you coach them? → Details. The first step adds a search across LiveHeats and the WSL athlete index (picking a LiveHeats athlete also offers their ranked series so standings and results import with them), or a manual entry; the second picks Training or Contest mode and, for contest athletes, enrols them in one of your circuits.
Finish with Add Athlete (or Skip & Add to leave the optional details blank). The coach who creates an athlete is assigned to them automatically.
Import a CSV
Import CSV (/athletes/import) walks Upload → Map columns → Review → Done. Surflink suggests a column mapping; the only required column is name. Roster import is CSV only.
The athlete profile
/athletes/[id] is the athlete's command center:
- KPI tiles adapt to the athlete: training athletes see Sessions / Drills Due / Upcoming; contest athletes see Best Heat / Best Wave / Heat Win Rate / Circuit Rank from imported results.
- Header actions: Invite (until accepted, then an Active pill), Re-sync (for imported athletes), Edit, Delete.
- Tabs: Overview, Sessions, Drills, Training Sessions, Coaches — and, for contest athletes in a pro workspace, a Compete row with Competition (imported results and heats), Qualifications and Opponents. The active tab is in the URL (
?tab=).
Invite an athlete
Inviting requires the athletes.create permission — the same key that lets you add an athlete (Owners and Head Coaches have it; Assistant Coach, Specialist and Viewer do not).
- Open the profile and click Invite. Surflink generates the link, copies it to your clipboard and, if email is configured, emails it. The button becomes Invite Sent!.
- The athlete opens
/invite/<token>, sees "Join Surflink" with your name and their details, sets a password and creates the account. - Once accepted, the button is replaced by an Active pill.
The invite page shows only the athlete's name, level and stance and your name — never an email or an id — and is rate-limited. A used or expired link says so and offers Sign in instead.
The two age rules
Surflink enforces two thresholds:
- Under 13 — the athlete cannot hold their own login. The invite link sends a parent or legal guardian to
/invite/<token>/guardian, where they create their account, confirm their relationship and consent, and manage the athlete's profile from it. The consent is recorded. - Under 16 — nothing about the athlete is ever published publicly. (Surflink has no public athlete pages at all.)
The age gate is checked on the server from the athlete's date of birth and fails closed.
Merge duplicates
If the same athlete ends up on your roster twice, Merge duplicates lists athletes who share a name; pick which one to keep and confirm. Sessions, results and standings move to the survivor; the other row is soft-deleted. It requires athletes.delete, is irreversible, and is recorded in the workspace audit log.