Migrating to Agon
After reading this page you can move your clients, memberships, and classes into Agon from a spreadsheet or export file, check how each column was matched, run the import, and invite the imported clients to set up their accounts.
The tools live in the desktop app under Settings → Migration. This tab is visible to Managers only. There is no separate onboarding wizard — everything happens in that one tab.
How migration works
Agon does not connect to your old platform and does not ask for your login details for it. You export your own data from your current platform and upload the file to Agon. This keeps your credentials safe and stays within what most platforms allow.
Migration in the app has four steps:
- Download a template (optional) — a ready-made file with the right column names.
- Choose what you're importing — Clients, Memberships, or Classes.
- Upload a file — Agon reads it and matches your columns to the fields for the type you chose.
- Review the column mapping and import — check the matches, fix any that are wrong, and confirm.
After a client import finishes you can send invitation emails to everyone who was imported.
What you can import right now
You can import Clients, Memberships, and Classes. Each is imported separately — pick one under What are you importing?, upload a file for it, and repeat for the others.
Retail products are not supported by migration and cannot be imported.
Because memberships and classes both depend on clients already existing in Agon, import your client list first:
- Clients — always do this first. Nothing else can be matched without it.
- Memberships — needs the client's email to already be in Agon, and the membership type name to already exist as a membership type in Agon.
- Classes — independent of clients, but do it last since class rosters/bookings still come from your old platform separately.
Supported files
The upload step accepts:
- CSV (
.csv) - Excel (
.xlsx) - JSON
Maximum file size is 10 MB. If your export is larger, split it into several files and import them one at a time.
Step 1 — Download a template (optional)
If you would rather build your file by hand, or your platform's export uses very different column names, start from an Agon template.
- Open Settings → Migration.
- In the Download templates section, click one of:
- Download clients template
- Download memberships template
- Download classes template
- Open the downloaded CSV in Excel or Google Sheets, fill in your rows, and save it as CSV.
You do not have to use a template. Any CSV, Excel, or JSON file works — the mapping step in Step 3 lets you line your columns up with Agon's fields.
Client template columns
| Column | Required? | Notes |
|---|---|---|
full_name | Recommended | If a row has no name, the client's email is used as the name. |
email | Required | A row with no email is skipped. |
phone | Optional | |
date_of_birth | Optional | Use YYYY-MM-DD (for example 1990-01-15). |
notes | Optional | Free-text notes about the client. |
billing_name | Optional | Used on this client's invoices going forward, if different from their full name (for example a company name). Not a historical record — Agon does not import invoices from your old platform. |
billing_address | Optional | Used on this client's invoices going forward. |
tax_id | Optional | The client's tax ID or VAT number, used on this client's invoices going forward. |
Membership template columns
| Column | Required? | Notes |
|---|---|---|
client_email | Required | Must already belong to a client in Agon — import your clients first. |
membership_type_name | Required | Matched to an existing membership type in Agon by name. |
starts_at | Required | Use YYYY-MM-DD. |
expires_at | Optional | Use YYYY-MM-DD. A date in the past is still imported, as an expired membership. |
credits_remaining | Optional | A whole number. |
Class template columns
| Column | Required? | Notes |
|---|---|---|
class_name | Required | Matched to an existing class type in Agon by name, or a new one is created if none matches. |
starts_at | Required | Use YYYY-MM-DD HH:MM:SS. A start time in the past is skipped. |
ends_at | Required | Use YYYY-MM-DD HH:MM:SS. |
capacity | Optional | A whole number. Defaults to 1 if left blank. |
instructor_name | Optional | Matched to an existing instructor in Agon by name. No match still imports the class, flagged for manual instructor assignment. |
See Column mapping for the full behaviour behind each field, including what happens with an unmatched membership type or instructor.
Step 2 — Export your data from your current platform
Most platforms have a self-service export.
- Look in your current platform's Settings, Admin, or Data area for an export or download option.
- Client data is usually under Clients, Members, or Contacts.
- If there is no self-service export, contact the platform's support team and ask for a GDPR Article 20 data portability export. Under GDPR Article 20, any platform holding personal data about your clients must give it to you in a structured, machine-readable format on request.
See the GDPR guide for how to word that request and what to do if the platform does not cooperate.
Step 3 — Choose what you're importing, upload the file, and review the column mapping
- Open Settings → Migration.
- Under What are you importing?, click Clients, Memberships, or Classes. This decides which Agon fields are offered in the mapping step below — pick the entity that matches the file you are about to upload.
- Under Upload a file, choose your CSV, Excel, or JSON file (up to 10 MB).
- Click Analyse file.
- Agon shows the Review column mapping table. It has matched each column in your file to an Agon field for you ("We matched each column in your file to an Agon field").
- Check each row:
- Column in your file — the header from your file.
- Agon field — a dropdown. The choices depend on the entity you picked above (Clients, Memberships, or Classes) — see Column mapping for the full field list per entity — plus — don't import —.
- A column Agon could not match shows a not mapped badge. It is skipped unless you pick a field for it.
- Fix any wrong match by choosing the correct field from the dropdown. Set a column to — don't import — to skip it on purpose.
- When the table looks right, click Confirm import.
There is no colour-coded confidence rating and no row-by-row preview — Agon runs the import as soon as you confirm.
Import one entity at a time. To import clients, memberships, and classes, repeat this whole step three times — once per entity — starting with Clients.
For more detail on how matching works and how to correct it, see Column mapping.
Step 4 — Import complete
When the import finishes, the tab shows:
- N imported — records added to Agon.
- N skipped — rows that were not imported.
- A Skipped rows list with a reason for each skipped row.
The reasons depend on what you imported:
Clients
- Row missing email — the row had no value in the column mapped to Email, so it could not be imported.
- Duplicate email skipped — a client with that email address already exists in Agon. The existing client is left untouched.
Memberships
- Row missing client email — no value in the column mapped to Client email.
- Client email not found — no client with that email exists in Agon yet. Import your clients first, then re-import this file.
- Row missing membership type name — no value in the column mapped to Membership type.
- Membership type not found — no membership type with that name exists in Agon. Create the membership type in Agon (Memberships in the left sidebar) first, then re-import.
- Row has invalid or missing starts_at — the start date is missing or not in a date Agon can read.
A membership whose expiry date is in the past is not skipped — it is imported with an expired status, so your historical record is preserved.
Classes
- Row missing class name — no value in the column mapped to Class name.
- Row has invalid or missing start/end time — one of the two times is missing or not in a date/time Agon can read.
- Class start time is in the past — only classes starting in the future are imported.
A class with no matching instructor name is not skipped — it is imported without an instructor. The Skipped rows list and the imported/skipped counts do not call this out row by row (it is recorded in the backend's own logs, not shown in this tab), so after importing classes, check your class list for any that still need an instructor assigned and add one from the class's own edit screen. A class name with no matching class type in Agon is not skipped either — Agon creates the class type automatically, using this row's start/end time and capacity as its defaults.
To bring in a skipped row, fix it in your source file and run the import again with the corrected file.
Step 5 — Invite the imported clients
This step only applies after importing Clients — memberships and classes have no invitation step. Client passwords never leave your old platform — they are stored as irreversible hashes — so imported clients need an invitation to set their own Agon password.
After the import, two actions are available:
- Send invitation emails — emails every client imported in this job a personal sign-up link.
- Download invitation list (CSV) — a file with each client's email address and personal invitation link, so you can send the invitations with your own email tool.
Invitation links expire 7 days after they are created. If a link expires before a client uses it, run the import again for that client (or use a fresh invitation list) to generate a new one.
There is no invitation history screen and no per-client resend button.
The Invite imported clients section is shown after every completed import, including a memberships or classes import. Sending invitations there after a memberships or classes import has no effect, since no new clients were created in that job — invitations only ever go to clients created by a Clients import.
Resuming a migration
The Migration tab remembers where you were:
- If you analysed a file but did not import it, re-upload the same file to get back to the Review column mapping table and finish.
- If an import already completed, the tab opens on the Import complete step so you can send invitations.
What if something goes wrong?
My old platform won't give me a data export Under GDPR Article 20 (right to data portability), any platform holding personal data about your clients must provide that data in a structured, machine-readable format on request. Send a written request to their support team. If they refuse or do not respond within 30 days, you can escalate to your national data protection authority. See the GDPR guide.
The column matches are wrong Fix them in the Review column mapping table using the dropdown in the Agon field column. You can also rename the headers in your file to match Agon's field names and upload it again. See Column mapping.
Some rows were skipped Open the Skipped rows list and read the reason. See Column mapping for what each reason means and how to fix it — the reasons differ for clients, memberships, and classes. Correct the source file and import it again.
All (or almost all) of my membership rows were skipped
The most common cause is importing memberships before clients — a membership row is skipped if its client's email is not already in Agon. Import your Clients file first, then re-import the memberships file. The next most common cause is a membership_type_name that does not match any membership type already set up in Agon (Memberships in the left sidebar) — the name has to match exactly (case does not matter, but spelling does).
A client didn't get their invitation, or their link expired Ask the client to check their spam folder. Invitation links last 7 days; to issue a new one, run the import again for that client or send a fresh invitation list. There is no resend button. This only applies to a Clients import — memberships and classes don't send invitations.
I can't see the Migration tab It is only shown to Managers. Ask a Manager at your studio to run the migration, or to change your role.
A class imported without an instructor
This happens when the instructor_name in your file doesn't match an instructor's name in Agon exactly. The class still imports — open it from the class list and assign the instructor manually.