Never Recorded Is Not Expired — The Third State Every Training Matrix Needs
Most training spreadsheets have two states: has it, or does not. That collapses three different problems into one column, and the one it hides is the one an auditor opens with. The case for a matrix that distinguishes lapsed from never-done from does-not-apply.
An auditor asks three questions about training, and they are not the same question.
Has this person's certificate expired? Did they ever hold one? And does this competency even apply to them?
A spreadsheet with a tick box answers none of them. A spreadsheet with an expiry date answers the first, badly. What the first two have in common is that the honest answer to "no" is different in each case, and the software usually only has one "no".
The collapse
The natural design is a column per competency, holding a date. Empty means no, filled means yes, and if the date is in the past somebody notices eventually.
That model has three failures baked in.
An empty cell is ambiguous. It might mean the person never did the training. It might mean the person did it and nobody typed it in. It might mean the training does not apply to their job at all. All three look identical, and only the third one is fine.
A past date is only visible if somebody is looking. Nothing surfaces it. The cell sits there being wrong.
And "does not apply" gets recorded by leaving the row blank, which is indistinguishable from a gap.
The result is a register that cannot tell you what is missing, which is the only thing you needed it for.
Four states, because there are four situations
Trainora colours every cell as one of four things:
Valid — a record exists and its expiry is in the future.
Expiring — valid today, inside the warning window you set.
Expired — a record exists and its expiry has passed. Somebody held this, and does not now.
Never recorded — no record at all. Not lapsed. Nothing was ever filed.
And a fifth rendering that is not a state at all: hatched, where a competency does not apply to that person. Front-of-house does not need the forklift ticket, and the grid says so rather than showing an accusing blank.
The difference between expired and never recorded is not cosmetic. They are different failures with different fixes. Expired means a renewal was missed by someone who knows the job. Never recorded means a person is doing work they were never signed off for, or that your record-keeping has a hole in it. An auditor treats those very differently, and so should the screen.
Expiry is computed, not stored
There is a second rule underneath, and it is the one that keeps the four states honest.
Nothing stores "is expired". The expiry date is derived from the date the training was achieved plus the validity period you set for that competency. Whether it has passed is decided when the page renders, against today.
The alternative — a flag written by a nightly job — has a specific failure mode that is worse than being wrong. It is being confidently wrong. The job does not run one night, and the grid shows green for something that lapsed at midnight. Nobody sees an error, because there is no error. There is just a screen saying everything is fine.
A derived value cannot go stale, because there is nothing to go stale. That is the whole argument for it.
What changing the rules does, and does not do
If you shorten a competency's validity from three years to two, records already on file keep the expiry they were issued with. A certificate does not become shorter-lived because you changed a setting afterwards.
This is a deliberate limit and worth stating plainly, because the opposite behaviour is easy to build and feels tidier. It is also wrong: it silently rewrites history, and the person whose certificate just turned red never did anything.
What the grid is for
The matrix is the home screen because it is the only view that answers all three of the auditor's questions at once. Everyone down the side, every competency across the top, every cell one of four colours.
On the demo seed it reads 48% of the 41 things that apply are in date · 3 expired · 18 never recorded. Those three numbers are the entire state of the register, and the third is the one a two-state spreadsheet cannot produce at all.
Clicking a cell records a completion without leaving the grid, because the moment you notice a gap is the moment you want to close it.
What it is not
Trainora is not a learning platform. No courses, no content, no quizzes, no SCORM. It records that training happened; it does not deliver it. It does not issue certificates either — it holds the one you were given as evidence.
A competency applies to everyone or to one group tag. That is the whole targeting model, deliberately: anything more expressive becomes a rules engine nobody can audit, and an unauditable rule in a compliance register is worse than a coarse one.
Those limits are on the product page, not buried in a FAQ.
The point
You can keep training records in a spreadsheet. Plenty of organisations do, and it works right up until somebody asks what is missing.
The reason it fails at that question is not effort. It is that the sheet has one kind of "no", and the question needs three.