Key takeaways
Every plant produces thousands of these records a month, and almost nobody specifies them. That is why they end up as free text nobody can query.
An inspection, an operator round and a preventive maintenance checklist are the same shape of record. They differ in who runs them and how often, not in how they should be modelled.
| Level | What it is | How many |
|---|---|---|
| Template | The list of checks and their rules | One, reused for years |
| Check definition | One line of the template | Many per template |
| Round | One dated run, one asset, one person | One per occurrence |
| Result line | One answer to one check | One per check per round |
The template lives for years and changes rarely. The round lives for one shift, and the result lines it carries must never change again.
Most bad implementations collapse two of these into one. Each collapse destroys something specific.
| Collapse this | And you lose |
|---|---|
| Template into the round | Every round is a new list, so nothing compares |
| Round into the result line | No record that the round happened at all |
| Result line into the round | One comment field, no per-check answers |
| Check definition into the result | Limits and units are retyped every time |
The third collapse is the common one. A round stores a status and a free text note, and the fourteen individual answers exist only inside a sentence.
The fourth is the expensive one. If the tolerance lives on the answer rather than on the check, two operators can disagree about the limit and both records look valid.
Our preventive maintenance plan data model owns the rule that decides when work falls due, the task list behind it and the four trigger types. It stops at the point where a job is raised.
This page owns the record produced when somebody actually walks the route: the round header, the typed answer to each individual check, and the arithmetic that turns those rows into a compliance number.
The repair side belongs elsewhere again. How a breakdown is coded after the fact is in our equipment failure record data model, and the surrounding tables are in the CMMS data model.
The template is the instruction set. One template serves every asset of the same class, which is why its checks name components rather than tags.
| Field | What it holds | M |
|---|---|---|
| template_ | TPL-OPR-START | Yes |
| name | Start of shift operator round | Yes |
| version | 4 | Yes |
| version_ | 2026-06-01 | Yes |
| applies_ | asset_class or one asset | Yes |
| category | Operator round, safety, statutory | Yes |
| estimated_ | 22 | No |
| required_ | Who may sign it | No |
| asset_ | Running, stopped, either | Yes |
| is_ | Can still be run | Yes |
Two fields carry more weight than they look. version and version_
That question is what the instruction said on the day, not what it says now. Stamp the version onto every round at the moment it starts, and never edit a published version in place.
asset_
This is one line of the template, and it is where a checklist stops being paper. Every field here exists so that the answer does not have to carry it.
| Field | What it holds | M |
|---|---|---|
| check_ | CHK-07 | Yes |
| template_ | Owner of this line | Yes |
| sequence | Order on the route | Yes |
| instruction | One action, one object | Yes |
| component_ | What it is done to | No |
| result_ | One of five, see below | Yes |
| uom | Unit, if numeric | If numeric |
| lower_ | 40 | If limits |
| upper_ | 70 | If limits |
| target | 55 | No |
| decimals | 1 | If numeric |
| option_ | Fixed choices, if a choice | If choice |
| on_ | What the failure sets off | Yes |
| allows_ | May be answered Not applicable | Yes |
| allows_ | May be skipped with a reason | Yes |
| is_ | Blocks the round if empty | Yes |
| photo_ | Evidence attached | No |
allows_
Set both to No on a statutory check and the round cannot be closed without a real answer. That is the only reliable way to stop a safety line being quietly waved through.
A check is not always pass or fail. Forcing every question into two buttons is the single biggest loss of value in inspection data.
| Result type | What it stores |
|---|---|
| Boolean | Pass or fail, nothing else |
| Numeric | A number plus its unit |
| In limits | A number judged against limits |
| Choice | One value from a fixed list |
| Free text | Words, never a measurement |
Boolean is right for a state that genuinely has two values: guard fitted, light on, leak present. Choice is right when the answer is a condition grade rather than a verdict.
A three point grade (Good, Worn, Replace) tells a planner something a pass never will. It is the cheapest upgrade available to an existing checklist.
Take bearing temperature on the main drive of FIL‑01, with a target of 55 °C and limits of 40 and 70 °C. The operator measures 66.0 °C.
Stored as In limits, that reading is inside tolerance and the check passes. It is also 11.0 °C above target and only 4.0 °C below the upper limit.
Stored as text, the row reads "OK" and both of those facts are gone forever. Nothing can recover them later, because the number was never written down.
Now put six identical fillers side by side on the same day. Five read between 54 and 57 °C and this one reads 66.0 °C, which is 9.0 °C above the highest of the other five.
All six pass. Only the typed version makes the outlier visible, and only the typed version can still be charted twelve months later.
| Free text answer | Typed reading |
|---|---|
| "runs a bit warm" | 66.0 °C |
| No limit check possible | In limit, 4.0 below the top |
| Cannot be charted | A series you can trend |
| Cannot be compared | Six machines on one axis |
| Cannot feed a condition rule | Can, see below |
The same reading is what a condition based maintenance rule needs as its input. A checklist that answers in words cannot feed one at all.
Keep a free text note field beside every typed answer, because people see things no field anticipated. Just never let the note be the only place a value lives.
The cost is real and worth stating plainly. A boolean check needs one column on the result line, and a numeric check judged against limits needs six.
| Cost | What it means |
|---|---|
| Six columns, not one | value, uom, lower, upper, target, in_limit |
| A unit decision per check | °C or °F, bar or kPa, fixed once |
| A decimals rule | 66 and 66.0 must not both exist |
| Limit changes need a version | Old rows keep the old limits |
| Entry is slower on the phone | A number takes longer than a tap |
The fourth row is the one that bites eighteen months in. If limits are read live from the template, tightening a tolerance retroactively turns yesterday's passes into failures.
Copy lower_
The round is one dated execution: one template version, one asset, one person, one window of time. It is the row that proves the work happened.
| Field | What it holds | M |
|---|---|---|
| round_ | RND-2026-0912-C | Yes |
| template_ | Stamped at start | Yes |
| asset_ | PKG-2 | Yes |
| scheduled_ | Shift or date it was due | Yes |
| started_ | 2026-09-12 06:08 | Yes |
| completed_ | 2026-09-12 06:30 | No |
| performed_ | Who walked the route | Yes |
| shift_ | C | Yes |
| status | Scheduled, in progress, completed, missed | Yes |
| work_ | If run from a PM job | No |
| lines_ | 14 | Yes |
| lines_ | 14 | Yes |
| signed_ | Closing signature | If statutory |
Keep scheduled_
A round that was never started still needs a row. A missing row is indistinguishable from a round nobody ever scheduled, which is how a whole shift disappears from a compliance report.
This is the field pair almost every home grown checklist misses, and it is the one that decides whether the data means anything.
| Field | What it answers |
|---|---|
| performed_ | When the check was actually done |
| recorded_ | When the answer reached the system |
Store one timestamp and you have given up the ability to tell the two apart. A whole round can then be filled in at the end of the shift from memory, and nothing in the data objects.
The gap between them is worth deriving and keeping: entry_
The shape of the evidence is simple. A round of 14 checks whose result lines were all written inside 95 seconds averages 6.8 seconds per check, which is 95 divided by 14.
The same round genuinely walked in the estimated 22 minutes gives 1,320 seconds across 14 checks, or 94.3 seconds per check. Those two numbers describe very different mornings.
Neither number proves anything on its own, and that matters. It is a question to ask, not a verdict to issue, and the answer is often a broken route rather than a dishonest operator.
One row per check per round. This is the table that grows to millions of rows, and the one worth getting exactly right.
| Field | What it holds | M |
|---|---|---|
| result_ | The key | Yes |
| round_ | Parent round | Yes |
| check_ | Which check, which wording | Yes |
| outcome_ | Pass, fail, na, skipped, missed | Yes |
| result_ | The number or the choice | If typed |
| result_ | Copied from the check | If numeric |
| lower_ | Copied at answer time | If limits |
| in_ | Derived, never typed | If limits |
| reason_ | Why skipped or not applicable | If skipped |
| note | Free text beside the value | No |
| photo_ | Evidence | If required |
| performed_ | Time of the check itself | Yes |
| recorded_ | Time it was written | Yes |
| performed_ | May differ from the round | Yes |
| work_ | Job raised from this line | No |
in_
Result lines are evidence, so they are append only. A correction is a new row with a link to the one it supersedes, not an update in place.
These are three different things and they are almost always stored as one. Each does something different to a compliance percentage, which is exactly why they get merged.
| outcome_code | What it means |
|---|---|
| pass | Answered, within rule |
| fail | Answered, outside rule |
| na | Cannot apply today, by design |
| skipped | Could not be done, reason given |
| missed | Nobody answered, no reason |
The rule that follows from the table is short. Not applicable leaves the denominator, skipped stays in it as a closed line, and missed stays in it and counts against you.
Not applicable needs guarding, because it is the easiest outcome to abuse. Require a reason_
Take round RND‑2026‑0912‑C on line PKG‑2, a 14 check operator round. One line was genuinely forgotten.
| Outcome | Lines |
|---|---|
| pass | 9 |
| fail | 1 |
| na (skid out of service) | 2 |
| skipped (no access) | 1 |
| missed (left blank) | 1 |
| Total | 14 |
The rows add up: 9 plus 1 plus 2 plus 1 plus 1 equals 14. Now score the same round three ways.
| Scoring rule | Sum | Result |
|---|---|---|
| All three lumped and dropped | 10 ÷ 10 | 100.0% |
| All three lumped as missed | 10 ÷ 14 | 71.4% |
| Three states kept apart | 11 ÷ 12 | 91.7% |
The third line is the honest one: the two not applicable lines leave the denominator, and the skipped line counts as closed because it carries a reason. That leaves 11 of 12.
The spread is 28.6 points on a single round, which is 100.0 minus 71.4. Nothing about the plant changed between those three numbers.
The first rule is the dangerous one, because it reports 100.0% on a round with a forgotten check in it. If your inspection compliance never drops below the high nineties, check what the denominator is doing.
Every check definition needs a field that says what a failure sets off. Without it, a failed check is a row nobody is obliged to look at.
| on_fail value | What happens |
|---|---|
| record | Stored, visible on the round |
| flag | Listed for review by a supervisor |
| notify | Push or email to a named role |
| prompt | The app offers to open a job |
| block | Round cannot be closed |
Be honest about the limit of this field. A failed check does not turn into a work order on its own, and any model that pretends otherwise is selling you something.
A person looks at the reading, decides whether it is a fault or a bad measurement, and raises the job. The system's part is to make that decision unavoidable and to record who made it.
There is a good reason for the human step, beyond caution. A single out of limit reading is often a sensor, a thermometer held against the wrong surface, or a machine that has been running for four minutes instead of forty.
One failed reading can end up producing more than one job, weeks apart. One job can be raised from three failed checks in the same round.
| Field | Sits on |
|---|---|
| work_ | The result line |
| source_ | The work order |
| source_ | The work order |
| linked_ | The link itself |
Store only the forward direction and you can ask which readings were acted on, but a technician opening the job cannot see the number that caused it. Store only the reverse and the opposite happens.
The direction you left out is always the one somebody needs. Because the relationship is many to many, the clean answer is a small link table holding both keys plus linked_
That last pair is the audit trail. It records that a human being looked at an out of limit reading and made a call, which is the fact an auditor will ask you to evidence.
What happens to the job after that is a different model again, covered in the CMMS data model and, for the repair itself, the equipment failure record.
One packaging line, PKG‑2, September 2026. Template CHK‑07 has 14 checks and runs once per shift, three shifts a day, thirty days.
Scheduled rounds are 3 × 30 = 90. Scheduled check lines are 90 × 14 = 1,260.
| Round status | Rounds |
|---|---|
| Completed, all 14 lines closed | 71 |
| Started, left part way | 9 |
| Never started | 10 |
| Scheduled | 90 |
The rows reconcile: 71 plus 9 plus 10 equals 90. The ten that never started are 11.1% of the month, which is 10 divided by 90.
The 71 completed rounds carry 71 × 14 = 994 answered lines. The 9 partial rounds carry 126 lines between them, of which 58 were answered and 68 were not.
The 10 rounds that never started contribute 10 × 14 = 140 unanswered lines. Total answered is 994 plus 58 = 1,052.
| Check lines | Count |
|---|---|
| Answered | 1,052 |
| Unanswered (partial rounds) | 68 |
| Unanswered (rounds never run) | 140 |
| Scheduled | 1,260 |
Those reconcile too: 1,052 plus 68 plus 140 equals 1,260. Now split the answered lines by outcome.
| outcome_code | Lines |
|---|---|
| pass | 961 |
| fail | 27 |
| na | 44 |
| skipped | 20 |
| Answered | 1,052 |
Again the rows add up: 961 plus 27 plus 44 plus 20 equals 1,052. The failure rate on answered lines is 27 ÷ 1,052 = 2.6%.
Of those 27 failures, the team raised 11 work orders and closed 16 on the spot with an adjustment or a top up. 11 plus 16 equals 27, and every one of the 11 carries the result line that caused it.
Both definitions below are honest and both are used in real plants. They are computed from exactly the same rows.
| Definition | Sum | Result |
|---|---|---|
| Rounds completed | 71 ÷ 90 | 78.9% |
| Check lines answered | 1,052 ÷ 1,260 | 83.5% |
The gap is 4.6 percentage points, which is 83.5 minus 78.9. In counts it is exactly the 58 lines answered inside the nine partial rounds.
You can prove that the gap is those 58 lines and nothing else. Score the partial rounds as if they had answered nothing, and the line based number becomes 994 ÷ 1,260 = 78.9%, identical to the round based one.
So 58 ÷ 1,260 = 4.6% of the month's check lines is the entire difference between the two headline figures. The definition moved the number, not the team.
Neither definition is wrong, and a plant needs both. Round completion tells you whether the route is being walked, and line completion tells you whether it is being walked properly.
Publish the numerator and the denominator beside every percentage, always. A compliance figure with no counts next to it cannot be checked, which is the same discipline our OEE calculation guide applies to availability.
Where these rounds sit against shifts, and how a due date maps onto a night shift that crosses midnight, is covered in the shift calendar data model. A round that changes hands mid task belongs on the shift handover checklist.
Ask for a demonstration in their system rather than a yes. Each of these takes under five minutes to show.
Before a shortlist, read what is a CMMS and equipment maintenance software. For the assets these rounds are walked on, see the asset hierarchy data model.
Fabrico is an OEE platform with a full CMMS built in, and part of this model is in the product today.
Preventive work runs from recurring templates with conditional tasks, on an annual plan view, with approval workflows, work shifts and allocation. Your team works from the iOS, Android or web app and scans a QR code on the machine or the part to open the right card.
Push, in-app and email notifications with smart rules carry the alert when something is due or late, and the audit log keeps the record of who did what. Analytics export to Excel, and the AI assistant answers questions about one machine's history in plain language.
Here is the honest boundary. Fabrico supports recurring templates and conditional tasks, and it does not advertise a typed inspection result with units, tolerances and a derived in-limit flag, so treat everything in this article about result typing, outcome codes and both-way links as a specification to test against your shortlist rather than a feature list.
Two more things Fabrico does not do: a failed check never opens a job on its own, because your team raises and confirms every work order, and failure forecasting is not a standard feature.
Want your inspection rounds stored as data instead of as sentences? Book a 30 minute demo with a Fabrico consultant, no commitment, or contact us with your questions.
result_id, round_id, check_id with its version, outcome_code, result_value, result_uom, the copied lower and upper limits, a derived in_limit flag, reason_code, note, photo_id, performed_at, recorded_at, performed_by and work_order_id.
The template is the list of checks and their rules, and it lives for years. The round is one dated run of that template on one asset by one person, and its result lines are evidence that must never be edited afterwards.
No, a person should. The check definition carries an on_fail field that records, flags, notifies, prompts or blocks, and a human decides whether the reading is a fault or a bad measurement before any job is raised.
As separate outcome codes with a reason code, never as one value. Not applicable leaves the denominator, skipped stays in it as a closed line, and missed stays in it and counts against you.
Either rounds completed divided by rounds scheduled, or check lines answered divided by check lines scheduled. In the example above the same month gives 71 ÷ 90 = 78.9% and 1,052 ÷ 1,260 = 83.5%, so always publish which one you used.
Zakažite sastanak KSNUMKS-to-KSNUMKS sa našim stručnjacima ili se direktno upišite u naš besplatni plan.
Nije potrebna kreditna kartica!