Import members from a spreadsheet
Adds many members in one go from a .csv file. This is how you move an existing register into GymLedger on day one.
Before you start
Create your plans first. The file has a plan column, and the app can only work out expiry dates for plan names it recognises. Import before your plans exist and every member arrives with no end date, which means none of them will ever appear in Renewals.
Your spreadsheet needs to be saved as CSV. In Excel or Google Sheets: File → Save as / Download → CSV.
Steps
Go to Members and tap Import.
Tap Download Template. You get
member-import-template.csvwith the correct columns and one example row.Open it, delete the example row, and paste your members in under the headings:
Column Required? Notes Name Yes Phone Yes At least 10 digits Plan No Must match one of your plan names Join Date No YYYY-MM-DD, e.g.2026-03-01. Blank means todayExpiry Date No YYYY-MM-DD. Blank and the plan fills it inNotes No Save as CSV, come back, and drag the file onto the box — or tap it and pick the file.
You land on Preview. Every row is listed with a green tick or a red reason. The line at the top reads "N valid · N with errors (will be skipped)".
Fix anything you want to fix — tap Back, correct the file, and drop it again.
Tap Import N members. A progress bar counts through. Don't close the window.
Import Complete tells you how many went in, and lists any that failed with the row number.
Good to know
The first row of your file is always ignored, whatever is in it. Keep your headings there.
Columns are read by position, not by name. You can rename the headings to anything; you must not reorder or remove the columns. Name first, Phone second, and so on.
Plan names are matched ignoring capitals.
monthly,MonthlyandMONTHLYall find your Monthly plan. A name that matches nothing is still saved on the member as plain text — they will show that plan on their row, but they get no expiry date from it.Expiry beats plan. Put a date in the Expiry Date column and it is used exactly. Leave it blank and it becomes join date + that plan's days.
Dates must be
YYYY-MM-DD.01/03/2026is rejected with "Join Date must be YYYY-MM-DD". This is the single most common reason rows fail. Watch out for spreadsheets that silently reformat a date column when you save.Rows with errors are skipped, not fixed. The import runs on the valid rows only; the bad ones are simply not imported and stay yours to correct.
No payments are created. Import brings people in, not their history. Money already collected has to be recorded separately, or left out.
There is no duplicate checking, at all. Importing the same file twice gives you every member twice. If an import half-finishes, do not just run it again — check what got in first.
Members are imported 5 at a time, so a few hundred rows takes a little while. The counter is honest about where it is.
<!-- SCREENSHOT: The import Preview step showing a mix of valid rows and rows with red error text -->
When it doesn't work
"CSV must have a header row and at least one data row." Your file has fewer than two lines. Usually it was saved empty, or saved as
.xlsxand renamed rather than exported as CSV."Phone must have at least 10 digits." The row has a short number, or the phone column got saved as a number and lost its leading digits. Format that column as text in your spreadsheet before exporting.
"Join Date must be YYYY-MM-DD" on every single row. Your spreadsheet is exporting dates in the Indian format. Either change the column format to
YYYY-MM-DDbefore saving, or empty the column entirely — blank join dates default to today, which is usually fine for a fresh import.Everyone came in with no expiry date. Either the Plan column was blank, or the plan names in your file don't match your plans in the app. Check the spelling on the Plans page, fix the file and import again — but delete the first attempt's members first, or you will have everyone twice.
The names are shifted into the wrong columns. Your columns are in a different order from the template. Download the template again and paste your data into it column by column.
A row failed with a message you don't recognise. Add that one member by hand with Add Member. One failure in a few hundred is not worth re-running the whole import for.
You closed the window mid-import. Whatever had already gone in stayed in. Go to Members, see how far it got, and import only the rest.