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 — oractive) 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.