Appearance
Importing event data
How to populate classes, courses, controls, and competitors by importing from IOF XML files, Purple Pen, or Eventor — so you don't have to enter everything by hand.
Overview
Manager supports four ways to bring data in:
| Method | What it gives you | When to use |
|---|---|---|
IOF XML files (.xml) | Courses, controls, classes, competitors, clubs, start times | You have export files from your course setter (IOF CourseData) or entry system (IOF EntryList, ClassList, StartList). Manager parses the IOF v3 schema. |
Purple Pen file (.ppen) | Courses and controls | Your course setter uses Purple Pen and you have the .ppen file. |
| Eventor | Classes, competitors, clubs, start times | Your federation uses Eventor for entries and you've configured the connection in Settings. |
Ranking list (.xml, .json, .csv) | Rankings, applied to competitors the event already has | You've been handed a ranking list and want to seed the start draw with it. See Importing rankings. |
These are not mutually exclusive — you can import courses from Purple Pen and competitors from Eventor for the same event, for example.
Where to import
Open the event dashboard and click Import. The Import Data dialog has three tabs:
- Local Files — browse and upload IOF XML or Purple Pen files.
- Linked Event — re-import data from an Eventor event that's already linked to this event (useful for picking up late entries).
- Other Event — search for any Eventor event and import from it, with the option to link it for future re-imports.
Importing IOF XML files
Course data (IOF CourseData XML)
Upload a file containing course and control definitions — the output of your course-setting software (e.g. OCAD, Condes, Purple Pen).
What gets created:
- Controls — one for each control referenced by a course. Normal controls keep their punch code; Start, Finish and Check controls are imported as named map positions (e.g. "Start 1") with no code of their own — radio routing for those types comes from the event's start/finish/check unit-code lists.
- Courses — each course with its ordered chain (Start → middle controls → Finish). Each course's Start and Finish are recorded individually, so a multi-Start map imports as two courses anchored at different Start controls.
- Class course assignments — if the file contains
ClassCourseAssignmententries (most course setters export them, e.g. Purple Pen and OCAD), each named class gets its course pool set to the named course(s) — no manual assigning needed, even when the course names don't match the class names. The file is authoritative for the classes it names (their pools are replaced); classes it doesn't name are untouched. An assignment is skipped — and reported in the import summary — when the class name doesn't match any class in the event or the course name isn't recognised. Classes are matched by name, so import classes before the course file if you want these assignments applied; with no classes in the event yet, the assignments are simply skipped. - Per-competitor course locks — if the file contains
PersonCourseAssignmentor (for relays)TeamMemberCourseAssignmententries, each one locks the named competitor to the named course (see Locking a competitor to a course). Competitors are matched by their Eventor/IOF person ID, then by bib number. An assignment is skipped — and reported in the import summary — when the competitor can't be matched, the course name isn't recognised, or the course isn't in that competitor's class course pool. So import competitors (and, for relays, their bibs via the start list) before the course file if you want these locks applied.
After a course import, the Assign Courses to Classes dialog opens automatically — but only if at least one class is still without a course. If the file's class course assignments covered every class, there's nothing left to do and the dialog stays closed.
Tip: If a control code in the file already exists in the event, it's matched and updated rather than duplicated.
From Condes or OCAD
If the courses were created in Condes or OCAD, then use the standard IOF CourseData XML.
Condes: open your event, then File → Export → Export course data as XML…. Choose IOF Version 3.0 and UTF-8 encoding (both recommended), and export. Upload the resulting .xml here.
OCAD: use Course Setting → Export → Course Data (XML)… and choose the IOF XML v3 format. Upload the resulting .xml here.
Note on coordinates: Condes and OCAD write control positions as millimetres on the printed map, not as real-world latitude/longitude. That's expected — Manager uses the map-relative positions and leg lengths from the file. (For multi-map events, Condes exports controls for one chosen canvas/map at a time, so export from the map whose control positions you want.)
Class list (IOF ClassList XML)
Upload a file defining classes.
What gets created:
- Classes — one for each class defined in the file.
Entry list (IOF EntryList XML)
Upload a file of competitor entries — typically exported from your entry system.
What gets created:
- Competitors — one for each entry, with name, card number, and class assignment.
- Clubs — any clubs referenced by competitors that don't already exist.
- Classes — any classes referenced by competitors that don't already exist.
Rankings in an entry list
Most entry lists carry no ranking at all — there is no ranking field in the IOF XML standard. The nearest thing it has is a <Score>, and what a score means is whatever its type says: World Ranking points, a series total, anything.
So Manager reads a score as a ranking only when its type says it is a rank (Rank or Ranking), and leaves every other kind of score alone. That is not caution for its own sake: World Ranking points run the other way — bigger is better — so a points value read as a place would seed your whole field backwards and nothing on screen would say so.
You aren't left guessing, though. If the file carried scores Manager wouldn't read, the import summary says so once per kind, naming the type and how many entries had one — so a file that did carry something doesn't just appear to have lost it. Scores with no type at all are counted the same way, in a note of their own, since there is no name to give them. And a value labelled as a rank but not actually a place (a decimal, a negative, a zero) is reported as a warning; that entry keeps whatever ranking it already had.
An Orienteering JSON entry list or start list carries rankings properly, with no labelling to get right — Manager writes them into the files it exports, too, in both formats. See Exporting the entry list.
If what you have is a ranking list rather than an entry list — a spreadsheet, or a federation's published file — import it separately: see Importing rankings.
Start list (IOF StartList XML)
Upload a file of allocated start times — typically exported from an entry system or start-list draw tool.
What it does:
- Matches competitors by person ID, then card, then name, and sets their allocated start times.
- Captures each competitor's bib number from the file, so a later course-data import can match per-competitor course assignments by bib (important for relays).
- Skips competitors who have already punched (so a late re-import can't overwrite a result).
- Does not create new competitors — only updates existing ones.
Re-importing
You can re-import the same file (or an updated version) at any point while setting up. Manager matches existing items by their identifiers (control code for controls, name for classes/competitors, etc.) and updates them rather than creating duplicates.
A re-import only changes what the file actually says. This matters more than it sounds, because by the time you re-import — one late entry, a corrected class — the event has moved on, and everything the day has added to a competitor lives in the fields the file has never heard of. An IOF entry list carries no bib number and no start time at all, so a file that mentions neither leaves both exactly as they are:
- bib numbers — from a bib allocation, or typed in;
- start times — from the start list, the draw, or a chase start;
- card numbers — including the hire card handed over at the desk;
- class and club, where the file names neither;
- and the things only the desk ever knows: hired items, notes, start-time requests, custom fields, rankings.
The same holds for classes: an IOF class list states a name, a short name and an order, so a re-import leaves the class's courses, its mass start and restart, and its score settings exactly as you set them.
A value the file does carry still wins, every time: a re-import is how you fix a card number or move somebody between classes. The rule is only that silence means "no opinion", never "empty it".
When a file is missing competitors or classes you already have
Only you know whether an entry list is the complete list of everyone entered, or a partial one to add on top of what's already in the event — runners you added by hand, imported from a CSV, or who turned up and entered on the day. So when a file omits competitors (or classes) the event already has, Manager stops and asks. Nothing is written until you answer.
You get a list of exactly who (or what) is missing from the file — competitors that already have downloaded race data are flagged — and one decision to make:
- Import on its own treats the file as a partial list. Everything in it is added or updated, and anyone missing from it is left exactly as they are. Nothing is deleted.
- Turn on Also remove these competitors (or classes) first, and the file is treated as the complete list: anyone missing from it is removed along with any results they have.
- Cancel — nothing at all happens; the event is untouched.
The toggle is off until you turn it on, so Import on its own never takes anybody away. An import that only adds and updates never asks — it just runs.
Course files never delete courses — courses absent from the file are always left in place.
When a file holds more than one race
A multi-day carnival's files are usually one file covering every day: one entry list with everybody's entries, one start list with everybody's start times for each day, one course file with each day's courses. A meshO event is one day, so Manager stops and asks which race this event is. Nothing is written until you answer.
You get the races the file names — its own names and dates where it gives them, otherwise just "Race 1", "Race 2". Choose one and select Import; only that race's data is imported. Nothing is picked for you, and Cancel leaves the event untouched.
This applies to the entry list, the start list and the course file, and only to IOF XML files — an Orienteering JSON export and a Purple Pen course file describe one race each, so there is nothing to ask. It doesn't apply to a class list (the format has no way to say which race a class list is for) or to a rankings import (a ranking belongs to the runner, not to a day, and is the same whichever day you import).
Manager only asks when the file can actually be split. A file that names three days in its header but tags none of its entries or start times with one is a single day's file with a carnival's header, so it imports without a question rather than asking one whose answer could change nothing.
Three things worth knowing about how the IOF format writes this:
- An entry with no race on it is entered in every race, which is what the standard says it means. So a runner who is down for all three days arrives whichever day you pick, and only the ones tagged for a particular day are held back. The same goes for a start time.
- A runner with no start time on the day you pick isn't imported at all — they aren't in that day's field, so they're not offered as a runner your event is missing either.
- The file may not name its races at all and only tag its contents with numbers, or — in a course file — simply hold one block of courses per day in order. Manager still spots the several races and asks, listing them by number.
Import each day into its own event, choosing the matching race each time. If the days belong together as a carnival, see Multi-stage events.
When a file brings the event's own start settings
An Orienteering JSON file describes the event it came from, including its mass start, its restart and whether a punched start overrides the allocated start. Those three decide how every competitor's start time is worked out, so Manager never takes them quietly. If the file's differ from this event's, importing entries or start times stops and shows you both sides — this event's setting and the file's — before anything is written:
- Apply start settings — this event takes the file's mass start, restart and punching-start setting, and then the import runs.
- Import without them — the entries and their times still arrive, and the event keeps its own settings. A time the file's settings produced is then stored on each competitor individually, so if you move this event's mass start afterwards those runners stay behind at the old time.
- Cancel — nothing at all happens; the event is untouched.
A file stating the settings this event already uses never asks, so re-importing costs you nothing.
When a file brings courses scored in any order
An Orienteering JSON file says how each course is scored — in the printed order, as a scatter course (a set number of controls, any order), or as a score course. Importing one brings that with it, along with how many controls a scatter course requires, so the courses score the same way in this event as they did in the event the file came from.
One thing to expect on the Courses page afterwards: a scatter or score course arrives with no control sequence. That is not a failed import. Those courses are run against every control in the event, so a sequence is not what they are scored on and the file does not carry one — listing the controls in play as though they were an order to visit them in would be inventing one. If you later switch such a course back to a line course, import the course file (IOF XML or Purple Pen) to give it its printed sequence.
Importing rankings
A ranking is a competitor's place on an external ranking list — 1 being the best-ranked athlete. Ranking lists are published separately from entries and republished every few weeks, so they are imported separately: Rankings is its own box at the bottom of the Local Files tab.
This import only ever fills in the Ranking field of competitors the event already has. It creates nobody, deletes nobody, and changes nothing else. Import your entries first.
Which files Manager accepts
Three kinds, and the only thing that differs between them is how much you have to say about the file:
| File | What Manager reads | What you have to do |
|---|---|---|
IOF XML (.xml) | A competitor list, or an entry list, in which an athlete carries a score labelled as a rank | Nothing — choose the file and import it |
Orienteering JSON (.json) | Any Orienteering JSON document that lists entries: an entry list, a start list, or a result list | Nothing — choose the file and import it |
CSV (.csv) | A spreadsheet of places, in whatever columns your list happens to use | Say which column is which, in the dialog that opens |
An IOF XML or Orienteering JSON file says what each number in it is, so Manager reads it as it stands: choose the file, click the upload arrow, and it imports in one step. A spreadsheet says nothing about itself — one list's third column is a place, another's is a points total — so a CSV always goes through the column-mapping dialog first. That is the whole of the difference; everything after the file is read is the same for all three.
Note: If your ranking list is an
.xlsx(or anything else a spreadsheet program opens), use Save as / Export to write a.csvfirst.
Which IOF XML files carry a ranking
IOF XML has no ranking field. The nearest thing it has is a <Score>, and what a score means is whatever its type says — so Manager reads a score as a ranking only where the file lists people and the score is labelled as a rank (Rank or Ranking). Two documents qualify:
- A competitor list — a list of athletes and the scores they hold. This is the shape a federation ranking list is usually published in.
- An entry list — the entries for an event. A relay's leg runners count too: a runner on leg 2 carries a ranking exactly as an individual entrant does.
A results file does not work, and Manager tells you rather than importing something wrong. The scores in a results file are what someone scored on the day — World Ranking points, most often — and points run the opposite way to a place: bigger is better. Read as places, 1250 points would become "1250th", and your whole field would be seeded backwards with nothing on screen to say so. So Manager reads the file, declines it, and reports:
No rankings were read: the scores in a results file are points rather than places on a ranking list. Import a competitor list or an entry list instead.
Any other IOF document — a start list, a class list, a course file — is turned away outright, with "Check that the file is a ranking list": there is nowhere in those for a ranking to be.
The same care applies inside a file that does work. A score of any other type — or with no type at all — is left alone, and the import summary says so once per kind, naming the type and how many entries carried one. A file that did carry something never just appears to have lost it.
What an Orienteering JSON file needs
Nothing in particular. A ranking travels on the entry itself in Orienteering JSON, so any document that lists entries is already a ranking list: an entry list, a start list, or a result list all work, and there is no separate ranking-list file to produce. Last season's result list, exported from Manager, seeds this season's draw exactly as it stands.
Importing rankings from a CSV
A spreadsheet is the way a ranking list most often arrives, and the only one of the three that needs anything from you before it can be read.
What the file needs
Two things, in whatever columns and whatever order your list happens to use:
- The ranking — a whole number. 1 is best.
- Something that says whose ranking it is — any one of an IOF ID, a competitor ID (the organiser's own entry number), a card number, or a name. A name can be one full-name column or separate given-name and family-name columns.
Extra columns — club, class, region, points, anything — are ignored. You don't need to tidy the file up first.
Mapping the columns
Choose the file and click the upload arrow, and the Import rankings from CSV dialog opens. Manager reads the file, guesses how it's put together, and shows you what it found so you can correct it:
- Delimiter — semicolon, comma or tab. Manager detects it; change it here if the preview looks wrong (all of one row crammed into a single column is the usual symptom).
- First row is a header — on when Manager recognised the first row as column headings. If your file has no headings, switch it off and every row is treated as data.
- A drop-down per field — Ranking (place), IOF ID, Competitor ID, Card / chip no., Full name, Given name, Family name. Manager pre-fills the ones it recognised from the headings; set any it missed, or (not mapped) for a column you don't want used. With no headings to go on it guesses that the first column is the place and the second is the name, and tells you it guessed.
- Preview — the first few rows of the file as Manager reads them, so you can check the mapping against real data before committing.
The Import button stays disabled until you've mapped the ranking column and at least one way of identifying the athlete; the dialog says so while that's outstanding.
How rows are matched to competitors
Manager works down the strongest identifier it has, per row: IOF ID, then competitor ID, then card number, then name. Names are compared with accents and capitalisation ignored, so asa lindstrom finds Åsa Lindström.
Two consequences worth knowing:
- One row seeds every entry that person holds. Someone entered in two classes is two competitors in the event, and both get the ranking — ranking only one of them would leave the other unseeded in a draw you believed was seeded.
- Two rows about the same person both apply, in file order, so the last one wins.
What happens to rows that don't land
Nothing is written for them, the rest of the file still imports, and you're told which rows and why. After the import, the summary reports Rankings: n updated, and lists any rows that reached nobody — the first ten, with the name and ranking the file gave and one of two reasons:
- not entered in this event — nobody in the event matched. Expect a lot of these if you imported a national list: most of the country isn't at your event. But every row failing usually means the file identifies athletes some other way than your entries do — a mis-mapped identity column, most often — and Manager says so separately when nothing at all matched.
- more than one competitor has that name — the row landed on two different people and nothing in it says which. Usually that's a row whose only usable identifier was a name two entrants share; it also happens when a row's card number or competitor ID is held by two people (a shared hire card, a reused organiser number) and the row's name doesn't settle it either. Manager won't guess. Give that competitor an IOF ID or competitor ID that matches the file, or set their ranking by hand.
Each is named by where it sits in the file: the line number in a CSV, or the athlete's position in the document for an IOF XML or Orienteering JSON file — so you can go and look at it either way.
Individual rows can also be skipped:
- A row that states a ranking but nothing to say whose it is — no ID, no card, no name — is skipped, in all three formats.
- A negative ranking is never stored, in any format. In a CSV the row is refused and the reason given; in an IOF XML or Orienteering JSON file it's counted in a notice of its own. Either way that competitor keeps the ranking they already had.
- In an IOF XML file, a score labelled as a rank but not actually a place — a decimal, or a zero — is treated the same way: reported, and the entry left as it was. (A zero does mean something in the other two formats — see Clearing a ranking.)
- In a CSV, a ranking that isn't a number skips that row, and a blank ranking cell is passed over in silence. A published list often names everyone and leaves the unranked blank, and an import never clears a ranking a file says nothing about.
Clearing a ranking
Setting a ranking works the same in all three formats. Clearing one does not, and it's the one asymmetry worth knowing about:
- A CSV or an Orienteering JSON file can clear a ranking, by stating
0. Zero is how Manager writes "not ranked", so a0in the ranking column is read as an instruction: that competitor's stored place is removed. - An IOF XML file cannot. There is no way to write "not ranked" in IOF XML — an unranked athlete simply has no
<Score>, which says nothing rather than saying zero, and a file that says nothing never overwrites what you already have. So an IOF XML import only ever sets a ranking or leaves it alone.
If you need to clear rankings from an IOF XML list, clear them on the competitors themselves (the Ranking field on the Details tab, emptied) or import a CSV with 0 in the ranking column.
That aside, the rule across every import in Manager is the same: a file that says nothing about a ranking leaves the stored one alone. Re-importing an entry list or a start list can't quietly wipe the rankings you've already set.
Re-importing
Run it again whenever a new list is published. A competitor who already holds the ranking the file would give them is left untouched, so re-importing the same file changes nothing at all — and the summary shows no Rankings line, because nothing was updated.
Importing from Purple Pen
Purple Pen .ppen files are handled the same way as IOF CourseData XML. Upload the .ppen file via the Import Data dialog → Local Files tab.
What gets created:
- Controls — extracted from the Purple Pen event definition, including any Start, Finish and Check controls as named map positions.
- Courses — each course with its full chain (Start → middle controls → Finish). Per-course Start and Finish anchors are preserved, so a
.ppenwith multiple Starts imports cleanly.
Note: Purple Pen provides courses and controls only. You still need to import (or create) classes, competitors, and start times separately.
Importing from Eventor
Eventor integration lets you pull entry data directly from your federation's system without handling files.
Prerequisites
Before you can import from Eventor, configure the connection in Settings → Eventor:
- Host Name — the URL of your Eventor instance.
- API Key — your Eventor API credentials.
- Organisation ID — your club or federation's Eventor organisation ID.
If Eventor is not configured, Manager will tell you when you try to import and point you to Settings.
Creating an event from Eventor
If you don't have an event yet, the fastest path is New from Eventor on the Events page — it creates the event and pulls in classes, competitors, clubs, and start times in one step. See Creating an event from Eventor for the full walkthrough.
Importing into an existing event
If you've already created an event and want to pull Eventor data into it:
- Open the Import Data dialog (available from the Dashboard, Courses, Classes, Competitors, and Teams pages)
- Use the Other Event tab to search for the Eventor event.
- Select it, optionally tick Link this event so you can re-import later with one click.
- Click Import.
Re-importing from Eventor
As entries close and start lists are published, you'll want to pick up the latest data. If the event is linked to an Eventor event:
- Open the Import Data dialog.
- Go to the Linked Event tab.
- Click Re-import.
Manager will fetch the latest entries and start times, matching them against the competitors already in the event. New entries are added; updated entries are refreshed.
Re-importing one stage of a carnival. Every stage of a multi-race Eventor event is linked to the same Eventor event, so this tab looks the same on each of them. It names the race the stage came from — Stage 2: Middle — and only that race's entries and start times are imported. If the tab warns that the stage is no longer in the Eventor event, the organiser has changed the race list since you imported: check the stage against Eventor before re-importing, because Manager will otherwise bring in every stage's entries.
Multi-race Eventor events
Some Eventor events contain several races — a 3 Days, a two-race weekend. Importing one of those into a single event captures only the first race. Import it as a carnival instead: choose Multi-stage in the New Event dialog, then Import from Eventor. Manager creates the container and imports one meshO event per Eventor race, with the entries split by race and each event attached as a stage. See Multi-stage events.
Note: An IOF XML file can also carry several races (its
raceNumbertags). Manager reads them, but the file-upload wizard doesn't yet offer the multi-stage step — import each race's file into its own stage event for now.
What to check after import
After any import, it's worth spending a few minutes verifying the data:
- [ ] Open the Classes page — confirm the right classes exist and each has a course assigned.
- [ ] Open the Courses page — confirm courses have the right controls in the right order.
- [ ] Open the Competitors page — confirm competitors have names, classes, and card numbers. Sort by card number to spot blanks.
- [ ] If start times were imported, check the Competitors page — the Start time column shows the allocated time and its source.
- [ ] If rankings were imported, turn on the Ranking column on the Competitors page and sort by it — the people you expect to be seeded should be at the top, and anyone who should have been ranked but isn't will be sitting with the blanks.
Tip: If something looks wrong, you can re-import a corrected file — Manager will update rather than duplicate.
Related
- Creating an event — where the event details live
- Classes and courses — editing what the import created
- Controls and radio controls — marking imported controls as radios
- Competitors, clubs and teams — editing imported competitors, and exporting the entry list back out again
- Start times — understanding how imported start times interact with other sources
- Drawing start times — seeding a draw with the rankings you imported
- Multi-stage events — importing a multi-race Eventor event as a carnival
- Orienteering JSON (OJSON) — the format spelled out, for anyone writing the files rather than choosing them