Data Import — Switcher Program
Who this guide is for: Tenant admins moving to EmbayLMS from another LMS who need to bring over their users, course enrollments, and historical completion records via CSV.
Overview
The Switcher Program lets you import nine kinds of data from any other LMS using plain CSV files — no per-vendor connectors. Imports are platform-agnostic: export to CSV from Moodle, Canvas, TalentLMS, Docebo, Cornerstone, Absorb, or anything else, match the columns below, and upload. The nine entities are: users, groups, group members, categories, learning paths, path courses, enrollments, completion history, and path enrollments.
You can import each entity from its own CSV, or fill one multi-tab workbook (one sheet per entity) and upload it all at once — see Multi-tab workbook below.
Every import runs in two steps:
- Validate (dry run) — we parse your file and show a preview with a per-row error list. Nothing is written until you confirm.
- Confirm — valid rows are applied in the background; you get an email when it finishes, and any failed rows can be downloaded as an error CSV to fix and re-upload.
Imported records are tagged source = import so reporting can tell historical data from
native activity, and imported completions keep their original completion dates.
Prerequisites
- The admin role (Settings → Data Management → Data Import requires it).
- Your courses already exist in EmbayLMS with a slug (or external ID) set, so enrollment and completion rows can resolve to them.
- A CSV file (UTF-8). Excel “Save As → CSV UTF-8” works; a BOM is handled automatically.
Step-by-step
- Go to Settings → Data Management → Data Import.
- Choose what you’re importing: Users, Enrollments, or Completion history.
- Click Choose file and select your CSV, then Validate.
- Review the preview: total rows, valid rows, and any rows with errors (with the reason).
- If there are errors, fix them in your CSV and re-upload. When you’re happy, click Import N rows.
- Wait for the confirmation (or check Import history later). For failed rows, click Download errors to get a CSV of just those rows with their error messages.
CSV formats
external_id is the primary matching key; email is the fallback. Provide at least one.
Users (users)
| Column | Required | Notes |
|---|---|---|
external_id | one of | Source-LMS user ID — the stable dedup key |
email | one of | Used to match when external_id is absent; required to create a new user |
first_name | no | |
last_name | no | |
role | no | learner (default), author, manager, admin |
locale | no | en (default) or fr-CA |
manager_external_id | no | external_id of this user’s manager (resolved after all users are created) |
group_names | no | Pipe-separated, e.g. `Sales |
external_id,email,first_name,last_name,role,locale,manager_external_id,group_names
e-1001,jdoe@acme.com,Jane,Doe,learner,en,e-1000,Sales|Ontario
e-1000,boss@acme.com,Pat,Lee,manager,en,,SalesNew users are created without sending an activation email — this is a historical backfill. Invite them through normal user management when you’re ready.
Enrollments (enrollments)
| Column | Required | Notes |
|---|---|---|
external_id / email | one of | Identifies the learner |
course_slug | yes | Matched against the course slug, then external ID |
status | no | active (default), completed, dropped, expired |
due_date | no | ISO 8601, e.g. 2025-03-31 |
email,course_slug,status,due_date
jdoe@acme.com,whmis-2024,active,2025-03-31Completion history (completions)
| Column | Required | Notes |
|---|---|---|
external_id / email | one of | Identifies the learner |
course_slug | yes | Matched against slug, then external ID |
completed_at | yes | ISO 8601 — the original completion date, preserved as-is |
score | no | Numeric |
email,course_slug,completed_at,score
jdoe@acme.com,whmis-2024,2023-05-01,92A completion with no existing enrollment auto-creates a completed enrollment so the transcript and compliance evidence are intact.
Groups (groups)
Dedup key: name.
| Column | Required | Notes |
|---|---|---|
name | yes | Group name — the dedup key |
description | no | |
type | no | static (default) or dynamic |
Group members (group_members)
Maps users into groups. Import users and groups first.
| Column | Required | Notes |
|---|---|---|
group_name | yes | Must match an existing group |
external_id / email | one of | Identifies the learner |
Categories (categories)
Dedup key: slug.
| Column | Required | Notes |
|---|---|---|
slug | yes | Unique slug — the dedup key |
name | yes | Display name |
description | no | |
parent_slug | no | Slug of the parent category (for a hierarchy) |
order_index | no | Sort order (number) |
Learning paths (learning_paths)
Dedup key: title. New paths are created as draft and hidden so an import never publishes a path by surprise.
| Column | Required | Notes |
|---|---|---|
title | yes | Path title — the dedup key |
description | no | |
status | no | draft (default), published, archived |
Path courses (path_courses)
Maps courses onto a path. Import learning paths and the courses first.
| Column | Required | Notes |
|---|---|---|
path_title | yes | Must match an existing path |
course_slug | yes | Matched against course slug, then external ID |
order_index | no | Position on the path (number, default 0) |
is_required | no | true (default) / false (also yes/no, 1/0) |
prerequisite_course_slug | no | Course that must be completed first |
Path enrollments (path_enrollments)
Enrolls users onto a path. Import learning paths and users first. Path completion stays derived from course completions — this only records the enrollment.
| Column | Required | Notes |
|---|---|---|
path_title | yes | Must match an existing path |
external_id / email | one of | Identifies the learner |
status | no | active (default), completed, dropped |
Multi-tab workbook
For a full migration, use the workbook instead of nine separate uploads:
- Go to Settings → Data Management → Data Import → Multi-tab workbook and click Download workbook
template. You get an
.xlsxwith one sheet per entity, each with the right headers (your tenant’s custom user fields are included on the Users sheet). - Fill in the sheets you need — leave the rest empty.
- Upload the filled workbook. Each non-empty sheet is validated and shown with its row counts, then imported in dependency order (users → groups → group members → categories → learning paths → path courses → enrollments → completions → path enrollments) when you click Import N sheets.
The workbook headers always match the current CSV contract above — if a column is added to an import, the next template download includes it automatically.
Configuration reference
| Setting | Value |
|---|---|
| Max file size | 8 MB |
| Encoding | UTF-8 (BOM tolerated) |
| Matching keys | external_id (primary), email (fallback); courses by slug then external_id |
| Date format | ISO 8601 (YYYY-MM-DD or full timestamp) |
| Idempotency | Re-running an import updates matched records instead of duplicating |
| Audit | Every import (create / confirm / complete) is written to the audit log |
Troubleshooting
| Problem | Cause / fix |
|---|---|
| ”Missing required column: …” | Your header row is missing a required column. Compare against the tables above (download a template from the page). |
| ”Unknown column: …” | A header doesn’t match a known column — check spelling/case. |
| ”Invalid email” / “Invalid date” | Fix the cell format (lowercase email; ISO date). |
| ”User not found” (enrollments/completions) | The learner isn’t in EmbayLMS yet — run the Users import first. |
| ”Course not found” | The course_slug doesn’t match any course slug or external ID. Set the slug on the course, or correct the value. |
| ”Learning path not found” | The path_title doesn’t match an existing path. Import the learning paths sheet first, with matching titles. |
| ”Group not found” (group members) | Import the groups sheet (or run a Groups CSV) before group members. |
| ”Prerequisite course not found” | The prerequisite_course_slug must resolve to a course that exists. |
| Some rows imported, some failed | Click Download errors on the history row to get just the failed rows + reasons, fix, and re-upload. |
| Manager not linked | The manager’s row must be present in the same (or an earlier) Users import; managers are resolved after all users are created. |
| ”No recognized data sheets in the workbook” | Sheet names must match the entity keys (users, groups, …). Use the downloaded template rather than renaming sheets. |