Updating courses in bulk with Batch Course Import
Update many existing courses at once from a single CSV file.
Applies to: CourseMill 8.5.25 and later
Batch Course Import lets administrators update the details of many existing courses at once from a single CSV file, instead of opening each course one by one. Use it to inactivate retired courses, change credit hours or course duration across several courses, set due dates, expiration, or re-enrollment rules, or update course names, descriptions, and notes in bulk.
Note: Batch Course Import updates existing courses only. It does not create courses, and course content still needs to be uploaded to each course as usual.
Before you begin
- You need administrator access to the Manage Courses page for the organizations you are updating.
- Have the OrgID and CourseID for every course you plan to change. These identify each course and cannot be changed through the import.
- Note or export the current settings of the courses you are changing, so you can restore them if needed.
Prepare your CSV file
Each row in the file is one course. The first row must contain the column headers exactly as shown below. OrgID and CourseID are required on every row; all other columns are optional.
Important: A blank cell clears that field's current value for the course. Include only the columns you want to change, and fill in every cell in those columns. Courses keep their current values for any column that isn't in the file.
Required columns
- OrgID – The organization the course belongs to.
- CourseID – The course to update. Must match an existing course in that organization.
Columns you can update
- CourseName – Course title (text).
- CourseDescription – Course description (text).
- Notes – Course notes (text).
- SelfRegCourseFlag – Allow learners to self-register. 1 = Yes, 0 = No.
- SelfRegCoursePassword – Access code required for self-registration (text).
- Width – Course window width in pixels.
- Height – Course window height in pixels.
- ResizableFlag – Allow the course window to be resized. 1 = Yes, 0 = No.
- CourseDuration – Course duration (number).
- IsActiveFlag – Course is active. 1 = Active, 0 = Inactive.
- Amount – Course price (number, for example
25.00). - CreditHours – Credit hours awarded (number).
- ApprovalRequestsFlag – Enrollment requests require approval. 1 = Yes, 0 = No.
- AllowAutoEnrollFlag – Allow auto-enrollment. 1 = Yes, 0 = No.
- CourseType – Course type (a CourseMill course type value).
- DueDateDays – Due date, in days after enrollment (whole number).
- Duration – Duration, in days (whole number).
- StaticDueDate – Fixed due date, in YYYY-MM-DD format (for example,
2026-12-31). - StaticExpirationDate – Fixed expiration date, in YYYY-MM-DD format (for example,
2027-06-30). - ReenrollCertDays – Re-enrollment certification period, in days. Whole number, 0 or greater.
- ReenrollPriorExpiration – Days before expiration to re-enroll. Whole number, 0 or greater.
Special rules
DueDateDays and Duration cannot be used together on the same course.
- If your file sets DueDateDays and the course currently has a Duration, the new DueDateDays is saved and the existing Duration is cleared.
- If your file sets Duration and the course currently has a DueDateDays, the new Duration is saved and the existing DueDateDays is cleared.
- If a row sets both DueDateDays and Duration, neither is updated and the row is listed in the error report.
Automatic re-enrollment: Providing a ReenrollCertDays value turns on automatic re-enrollment for certification for that course. Providing only ReenrollPriorExpiration does not turn it on. This matches how these settings behave when edited on the course.
Template and example files
The template file contains the header row with every column. Make a copy, delete the columns you don't want to change, and add one row per course. Because blank cells clear values, don't leave unused columns in the file.
Download the template here: CourseMill_Batch_Course_Import_Template.csv
Each example below changes only the columns it includes.
Inactivate retired courses
OrgID,CourseID,IsActiveFlag ORG001,LEGACY200,0 ORG001,LEGACY210,0
Change credit hours
OrgID,CourseID,CreditHours ORG001,SAFETY101,1.0 ORG001,SAFETY102,0.75
Set a due date and automatic re-enrollment
OrgID,CourseID,DueDateDays,ReenrollCertDays,ReenrollPriorExpiration ORG001,SAFETY101,30,365,30 ORG002,CERT500,14,730,60
Set fixed due and expiration dates
OrgID,CourseID,StaticDueDate,StaticExpirationDate ORG001,SAFETY102,2026-12-31,2027-06-30
Run the batch import
- Prepare your file and save it in CSV format.
- Click the Curriculums/Courses side tab and click Manage Courses.
- Click Batch Course Import.
- Select your CSV file and start the import.
- When the import finishes, review the results and download the error report if any rows were not applied.
- Spot-check a few updated courses to confirm the new values.
Review results and errors
Valid rows are applied even when other rows in the same file have errors. Rows or values that could not be applied are listed in the import error report.
- "Error - DueDateDays and Duration cannot both be used for a Course." – The row has values for both DueDateDays and Duration. Keep only one of the two and re-import the row.
- Warning on ReenrollCertDays or ReenrollPriorExpiration – The value is negative, a decimal, or not a number. Enter a whole number of 0 or greater.
- Error on DueDateDays, Duration, StaticDueDate, or StaticExpirationDate – The value is not in a valid format. Day values must be whole numbers, and dates must use YYYY-MM-DD. Correct the value and re-import the row.
- Course not updated – The OrgID and CourseID don't match an existing course. Check both IDs; a CourseID is matched only within its own organization.
To fix errors, correct only the failed rows and import them again. Rows that already succeeded don't need to be re-imported.
Frequently asked questions
How do I clear a field for a course?
Include that column and leave the course's cell blank. The import clears the current value.
Can I update courses in more than one organization in the same file?
Yes. Each row is matched on its own OrgID and CourseID, so only the matching course is updated.
Does changing course settings affect learners already enrolled?
Changes apply to the course settings. If you're unsure how a change (such as due date or duration) affects current enrollments, test on a single course first or contact Customer Solutions.