Skip to main content
Help centre
Migration

How do I move my members from a Google Sheet?

The most common path onto Freyaa. CSV import accepts every column you'll typically have in a sheet — it just needs an email column to land cleanly.

4 min read·Updated 2026-04-29

Before you start

You need:

  • A column named email in the sheet — this is the one mandatory column.
  • Optional: name, role (member / staff / admin), tier (whatever you've called your tiers — they're matched by name on import), and paid_through (see "Pre-paid members" below).
  • Owner access to your Freyaa dashboard. The bulk import lives at /dashboard/members/import.

You don't need to delete duplicate rows or sort the sheet. The importer skips rows with no email and reports them in a summary at the end.

Step 1: Export the sheet to CSV

In Google Sheets, File → Download → Comma-separated values (.csv). In Excel it's File → Save As → CSV UTF-8. Either works. Don't worry about quoting or escaping — the importer handles standard CSV from both tools.

Step 2: Upload it

Open /dashboard/members/import. Drop the CSV onto the upload area. You'll see a preview with the first ten rows; check the columns line up with the labels Freyaa expects.

Click Import. The importer runs synchronously for files under ~5,000 rows and queues anything larger. You'll get an email when it finishes if it queues.

Step 3: Tell members

Imported members don't automatically get an email — they sit as "invited but not activated" until they sign in for the first time. There's a one-click "Send welcome emails" button on the members list once the import is done. That triggers thewelcome lifecycle drip for each member.

First sign-in flow: the member receives a magic link, sets a password, and lands on their member portal at your subdomain.

Pre-paid members (the 6 / 12-month dues case)

Most clubs collect dues offline once or twice a year. When you migrate, you don't want Freyaa to charge those members again on day one. Add a paid_through column with the date their offline payment covers them through:

email,name,tier,paid_through
mira@example.co,Mira Patel,Adult,2026-11-01
jamie@example.co,Jamie Reyes,Adult,2026-05-15

Accepts YYYY-MM-DD or DD/MM/YYYY. On import the membership is marked pre-paid through that date. When the member adds a card and starts their Stripe subscription, Freyaa passes trial_end = paid_through to Stripe — the first card charge lands at renewal, not on signup. No double-charging.

Members without a paid_through field are billed normally on subscription start. You can mix pre-paid and not in the same CSV.

Past bookings — usually skip

We strongly recommend not migrating historical bookings. They take time to map (court ids change, time zones drift), they don't earn your front desk anything, and members already know what they booked. If a member asks about an old booking, just point them at the original record. After 60-90 days no one asks any more.

Gotchas

  • Trailing whitespace in emails. The importer trims it but flags rows where the original had trailing spaces — useful for spotting copy-paste errors.
  • Tier names that don't match. If your sheet has "Full Member" but you've created a tier called "Adult" in Freyaa, the import drops the tier and lands the member without one. Rename in the sheet first or match the tier in Freyaa.
  • Capitalisation in emails. Doesn't matter — emails are stored lowercased.

Did this help?

If anything's missing or wrong, email us — we update articles when readers point things out.

Email feedback