All articles

Importing your club

In progress

Bringing last season's families, extra family members and memberships across from a spreadsheet: upload, map the columns, check the dry run, commit, work the reject list — and undo it if it went wrong.

In progress. Part of this works today. The article says which part.

Written for Club staff

A club does not open its doors by typing three hundred and twelve households. Households → Import from a spreadsheet (or Import last season on an empty roster) brings families and the people in them across from a CSV. You need the registrar's permission (manage_club_members).

Choose what the file holds when you upload it:

  • Families — families and the people in them, created or matched.
  • People joining families already here — one line per person, each naming a family that is already on the roster by its member number, family email or record id (hh_…, on the family's page). A line whose family is not found is rejected; this kind never creates a family.
  • Memberships — one line per family: the family (as above) and the membership type by name, with an optional season (blank is the current one), status (pending — dues outstanding, the default — or active) and joined date. Families are not emailed about a membership an import brings across. A family that already holds that membership for the season is "already here"; one holding a different membership that season is rejected.

Get the file ready

  • CSV, headings in the first row. In Excel or Google Sheets, save or download as CSV.
  • One line per person — parents and swimmers alike.
  • A column the lines of one family share — a family or account number from the old system. Lines with the same value become one household. If there is no such column, the family's name works instead.
  • First and last name on every line, and either a date of birth or a role (parent / swimmer) so we can tell adults from children.

Useful if you have them: member number, address, family email, the person's own email and phone, competition gender, relationship, and yes/no columns for "can pick up", "pays the bills" and "gets billing email". Each person's emergency contact (name and phone, and the relationship if you have it) and a one-line medical alert for the desk come across too — the medical column needs the read_medical permission to map. Neither replaces what a person already has: a contact with the same phone is not added twice, and an existing medical line is left alone.

1. Map the columns

We guess what each column is from its heading. Correct anything wrong, and set a column you do not want to Not imported.

2. The dry run — mandatory

Run the dry run checks every line against the roster and changes nothing. Each line comes back as one of:

  • New — nobody on the roster matched; the person will be created.
  • Already here — the same person (same email and first name, or the same name and date of birth) is already in that family. Nothing is written.
  • Joined a family — the person is on the roster with no family; they will be added to this one.
  • Rejected — not imported, with the reason: a missing name, a date we cannot read, two roster people with the same name and birth date, someone already in a different family. A rejected line is never silently dropped.

A family is matched to an existing household by member number, then by a matched person's family, then by the family email.

Updating people already here is off unless you turn it on. Under the mapping, tick each field the file should overwrite for people and families already on the roster — phone, email, address and so on. Only the ticked fields change, a blank cell never clears anything, and the dry run shows every change on its line ("Updated from the file: Phone") before anything is written. Each change is in the audit log under the import.

3. Commit

The commit button stays off until you have looked at the dry run's lines. Committing adds each family in its own step, so one bad line rejects that line and not its family. A large file runs in the background with a progress bar — you can leave the page and come back.

Every household, person and family seat an import creates is in the audit log with the import's id (imp_…) on it.

4. Work the reject list

Download the reject list gives you the rejected lines with the reason in front of each, in your file's own columns. Fix them and import the corrected file as a new import. The same file cannot be committed twice.

Undoing an import

For seven days after a commit, Undo this import takes it back in one step: everyone and every family it created is archived, the family seats and memberships it created are removed, its emergency contacts are deleted, and every field it updated goes back to what it was. A field somebody has changed again since is left as they set it, and the page lists those.

The undo is refused — and nothing changes — if anything the import added has been used since: someone it added has been checked in, a membership it created has dues posted against it, or someone it added has had a membership sold to them since. Change those families from their own pages instead. The undo is in the audit log under the import.

What is not built yet

  • Balances, swim times, the waitlist and the chart of accounts. Open registration for the season, or add them by hand.
  • One-line-per-family sheets with "Child 1 / Child 2" columns. Reshape them to one line per person first.

Related

Looking for something else?

Search every article, or ask your club — SwimWin support cannot see inside a club’s roster, and your club can.