Importing families from CSV
At the start of the season, you usually have a roster spreadsheet from registration. The CSV importer takes that data, creates families
- athletes + contacts in one pass, then you invite parents one family at a time (or all at once from the families list).
Live at /coach/families/import.
CSV format
One row per record (a row is either a parent contact or an athlete, not both):
| Column | Required for parent | Required for athlete |
|---|---|---|
family_name | ✓ | ✓ |
kind | parent | athlete |
name | optional | ✓ |
email | email or phone | — |
phone | email or phone | — |
group | — | ✓ (exact group name) |
Group must match the exact name of a group you’ve already
created (see Calendars & groups). E.g.
U14, not u14 or U-14.
Step by step
- Go to
/coach/families/import. - (Optional) Tap Download template to grab a starter CSV.
- Paste your CSV into the textarea.
- Preview — the importer counts families / parents / athletes and lists any rows it’ll skip (and why).
- Review the preview. If rows are being skipped, fix them and paste a new version.
- Confirm and import.
You land on a summary showing what got created vs merged vs skipped.
Merging rules
- Families are merged by exact
family_namematch (case-sensitive). IfSmith Familyalready exists, new rows forSmith Familyadd into it. - Parents are deduped by email (case-insensitive). Adding a row with the same email twice doesn’t create a duplicate contact.
- Athletes are deduped by
name + group. Re-running the same CSV is safe.
What does NOT happen on import
- No invite emails are sent. The importer creates records only.
- Families show as draft in the families list. Send invites one by one when you’re ready.
Common gotchas
- Group not found — the importer skips the row and tells you in
the error column. Create the group first at
/coach/calendars, then re-paste the row. - Parent rows with no email and no phone — skipped. Need at least one contact method.
- Athlete rows with no name — skipped.
- Whitespace in family_name —
"Smith Family"and"Smith Family "are treated as different families. Trim before pasting.
After importing
- Verify counts on the result page.
- Spot-check a few families at
/coach/families/<id>— athletes in the right groups, parents listed correctly. - Send invites — see Bulk-inviting families below for the fast path, or invite one-by-one from each family’s detail page if you’d rather stage the rollout.
Bulk-inviting families
Once families are imported (or any time you have a batch of draft families to invite), use the bulk-invite flow:
- Go to
/coach/families. - Each draft family with at least one parent email has a checkbox in the leftmost column. Check the ones you want to invite, or tap Select all eligible in the bar above the table.
- Tap Send invites to selected (N).
What happens:
- For each selected family, every parent contact with an email gets their own single-use claim link (valid 7 days).
- A slug is auto-suggested from the family name (e.g.
Smith Family→smith). The parent can change it during the claim flow. - A breakdown shows up at the top of the page — sent / partial / skipped per family.
Families that are already claimed, archived, or have no email contacts are skipped automatically (with a reason).
If both parents click their links, whoever claims first wins —
the second link no-ops with a “this family is already claimed”
message. They just visit ts.onsnowlive.com/<slug> to use the
family page.