Welcome!

Bulk Enroll With CSV

TL;DR; For adding more than a handful of people to a course at once, open the course's People tab, click Bulk Upload, download the template, fill it in with email addresses (plus optional names and passwords), pick the role for everyone in the file, and click Import CSV. Lupo creates accounts for anyone who doesn't have one yet, emails each person, and enrolls everyone in one go. The import runs in the background, and its results — including any generated passwords — stay on the course's import page.

Bulk CSV enrollment is the fastest way to populate a course when you're rolling it out to a whole team or department.

When to use bulk enrollment

Use it when you have more than around ten people to enroll at once, or when you already have a list of emails in a spreadsheet or HR system and want to avoid clicking through the individual form for each person. For smaller enrollments, just add people one at a time with Enroll User on the People tab — the CSV is overkill for three learners.

Bulk enrollment puts people in the course. It does not seat anyone on a delivery run of an instructor-led course; to fill a class, use the Import CSV on that run's roster instead — see Manage the Roster.

The CSV format

From the course's People tab, click Bulk Upload. In the dialog that opens, click Download Template. The template carries the column headings Lupo expects, so start from it rather than building your own.

The columns are:

  • Name — optional. It is used only for accounts the import creates; an existing person's name is never changed by a CSV.
  • Email — required. This is the unique identifier Lupo uses to look up existing accounts.
  • Password — optional. Leave it blank and Lupo generates a simple password for any new account. Existing users keep their current password regardless of what you put in this column. A password you supply must be at least 4 characters and at most 128.

Columns are read by their headings, not their order, so extra columns are ignored — a roster you exported from Lupo can be edited and uploaded straight back. Common spellings of the headings are recognized too (Email address, First name and Last name instead of Name, Pwd). Only the email column is mandatory: a file with nothing but an Email column works.

The template looks like this:

Name,Email,Password
Ana Gómez,ana.gomez@example.com,
,someone@example.com,
Sam Doe,sam.doe@example.com,theirpass

The first row is the common case (a name, a blank password), the second shows that the name is optional, and the third is where a password goes when you have already issued one.

Use a plain CSV file, not an Excel .xlsx. Files saved from Excel are read correctly, accented names included. A file can have at most 2,000 rows and 2 MB.

Choosing a role and starting the import

In the same dialog, pick the Role to give everyone in the file: Student or Observer. Company Administrators also see Instructor; an Instructor running the import does not. The same role applies to every row — if you need some people as Students and others as Observers, do two uploads.

Click Import CSV. Lupo checks the file and takes you to the course's import page (Bulk import people from CSV), where a progress bar counts the rows processed. The import runs in the background, so you can leave the page and come back: the People tab keeps a pointer to it ("A bulk import is running for this course." while it runs, then "The last bulk import finished. Its results and any generated passwords stay on the import page." with an Open the import page link).

Only one import runs per course at a time. Uploading a second file while one is running is refused with "An import is already running for this course. Watch its progress below — when it finishes you can upload the next file."

What Lupo does with each row

  • An address with no account — Lupo creates the account, adds it to your company, enrolls it at the role you picked, and sends an invitation email. If Lupo generated the password, the invitation carries it. The row reads "Enrolled. An account was created and an invitation email sent."
  • An existing account — the person is enrolled and receives an enrollment notification email; their password is untouched. The row reads "Enrolled in the course." An account that was created earlier but never activated receives the invitation again instead of the notification.
  • Someone already enrolled at that role — skipped, not duplicated: "Already enrolled - left as they were."
  • Someone already in the course under a different role — refused: "Already in the course under a different role. Use Change role on the People page instead."
  • A Lupo platform administrator's address — refused; such accounts are never enrolled.

When the import finishes, the page sums it up — " enrolled, already enrolled, failed, of rows." — and lists the Rows that need attention (row number, the email exactly as it appeared in your file, name, and the result). Successful rows don't appear there; they are on the People tab itself. If an email couldn't be delivered, the person is still enrolled and the row says so ("Enrolled - but the email did not go out. Tell them directly."); for a brand-new account the row adds that "Their generated password is on this page; share it with them directly."

Generated passwords

If any rows had a blank password, the import page shows a Generated passwords table — each new account's email and password — with a Download as CSV button. The passwords are not a one-time display: they stay readable on that page for as long as the import does, and each new learner's invitation email carries their own. Only someone allowed to enroll people under the role the file was imported as can read the sheet; anyone else sees a note that the passwords are withheld.

Re-running a CSV

If you re-upload a CSV that contains people who are already enrolled, their rows are skipped — no duplicate enrollments, no errors. This makes it safe to fix a row or two and re-submit the whole file rather than trying to upload only the corrected rows.

If an import stops partway (the page says "This import stopped after of rows and did not finish"), click Resume import. It picks up exactly where it stopped and will not enroll anyone twice.

Common CSV problems

"That file is empty." or "That file has a header row but no people under it." — the file has no data rows.

"No email column was found. The headings read: …" — the first line of the file isn't a header Lupo recognizes. Rename the column holding the addresses to Email, or start from the template. A file whose first line is already data (no header row) fails the same way.

"That file has more than 2000 rows. Split it into smaller files and import them one at a time." and "That file is larger than 2048 KB." — the two hard limits. Big files don't time out (the import is a background job); they are refused up front.

"Not a valid email address." — a row-level result: check for stray spaces, a missing @, or typos.

"This address appears earlier in the same file." — duplicate rows in one file; only the first is processed.

"The password in the file is shorter than the minimum." / "…longer than the 128-character maximum" — fix the cell, or blank it so a password is generated.

Where to go next