Skip to content

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):

ColumnRequired for parentRequired for athlete
family_name
kindparentathlete
nameoptional
emailemail or phone
phoneemail 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

  1. Go to /coach/families/import.
  2. (Optional) Tap Download template to grab a starter CSV.
  3. Paste your CSV into the textarea.
  4. Preview — the importer counts families / parents / athletes and lists any rows it’ll skip (and why).
  5. Review the preview. If rows are being skipped, fix them and paste a new version.
  6. Confirm and import.

You land on a summary showing what got created vs merged vs skipped.

Merging rules

  • Families are merged by exact family_name match (case-sensitive). If Smith Family already exists, new rows for Smith Family add 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

  1. Verify counts on the result page.
  2. Spot-check a few families at /coach/families/<id> — athletes in the right groups, parents listed correctly.
  3. 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:

  1. Go to /coach/families.
  2. 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.
  3. 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 Familysmith). 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.