Upload a CSV, paste a list, or photograph your roster — the AI stages each athlete and sends them a personalised invitation link.
Go to Athletes in the sidebar.
Click the Import athletes button in the top-right corner of the page.
The Import Athletes modal opens. It accepts three input formats:
| Format | When to use |
|---|---|
| CSV file | You have an existing spreadsheet export |
| PDF / photo | You have a printed roster or a photo of a signup sheet |
| Pasted text | You are typing or pasting a list directly |
Current limits
| Limit | Value |
|---|---|
| Maximum file size | 8 MB |
| Maximum athletes processed per import | 400 rows |
| Without AI | CSV only, using the standard column headers shown later in this guide |
If your file contains more than 400 athletes, Compteam imports the first 400 and asks you to split the rest into a second batch.
Expected runtime
These times are typical, not guaranteed. They depend on file cleanliness, image or PDF quality, and current AI provider latency.
| Import type | Typical time | Notes |
|---|---|---|
| Standard CSV (AI disabled) | 2-8 seconds | Fastest path; parsed directly on the server |
| AI CSV or pasted text | 15-45 seconds | Larger imports are read in chunks |
| AI PDF or photo | 20-60 seconds | Slowest path; scanned or multi-page files take longer |
Just paste whatever data you have — the AI figures out the rest.
There is no required column order, no header row, no specific format. The agent reads the raw text and maps each value to the right field automatically. All of these work:
Jude Mitchell, Jude@mitch.de, 03.10.1980
russel@gmail.com, Rich Russel, 02.04.2005
1988-07-22 | Anna Kovacs | anna@kovacs.hu
Accepted date formats: DD.MM.YYYY, YYYY-MM-DD, MM/DD/YYYY.
The agent stages every row it can fully resolve and flags the rest as problems (see Step 4).
Three fields are mandatory: name, email, and date of birth. Any row missing one of these will not be staged until it is corrected.


If you are migrating athletes from another system you can include billing data directly in your CSV — the importer will carry it through to each athlete's account the moment they register.
Optional columns you can add to your CSV:
| Column | Description |
|---|---|
iban | Full IBAN (spaces allowed — e.g. DE89 3704 0044 0532 0130 00) |
account_holder_name | Name on the bank account |
address_line1 | Street and number |
address_line2 | Apartment, floor, etc. (optional) |
city | City |
postal_code | Postal / ZIP code |
country | Two-letter country code (e.g. DE, AT) |
membership_plan | Plan name exactly as it appears in your branch (e.g. Monthly Adult) |
signup_fee_paid | true/false. Use true when a migrated member already paid the plan signup fee elsewhere |
membership_end_date | Contract end date for an already-cancelled member. Recommended format: YYYY-MM-DD. Requires membership_plan |
historical_membership_start_date | Original membership start date for display in the athlete profile. Recommended format: YYYY-MM-DD. Display only — does not affect billing |
Example:
first_name,last_name,email,date_of_birth,iban,account_holder_name,membership_plan,signup_fee_paid,membership_end_date,historical_membership_start_date
Jude,Mitchell,jude@mitch.de,1980-10-03,DE89370400440532013000,Jude Mitchell,Monthly Adult,true,2026-08-31,2019-05-01
Anna,Kovacs,anna@kovacs.hu,1990-07-22,HU42117730161111101800000000,Anna Kovacs,,false,,2021-09-15
How SEPA mandate migration works
Providing an IBAN migrates the existing direct-debit authorisation from your old system into C-TEAM:
Membership plan pre-assignment
If you include a membership_plan column and the plan name matches one of your active branch plans, the plan is pre-assigned to the pending athlete. When they register the membership is activated automatically, backdated to the 1st of the month they were imported — so billing history starts from the correct date with no manual correction needed.
If the plan name does not match any active plan in your branch the row is flagged as a problem and not staged. Check the plan name in Membership Plans and correct the CSV before re-importing.
Already cancelled or ending soon?
If a migrated member has already cancelled, add membership_end_date with the final contract date. This field requires membership_plan because the end date is stored on the imported membership. Future end dates keep the membership active until that date; past end dates create the membership as inactive so it will not be billed.
Need the original join date for the profile header?
Add historical_membership_start_date with the athlete's original membership start date in YYYY-MM-DD format. This value is display only: it appears on the athlete profile next to the nationality code and can be corrected in Migration mode, but it never changes billing, proration, or membership activation dates.
Already paid a signup fee? (migrated members)
If your plan has a one-time signup fee and you are migrating members who already paid it in your previous system, set signup_fee_paid=true in the CSV. The first invoice will then skip the signup fee and bill only the membership. This flag only takes effect when membership_plan is also imported; you can still tick or untick Signup fee paid next to the athlete's plan in the Pending registration section before activation.
No plan column? That is fine. Athletes will be placed on a trial membership as usual when they register. You can also assign or change a plan at any time from the Pending registration section on the Athletes page before the athlete registers.
Example — no proration on the first invoice
Jude is imported on 10 June with the Monthly Adult – IBAN plan (49.00 EUR/month) pre-assigned via the membership_plan column. He registers a few days later and his membership is activated immediately, backdated to 1 June — the 1st of the month he was imported, not the day he registered.
On 1 July, the branch admin runs Monthly & Yearly Invoice. Because Jude's membership started on the 1st of the month, June is not prorated:
June membership (full month): 49.00 EUR
If Jude had instead registered himself on 10 June with no pre-assigned plan — i.e. a normal self-registration — his membership would start on the day he subscribes, and June would be prorated to 21/30 days (49.00 EUR × 21/30 = 34.30 EUR). Backdating on import avoids that: an athlete who was already training before being added to C-TEAM is billed for the full month, just like they would have been in your old system.

After import, some athlete profile fields — nationality, historical membership start date, gender, date of birth, phone, Smoothcomp ID, and Instagram handle — can only be edited by the athlete themselves. This is intentional: those fields are personal data or migration metadata that should stay locked once your gym is running normally.
However, when you are migrating from another system you likely already have this data and want to fill it in before athletes register. Migration mode exists for exactly this.
How to enable Migration mode
Go to Branch Settings → Migration mode and toggle it on. The toggle turns amber to indicate the mode is active.
While Migration mode is on:
Turn it off once you are done
Migration mode is a temporary tool. Once you have finished populating your historical data, go back to Branch Settings and turn it off. From that point forward those fields are athlete-controlled again, which is the correct ongoing behaviour.
Weight and training hours are always editable by admins — those are operational fields that coaches legitimately need to update at any time, independent of migration mode.
By default, AI is used to read your file — whether it's a CSV, a PDF, a photo, or pasted text — and map the data to the right fields.
If you'd rather not send any athlete data to an AI provider, tick "Disable AI for this import" in the Import Athletes modal. With this option:
Required CSV column headers, in order
The first row of your CSV must contain exactly these headers (lowercase, comma-separated). First name, last name, and date of birth are always required; email is required for adult athletes. The rest may be left empty:
| # | Header | Required? | Notes |
|---|---|---|---|
| 1 | first_name | Required | |
| 2 | last_name | Required | |
| 3 | email | Required (unless is_kid is true) | Kids without an email get a temporary address automatically |
| 4 | date_of_birth | Required | Format YYYY-MM-DD, must be in the past |
| 5 | gender | Optional | male, female, or other |
| 6 | belt | Optional | One of: white, grey, grey-white, grey-black, yellow, yellow-white, yellow-black, orange, orange-white, orange-black, green, green-white, green-black, blue, purple, brown, black, coral, red (defaults to white) |
| 7 | stripes | Optional | Belt stripe count from 0 to 11 (defaults to 0) |
| 8 | is_kid | Optional | true/false (or 1/yes) |
| 9 | guardian_email | Optional | For kids, this guardian is invited or linked automatically when the kid is activated |
| 10 | address_line1 | Optional | |
| 11 | address_line2 | Optional | |
| 12 | city | Optional | |
| 13 | postal_code | Optional | |
| 14 | country | Optional | |
| 15 | account_holder_name | Optional | Name on the bank account |
| 16 | iban | Optional | |
| 17 | membership_plan | Optional | Must match an existing plan name exactly |
| 18 | signup_fee_paid | Optional | true/false (also accepts yes, paid, or waived). Requires membership_plan; skips the one-time signup fee on the first invoice |
| 19 | membership_end_date | Optional | Contract end date in YYYY-MM-DD format. Requires membership_plan; past dates create inactive memberships |
| 20 | historical_membership_start_date | Optional | Display-only membership start date in YYYY-MM-DD format. Shows on the athlete profile and does not affect billing |
Any extra columns in your file are ignored. If one of the required headers is missing, the import is rejected with an error listing the missing column(s).
belt and stripes are staged together. When an adult claims the pending registration, or an admin activates a kid profile, both values are written to the athlete's branch belt state.
Download example CSV template · Download as Excel (.xlsx)
For a full breakdown of how Compteam protects athlete data — including bank details — when AI is used, see AI & data privacy.
After parsing, the modal shows a four-tile summary:
| Tile | Meaning |
|---|---|
| Rows | Total rows detected in the input |
| Staged | Athletes ready to be invited — no problems found |
| Skipped | Rows the parser ignored (blank lines, headers) |
| Problems | Rows that need attention before they can be staged |
A Staged count greater than 0 and Problems at 0 means you are ready to proceed.
If Problems is greater than 0, a table below the summary lists every issue by row, field, and a plain-English description.
Common problems and how to fix them:
Missing mandatory field — name, date of birth, or an adult athlete email could not be found in that row.
Jude Mitchell, Jude@mitch.de ← no date of birth → flagged
Add the missing value and paste the corrected list again:
Jude Mitchell, Jude@mitch.de, 03.10.1980
Athlete already registered in another branch — the email address is already linked to an account elsewhere. That athlete cannot be re-imported; they would need to transfer branches through their existing gym.
The agent re-parses immediately each time you update the input. Once all rows are resolved the problems table disappears and every row moves to Staged.

Once Problems reaches 0, all rows move to Staged and the import is done on your end.
Why we don't create active accounts or email passwords
Sending a password by email is a security risk — the message can be intercepted, forwarded, or land in the wrong inbox. Instead, each athlete creates their own account using a method they control: email + password they set themselves, or a social login (Google or Facebook). This keeps credentials out of your hands entirely and keeps the platform compliant with standard security practices.
What happens when the athlete registers or the kid is activated
All the data you imported — name, date of birth, belt, stripes, weight, and any other records already in the system — is pre-loaded into the account the moment it is created. The athlete just needs to register; they will not be asked to fill anything in. Their profile is ready to use immediately.
Kid records work differently: they are activated by an admin as managed profiles, without a child login. If the imported row included guardian_email, activating the kid automatically links an existing guardian account or emails that guardian an invitation to register and manage the kid.
Athletes can register by:
They can sign up with an email and a password they choose, or with their existing Google or Facebook account — no password required.
Click Done to close the modal, or Import another file to stage a second batch.

After import, your athletes appear in the Pending Registration section on the Athletes page. Each row shows a plan dropdown, a Signup fee paid checkbox, and the invite or activate button — all in a fixed-width grid so they stay aligned regardless of plan name length.
Activating imported kids
Rows marked is_kid=true show Activate kid instead of a self-registration invite. Activating the kid creates the managed child profile immediately. If guardian_email was imported, Compteam automatically links that guardian if they already have an account, or sends them an invitation email to create an account and accept the kid link.
Assign a membership plan before inviting (optional)
Use the plan dropdown to pre-assign a membership plan before you send the invite link. When the athlete registers, the plan activates automatically — no manual step needed afterwards.
Signup fee paid (migrated members)
Next to the plan dropdown is a Signup fee paid checkbox. It is only active when the selected plan has a one-time signup fee configured. Tick it for members who already paid your signup fee in a previous system — their first invoice will then bill only the membership and skip the fee. The checkbox resets automatically if you clear the plan back to No plan.
Send invite link (email)
Click Send invite link and the platform sends an email directly to the athlete's address with a personal registration link. The link pre-fills their email address so they only need to set a password and they are in. Once sent, the button changes to Resend invite — you can resend at any time if the email was missed or ended up in spam.
Copy link and send via WhatsApp (or any other channel)
After clicking Send invite link, a Copy link button appears next to it. Tap it and the personal registration link is copied to your clipboard. You can then paste it directly into a WhatsApp message, SMS, or any messenger.
The link is personal. It pre-fills the athlete's email address and, if you pre-assigned a membership plan, activates that plan automatically when they register. Do not share one athlete's link with another person.
