Roster CSV format
The roster upload accepts a UTF-8 CSV with one student per row. Extra columns are silently ignored — only the whitelisted columns below are read.
Required columns
| Column | Required | Notes |
|---|---|---|
| student_id | Yes | School's internal identifier. Hashed before storage. |
| student_first_name | Yes | Used in email personalisation only. |
| student_email | Yes | Where the student receives their consent request. |
| date_of_birth | Yes | Used to compute age at time of upload. |
| parent_first_name | If minor | Personalisation in the parent email. |
| parent_email | If minor | Required if age < 18; optional otherwise. |
| grade_level | No | e.g. Grade 9, Freshman. |
| notes | No | Free text visible to admins only. |
Example
student_id,student_first_name,student_email,date_of_birth,parent_first_name,parent_email,grade_level,notes S-1001,Aisha,aisha@example.edu,2010-03-14,Fatima,fatima@example.com,Grade 9, S-1002,Ben,ben@example.edu,2005-11-02,,,Grade 12,Transfer student S-1003,Chen,chen@example.edu,2009-07-22,Wei,wei@example.com,Grade 8,
Validation rules
- The file is rejected if any required column is missing — the specific columns are listed.
- Each row is validated and errors are reported with row numbers and reasons.
- The whole file is rejected if more than 10% of rows fail — the CSV is assumed to be wrong, not the data.
- Rows are deduplicated on student_email within the file and against existing records.
- A minor without a parent email is rejected at validation — consent cannot proceed without a parent route.
- If date of birth is missing and there is no explicit minor/adult override, the row is rejected. MindGuard never guesses.
Minor detection
Two signals feed one decision. An explicit minor/adult override on the roster wins. Otherwise age is computed from date of birth at time of upload against the institution's age-of-majority threshold (default 18). Missing DOB with no override is rejected — MindGuard never guesses.