Skip to main content

Import Course Dates

Create or update course dates in bulk from a CSV or Excel file, import blocks of dates, and check which rows were imported and which failed.

Written by Artur Binzaru

This guide is for course providers who want to add or change many course dates at once. It explains how to prepare a spreadsheet, map its columns to Cademy fields, import it, check the result, update dates that already exist, and import a block of dates.

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 the Course Dates Import does

The Course Dates Import reads a CSV or Excel file and creates one course date for each row. It can also change dates that already exist, and it can group rows into a block.

​

Before you start, check that the import fits what you need:

  • 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 in Cademy. The import does not create courses. To create courses from a file, see Import Courses.

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

  • The import adds and changes dates. It does not delete dates, and an import cannot be undone.

​


​

Prepare your file

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.

​

If your file has letters with accents or symbols, such as é or £, save it as Excel. Depending on the program that saved it, a CSV file is read with these characters wrong, for example Zoë as Zoë. A course name that is read wrong is not found, so the row is not imported.

​

Three fields are required in every row: Course, Starts at and Ends at. Every other field is optional.

​

Cademy provides an example file that contains every column: course dates example file. Make a copy of it and replace the example rows with your own. Whichever file type you save your copy as, the note on accents above and the note on Excel dates below apply to it. In the example file, the headings of the three required columns end with “(required)”, and the heading of the Cademy Occurrence ID column has a note in brackets. Cademy does not match these four columns for you, so select them yourself when you map your columns, or rename the headings.

​

You can give your columns any headings. If a heading is the same as the name of a Cademy field, for example Starts at, Cademy selects that column for the field when you map your columns. Capital letters do not matter. You map every other column yourself.

​

Identify the course

Every row must say which course the date belongs to. You can identify the course in one of three ways. You choose which one when you map your columns:

  • Course Name: the course’s name, written exactly as it is 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: the value in the course’s Course code field, if you have filled it in. To find the field, select Settings in the course editor, then Advanced Settings.

If Cademy cannot find the course, the row is not imported. If two of your courses have the same name, use the Cademy Course ID or the Course Code, so that each date goes to the course you mean.

​

If every row is for the same course, your file does not need a course column. You can pick the course once when you map your columns.

​

Write the start and end date and time

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 your columns, you choose the format your file uses from a list, once for Starts at and once for Ends at. In the format names, D is the day, M is the month, YY is a two-digit year, YYYY is a four-digit year, HH:mm is the time, ss is the seconds, S is a fraction of a second and Z is a time zone offset.

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. The cell must end with a time zone offset, and the offset changes how the time is read. Choose a format without Z unless your file already contains 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

Important: Choose the format that matches your file exactly, including whether the year has two or four digits. Cademy does not warn you when the format and the file differ. Either it cannot read the cell and the row is not imported, or it reads a different date and time from the cell and saves that. The first format in the list, D/M/YY HH:mm, is selected to begin with.

The dates in the example file are written like 2027-01-08 10:00. For that style, choose YYYY-M-D HH:mm.

​

In an Excel file, enter dates and times as text: format the cells as Text before you type them. If Excel stores a cell as a date, Cademy receives a number instead of the date you see and reads it as a date in January 1970. The row is imported with that date and is not listed as failed, as long as its end is later than its start. A Course Code that contains only digits must also be in a Text cell, otherwise the course is not found. 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 time zone name such as Europe/London. If Cademy does not recognise the name, it uses the course’s time zone.

​

Add optional columns

Add a column for each detail you want to set. If you leave a field out, a new date gets the value in the last column of this table.

Cademy field

What to enter

If you leave it out

Session Name

A name for this date.

The date has no name.

Session Description

A description for this date.

The date has no description.

Spaces

The number of places on the date.

The course’s default number of spaces, or 10 if the course has none.

Available spaces and Spaces used

The number of places still free, and the number already taken. Spaces used plus Available spaces must equal Spaces, otherwise the row is not imported.

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.

If the date is online or hybrid and the course uses a connected Zoom account, Cademy creates a Zoom meeting for the date. If Zoom cannot create the meeting, the date is still imported, without a link.

Location Name

The name of a location saved in Cademy. Capital letters do not matter. If no saved location has that name, Cademy uses the address columns.

Cademy uses the address columns. If they give no location either, the date uses the course’s location.

Street, City, Postcode, Country

The address. Cademy uses these columns only when City has a value. If Country is empty, Cademy uses United Kingdom. If no saved location matches the address, Cademy creates a saved location.

The date uses the course’s location.

Owner

The team member who runs the date: their Cademy Admin ID or their email address. Use the email address unless you already have the IDs. 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 for this date, each with a name and a price. Write the price as a plain number, such as 25 or 25.50, with no currency symbol. Cademy creates an offer when its name or its price has a value. A name with no price, or with a price Cademy cannot read, creates an offer with the price 0. A price with no name creates an offer called General Admission for Offer 1, or Offer 2, Offer 3 or Offer 4.

The import sets no prices on the date.

Occurrence Code

Your own reference for the date. Cademy can use it to find the date in a later import.

The date has no code.

For Delivery, Visibility and the number fields, Cademy ignores a value it does not recognise, such as a price written as £25. The row is imported as if the cell were empty, and it is not listed as failed. For a price, this means that an offer with a name is created with the price 0. Check these columns before you import.

​

Two more groups of columns are described later in this guide: Cademy Occurrence ID in “Update existing course dates”, and the columns that start with Block in “Import a block of dates”.

​


​

Import course dates step by step

The import has four steps: open the import, upload your file, map your columns to Cademy fields, and start the import.

​

1. Open the Course Dates Import

  1. Sign in to the Cademy admin dashboard at admin.cademy.io.

  2. In the main menu, select Settings.

  3. Under Tools, select Imports. The Imports page has two sections: Start an Import and Your Imports.

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

2. Upload your file

The window shows Upload a file to import. Its View example file link opens the example file.

​

  1. Drag your file onto the area marked Drop or Select a file, or select Select file and choose the file. You can upload one file at a time.

  2. Wait for the upload to finish. The window then shows Configure your import, with a table of Cademy fields. You do not need to select Next.

If Cademy finds no rows under the headings, it shows “There was an issue processing your file. Please try again.” and stays on this step.

​

3. Map your columns to Cademy fields

Mapping tells Cademy which column of your file fills which field. The table has one row for each Cademy field, in alphabetical order. Its columns are Cademy Field, Value Source, File Column and Sample Data. Fields that Cademy matched to one of your headings are already filled in.

  1. For each field you want to import, choose a Value Source:

    • Do not import: the import takes no value for this field from your file.

    • CSV column: the field takes its value from a column of your file. The choice has this name for Excel files too.

    • Fixed value: every row gets the same value, which you enter or pick under File Column. For Course, you pick the course from a list.

  2. If you chose CSV column, select your column under File Column. For Course, Starts at, Ends at and Owner, a second list appears under it:

    • For Course, choose Course Name, Cademy Course ID or Course Code.

    • For Starts at and Ends at, choose the date and time format your file uses.

    • For Owner, choose Cademy Admin ID or Email.

  3. Check the second list for every field that has one, including the fields Cademy matched for you. It starts on its first option: Course Name, D/M/YY HH:mm or Cademy Admin ID. It also goes back to its first option when you select a different column.

  4. Look at Sample Data. It shows the values Cademy read from the first five rows of the column. A date must look the way you typed it. If it shows a number such as 46331.375, the cell is stored as an Excel date: change it to text, then upload the file again.

  5. Make sure Course, Starts at and Ends at each have a value source. They are marked REQUIRED. While one of them is missing, a warning titled Incomplete mappings names it, and you cannot select Next.

  6. Leave the fields you do not need on Do not import.

  7. Select Next.

4. Choose whether to update existing dates, then start the import

The window shows We will attempt to import followed by the number of rows Cademy found in your file. If the file contains blocks, a line under it counts the blocks and the standalone dates, which are the dates that are not in a block.

  1. Decide whether to leave Update existing occurrences on. It is on when you open the Imports page. If you turn it off, it stays off for later imports until you leave the page, so check it each time. Read “Update existing course dates” below before you import a file that contains dates you already have.

    • On: a row that matches a date you already have changes that date. A row that matches nothing creates a new date. A box titled Deduplication Logic describes the matching.

    • Off: every row creates a new date, even if the same date already exists.

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

To change something first, select Back. Nothing is imported until you select Import Data.

​


​

Check the results

Cademy processes the file in the background, so you can keep working. To see the result, go to Settings, then Imports, and look at Your Imports. The newest import is at the top.

​

  • TYPE: a course dates import is shown as Occurrences.

  • DATE: the date and time of the upload.

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

  • FAILED: the number of rows that were not imported. Select the number to open the list Failed Occurrences, which gives a ROW NUMBER and a REASON for each row.

  • SOURCE: shows CSV File for every import, including Excel files.

  • STATUS: PROCESSING while Cademy works through the file, then PROCESSED. While an import is processing, the table refreshes by itself every 10 seconds.

PROCESSED means that Cademy has finished working through the file. PROCESSED does not mean that every row succeeded, so always check the FAILED column.

​

An import that stops before it finishes stays at PROCESSING. If an import stays at PROCESSING and no email arrives, look for its dates in Cademy before you upload the file again, and contact Cademy Support with the import’s type and the date and time shown in Your Imports. Do not import the file again with Update existing occurrences off, because rows that were already imported would be created a second time.

​

ROW NUMBER counts the rows under your headings. Row 1 is the first date below your headings, which is row 2 of a spreadsheet with no empty rows. Each row is imported separately, so a failed row does not stop the others. The rows of a block are the exception: see “Import a block of dates”.

​

The table explains reasons this import gives. The course name and the email address in them are examples.

Reason

What to check

Course with Course Name First Aid at Work not found

The words after “with” are the option chosen in the second list under Course, then the value from your file. Check that a course exists with that value, and that the option matches what your file contains.

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 words after “with” are the option chosen in the second list under Owner, then the value from your file. If the option is Cademy Admin ID and the value is an email address, change the list to Email. Otherwise the Owner is not a current user on your account.

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

The row belongs to a block that could not be imported, or the row could not be added to the block. See “Import a block of dates”.

An unknown error occurred importing this row

Cademy could not save the row for another reason. One cause is an address with a City and a Country that Cademy does not recognise as a country name. If you cannot find the cause, send Cademy Support the date and time of the import and the row number.

When processing ends, Cademy sends an email to the person who started the import, as long as that person still has access to the account. Its subject starts with “Cademy:” and gives the number of occurrences imported. The email lists each failed row with its row number and its error.

​

To import the failed rows, put the corrected rows in a new file and import that file. If you import the whole file again instead, leave Update existing occurrences on, so that a row which matches the date it created changes that date and does not create it again.

​


​

Update existing course dates

With Update existing occurrences on, Cademy looks for an existing date for each row. It uses one of these three checks, the first that applies to the row:

  1. If the row has a Cademy Occurrence ID, Cademy looks for the date with that ID.

  2. If the row has no ID but has an Occurrence Code, Cademy looks for the date with that code.

  3. If the row has neither, Cademy looks for a date on the same course with exactly the same start and end.

Cademy makes one check for each row. If the row has an ID or a code and no date has it, Cademy does not go on to compare the course, start and end. It creates a new date. The Deduplication Logic box lists the same three checks as steps that follow one another; each row gets only one of them, as described here.

​

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

  • The date’s course, start and end are replaced by the values in the row. To move a date to a new time, give the row the date’s ID or code and the new times. Without an ID or a code, a row with new times matches nothing and creates a second date.

  • Session Name, Session Description, Spaces, Available spaces, Spaces used, Delivery, the location, Owner, Visibility and Occurrence Code change only when the row has a value for them. An empty cell leaves the date’s current value in place.

  • If the row has a value in any Offer column, the offers in the row replace all of the date’s existing offers.

  • To change the number of spaces, give Spaces, Spaces used and Available spaces together, so that Spaces used plus Available spaces equals Spaces. If you give only Spaces, Cademy keeps the date’s current Available spaces and Spaces used, and the row is not imported when the three numbers no longer add up.

  • If the date’s meeting was created through a connected Zoom account, Cademy moves that Zoom meeting to the new times. If the row has a Join URL, that link is used and Cademy cancels the Zoom meeting. If the row changes the date to in-person, Cademy cancels the Zoom meeting.

To get a date’s ID, export your dates. The export contains an Occurrence ID column and an Occurrence Code column: see Export Data or Schedule an Export. Do not copy an ID from the Imported Occurrences list. That list shows IDs in capital letters, and the import matches an ID exactly, capital letters included. A row whose ID matches no date creates a new date. You set a date’s code yourself, in the Occurrence code field in the Other section of the date’s editor, or with the Occurrence Code column of an import.

Important: With Update existing occurrences off, every row creates a new date. If you import the same file twice with the switch off, every date in it is created twice.

​


​

Import a block of dates

To import a block, add a Block Name column. Rows for the same course that have the same Block Name are imported together as one block, and each row becomes one date in the block. Capital letters, and spaces before or after the name, do not matter. Rows with no Block Name are imported as separate dates, so one file can contain both.

​

The settings for the block as a whole come from the first row of the block in your file. Cademy ignores these columns in the block’s other rows.

Cademy field

What it sets for the block

Block Code

Your own reference for the block. Cademy can use it to find the block in a later import.

Block Booking

Block: learners book the whole block. Block or Individually: learners can also book a single date. If you leave it out, a new block uses Block, and an existing block keeps its current setting. Cademy ignores any other value.

Block Capacity

The number of places on the block. If you leave it out and the block uses Block booking, Cademy uses Spaces from the first row. Otherwise, or if that is empty too, an existing block keeps its capacity, and a new block gets the course’s default number of spaces, or 10 if the course has none.

Block Description

A description of the block.

Block Bookable After Start

yes or no: whether the block can still be booked after its start date. If you leave it out, a new block uses no.

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

Up to four prices for the whole block. The rules are the same as for the Offer columns: a name with no price, or with a price Cademy cannot read, creates an offer with the price 0, and a price with no name creates an offer called General Admission, Offer 2, Offer 3 or Offer 4.

The dates inside the block get their places and prices in one of two ways:

  • With Block booking, every date in the block has the block’s capacity, and the Offer columns are not used for the 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 the 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. The block’s 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 or its spaces do not add up, no row of that block is imported. Each of its rows 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 that fails earlier, because its course is not found or a required value cannot be read, fails on its own, and the rest of the block is imported without it.

​

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. If the first row has no code, or no block has it, Cademy looks for a block with the same Block Name on the same course.

  • Rows that match a date already in the block change that date. Rows that match no date are added to the block as new dates.

  • A row that matches a date outside the block, either a standalone date or a date in another block, is not imported. It is listed under FAILED, and the other rows are imported. The import does not move dates into a block or between blocks.

  • If every matched date already belongs to one block and your file gives a different Block Name, Cademy renames that block.

  • 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.

​


​

Tips before a large import

  • Import two or three rows first. Then open one imported date and check its time, time zone, spaces and prices before you import the full file.

  • Keep a copy of your original file.

  • Give your columns the same names as the Cademy fields, so that Cademy matches them for you.

  • Use Fixed value for a field that is the same in every row, such as Course or Owner.

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

  • A new date is public unless its row sets Visibility to private.

​


​

Related guides

​


​

Frequently asked questions

Which fields are required when importing course dates?
​Course, Starts at and Ends at are required in every row, including rows that update an existing date.

​

Can the import update existing course dates?
Yes, when Update existing occurrences is on. Cademy finds the date by its Cademy Occurrence ID if the row has one, otherwise by its Occurrence Code if the row has one, otherwise by its course, start and end.

​

What happens if Update existing occurrences is turned off?
Every row creates a new course date, even if the same date already exists.

​

What file types can I use?
A CSV file or an Excel file. In an Excel file, Cademy reads the first sheet only.

​

How can I see which rows failed to import?
Go to Settings, then Imports, find the import under Your Imports, and select the number in the FAILED column. The list shows the row number and the reason for each row.

​

Why did my dates import with the wrong date or time?
Check four things. The date format you chose must match the file exactly, because Cademy does not warn you when it does not. In an Excel file, the cells must be text, not Excel dates, which are imported as dates in January 1970. Times must use the 24-hour clock, because Cademy does not read AM or PM. A row that needs a different time zone from the course’s needs a Timezone value. Correct the file or the format, then import again with the dates’ IDs or codes, so that the rows change the existing dates.

​

Can a course date import reactivate or 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 from Users & Facilitators first. For the steps, see Archive and Reactivate a User or Facilitator.

​

Will I be notified when the import finishes?
Yes. Cademy emails the person who started the import when processing ends, as long as that person still has access to the account.

​

Can I undo an import?
No. The import has no undo. The Imported Occurrences list shows every date the import created or changed, so you can open each one and correct or delete it.

Did this answer your question?