Import students into ProgresslyAI from a CSV file
Updated . Written by the ProgresslyAI team from the current product. Examples use invented records.
School owners can add a whole roster at once from a CSV file. You see a preview of every row before anything is saved, and the import either adds every new student or adds none. Only owners can import; instructors can still add students one at a time.
Quick answer: open Students, select Import CSV, upload a file with first_name and last_name columns, fix every row marked invalid, tick the confirmation box and select Import. Rows that match an existing student are skipped.
What the CSV can contain
Use one student per row and a header row. Headers are not case-sensitive, spaces become underscores, and columns can be in any order.
| Column | Required | Accepted values |
|---|---|---|
first_name | Yes | Up to 120 characters |
last_name | Yes | Up to 120 characters |
email | No | A valid email address; stored in lower case |
date_of_birth | No | YYYY-MM-DD, not in the future |
vertical | No | Teaching category, up to 100 characters |
level | No | Up to 120 characters |
status | No | active, paused or inactive in lower case. Blank means active |
notes | No | Up to 10,000 characters |
Other column names, or the same column twice, are rejected before the preview. A file can have up to 1,000 student rows and must be no larger than 256 KB. Quote any value that contains a comma.
The import page has a Download CSV template button with the correct headers. You can also download our sample CSV, which deliberately contains one invalid row and one duplicate so you can see how the preview reports them.
Step 1: Upload and preview
- Go to Students and select Import CSV.
- Under Student CSV file, choose your file.
- Select Preview import.
The preview shows a count such as "3 new, 1 duplicate, 1 invalid." and a table with the CSV row number, student name and result for each row. Open View CSV values on a row to see exactly what will be saved.
Step 2: Read the preview results
| Result | Meaning | What happens on import |
|---|---|---|
| new | Valid and not already in the school or earlier in the file | Added |
| duplicate | First name, last name, date of birth and email all match an existing student or an earlier row, ignoring capitals. A blank email or date of birth matches another blank | Skipped. The existing student is not changed |
| invalid | A value breaks a rule above. The row shows the reason | Blocks the whole import |
With the sample file, the preview is:
| CSV row | Student | Result | Reason |
|---|---|---|---|
| 2 | Ava Lindqvist | new | |
| 3 | Owen Brooks | new | Paused status |
| 4 | Mia Santos | new | Blank status imports as active |
| 5 | Priya Raman | invalid | Invalid student status. Active must be active |
| 6 | Ava Lindqvist | duplicate | Same name, date of birth and email as row 2 |
Row 6 shows that email matching ignores capitals: AVA.PARENT@example.com matches ava.parent@example.com.
Step 3: Fix problems, then import
If any row is invalid, the page says "Fix all invalid rows and upload the corrected file. No students have been added." Correct the file in your spreadsheet, save it as CSV again and preview it again.
When the preview has no invalid rows and no plan-limit message:
- Tick I reviewed this file and want to add these students to your school.
- Select Import 3 students (the number matches the new rows).
- The page confirms Import complete.
Duplicates and plan capacity are checked again at the moment you import. If someone added a matching student in the meantime, that row is skipped.
Troubleshooting
"Your Starter plan allows up to 25 active students. Upgrade or archive a student first." The new active rows would take the school over its plan limit. Only active students count. Either set some rows to paused or inactive, change existing students who have left to inactive, or upgrade on Billing. Starter allows 25 active students and Pro allows 200; Business has no cap. Nothing is imported until the whole file fits.
"Unrecognized columns: ... Use the provided template." Rename or remove the extra column. Use exactly the names in the table above.
"The first_name and last_name columns are required." Add both columns, even if you split names yourself.
"Expected 8 columns, found 9." A value contains an unquoted comma. Put quotes around that value.
"Enter a valid date of birth that is not in the future." Spreadsheets often reformat dates. Format the column as text in YYYY-MM-DD form, for example 2015-06-01.
A student you expected to be skipped was added. The duplicate check needs all four values to match. If the existing record has an email and the CSV row does not, they are treated as different students.
What the import does not do
The CSV adds student profiles only. It does not import attendance history, skill assessments, payments, class enrollments, curricula or family links. After importing, assign each student a curriculum, enroll them in classes and add parent emails. Keep your original spreadsheet until you have checked the imported records.