Skip to main content
This feature allows admins to add student records either one-by-one or in bulk via CSV.
Demo data notice Any names, student records, IDs, and examples shown in this documentation section are fictitious sample data for demonstration and training purposes only. Any resemblance to real persons, schools, or records is purely coincidental.

Choose the right path

  • Use manual add for a few students
  • Use CSV import for batches and class updates
  • Use Student Enrollment on Students → Enrollment to advance existing students to a later school year
  • Use Classes to assign students to classes in the current school year
  • Students → Export CSV uses import-friendly enrollment columns (first_name, last_name, school_year, grade, class, and optional external_student_id) so you can edit year, grade, and class and re-import the same file

How to add one student manually

  1. Go to StudentsView Students.
  2. Click + Add Student.
  3. Enter required fields:
    • First name
    • Last name
    • Grade (0 to 12, where 0 is Kindergarten)
    • School year
  4. Optional fields:
    • Middle name
    • External student ID (up to 20 characters)
    • Class (choose an existing class for that school year and grade, create a new one, or Assign a class later)
  5. Click Save (or Save & Add Another).
The student appears in the roster for that school year and grade, unless hFlow finds a matching existing student first (see below).

If a matching student already exists

Before creating a new record, hFlow checks whether an existing student already matches the name or external student ID you entered. This applies wherever you can add a student manually (Students, Enrollment, and Classes).
  • One match found: hFlow shows the existing student’s name, external ID, and whether they are currently enrolled or were last enrolled in an earlier year. Choose Re-enroll to add the year, grade, and class you entered to that existing student, or Create new student anyway if this is genuinely a different person.
  • Several matches found: hFlow lists the possible matches so you can pick the right one to re-enroll. If none of them are the right person, choose None of these, create new. Adding an external student ID before saving again can help hFlow tell two similarly named students apart.
  • No match found: hFlow creates the student as usual.
Re-enrolling never creates a duplicate record or loses the student’s history from earlier years. This matching step does not run during CSV import; see CSV format rules (quick reference) below for how CSV import handles existing students.

Add Student fields explained

  • First name (required): Student’s given name.
  • Last name (required): Student’s family/surname.
  • Middle name (optional): Helps distinguish students with similar first/last names.
  • Grade (required): Numeric grade level (0 to 12), where 0 represents Kindergarten.
  • School year (required): Academic year context for enrollment and reporting.
  • Class (optional): Class for that school year and grade. Choose an existing class, create a new one, or Assign a class later (student enrolls unassigned; you can place them later on Classes).
  • External student ID (optional, max 20): Any ID the school wants to use as a cross-reference in another system (for example, the school’s main directory or SIS record ID).

How to add students via CSV

  1. Go to StudentsView Students.
  2. Click Import CSV.
  3. Click the ? help icon in the import header to review exact format and rules.
  4. Upload your CSV and confirm row count.
  5. Click Proceed.
  6. Review import results.
  7. Download:
    • Successes (includes generated student_code)
    • Failures (includes failure_reason)
If the wrong file went through or the whole batch must be reversed, owners and admins can check Configuration → CSV Imports for undo. Undo only works when no one has added or changed data tied to that upload (for example new assessments on imported students, or a class change after the file ran). Teachers should contact your hFlow owner or admin immediately and avoid editing affected roster rows until they respond. See CSV imports and undo.

CSV format rules (quick reference)

Required columns:
  • first_name
  • last_name
  • school_year (format YYYY-YYYY, example 2025-2026)
  • grade (integer 0 to 12)
Optional columns:
  • middle_name
  • class
  • external_student_id (max 20 chars, unique in org when present)
Other constraints:
  • CSV only
  • Maximum 500 rows
  • Headers are case-insensitive and normalized

Common CSV outcomes

  • If class is provided and does not exist, class is created automatically
  • If student is already enrolled for same year+grade, row updates class assignment
  • Two students with the same first and last name in the same school year but different grades import as separate records
  • When two different students share the same name in the same grade and year, use middle_name or external_student_id to distinguish them
  • Duplicate external_student_id values are rejected

Troubleshooting

  • “Missing required columns”: verify exact required headers
  • “Invalid year format”: must be YYYY-YYYY and second year = first + 1
  • “Invalid grade”: must be between 0 and 12
  • Class required error: choose a class when that grade already has classes
  • “Multiple students match this name”: add external_student_id or a distinct middle_name
For the full first-time import walkthrough. See Getting started.