This guide is for course providers who want to bring bookings into Cademy from a spreadsheet, for example bookings taken in another system. It explains how to prepare a CSV or Excel file, how to run the Orders import, what each row creates and how to check the result.
An order is Cademy’s record of a booking: who booked, which course and course date, how many spaces, the cost and whether it is paid. A course date is a date on which a course runs. An on-demand course has no course dates. A registration is one person’s place on a course. A contact is a person saved in your Cademy account. Each row of an Orders import creates one order, with one registration for the contact in that row.
If you only need to put learners on a course and do not need a cost or payment record, use the Registrations import instead: see the guide to the Registrations import. If you are not sure which import you need, start with the imports overview.
What the Orders import does
Each row creates one order for one course. The contact in the row is the person who booked and the person attending.
An on-demand course has no course dates, so its rows need none. Every other course needs a course date that already exists in Cademy.
The import always creates new orders. It cannot find or change an order you already have, so importing the same rows twice creates the orders twice.
The import does not check whether the person is already booked on that course date, and it does not check how many spaces the course date has left.
A row cannot hold guest names, more than one course, add-ons, discounts or vouchers.
Cademy records the amounts you import. It does not take a payment, and it does not work out tax or fees from the course price.
An import cannot be undone. Cademy has no option to reverse or cancel an import once it has started.
Before you start
The Orders import is available on every Cademy plan. To run it you need the Course Owner or System Admin role. Only a System Admin can open the Orders page afterwards to look at the imported orders.
Your plan limits the number of rows in one file. On the Free, Starter and Pro plans a file can have up to 1,000 rows. The Teams plan has no row limit. On the Enterprise plan the limit is set for your account. If a file has too many rows, Cademy refuses it when you upload it and shows a message that starts You cannot import more than. Split the rows over several files.
Check these points before you import:
Every course in the file must already exist in Cademy. For every course that is not on-demand, the course date must exist too. The import does not create courses or course dates. To add many at once, see the guide to the Courses import and the guide to the Course Dates import.
If a course is set to require approval of its bookings, read “What each row creates” and “Emails the import sends” below first. Orders for that course wait for your approval, and the person is emailed.
Import a file with one or two rows first. Then check those orders before you import the rest.
Keep a copy of your original file.
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 below it is one order. Completely blank rows are skipped.
You can name your columns as you like, because during the import you tell Cademy which column holds which Cademy field. This is called mapping. If a column heading is the same as a Cademy field name, Cademy chooses that column for the field by itself. Capital letters do not matter, and you can change any choice on the mapping screens.
The import window has a View example file link. It opens this example spreadsheet: orders import example file. Its column Total Paid is not chosen for you, because the Cademy field is named Total Paid / Cost: choose the column by hand, or rename the heading. To start from the example, copy it into a file of your own.
Columns for the person
Each row needs at least one detail of the person who booked. Include Email, First Name and Last Name. Cademy finds a contact you already have by its email address. It can also find one by its Cademy ID, if you map that field and leave Update existing Contact on. A contact’s Cademy ID is the part of the contact page’s address after /contacts/. If Cademy finds no contact, it creates a new one, so a row without an email address and without a Cademy ID creates a new contact every time. A row with an email address that is not valid fails.
You can add columns for other contact fields, such as Phone, Tags or contact fields you have added yourself. The guide to the Contacts import lists the contact fields.
If you include a Marketing Consent column, write yes only for people who gave consent, and leave the cell empty for everyone else. Do not write no, false or 0. A no is saved as consent given, and so are false and 0 in a CSV file. The guide to the Contacts import has the full rule. “Choose whether to update existing contacts” below explains what this field does to contacts you already have.
Columns for the order
Only Course is marked as required on the mapping screen. Course Date is not marked, but every course that is not on-demand needs it. The fields are listed here in the order the mapping screen shows them.
Course - the course the order is for. Give the course name, the Cademy course ID or, if your courses have codes, the course code. Use the same kind of value in every row. A course’s Cademy course ID is in the address of the course’s page: it is the part after /courses/, up to the next / if there is one. On the course editor the address has /courses/edit/ before the ID. The value must be exactly the same as in Cademy, including capital letters and spaces. A row whose course is not found fails. If two of your courses have the same name, Cademy picks one of them, so use the ID or the code for those courses. In an Excel file, a course name or code made only of digits, such as 101, must be in a cell formatted as Text. Excel otherwise stores it as a number, and the course is not found.
Course Date - the day, or the day and time, the course date starts. Every course that is not on-demand needs it. Leave the cell blank for an on-demand course. “How Cademy finds the course date” below explains the formats.
Created date - listed, but not used. Every order gets the time of the import as its created date. Leave this field on Do not import.
Currency - one of these codes: GBP, USD, EUR, AUD, CAD, NZD, ZAR or MYR. If the cell is blank or holds anything else, Cademy uses the selected course date’s currency. If that date has no currency of its own, or the course is on-demand, it uses the course’s currency. For a new order linked to a date, an explicit supported currency must match that date’s currency or the row fails.
External Order Ref - a reference from another system. Cademy saves it on the order. It does not join rows into one order.
Payment Status - paid, awaiting_payment or overdue, spelled exactly like this. Capital letters do not matter. If the cell is blank, the order is saved as paid. A row with cancelled fails.
Secondary invoice ref - an invoice reference of your own. Cademy saves it as the order’s invoice reference.
Send Confirmation - yes, true or 1 to email the person. With no, false, 0 or a blank cell, no confirmation is sent. “Emails the import sends” below explains which email is sent.
Spaces - the number of places on the order, as a whole number. If the cell is blank, the order has 1 space. Only the contact in the row is registered. Extra spaces have no names.
Total Paid / Cost - the total for the whole order, not the price of one space, as a plain number such as 120 or 120.50. If the cell is blank, the cost is 0.
Important: Cademy does not refuse a value it cannot read in these fields. It saves a default and gives no warning. A cost that reaches Cademy with a currency symbol or a comma, such as £120 or 1,200 in a CSV file, is saved as 0: on the mapping screen, Sample Data shows each value as Cademy reads it. A payment status that is not one of the words above, such as unpaid, is saved as paid. Spaces that are not a number above 0 are saved as 1. Check these columns before you import, and check a few orders afterwards.
For example, if the course uses GBP and the selected date uses EUR, leaving Currency blank creates an EUR order. Enter the cost as the intended EUR amount; Cademy does not convert a GBP amount into euros. Entering GBP for that date fails the row. Check the date’s price and currency before preparing the file; see Choose Currencies for Courses, Memberships and Gift Cards.
How Cademy finds the course date
On the mapping screen you choose the format your Course Date column uses. Cademy then looks for a course date of the row’s course in this way:
With a format that has only a day, such as D/M/YYYY, Cademy looks for a course date that starts on that day. If the course has more than one course date starting that day, use a format with a time.
With a format that has a day and a time, such as D/M/YYYY HH:mm, the time must be exactly the start time of the course date.
Do not use the format D-MMM-YY. It has no time, but Cademy treats it as a time of 00:00, so it finds only course dates that start at midnight.
Cademy reads the day and time in your account’s time zone.
The first format in the list, D/M/YY HH:mm, expects a year with two digits. For a value such as 14/11/2025 09:30, choose D/M/YYYY HH:mm. With a format that does not match your file, Cademy reads a different day or cannot read the value. The row then fails, unless the course has a course date at the day and time Cademy read: in that case the person is booked onto that course date.
In an Excel file, format the cells of the Course Date column as Text before you type the dates, or save the file as CSV. If Excel stores a cell as a date, Cademy receives a number such as 45975.395833 in place of the date, and the row fails. Sample Data on the mapping screen shows that number, so check it there.
If your file has letters with accents or symbols such as é or £, upload an Excel file. Depending on the program that saved it, a CSV file is read with these characters wrong, for example Zoë as Zoë, and a course name that contains one is then not found. Sample Data shows the text as Cademy read it.
Upload the file and map contacts
Open the Orders import
Sign in to the Cademy admin dashboard at https://admin.cademy.io.
Select Settings in the main menu.
In the Settings menu, under Tools, select Imports. The page shows Start an Import at the top and Your Imports below it.
Select the Orders card. The Import Orders window opens. The top of the window names its three steps: Select file, Map Contacts and Map Orders.
If Tools and Imports are not in the Settings menu, your role is Facilitator. Ask a System Admin or Course Owner on your account to run the import.
A System Admin can also start the import from a course: open the course, select the Orders tab, then select Import (shown as Import Orders… when the actions are folded into a menu). The same window opens, and on the Map Orders step Course is already set to that course. If you are viewing one course date, Course Date is set too.
Upload your file
Drag your file onto the area marked Drop or Select a file, or select Select file and choose it. Upload one file at a time.
Wait while Cademy reads the file. The window then moves to the Map Contacts step by itself and shows the heading Configure your import.
If Cademy shows The uploaded file appears to be empty, check that the first sheet has a row of headings and at least one row below it, then upload the file again.
Map the contact columns
Mapping tells Cademy which column of your file fills which field. The screen lists the contact fields in alphabetical order in a table with four columns: Cademy Field, Value Source, File Column and Sample Data.
Value Source has three options:
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. Choose the column under File Column. The choice has this name for Excel files too.
Fixed value - every row gets the same value, which you enter or choose in the table.
Find Email. If Cademy matched it to a column, Value Source shows CSV column and File Column shows that column. If not, set Value Source to CSV column, then replace Select a column in File Column with the column that holds the email addresses. Sample Data shows values from the first five rows of the column, so you can confirm the choice.
Set First Name, Last Name and every other contact field you want to import in the same way. Leave the rest on Do not import.
Select Continue.
Map at least one contact field. The window lets you continue with none, but then every row fails.
Organisation is in the list of contact fields, but the Orders import does not use it to set the organisation of the person or the order. Leave it on Do not import. If you map it while Create organisations when auto-linking is on in your account, a name or domain that matches no organisation creates one. When the column holds domains (the Domains option in the second list) and Automatically link contacts to organisations by domain is on, Cademy can then link the new organisation to contacts in your account that have an email address at that domain and no organisation. That can include the person in the row. Marketing Consent needs care: the next section explains why.
Choose whether to update existing contacts
The next screen starts with We will attempt to import and has one switch, Update existing Contact. The switch is on to begin with. It decides what happens when a row’s email address belongs to a contact you already have. It never changes orders.
On: Cademy writes the mapped values from the row over the contact’s saved details.
Off: Cademy leaves the contact’s details as they are. Only tags from the file are added.
Either way, the new order belongs to that contact. A row whose email address no contact has creates a new contact.
With the switch on, an update can also change details that are not in your file. If a row has a value for any part of an address, the contact’s whole saved address is replaced by the parts in the row. The contact’s first name, last name and email address are saved again: where the row has no value for one of them, Cademy uses the value from the learner account that person has with Cademy. The guide to the Contacts import explains what an update changes.
Important: With the switch on, the import also sets Marketing Consent on every contact it finds. If Marketing Consent is on Do not import, or the row’s cell is blank, the contact is saved as not having given consent. If the cell holds yes, no, true or 1, the contact is saved as having given consent, whichever value it is. So is a contact whose cell holds false or 0 in a CSV file. To keep the consent your contacts already have, switch Update existing Contact off.
When the switch is set as you want it, select Continue. The Map Orders step opens.
Map the order details
The Map Orders step has the same table, for the ten order fields described in “Columns for the order” above. Course is marked REQUIRED. Until it is mapped, a box named Incomplete mappings is shown and Import cannot be selected.
Map Course. A second list appears in File Column: choose Course Name, Cademy Course ID or Course Code to say what your column holds. Choose the column first, because choosing a different column sets the second list back to its first option. If every row is for the same course, set Value Source to Fixed value and choose the course.
Map Course Date, then choose the format your column uses in its second list, again after you have chosen the column. If every row is for the same course date, use Fixed value: once you have chosen a fixed course, you can pick one of its course dates.
Map Total Paid / Cost, Payment Status, Spaces, Currency and Send Confirmation if your file has them. For Send Confirmation, Fixed value shows a switch: switch it on to email everyone in the file.
Check Sample Data for every field you mapped.
Select Import. Cademy shows Import started, and the window changes to Processing Import.
A field you leave on Do not import gets its default in every row: a cost of 0, a payment status of paid, 1 space, the selected date’s currency (or the course’s currency when the date has no currency of its own or the course is on-demand) and no confirmation email.
To change an earlier choice, select Back. Every screen you return to starts again: a mapping table goes back to the columns Cademy matched by itself, and Update existing Contact goes back to on. Set your choices again on each screen, including the second lists, before you select Import.
What each row creates
A paid row is saved with the whole cost as paid. The person has their place on the course straight away.
An awaiting_payment or overdue row is saved as an invoice order with nothing paid. The person’s place stays pending until the order is paid, unless Allow Course Access Before Invoice Is Paid is switched on in your invoice settings under Settings > Payments.
If the course is set to require approval of its bookings, the order starts as awaiting approval, also when it is paid. The person’s place stays pending until the order is approved.
Emails the import sends
Send Confirmation decides whether the person in a row is emailed about the order when the row is imported. With yes, true or 1:
A paid row sends the order confirmation.
An awaiting_payment row sends an email that asks for payment. If course access before payment is switched on, the order confirmation is sent too.
An overdue row sends no email when it is imported.
With no, false, 0, a blank cell or the field on Do not import, none of these emails is sent.
Send Confirmation does not control emails that Cademy sends for other reasons, such as these:
If the course is set to require approval of its bookings, Cademy emails the person that their order is waiting for approval.
Lesson notifications follow the course’s lesson schedules and due dates.
If the course has reminder emails set up, Cademy sends them before a course date to everyone who has a place on it, including people you imported. A pending place gets none. See Set Up Automatic Course Emails.
If an unpaid order has an invoice and the invoice passes its due date, Cademy marks the order as overdue. If Overdue Payments Reminder Emails is switched on in your invoice settings under Settings > Payments, Cademy then sends its overdue payment email to the person and to your team.
When a row is imported, Cademy does not email your team about the new order.
Review the result
You can keep the window open or close it. Cademy carries on either way. When it has finished, the window shows Import Complete with the number of orders imported and, if any rows failed, the number of failed rows.
To check an import afterwards:
Open Settings, then Imports.
Find the import in Your Imports. The newest import is the top row, and an Orders import has the type Orders (unified), which the TYPE column can cut short.
Read IMPORTED, FAILED and STATUS in that row.
Start with STATUS, the last column: the two numbers are complete only when it shows PROCESSED.
STATUS shows PROCESSING while Cademy works through the file and PROCESSED when it has finished. The table refreshes every 10 seconds while an import is processing.
PROCESSED does not mean that every row succeeded, so always check the FAILED column.
The status FAILED means the import stopped with an error before it finished. Before you upload the file again, ask a System Admin to check on the Orders page whether any orders from it were created.
If the import stays at PROCESSING and no email arrives, ask a System Admin to look for its orders on the Orders page before you upload the file again, and contact Cademy Support with the import’s type and the date and time shown in Your Imports.
The IMPORTED column shows the number of rows that created an order. If the number is above 0, select it to open Imported Orders (unified), a list with each order’s course, the person’s name and email address, and the order’s ID. A System Admin can select the eye button beside an order to open it on the Orders page in a new tab.
The FAILED column shows the number of rows that created no order. For an Orders import this number cannot be selected, and the page does not list the failed rows.
To see which rows failed and why, open the email Cademy sends when the import has finished. It goes to the user who started the import, as long as that user still has access to the account. Its subject is “Cademy: 25 orders imported”, with your number of imported orders. For failed rows it has a table with the columns of your file and an Error column.
Why a row fails
These are the messages you are most likely to see in the Error column, and what to check:
Course with … not found. No course in your account has exactly that name, ID or code. Check the spelling, capital letters, spaces at the start or end of the cell, and your choice in the second list for Course.
The required field "Course" needs a value for this record. The Course cell is blank.
Could not find a matching course date for this row. Add a valid "Course Date" column and re-upload. The course is not on-demand, and Cademy found no course date at the day or time it read. Check the format you chose, the time, and that the course date exists.
Course date does not match the course. Cademy found a course date at that day or time, but it belongs to another course.
Order currency does not match the course date, with a message such as “This row is in GBP, but the course date is priced in EUR.” Check that you chose the intended date. Then correct the row’s currency and numeric cost, or check the date’s currency settings using Choose Currencies for Courses, Memberships and Gift Cards. Re-upload only the corrected failed rows. Do not change a booked date’s currency just to force an import through.
Value: … is not a valid value for field 'Course Date'. The cell could not be read as a date in the format you chose. In an Excel file this happens when the cell is stored as a date.
Rows with payment_status = "cancelled" cannot be imported; create the booking and cancel it afterwards. The payment status is cancelled.
Missing student data. The row has no value in any contact column you mapped.
Error mapping contact data, Error mapping order data or Error importing unified order. Cademy could not read or save the row. Check that the email address is valid. If it is and the row fails again, contact Cademy Support with the row and the message.
To try again, put only the corrected rows in a new file and import that file. If you import the whole file again, each row that worked the first time creates a second order.
Frequently asked questions
Can I import bookings for an on-demand course?
Yes. Map Course and leave Course Date on Do not import, or leave its cell blank in those rows. If learners only need access to the course and no order, use the Registrations import instead: see the guide to the Registrations import.
Does the import update orders I already have?
No. Every row creates a new order. Update existing Contact changes contact details only. Importing the same rows again creates the orders again, so import only the rows that failed.
How do I keep the original date of a booking?
The Orders import cannot keep it. Created date is listed on the mapping screen but is not used, and every order gets the time of the import as its created date. For learner records without an order, the Registrations import has its own Created date field: see the guide to the Registrations import.
Why did a row fail?
The reason is in the Error column of the email Cademy sends when the import has finished. The Imports page shows only the number of failed rows. “Why a row fails” above explains each message.
Why is an imported order’s cost 0, or its payment status paid, when my file says something else?
Cademy saves a default when it cannot read a value. A cost must be a plain number without a currency symbol or a comma. A payment status must be paid, awaiting_payment or overdue. The import cannot change an order afterwards. To avoid this, import one or two rows first and check those orders. If orders were already saved with a wrong cost or payment status, contact Cademy Support with their IDs, which the Imported Orders (unified) list shows.
Which file types can I import?
CSV and Excel files. In an Excel file, Cademy reads the first sheet only.
Can I undo an Orders import?
No. Cademy has no option to reverse an import. Import one or two rows first and check those orders before you import the whole file.
