Spreadsheet Column Reference
Every column in Oho's import template, what it expects, and which ones are required. This is the reference behind the spreadsheet import walkthrough — use the walkthrough to run the import, and this page while you're filling the template in.
It applies to every file-based source, because they all read the same template: Excel, Google Sheets, and SFTP.
⬇ Download the Excel template (.xlsx)On a tenant that already holds data, the connection screen can also export your current records into this same template — same sheets, same headings, same vocabulary — which is usually a better starting point than a blank file.
How to read this page
- Required columns are the ones Oho refuses a row without. Leave one blank and that row is skipped, and the skip is counted in your sync report.
- Recommended columns don't block the import, but leaving them blank costs you something concrete — the table says what.
- Optional columns can be left blank — leave the empty column in place rather than deleting it. Blanking a cell and deleting its column mean different things; see below.
- Dates use
YYYY-MM-DD(for example2026-03-31). - Values shown in
codeare the values Oho accepts. Case doesn't matter — Oho normalises them as it reads, soactive,ActiveandACTIVEare the same value, as areWWCCandwwcc. The one exception is Worker Type, which is free text and is stored exactly as you type it. - Column headings aren't case-sensitive either, and a trailing
*is ignored. What matters is the wording — see the caution below.
A * in the downloaded template marks a column Oho refuses the row without. There are only ever three or four per sheet, and they match the Required rows in the tables below exactly — a CI check holds the template to the connector, so the two can't drift apart.
Everything without a * is genuinely optional in the sense that the row still imports. That isn't the same as "safe to leave out": the Needed? column below says what each blank one actually costs you.
Your sheet is the source of truth for the worker fields it carries, and Oho reads these two cases differently:
- Column present, cell blank — you're telling Oho this worker has no value, so it clears the field.
- Column not on the sheet at all — your sheet isn't claiming to manage that field, so Oho leaves whatever it holds.
This is what makes a partial sheet safe. If you export only the columns you're updating — say Worker ID, Job Title and Department — nobody loses their date of birth or their address, and an older file written before a column existed won't wipe values recorded since. It also means the way to clear a field is to keep its column and empty the cell, not to delete the column.
One exception, in your favour: a value someone edited by hand in Oho isn't overwritten by a sheet that disagrees. That's raised for review instead.
Oho reads your columns by heading name. If a heading is renamed, moved, or removed, Oho can't map that column and those rows won't import. Add your data under the headings exactly as they come in the template.
The row directly under the headings on each sheet is a hint row describing what the column expects. Leave it in place — Oho skips it — and start your data on the row below.
The four sheets
| Sheet | What goes on it | Needed? |
|---|---|---|
| Workers | One row per person you employ or engage. | Yes |
| Applicants | One row per candidate you're still hiring, before they become a worker. | Optional |
| Credentials | One row per card or registration a worker holds. | Optional |
| Exemptions | One row per requirement a worker is formally excused from. | Optional |
Fill in the sheets you need and leave the others empty. Don't delete a sheet you're not using — leave it in place with just its headings.
Worker ID is the match key
Worker ID does two jobs, and both depend on you keeping it stable:
- It links a worker's Credentials and Exemptions rows to their Workers row. Oho never matches on email.
- It tells Oho a person on this run is someone it already has, so a re-import updates them instead of creating a duplicate.
Use the identifier the person already has in your HR or payroll system, use exactly the same value across all three sheets, and reuse it on every later run. A row with a blank Worker ID can't be linked; a credential or exemption row whose Worker ID doesn't appear on the Workers sheet is reported as an orphan rather than guessed at. More in Map your fields → Recognising the same person again.
Worker IDs that start with a zero — 02579 — are the one thing a spreadsheet will quietly change
for you. Saved as a number the leading zero is dropped and 02579 becomes 2579, while the
spreadsheet carries on showing you 02579. Oho treats the two as the same payroll number, so this
won't duplicate anybody, but the Worker ID stored against the person follows whichever form the file
last carried. Format the Worker ID column as Text before you edit the file, and the value you
see is the value Oho keeps.
Workers
One row per person. 28 columns. Only Worker ID and a name will stop a row importing.
| Column | Needed? | What it expects |
|---|---|---|
| Worker ID | Required | The person's unique ID from your HR or payroll system. Oho's match key — keep it stable. |
| Organisation | Recommended | The Oho organisation the worker belongs to — a worker belongs to exactly one. Blank imports, but leaves them assigned to none: see Leaving Organisation blank. |
| First Name | Recommended | Their given name. Leave it blank for someone who goes by a single name — see the note below. |
| Middle Name | Optional | Their middle name, if you hold it. |
| Last Name | Required | Their family name — and the single name of anyone who has only one. Never a placeholder; see the note below. |
| Recommended | Their email address. Without one Oho can't send this worker a check request or a reminder — they still import. | |
| Email Type | Optional | work or personal. Describes the address in Email. |
| Phone | Optional | International format, for example +61 2 1234 5678. |
| Phone Type | Optional | work or personal. Describes the number in Phone. |
| Date of Birth | Recommended | YYYY-MM-DD. Several registers match on it — see the note below. |
| Nationality | Optional | For example Australian. |
| Street Address | Optional | Street number and name of where they live. |
| Street Address 2 | Optional | Unit, level or suite of where they live. |
| City | Optional | Suburb or city where they live. |
| State | Recommended | NSW, VIC, QLD, WA, SA, TAS, NT or ACT. Sets the worker's home address — put the credential's own state on its own row. |
| Postcode | Optional | Four-digit Australian postcode where they live. |
| Country | Optional | Two-letter country code, for example AU. Defaults to AU when any other home address column is filled in. |
| Work Street Address | Optional | Street number and name of the site they work at. |
| Work Street Address 2 | Optional | Unit, level or suite of the work site. |
| Work City | Optional | Suburb or city of the work site. |
| Work State | Recommended | NSW, VIC, QLD, WA, SA, TAS, NT or ACT. The state whose rules apply to this worker — see the note below. |
| Work Postcode | Optional | Four-digit Australian postcode of the work site. |
| Work Country | Optional | Two-letter country code, for example AU. Defaults to AU when any other work address column is filled in. |
| Job Title | Optional | Their role, for example Case Manager. |
| Department | Optional | Their team or department. |
| Worker Type | Recommended | Free text, stored exactly as you type it. Use Employee, Contractor or Volunteer so the filter stays tidy. |
| Status | Recommended | ACTIVE or INACTIVE, in any case. Blank counts as active. INACTIVE is the only value that deactivates a worker. See Active vs. inactive. |
| Start Date | Optional | YYYY-MM-DD. |
Only two things: a blank Worker ID, or no name at all. Oho builds the worker's name from First Name, Middle Name and Last Name together, so a row with any one of them filled in will import. Fill in both First Name and Last Name anyway — name-matching at the issuing register compares against the full name Oho holds.
For someone who holds a single legal name, put it in Last Name and leave First Name blank. The row imports — First Name is only marked required on the template, not by the import.
Don't put -, ., N/A or a repeat of the name in Last Name to satisfy the column. The
surname is what Oho sends to the register, and a placeholder is submitted literally: the check
errors or returns not found, every time it runs. The Credentials sheet has no name columns —
each credential is checked under its holder's name — so the Workers row is the only place to get
this right. See People with one name.
The unprefixed address columns are where the worker lives. The Work * columns are the site they work at. Compliance rules that scope by state read the work address, because it's the site's state that decides which state's rules apply — a worker living in NSW but based at a Victorian site needs the Victorian requirements. If the two are the same, fill in both.
Both follow the blank-cell rule above: empty the cells to clear an address, and a sheet written before the Work * columns existed won't touch work addresses at all.
Templates downloaded before September 2026 have no Street Address 2 or Country column on the home address. Those files still import exactly as before — a missing column means "not managed" — but because the home address is rebuilt from the columns that are present, they can't carry a unit number or a country. Download the current template if you hold either.
It's optional, but several credential checks match on date of birth at the issuing authority. A worker without one may not verify automatically even when their card details are correct.
Leaving Organisation blank
The Add Worker form in the app makes Organisation required; this sheet doesn't. The import won't stop a row over it — but the worker arrives belonging to no organisation, and Oho has no default to fall back on.
That matters more than "optional" suggests:
- Only a Super Admin can see them. Access is scoped by organisation for every other role, so an unassigned worker is missing from the worker lists, compliance figures and search results of every Admin, Manager and Observer. See Roles & access.
- Their credential rows inherit the gap. Credentials take their organisation from the worker's row, so those become invisible too.
- Police check rows are skipped outright. An
npcrow for a worker with no organisation can't be submitted and is reported as skipped — a police check needs an organisation to bill and route it.
Fill the column in, even when you only have one organisation. If a worker has already imported without one, re-import them with the column filled; same Worker ID, so it updates rather than duplicating.
Credentials
One row per card or registration. 9 columns, 3 of them required. A worker can have as many rows as they hold cards — repeat their Worker ID on each one.
| Column | Needed? | What it expects |
|---|---|---|
| Worker ID | Required | Must match a Worker ID on the Workers sheet — this is what links the credential to its holder. |
| Credential Type | Required | One of the codes in Credential Type values below. A code Oho doesn't recognise is skipped, not guessed at. |
| Reference Number | Required | The official ID or registration number, exactly as it appears on the card — including any leading zeros. Format the column as Text first; see below. |
| State | Recommended | The state or territory the credential was issued in. It picks the register Oho checks — without it a state-based card won't verify. |
| Issuing Authority | Optional | The body that issued it, for example Blue Card Services. |
| Country of Issue | Optional | Used for VEVO checks. |
| Issue Date | Optional | YYYY-MM-DD. |
| Expiry Date | Optional | YYYY-MM-DD. |
| Status | Optional | ACTIVE, EXPIRED, PENDING or INACTIVE, in any case. Blank counts as ACTIVE. INACTIVE pauses Oho's re-checks — see the caution below. |
A blank Worker ID, a blank Reference Number, or a Credential Type that's blank or not on the accepted list. Everything else imports — but a row with no State may sit unverified, because Oho uses the state to pick which register to check.
Two things that spoil a Credentials sheet
Both of these import without an error and go wrong quietly afterwards, so they're worth checking in the file rather than finding in Oho.
Leading zeros disappear in Excel and Google Sheets
A card number made only of digits — 0984082 — is treated as a number by both Excel and Google
Sheets, and a number has no leading zeros. The spreadsheet shows 984082, and that's what it
stores. The zeros are gone before Oho ever opens the file, so Oho reads 984082 and there is
nothing for it to recover.
That matters because Oho identifies a credential by its type and its reference number. A card
recorded as 984082 and the same card arriving as 0984082 from your HR system or a register
check are two different records of one card, and your worker shows two.
Format the column as Text before you type or paste into it (in Excel: select the column → Home → Number Format → Text; in Google Sheets: Format → Number → Plain text). Re-typing the zeros into a column that's still formatted as a number won't hold them. Pasting into an existing file is the usual way this happens — a column that was fine can become numeric when the paste brings its own formatting.
It only affects numbers made entirely of digits. A number carrying a letter or a slash — a
Queensland Blue Card 1519921/2, a WA card already saved as text — is left alone.
The same reference number on two people
Oho identifies a credential by credential type plus reference number, with no holder in the key — that's what lets one card converge when it arrives from an HR feed, a register check and a worker's upload at the same time. The cost is that two different people recorded against the same number aren't two credentials. They're one, and its holder is whichever row was written last. The other worker's profile shows nothing, and they'll read as missing that credential.
This usually comes from one of two things:
- A typo — the same card number entered against two people. Fix the sheet and re-import.
- A number that was never per-person — a group policy number, a training unit code like
HLTAID009, or a placeholder such asN/Atyped into the column because it's required. Don't use a placeholder: leave the row out, or record the credential in Oho by hand. If a credential type you use really does share one number across people, ask support to key that type per worker for you.
Your sync report counts the collisions it found, so re-run the import and check the report before assuming a clean load.
Scan the Credentials sheet for a reference number that appears on two Worker IDs, and confirm that any digits-only card numbers still start with the zeros printed on the card.
Credential Type values
These are the codes the Credential Type column accepts. Anything else is skipped with an "unknown credential type" warning in your sync report.
| Code | What it is | Oho verifies it |
|---|---|---|
wwcc | Working With Children Check. State names it — QLD is the Blue Card, NT the Ochre Card, TAS the WWVP Registration, ACT the WWVP Check. | NSW, VIC, QLD, WA, SA, TAS, NT. ACT capture-only |
wwvp | Working With Vulnerable People Registration, when you'd rather name it directly than as wwcc + TAS. | TAS |
ndws | NDIS Worker Screening Check, against the NDIS Quality and Safeguards Commission register. | Australia-wide |
ahpra | AHPRA registration — nurses, doctors, allied health. | Australia-wide |
teacher | Teacher registration. State picks the board — VIT, NESA, QCT and the state TRBs. | NSW, VIC, QLD, WA, SA, TAS, NT. ACT capture-only |
vevo | VEVO visa entitlement check with the Department of Home Affairs. | Australia-wide |
npc | A National Police Check you already hold from a prior system. See the note below. | Loaded as a completed check, not re-run |
passport | Passport. | No — recorded and tracked for expiry |
driverslicense | Driver's licence. Add the state in the State column. | No — recorded and tracked for expiry |
firstaid | First aid certificate. | No — recorded and tracked for expiry |
cpr | CPR certificate. | No — recorded and tracked for expiry |
driverslicense_act … driverslicense_wa | The same, with the state baked into the code. One per state and territory. | No — recorded and tracked for expiry |
| Your own custom credential codes | Anything you've defined yourself. Use the code Oho shows you, or the slugified name. | No — see Create a custom credential |
The Exemptions sheet takes a shorter list than Credentials: wwcc, wwvp, teacher, ahpra, ndws, npc, vevo, visaentitlement, righttowork, driverslicense, firstaid, cpr. It has no passport, and no per-state driverslicense_* — use driverslicense with the State column. As on the Credentials sheet, a code that isn't on the list is skipped.
"Oho verifies it" means Oho checks the number against the issuing register and keeps re-checking it. Everything else is stored, shown on the worker's profile, and tracked for expiry — Oho just can't confirm it with the issuer.
These codes are the import vocabulary, and the REST API uses a different one — ndws is stored as NDIS_SCREENING, wwcc with State NSW as WWCC_NSW, ahpra as AHPRA_G. Credential Type Codes maps every code here to the one the API expects.
npc rows don't trigger a new police check. Oho loads them as a completed, historic check so the worker's record is accurate from day one. Two conditions: leave State blank or set it to AUS, and give the row an Issue Date — without one the row is skipped, because the check's expiry is calculated from it.
Credentials Oho doesn't verify still belong in your import — they count towards compliance and Oho tracks their expiry. If the type you need isn't listed, create it as a custom credential first, then use its code here.
Oho reads this column as the credential's scan toggle: INACTIVE pauses re-checks, and every other value — including a blank cell — switches them back on.
So if you paused a credential in Oho and then upload a sheet that leaves its Status blank, the pause is lifted. Put INACTIVE in the cell for any credential you want to stay paused. This is why the export Oho gives you writes INACTIVE for paused records and leaves every other Status cell blank, rather than filling in the check result.
Applicants
One row per candidate you're still considering. 7 columns. Fill this sheet in only if you want to bring a recruitment list in alongside your workforce — otherwise leave it blank.
| Column | Needed? | What it expects |
|---|---|---|
| Applicant ID | Required — key | Their unique ID in your ATS or HR system. Applicants are keyed on it, so a row without one is skipped. |
| Organisation | Recommended | The organisation they're being considered for. Leave it blank and the applicant imports unassigned. |
| First Name | Recommended | Their given name. Leave it blank for a candidate who goes by a single name. |
| Last Name | Required | Their family name, or their single name. Never a placeholder — it's what the registers are searched on. |
| Recommended | Where Oho sends their Recruitment Check. Applicants with no email address import — you just can't send them a check. | |
| Phone | Optional | International format, for example +61 4 1234 5678. |
| External ID | Optional | A second reference of your own, for example an ATS reference. |
A blank Applicant ID, or no name in either name column. Oho keys applicants on Applicant ID, so a row without one can't be matched on the next run.
Applicants don't take credential rows — their credentials arrive when they complete a Recruitment Check. When you take an applicant on, you promote them to a worker and their credentials carry across. See Applicants.
Exemptions
An exemption records that a worker is formally excused from a requirement — a registered teacher exempt from holding a Queensland Blue Card, for example. Exemptions count towards compliance, so a properly exempt worker doesn't also need the underlying card.
The sheet takes the same 9 columns as Credentials, with two differences in meaning:
- Credential Type names the requirement the worker is excused from, rather than a card they hold.
- State is what makes the exemption specific —
wwcc+QLDis the Blue Card exemption.
The exact codes the Exemptions sheet takes are listed with the Credential Type values above.
Worker ID, Credential Type and Reference Number are required, exactly as on the Credentials sheet — and State matters just as much here, because it's what turns wwcc into the specific state exemption.
Use this sheet when you're loading a batch of known exemptions alongside your workforce. For one-off exemptions — and where you need to capture a reason and a review-by date — record them on the worker's profile instead: see Record an exemption.
When rows don't import
| What you see | Why | Fix |
|---|---|---|
| A column is ignored entirely | Its heading was renamed, moved, or deleted | Restore the heading exactly as the template has it |
| Some worker rows missing | Worker ID is blank, or the row has no name | Fill in Worker ID and at least one name column |
| Some credential rows missing | Worker ID, Reference Number or Credential Type is blank — or the Credential Type isn't one Oho accepts | Fill all three, and use an accepted Credential Type code |
| A credential has no worker | Its Worker ID isn't on the Workers sheet | Use the same Worker ID on both sheets |
| The same person imported twice | Their Worker ID changed between runs | Keep Worker ID stable for the life of the person's record |
| A value was rejected | It isn't one of the accepted values | Use one of the code values above. Case doesn't matter — spelling does |
More in Run and verify your first sync.
Related
- Import from Excel or Google Sheets — the full step-by-step walkthrough
- Map your fields — match keys, and value mapping for HRIS sources
- Connect Excel · Connect Google Sheets · Connect SFTP
- Workers — organisations, status, and matching