Skip to content
← Help center

Getting started

CSV member import

Preview a CSV, resolve skipped rows, apply your import, and prepare member access.

Club staff · 4 min read

Follow these steps at your club’s own website. Available screens and actions depend on your account’s role and the programs your club has enabled.

Overview

Member import (Admin › Member import) is for bulk-loading household and contact rows. It is admin-only and deliberately money-safe.

Two-phase flow

  1. Dry run: upload or paste CSV. The server shows a per-row plan and a payload hash. Nothing is written. Each row plans as one of: Create household + member, Create member (attaches to a new household created earlier in the same file), Attach to existing household, or Skip. There is no "update" action: import never edits an existing household's fields (see below).

  2. Apply: confirm with the same CSV + hash. If the file changed, apply refuses. Each household's writes land in one transaction. Apply is safe to click twice: rows that already landed on an earlier apply are re-classified as skips the second time, not re-created.

Download the template from the import page so columns match. Row and file size caps protect the Worker: 2,000 rows and 5 MB per file. Split larger rosters into multiple files.

What import does *not* do

Import never creates invoices, membership-year dues rows, or bond ledger entries. After import you still run Renewals / Waitlist / billing flows as appropriate.

Import also never modifies an existing household. No status or address writes on the "attach to existing household" path, only new members attach. If a CSV row would create a new household, that household defaults to status prospect, unless the row carries a valid active membership tier. In that case it's created as member with exactly one active membership row (no invoice, no bond, no membership-year record; billing still has to be run separately). When reviewing the dry-run plan, check which rows carry a tier if you need to know ahead of time which will land as members versus prospects.

Known issue: attaching a tiered member to an existing household never updates that household's status. A CSV row that attaches an active tier to an existing prospect household can leave the household stuck at status prospect even though it now has a live membership — check and manually correct the household's status after an import that attaches tiers to existing prospect households.

A same-address or same-phone match against an existing household blocks the row as a per-row skip, with a warning surfaced for the batch, rather than silently creating a duplicate household. If you see unexpected skips in the dry-run plan, this duplicate guard is the most likely reason. Open the matched household and attach the member manually if the match is correct, or adjust the row if it's a false match.

Messy exports

Real club exports are often messy: odd columns, blank emails, duplicate rows. If your export does not already match the CSV template, send it to Swim Ops and we prepare it for you — mapping columns, quarantining bad rows, and handing back a clean file for the dry-run → apply flow above. You do not need an in-admin prepare tool.

Importing into a trial org

A club evaluating the platform gets its real roster imported into an org still in quiet mode: all outbound member email and SMS is suppressed until an explicit go-live, so a full import, and everything staff rehearse afterwards, happens without any member being contacted. The batch report doubles as the reconciliation record for that trial: "here's your roster, here's every row that needed attention." See Go-live and quiet mode.

Imported contacts get no email until they confirm

Every address an import creates arrives unconfirmed, and the send engine delivers nothing member-facing to an unconfirmed address. Campaigns, dues notices, receipts, workflow email, all of it. Asking those people to confirm is a separate button on this page (Email confirmation › Send confirmation emails), never part of Apply, so you can import, inspect, delete, and re-import until the roster is right without contacting anybody. See Email confirmation for the full flow, what counts as proof, and what to do about people who never click.

Portal logins after import

Import automatically attempts to provision a portal login for each newly created user, immediately after that household's row commits. This is best-effort and silent. There's no success/failure signal in the import UI, and a failed attempt isn't retried automatically (a backfill script is the only automated retry path).

If an imported adult can't sign in, don't assume the automatic attempt worked: open the household's People tab and use Create portal login as the manual recovery step. It's safe to click even if a login already exists.