Skip to main content

Import Course Dates (Classes and Sessions) from a Spreadsheet

Create or update course dates and blocks of sessions in bulk from a spreadsheet, using the course dates template, and check which rows failed.

Written by Artur Binzaru

This guide is for course providers who want to add many class dates or sessions at once, for example from an old website or another booking system, or to change dates they already have.

​

The import reads a spreadsheet, not a website, so first put your dates in a CSV or Excel file, one row per date. Each row creates one date on an existing course, or updates a date you already have.

A course date is one scheduled session of a course. Cademy’s import screens call a course date an occurrence. A block is a group of dates on one course that learners book together.

​


​

What You Need Before You Import Course Dates

  • You need the Course Owner or System Admin role. A Facilitator cannot open the Imports page.

  • The import is available on every Cademy plan.

  • The course must already exist. The import does not create courses: see Import a List of Courses from a CSV or Excel File.

  • The course cannot be an on-demand course. A row for an on-demand course is not imported.

  • It adds and changes dates, never deletes them, and cannot be undone.

​


​

Prepare Your Course Dates Spreadsheet

Save the file as CSV or Excel. In an Excel file, Cademy reads the first sheet only. Put the column headings in the first row. Each row under it is one course date.

​

Three fields are required in every row: Course, Starts at and Ends at. Every other field is optional. Headings can be anything: one that is the same as a Cademy field name, such as Starts at, is matched for you, and you map the others.

Accents and symbols: if your file has letters or symbols such as é or £, save it as Excel. A CSV file can be read with these characters wrong, for example Zoë as Zoë, and a course name read wrong is not found.

​

Get the CSV Template to Import Course Dates (Example File)

Cademy’s course dates example file has every column. The import window links to it as View example file. Make a copy and replace the example rows with your own.

​

In the example file, the headings of the three required columns end with “(required)”, and the Cademy Occurrence ID heading has a note in brackets. Cademy does not match these four columns for you, so select them yourself when you map, or rename the headings. The example dates are written like 2027-01-08 10:00, which is the format YYYY-M-D HH:mm.

​

Say Which Course Each Date Belongs To (Name, Course ID or Course Code)

Every row names its course in one of three ways, chosen when you map your columns:

  • Course Name: written exactly as in Cademy, including capital letters and spaces.

  • Cademy Course ID: the ID that Cademy gave the course. An export of your dates lists it in the Course ID column.

  • Course Code: your own code for the course, set in the course editor under Settings, then Advanced Settings. A course import can set it too, with its Course Code column.

If Cademy cannot find the course, the row is not imported. If two courses share a name, use the Course ID or Course Code. If every row is for the same course, choose Fixed value for Course and pick the course once.

​

How Course Codes Work for E-Learning (On-Demand) Courses

An on-demand course has no dates, so the Course Dates Import cannot use it, whatever its code. Its Course Code is your own reference, which a course import can use to find it: see Import a List of Courses from a CSV or Excel File.

​

Write the Start and End Date and Time in a Format Cademy Can Read

Write the date and the time together in one cell, for example 5/11/26 09:00. Use the 24-hour clock: Cademy does not read AM or PM, so 2:30 PM is read as 02:30. The end must be later than the start.

​

When you map Starts at and Ends at, you choose your file’s format from a list.

Format in the list

How 5 November 2026 at 09:00 is written

D/M/YY HH:mm

5/11/26 09:00

D/M/YYYY HH:mm

5/11/2026 09:00

M/D/YY HH:mm

11/5/26 09:00

MM/DD/YYYY HH:mm

11/05/2026 09:00

YYYY-M-D HH:mm

2026-11-05 09:00

YYYY-MM-DDTHH:mm:ss.SSSZ

2026-11-05T09:00:00.000Z, where Z is a time zone offset that changes the time. Use it only if your file has offsets.

YYYY-MM-DDTHH:mm:ss.SSSS

2026-11-05T09:00:00.0000

YYYY-MM-DDTHH:mm:ss.SSS

2026-11-05T09:00:00.000

YYYY-MM-DDTHH:mm:ss

2026-11-05T09:00:00

YYYY-MM-DDTHH:mm

2026-11-05T09:00

YYYY/M/D HH:mm

2026/11/5 09:00

Choose the format that matches your file exactly, including a two-digit or four-digit year. Cademy does not warn you when they differ: the row either fails or is saved with a different date and time. The list starts on D/M/YY HH:mm.

In an Excel file, format the date cells as Text before you type the dates. A cell stored as an Excel date reaches Cademy as a number and is read as January 1970, often without the row failing. A Course Code that contains only digits must also be in a Text cell. In a CSV file every date is already text.

​

Cademy reads the times in the course’s time zone. To use another time zone for a row, add a Timezone column with a name such as Europe/London. An unrecognised name uses the course’s time zone.

​

Optional Columns: Places, Prices, Venue, Owner and Visibility

If you leave a field out, a new date gets the value in the last column.

Cademy field

What to enter

If you leave it out

Session Name

A name for this date.

No name.

Session Description

A description for this date.

No description.

Spaces

The number of places on the date.

The course’s default spaces, or 10.

Available spaces and Spaces used

The places still free and already taken. Together they must equal Spaces, or the row fails.

Available spaces equals Spaces, and Spaces used is 0.

Delivery

in-person, online or hybrid.

The course’s delivery.

Join URL

The link learners use to join an online date.

See “Skip the Join URL?” below.

Location Name

The name of a saved location, in any capital letters. If none has that name, Cademy uses the address columns.

The address columns, then the course’s location.

Street, City, Postcode, Country

The address, used only when City has a value. An empty Country means United Kingdom. With no matching saved location, Cademy creates one.

The course’s location.

Owner

The team member who runs the date: their email address or Cademy Admin ID. They must be a current user on your account.

The course’s facilitators and owners.

Visibility

public or private.

public.

Offer 1 Name and Offer 1 Price, up to Offer 4

Up to four prices, each a plain number such as 25.50 with no currency symbol. A name with no readable price gets 0. A price with no name is called General Admission (Offer 1), or Offer 2 to Offer 4.

No prices on the date.

Occurrence Code

Your own reference for the date. A later import can use it to find the date.

No code.

An unreadable value is not always rejected. For Delivery, Visibility and the number fields, Cademy ignores a value it does not recognise, such as £25, and imports the row as if the cell were empty. An offer with a name and an unreadable price gets the price 0.

The import has no Currency field. A new standalone date follows the course currency. To use another currency, change it in the date’s editor after the import. See Choose the Currency for Your Course Prices. Check currency and prices before you import bookings for these dates.

​

Skip the Join URL? When Cademy Generates a Zoom Link for Imported Course Dates

The Join URL column is optional. For new dates, what a date gets depends on the row:

  • With a Join URL, the date uses that link.

  • With no Join URL, an online or hybrid date on a course that uses a connected Zoom account gets a new Zoom meeting, and Cademy saves its link on the date. If Zoom cannot create the meeting, the date is imported without a link.

  • With no Join URL and no Zoom on the course, Cademy does not create a link for the date. For a class or blended course, learners booked on the date then see the course’s own online joining link, if the course has one.

  • Without an imported Join URL, an in-person date gets no link.

​

When updating an online or hybrid date, leaving Join URL blank keeps its existing manual joining link. To connect Zoom, see Connect Zoom to Create Meeting Links for Course Dates.

​


​

Import Course Dates Step by Step

Open the Course Dates Import

  1. In the Cademy admin dashboard, select Settings in the main menu, then Imports under Tools.

  2. Under Start an Import, select Course Dates Import. A window titled Import occurrences opens.

​

Upload Your Course Dates File

  1. Drag your file onto Drop or Select a file, or select Select file and choose it.

  2. Wait for the upload to finish. The window shows Configure your import. You do not need to select Next.

With no rows under the headings, Cademy shows “There was an issue processing your file. Please try again.”

​

Import occurrences window at Upload a file to import, with the links View example file and Learn more about imports, the Drop or Select a file area with a Select file button, and Cancel and Next

​

Map Your Columns to Course Date Fields

Fields that Cademy matched to your headings are already filled in.

  1. For each field you want, choose a Value Source: Do not import, CSV column (a column of your file, also for Excel files) or Fixed value (the same value in every row; for Course you pick the course from a list).

  2. With CSV column, select your column under File Column. For Course, Starts at, Ends at and Owner, choose in the second list beside it how the column is written: Course Name, Cademy Course ID or Course Code; the date format; or Cademy Admin ID or Email.

  3. Check every second list, also on matched fields. It starts on its first option (Course Name, D/M/YY HH:mm or Cademy Admin ID), and goes back to it when you change the column.

  4. Check Sample Data, the values from the first five rows. A date must look the way you typed it. A number such as 46331.375 means the cell is an Excel date: change it to text and upload the file again.

  5. Course, Starts at and Ends at are marked REQUIRED. While one of them has no value source, a warning titled Incomplete mappings names it, and you cannot select Next.

  6. Select Next.

​

Three rows of the mapping table of the Import occurrences window: Course, marked Required, takes the column Course with a second list beside it; Delivery is set to Do not import; Ends at, marked Required, takes the column Ends at with a second list of date formats beside it, which is outlined

​

Choose Whether to Update Existing Dates and Start the Import

The window shows We will attempt to import and the number of rows in your file. If the file contains blocks, a line under it counts the blocks and the standalone dates.

​

Import occurrences window reading We will attempt to import 7 records and, under it, That's 1 block (2 dates) and 5 standalone dates, with the switch Update existing occurrences turned on and outlined, a box titled Deduplication Logic, and the buttons Back and Import Data

​

  1. Decide whether to leave Update existing occurrences on. On: a row that matches a date you already have changes it, and a row that matches nothing creates a new date. Off: every row creates a new date, even if the same date exists. The switch is on when you open the Imports page; if you turn it off, it stays off until you leave the page.

  2. Select Import Data. Cademy shows “Import is being processed. You will be notified by email when it is complete.”

​


​

Check Which Course Dates Were Imported and Which Rows Failed

Go to Settings, then Imports, and look at Your Imports. The newest import is at the top, with the type Occurrences. While it is PROCESSING, the table refreshes every 10 seconds. PROCESSED means Cademy has tried every row, not that every row succeeded, so always check FAILED.

​

Your Imports table with the columns Type, Date, Imported, Failed, Source and Status and four rows, all Processed: Occurrences, outlined, with 6 imported and 1 failed; Courses with 4 imported and 2 failed; Contacts with 15 imported and 0 failed; Organisations with 5 imported and 0 failed

​

  • IMPORTED: the rows that created or changed a date. Select the number to open Imported Occurrences, with each date’s course, start, end and ID in capital letters. The eye button opens the date in a new tab.

  • FAILED: the rows that were not imported. Select the number to open Failed Occurrences, with a ROW NUMBER and a REASON for each row. Row 1 is the first row under your headings.

When processing ends, Cademy emails the person who started the import, if they still have access, with the number of dates imported and each failed row and its error.

​

If an import stays at PROCESSING and no email arrives, look for its dates before you upload the file again, and contact Cademy Support with the date and time shown in Your Imports. Do not import the file again with Update existing occurrences off, or the rows already imported are created twice.

​

Imported Course Dates Not Showing Up or Not Scheduling

If you cannot see the dates you imported, check these points:

  1. Wait for PROCESSED or the email.

  2. Check the FAILED number. A failed row creates no date.

  3. Open the course, select Edit Course, then the Dates tab, and tick Show passed dates to see dates that have passed. On the Courses page, the Dates layout shows Upcoming dates to begin with: choose Past under Show for earlier ones.

  4. Check the year: a date read as 1970, or with the wrong year, is listed with past dates (see below).

  5. On your website, dates show only on a published course, and private dates are not listed publicly: see Offer a Private Course Date for One Group or Company.

​

Why Course Date Rows Fail and How to Fix Them

A failed row does not stop the others, except in a block. Put the corrected rows in a new file and import it, or import the whole file again with Update existing occurrences on.

Reason

What to check

Course with Course Name First Aid at Work not found

Check that a course has that value, and that the second list under Course matches what your file holds.

The required field "Starts at" needs a value for this record

The cell is empty, or it cannot be read in the format you chose, for example a date with no time. The same reason is used for Course and Ends at.

End time must be after the start time

The end is the same as the start, or earlier.

On-demand courses are not supported

The course in the row is an on-demand course.

Spaces used and available spaces exceed total spaces

Spaces used plus Available spaces does not equal Spaces.

Admin with Email jo@example.com not found

The Owner is not a current user on your account, or the second list under Owner does not match your file. Change Cademy Admin ID to Email if the column holds email addresses.

A reason that starts with Block and the block’s name

The row belongs to a block that could not be imported. See “Import a Multi-Session Course Date (Block of Dates)”.

An unknown error occurred importing this row

One cause is an address whose Country is not a country name Cademy recognises. Otherwise, send Cademy Support the import’s date and time and the row number.

​

Course Dates Import Processed the Wrong Date or Time? Check the Date Format

Check four things: the format you chose matches the file exactly, Excel date cells are Text (Excel dates become January 1970), times use the 24-hour clock, and a row in another time zone has a Timezone value.

​

Correct the file, then import again with Update existing occurrences on and each date’s Occurrence ID or Occurrence Code, so the rows change the dates already created. Without an ID or a code, new times create second dates: delete the wrong ones in the Dates tab of the course editor (Edit Course).

​


​

Import a Multi-Session Course Date (Block of Dates)

To import a block, add a Block Name column. Rows for the same course with the same Block Name are imported as one block, and each row becomes one date in it. Capital letters, and spaces around the name, do not matter. Rows with no Block Name are separate dates.

​

The block’s own settings come from its first row. Cademy ignores these columns in its other rows.

Cademy field

What it sets for the block

Block Code

Your own reference for the block. A later import can use it to find the block.

Block Booking

Block: learners book the whole block. Block or Individually: they can also book a single date. Left out: a new block uses Block, an existing block keeps its setting.

Block Capacity

The places on the block. If you leave it out, Block booking uses Spaces from the first row; otherwise an existing block keeps its capacity and a new block gets the course’s default spaces, or 10.

Block Description

A description of the block.

Block Bookable After Start

yes or no: whether the block can still be booked after it starts. A new block uses no if you leave it out.

Block Offer 1 Name and Block Offer 1 Price, up to Block Offer 4

Up to four prices for the whole block, with the same rules as the Offer columns.

  • With Block booking, every date in the block has the block’s capacity, and the Offer columns are not used for single dates. If the first row has no Block Offer values, its Offer columns set the block’s prices.

  • With Block or Individually booking, each date keeps the Spaces and offers from its own row, and the Block Offer columns set the price of the whole block.

  • The block starts when its earliest date starts and ends when its latest date ends. Its visibility comes from Visibility in its first row.

If Cademy cannot create one of the block’s dates, for example because its end is before its start, no row of that block is imported. Each row is listed under FAILED with a reason that names the block and the row at fault, such as Block "January Evenings": row 7: End time must be after the start time. A row whose course is not found, or whose required value cannot be read, fails on its own.

​

With Update existing occurrences on, an import can change a block you already have:

  • Cademy finds the block by its Block Code on the same course, otherwise by its Block Name on the same course.

  • Rows that match a date in the block change that date. Rows that match no date are added to the block.

  • A row that matches a date outside the block fails: the import does not move dates into or between blocks.

  • If every matched date is in one block and your file gives another Block Name, the block is renamed.

  • Dates of the block that are not in your file stay as they are.

With the switch off, the rows create a new block, even if the course already has a block with that name.

​


​

Update Existing Course Dates with an Import

With Update existing occurrences on, Cademy looks for one match per row, using the first of these that the row has:

  1. A Cademy Occurrence ID: the date with that ID.

  2. No ID but an Occurrence Code: the date with that code.

  3. Neither: a date on the same course with exactly the same start and end.

If the row’s ID or code matches no date, Cademy creates a new date without comparing times, although the Deduplication Logic box shows the checks as steps in turn.

​

When Cademy finds the date, the row changes it as follows:

  • The course, start and end are replaced by the row’s values. To move a date to new times, give its ID or code.

  • Session Name and Description, the spaces fields, Delivery, the location, Owner, Visibility and Occurrence Code change only when the row has a value.

  • A value in any Offer column replaces all of the date’s offers.

  • To change the places, give Spaces, Spaces used and Available spaces together. With only Spaces, the row fails if the three numbers no longer add up.

  • A Zoom meeting that Cademy created for the date moves to the new times. A Join URL in the row, or a change to in-person, cancels the Zoom meeting.

To get a date’s ID or code, export your dates. See Export or Download Your Data as a CSV File. Do not copy an ID from Imported Occurrences, which shows IDs in capital letters. You set a date’s code in the Occurrence code field in the Other section of the date’s editor, or with the Occurrence Code column.

Important: importing the same file twice with Update existing occurrences off creates every date twice.

​


​

Tips Before a Large Course Dates Import

  • Import two or three rows first, and check one imported date’s time, time zone, spaces, currency and prices.

  • Give each date an Occurrence Code if you keep dates in another system or will update them by import later.

​


​

Related Guides

​


​

Frequently Asked Questions

Can a course date import assign an archived Owner or Facilitator?
No. The Owner must be a user who has access to your account now, so a row that names an archived user is not imported. A System Admin must reactivate the user first: see Remove a Team Member’s Access (Archive a User).

​

Can I undo an import?
No. Imported Occurrences lists every date the import created or changed, so you can correct or delete each one.

Did this answer your question?